Skip to content

Commit 5cc06c4

Browse files
authored
Merge pull request #369 from DigitalSlideArchive/support-short-login-sessions
Support short login sessions.
2 parents ebbd1a9 + 6342f46 commit 5cc06c4

File tree

3 files changed

+64
-0
lines changed

3 files changed

+64
-0
lines changed

histomicsui/__init__.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,21 @@ def validateHistomicsUIQuarantineFolder(doc):
194194
Folder().load(doc['value'], force=True, exc=True)
195195

196196

197+
@setting_utilities.validator(PluginSettings.HUI_LOGIN_SESSION_EXPIRY_MINUTES)
198+
def validateLoginSessionExpiryMinutes(doc):
199+
if not doc.get('value', None):
200+
doc['value'] = None
201+
else:
202+
try:
203+
doc['value'] = float(doc['value'])
204+
if doc['value'] > 0:
205+
return
206+
except ValueError:
207+
pass # We want to raise the ValidationException
208+
msg = 'Login session expiry must be None or a number >= 0.0.'
209+
raise ValidationException(msg, 'value')
210+
211+
197212
# Defaults that have fixed values are added to the system defaults dictionary.
198213
SettingDefault.defaults.update({
199214
PluginSettings.HUI_WEBROOT_PATH: 'histomics',
@@ -386,6 +401,8 @@ def load(self, info): # noqa
386401
'tasks are therefore unavailable.')
387402
plugin.getPlugin('large_image_annotation').load(info)
388403

404+
# Support short login sessions
405+
handlers.shortLoginSessions()
389406
# Python's http cookie parser fails for all cookies when there are some
390407
# invalid cookies. Work around some of that.
391408
patchCookieParsing()

histomicsui/constants.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,4 @@ class PluginSettings:
1919
HUI_HELP_URL = 'histomicsui.help_url'
2020
HUI_HELP_TOOLTIP = 'histomicsui.help_tooltip'
2121
HUI_HELP_TEXT = 'histomicsui.help_text'
22+
HUI_LOGIN_SESSION_EXPIRY_MINUTES = 'histomicsui.login_session_expiry_minutes'

histomicsui/handlers.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import time
55

66
import cachetools
7+
import cherrypy
78
import girder.utility
89
import large_image.config
910
import orjson
@@ -14,6 +15,7 @@
1415
from girder.models.folder import Folder
1516
from girder.models.item import Item
1617
from girder.models.setting import Setting
18+
from girder.models.token import Token
1719
from girder.models.user import User
1820
from girder_large_image_annotation.models.annotation import Annotation
1921

@@ -308,3 +310,47 @@ def iterencode(self, obj, *args, **kwargs):
308310

309311
girder.utility.JsonEncoder.encode = encode
310312
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

Comments
 (0)