@@ -53,6 +53,10 @@ class ClientError(Exception):
5353 pass
5454
5555
56+ class LoginError (Exception ):
57+ pass
58+
59+
5660class SyncError (Exception ):
5761 def __init__ (self , msg , detail = "" ):
5862 super ().__init__ (msg )
@@ -581,8 +585,21 @@ def __init__(self, url, auth_token=None, login=None, password=None, plugin_versi
581585 urllib .request .install_opener (self .opener )
582586
583587 if login and password :
584- self .login (login , password )
588+ self ._auth_params = {
589+ "login" : login ,
590+ "password" : password
591+ }
592+ if not self ._auth_session :
593+ self .login (login , password )
594+
595+ def _check_token (f ):
596+ def wrapper (self , * args ):
597+ if (not self ._auth_session or self ._auth_session ['expire' ] < datetime .now (timezone .utc )) and self ._auth_params :
598+ self .login (self ._auth_params ['login' ], self ._auth_params ['password' ])
599+ return f (self , * args )
600+ return wrapper
585601
602+ @_check_token
586603 def _do_request (self , request ):
587604 if self ._auth_session :
588605 delta = self ._auth_session ["expire" ] - datetime .now (timezone .utc )
@@ -686,10 +703,19 @@ def login(self, login, password):
686703 "login" : login ,
687704 "password" : password
688705 }
689- self ._auth_params = params
690- resp = self .post ("/v1/auth/login" , params , {"Content-Type" : "application/json" })
691- data = json .load (resp )
692- session = data ["session" ]
706+ try :
707+ self ._auth_params = params
708+ url = urllib .parse .urljoin (self .url , urllib .parse .quote ("/v1/auth/login" ))
709+ data = json .dumps (self ._auth_params , cls = DateTimeEncoder ).encode ("utf-8" )
710+ request = urllib .request .Request (url , data , {"Content-Type" : "application/json" }, method = "POST" )
711+ resp = self .opener .open (request )
712+ data = json .load (resp )
713+ session = data ["session" ]
714+ except urllib .error .HTTPError as e :
715+ if e .headers .get ("Content-Type" , "" ) == "application/problem+json" :
716+ info = json .load (e )
717+ raise LoginError (info .get ("detail" ))
718+ raise LoginError (e .read ().decode ("utf-8" ))
693719 self ._auth_session = {
694720 "token" : "Bearer %s" % session ["token" ],
695721 "expire" : dateutil .parser .parse (session ["expire" ])
@@ -1154,7 +1180,6 @@ def upload_chunk(chunk_id, data):
11541180 for chunk in file_meta ["chunks" ]:
11551181 data = file .read (UPLOAD_CHUNK_SIZE )
11561182 upload_chunk (chunk , data )
1157-
11581183 def project_status (self , directory ):
11591184 """
11601185 Get project status, e.g. server and local changes.
0 commit comments