|
4 | 4 | import time |
5 | 5 |
|
6 | 6 | import cachetools |
| 7 | +import cherrypy |
7 | 8 | import girder.utility |
8 | 9 | import large_image.config |
9 | 10 | import orjson |
|
14 | 15 | from girder.models.folder import Folder |
15 | 16 | from girder.models.item import Item |
16 | 17 | from girder.models.setting import Setting |
| 18 | +from girder.models.token import Token |
17 | 19 | from girder.models.user import User |
18 | 20 | from girder_large_image_annotation.models.annotation import Annotation |
19 | 21 |
|
@@ -308,3 +310,47 @@ def iterencode(self, obj, *args, **kwargs): |
308 | 310 |
|
309 | 311 | girder.utility.JsonEncoder.encode = encode |
310 | 312 | girder.utility.JsonEncoder.iterencode = iterencode |
| 313 | + |
| 314 | + |
| 315 | +def shortLoginSessions(): |
| 316 | + import girder.api.rest |
| 317 | + |
| 318 | + _recentTokens = {} |
| 319 | + |
| 320 | + origGetCurrentUser = girder.api.rest.getCurrentUser |
| 321 | + |
| 322 | + def getCurrentUser(*args, **kwargs): |
| 323 | + result = origGetCurrentUser(*args, **kwargs) |
| 324 | + try: |
| 325 | + if 'api/v1/notification/stream' in cherrypy.request.path_info: |
| 326 | + return result |
| 327 | + except Exception: |
| 328 | + pass |
| 329 | + user = result[0] if isinstance(result, tuple) else result |
| 330 | + if user: |
| 331 | + token = girder.api.rest.getCurrentToken() |
| 332 | + if token['_id'] not in _recentTokens or time.time() - _recentTokens[token['_id']] > 60: |
| 333 | + if Setting().get(PluginSettings.HUI_LOGIN_SESSION_EXPIRY_MINUTES): |
| 334 | + days = float(Setting().get( |
| 335 | + PluginSettings.HUI_LOGIN_SESSION_EXPIRY_MINUTES)) / 24 / 60 |
| 336 | + token['expires'] = datetime.datetime.utcnow() + datetime.timedelta( |
| 337 | + days=float(days)) |
| 338 | + token = Token().save(token) |
| 339 | + logger.debug( |
| 340 | + 'Extend user login duration ' |
| 341 | + f'(user {user["_id"]}, token {token["_id"][:16]}...)') |
| 342 | + if len(_recentTokens) > 100: |
| 343 | + _recentTokens.empty() |
| 344 | + _recentTokens[token['_id']] = time.time() |
| 345 | + return result |
| 346 | + |
| 347 | + girder.api.rest.getCurrentUser = getCurrentUser |
| 348 | + |
| 349 | + origResourceSendAuthTokenCookie = girder.api.rest.Resource.sendAuthTokenCookie |
| 350 | + |
| 351 | + def sendAuthTokenCookie(self, user=None, scope=None, token=None, days=None): |
| 352 | + if days is None and Setting().get(PluginSettings.HUI_LOGIN_SESSION_EXPIRY_MINUTES): |
| 353 | + days = float(Setting().get(PluginSettings.HUI_LOGIN_SESSION_EXPIRY_MINUTES)) / 24 / 60 |
| 354 | + return origResourceSendAuthTokenCookie(self, user, scope, token, days) |
| 355 | + |
| 356 | + girder.api.rest.Resource.sendAuthTokenCookie = origResourceSendAuthTokenCookie |
0 commit comments