|
7 | 7 | log = logging.getLogger(__name__) |
8 | 8 |
|
9 | 9 |
|
10 | | -EXPIRES_ON_THRESHOLD = 2 * 60 # 2 minutes |
| 10 | +EXPIRES_ON_THRESHOLD = 1 * 60 # 1 minute |
11 | 11 |
|
12 | 12 |
|
13 | 13 | class Token(dict): |
@@ -35,15 +35,33 @@ def expiration_datetime(self): |
35 | 35 | Returns the expiration datetime |
36 | 36 | :return datetime: The datetime this token expires |
37 | 37 | """ |
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) |
43 | 40 | if self.is_long_lived: |
44 | 41 | expires_on = expires_on + dt.timedelta(days=90) |
45 | 42 | return expires_on |
46 | 43 |
|
| 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 | + |
47 | 65 |
|
48 | 66 | class BaseTokenBackend(ABC): |
49 | 67 | """ A base token storage class """ |
@@ -154,6 +172,9 @@ def __init__(self, token_path=None, token_filename=None): |
154 | 172 | else: |
155 | 173 | token_filename = token_filename or 'o365_token.txt' |
156 | 174 | self.token_path = token_path / token_filename |
| 175 | + |
| 176 | + # is this backend waiting on the filesystem |
| 177 | + self.fs_wait = False |
157 | 178 |
|
158 | 179 | def __repr__(self): |
159 | 180 | return str(self.token_path) |
@@ -207,6 +228,8 @@ def check_token(self): |
207 | 228 | """ |
208 | 229 | return self.token_path.exists() |
209 | 230 |
|
| 231 | + def should_refresh_token(self): |
| 232 | + return not self.fs_wait |
210 | 233 |
|
211 | 234 | class FirestoreBackend(BaseTokenBackend): |
212 | 235 | """ A Google Firestore database backend to store tokens """ |
|
0 commit comments