You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
2.1 KiB
76 lines
2.1 KiB
# Copyright (C) 2005-2025 Splunk Inc. All Rights Reserved.
|
|
|
|
'''
|
|
The session module exports the session object that you can use to store and retrieve information in a thread-safe
|
|
manner.
|
|
|
|
Usage:
|
|
```code
|
|
from session import session
|
|
# save information to session
|
|
session.save(authtoken='abcdef', user='admin')
|
|
# read information from session
|
|
authtoken = session['authtoken'] # 'abcdef'
|
|
something_else = session['non_existent_key'] # None
|
|
# clear session
|
|
session.clear()
|
|
```
|
|
'''
|
|
|
|
import threading
|
|
import functools
|
|
from .exception import BaseRestException
|
|
import http.client
|
|
|
|
|
|
class SessionAlreadyInitializedException(Exception):
|
|
def __init__(self):
|
|
super(SessionAlreadyInitializedException, self).__init__('session already initialized.')
|
|
|
|
|
|
class _LocalSession(object):
|
|
'''
|
|
_LocalSession is a wrapper class arounds the actual session object. It is
|
|
thread-local so that race condition will be avoided during concurrent request handling
|
|
|
|
It is a singleton class that should not be initialized outside of this module.
|
|
'''
|
|
_s_local = threading.local()
|
|
_initialized = False
|
|
|
|
def __init__(self):
|
|
if _LocalSession._initialized:
|
|
raise SessionAlreadyInitializedException()
|
|
_LocalSession._initialized = True
|
|
|
|
def __getitem__(self, name):
|
|
return getattr(self._s_local, name, None)
|
|
|
|
def save(self, **kwargs):
|
|
for k, v in kwargs.items():
|
|
setattr(self._s_local, k, v)
|
|
|
|
def clear(self):
|
|
_LocalSession._s_local = threading.local()
|
|
|
|
|
|
# this is the session object that should be exported
|
|
session = _LocalSession()
|
|
|
|
|
|
class UnauthenticatedException(BaseRestException):
|
|
def __init__(self, msg):
|
|
super(UnauthenticatedException, self).__init__(http.client.UNAUTHORIZED, msg)
|
|
|
|
|
|
def authtoken_required(func):
|
|
"""
|
|
Decorator util method that raises Exception if `authtoken` is not stored on current session.
|
|
"""
|
|
@functools.wraps(func)
|
|
def wrapper(*args, **kwargs):
|
|
if not session['authtoken']:
|
|
raise UnauthenticatedException('Authtoken not found in current session.')
|
|
return func(*args, **kwargs)
|
|
return wrapper
|