Skip to content

Commit 66f1399

Browse files
author
Alejandro Casanovas
authored
Merge pull request googleapis#356 from riptusk331/file_lock
Atomic file operations
2 parents cd46e6c + 07027e8 commit 66f1399

File tree

1 file changed

+29
-6
lines changed

1 file changed

+29
-6
lines changed

O365/utils/token.py

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
log = logging.getLogger(__name__)
88

99

10-
EXPIRES_ON_THRESHOLD = 2 * 60 # 2 minutes
10+
EXPIRES_ON_THRESHOLD = 1 * 60 # 1 minute
1111

1212

1313
class Token(dict):
@@ -35,15 +35,33 @@ def expiration_datetime(self):
3535
Returns the expiration datetime
3636
:return datetime: The datetime this token expires
3737
"""
38-
expires_at = self.get('expires_at')
39-
if expires_at is None:
40-
# consider it is expired
41-
return dt.datetime.now() - dt.timedelta(seconds=10)
42-
expires_on = dt.datetime.fromtimestamp(expires_at) - dt.timedelta(seconds=EXPIRES_ON_THRESHOLD)
38+
access_expires_at = self.access_expiration_datetime
39+
expires_on = access_expires_at - dt.timedelta(seconds=EXPIRES_ON_THRESHOLD)
4340
if self.is_long_lived:
4441
expires_on = expires_on + dt.timedelta(days=90)
4542
return expires_on
4643

44+
@property
45+
def access_expiration_datetime(self):
46+
"""
47+
Returns the token's access expiration datetime
48+
:return datetime: The datetime the token's access expires
49+
"""
50+
expires_at = self.get('expires_at')
51+
if expires_at:
52+
return dt.datetime.fromtimestamp(expires_at)
53+
else:
54+
# consider the token expired, add 10 second buffer to current dt
55+
return dt.datetime.now() - dt.timedelta(seconds=10)
56+
57+
@property
58+
def is_access_expired(self):
59+
"""
60+
Returns whether or not the token's access is expired.
61+
:return bool: True if the token's access is expired, False otherwise
62+
"""
63+
return dt.datetime.now() > self.access_expiration_datetime
64+
4765

4866
class BaseTokenBackend(ABC):
4967
""" A base token storage class """
@@ -154,6 +172,9 @@ def __init__(self, token_path=None, token_filename=None):
154172
else:
155173
token_filename = token_filename or 'o365_token.txt'
156174
self.token_path = token_path / token_filename
175+
176+
# is this backend waiting on the filesystem
177+
self.fs_wait = False
157178

158179
def __repr__(self):
159180
return str(self.token_path)
@@ -207,6 +228,8 @@ def check_token(self):
207228
"""
208229
return self.token_path.exists()
209230

231+
def should_refresh_token(self):
232+
return not self.fs_wait
210233

211234
class FirestoreBackend(BaseTokenBackend):
212235
""" A Google Firestore database backend to store tokens """

0 commit comments

Comments
 (0)