Skip to content

Commit cb709df

Browse files
committed
login type and checks
1 parent 11e7ce8 commit cb709df

File tree

1 file changed

+33
-8
lines changed

1 file changed

+33
-8
lines changed

mergin/client.py

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,16 @@ class ServerType(Enum):
5252
SAAS = auto() # Server is SaaS
5353

5454

55+
class LoginType(Enum):
56+
"""Types of login supported by Mergin Maps."""
57+
58+
PASSWORD = "password" # classic login with username and password
59+
SSO = "sso" # login with SSO token
60+
61+
def __str__(self) -> str:
62+
return self.value
63+
64+
5565
def decode_token_data(token):
5666
token_prefix = "Bearer ."
5767
if not token.startswith(token_prefix):
@@ -80,14 +90,24 @@ class MerginClient:
8090
Currently, only HTTP proxies are supported.
8191
"""
8292

83-
def __init__(self, url=None, auth_token=None, login=None, password=None, plugin_version=None, proxy_config=None):
93+
def __init__(
94+
self,
95+
url=None,
96+
auth_token=None,
97+
login=None,
98+
password=None,
99+
plugin_version=None,
100+
proxy_config=None,
101+
login_type: LoginType = LoginType.PASSWORD,
102+
):
84103
self.url = url if url is not None else MerginClient.default_url()
85104
self._auth_params = None
86105
self._auth_session = None
87106
self._user_info = None
88107
self._server_type = None
89108
self._server_version = None
90109
self.client_version = "Python-client/" + __version__
110+
self._login_type = login_type
91111
if plugin_version is not None: # this could be e.g. "Plugin/2020.1 QGIS/3.14"
92112
self.client_version += " " + plugin_version
93113
self.setup_logging()
@@ -134,15 +154,20 @@ def __init__(self, url=None, auth_token=None, login=None, password=None, plugin_
134154
self.opener = urllib.request.build_opener(*handlers, https_handler)
135155
urllib.request.install_opener(self.opener)
136156

137-
if login and not password:
138-
raise ClientError("Unable to log in: no password provided for '{}'".format(login))
139-
if password and not login:
140-
raise ClientError("Unable to log in: password provided but no username/email")
157+
if self._login_type == LoginType.PASSWORD:
158+
if login and not password:
159+
raise ClientError("Unable to log in: no password provided for '{}'".format(login))
160+
if password and not login:
161+
raise ClientError("Unable to log in: password provided but no username/email")
162+
163+
if login and password:
164+
self._auth_params = {"login": login, "password": password}
165+
if not self._auth_session:
166+
self.login(login, password)
141167

142-
if login and password:
143-
self._auth_params = {"login": login, "password": password}
168+
elif self._login_type == LoginType.SSO:
144169
if not self._auth_session:
145-
self.login(login, password)
170+
raise ClientError("Unable to log in: no auth token provided for SSO login")
146171

147172
def setup_logging(self):
148173
"""Setup Mergin Maps client logging."""

0 commit comments

Comments
 (0)