Skip to content
This repository was archived by the owner on Jun 23, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion src/oidcop/session/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ def __init__(
self, handler: TokenHandler, conf: Optional[dict] = None,
sub_func: Optional[dict] = None,
):
super(SessionManager, self).__init__()
self.conf = conf or {}

# these won't change runtime
Expand Down Expand Up @@ -451,6 +452,13 @@ def get_session_info(

return res

def _compatible_sid(self, sid):
# To be backward compatible is this an old time sid
p = self.unpack_session_key(sid)
if len(p) == 3:
sid = self.encrypted_session_id(*p)
return sid

def get_session_info_by_token(
self,
token_value: str,
Expand All @@ -467,6 +475,9 @@ def get_session_info_by_token(
if not sid:
raise WrongTokenClass

# To be backward compatible is this an old time sid
sid = self._compatible_sid(sid)

return self.get_session_info(
sid,
user_session_info=user_session_info,
Expand All @@ -478,7 +489,8 @@ def get_session_info_by_token(

def get_session_id_by_token(self, token_value: str) -> str:
_token_info = self.token_handler.info(token_value)
return _token_info["sid"]
sid = _token_info.get("sid")
return self._compatible_sid(sid)

def add_grant(self, user_id: str, client_id: str, **kwargs) -> Grant:
"""
Expand Down
21 changes: 20 additions & 1 deletion tests/test_35_oidc_token_endpoint.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@
import json
import os

import pytest
from cryptojwt import JWT
from cryptojwt.key_jar import build_keyjar
from oidcmsg.oidc import AccessTokenRequest
from oidcmsg.oidc import AuthorizationRequest
from oidcmsg.oidc import RefreshAccessTokenRequest
from oidcmsg.oidc import TokenErrorResponse
from oidcmsg.time_util import utc_time_sans_frac
import pytest

from oidcop import JWT_BEARER
from oidcop.authn_event import create_authn_event
Expand Down Expand Up @@ -813,6 +813,25 @@ def test_old_default_token(self):
_info = self.session_manager.token_handler.info(_old_type_value)
assert _info["token_class"] == "authorization_code"

def test_old_default_token_sid_unencrypted(self):
session_id = self._create_session(AUTH_REQ)
grant = self.session_manager[session_id]
code = self._mint_code(grant, AUTH_REQ["client_id"])

# pack and unpack
_handler = self.session_manager.token_handler.handler["authorization_code"]
_res = dict(zip(["_id", "token_class", "sid", "exp"], _handler.split_token(code.value)))

_clear_txt_sid = self.session_manager.session_key(
*self.session_manager.decrypt_session_id(_res["sid"]))

_old_type_token = base64.b64encode(
_handler.crypt.encrypt(lv_pack(_res["_id"], "A", _clear_txt_sid, _res["exp"]).encode())
).decode("utf-8")

_session_info = self.session_manager.get_session_info_by_token(_old_type_token)
assert _session_info["user_id"] == "diana"

def test_old_jwt_token(self):
session_id = self._create_session(AUTH_REQ)
grant = self.session_manager[session_id]
Expand Down