Single Sign On (SSO)
- class proton.sso.ProtonSSO(appversion: str = 'Other', user_agent: str = 'None')
Proton Single Sign On implementation. This allows session persistence for the current user.
The general approach for this is to create a SSO instance, and then to get either a specific or the default session, and work from there:
from proton.sso import ProtonSSO sso = ProtonSSO() session = sso.get_default_session() # or: session = sso.get_session('pro') # get session for account pro
Note that it is advised not to try to “guess” the state of the session, but instead to just try to use it, and handle any exception that would arise.
This object uses advisory locks (using
flock
) to protect the session from multiple conflicting changes. This does not guarantee that Session objects are immune to what happens in another process (i.e. imagine if one process terminates the session.), but at least makes it consistent. In the future, it would be nice to use an IPC mechanism to make sure other processes are aware of the state change.- __init__(appversion: str = 'Other', user_agent: str = 'None')
Create a SSO instance
- Parameters:
appversion (str, optional) – Application version (see
proton.session.Session
), defaults to “Other”user_agent (str, optional) – User agent version (see
proton.session.Session
), defaults to “None”
- property sessions: list[str]
Returns the account names for the current system user
- Returns:
list of normalized account_names
- Return type:
list[str]
- get_session(account_name: str | None, override_class: type | None = None) Session
Get the session identified by account_name
- Parameters:
account_name (Optional[str]) – account name to use. If None will return an empty session (can be used as a factory)
override_class (Optional[type]) – Class to use for the session to be returned, by default will use proton.session.Session
- Returns:
the Session object. It will be an empty session if there’s no session for account_name
- Return type:
- get_default_session(override_class: type | None = None) Session
Get the default session for the system user. It will always be one valid session if one exists.
- Parameters:
override_class (Optional[type]) – Class to use for the session to be returned, see
get_session()
.- Returns:
the Session object. It will be an empty session if there’s no session at all
- Return type:
- set_default_account(account_name: str)
Set the default account for user to be account_name
- Parameters:
account_name (str) – the account_name to use as default
- Raises:
KeyError – if the account name is unknown
- _acquire_session_lock(account_name: str, current_data: dict) None
Observer pattern for
proton.session.Session
(seeproton.session.Session.register_persistence_observer()
). It is called when the Session object is getting locked, because it’s expected to be changed and we want to avoid race conditions.- Parameters:
account_name (str) – account name of the session
current_data (dict) – current session data serialized as a dictionary
- _release_session_lock(account_name: str, new_data: dict) None
Observer pattern for
proton.session.Session
(seeproton.session.Session.register_persistence_observer()
). It is called when the Session object is getting unlocked.If the data between has changed since
_acquire_session_lock()
was called, it will be persisted in the keyring.- Parameters:
account_name (str) – account name of the session
new_data (dict) – current session data serialized as a dictionary