import logging from urllib.parse import parse_qs, urlsplit import nose.tools as nt from behave import step from flask.sessions import SecureCookieSessionInterface from itsdangerous import URLSafeTimedSerializer as Serializer logger = logging.getLogger(__name__) def deserialize_session(session, session_secret): s = Serializer( session_secret, salt=SecureCookieSessionInterface.salt, serializer=SecureCookieSessionInterface.serializer, signer_kwargs={ "key_derivation": SecureCookieSessionInterface.key_derivation, "digest_method": SecureCookieSessionInterface.digest_method, }, ) return s.loads(session) @step("I should be assigned a session state matching the state param") def step_should_be_assigned_session_state_matching_state_param(context): qs = parse_qs(urlsplit(context.response.headers["Location"]).query) session = context.atlas_um_client.cookies["session"] session_secret = context.atlas_um_app.config["SECRET_KEY"] deserialized_session = deserialize_session(session, session_secret) nt.assert_equal( qs["state"], [deserialized_session["usm_authentication_state"]] ) @step("I should be assigned a session nonce matching the nonce param") def step_should_be_assigned_session_nonce_matching_nonce_param(context): qs = parse_qs(urlsplit(context.response.headers["Location"]).query) session = context.atlas_um_client.cookies["session"] session_secret = context.atlas_um_app.config["SECRET_KEY"] deserialized_session = deserialize_session(session, session_secret) nt.assert_equal( qs["nonce"], [deserialized_session["usm_authentication_nonce"]] )