Skip to content

Commit 7dacbec

Browse files
committed
fix session login for non admin users
1 parent d5589e6 commit 7dacbec

File tree

2 files changed

+33
-14
lines changed

2 files changed

+33
-14
lines changed

src/nextcloud/session.py

+32-13
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
import requests
44
from .compat import encode_requests_password
55

6+
import logging
7+
_logger = logging.getLogger(__name__)
8+
69

710
class NextCloudConnectionError(Exception):
811
""" A connection error occurred """
@@ -31,7 +34,7 @@ def __init__(self, url=None, user=None, password=None, auth=None, session_kwargs
3134
self.auth = None
3235
self.user = None
3336
self._set_credentials(user, password, auth)
34-
self.url = url
37+
self.url = url.rstrip('/')
3538
self._session_kwargs = session_kwargs or {}
3639

3740
def _set_credentials(self, user, password, auth):
@@ -41,12 +44,11 @@ def _set_credentials(self, user, password, auth):
4144
self.user = user
4245
else:
4346
if isinstance(self.auth, tuple):
44-
(self.user, password) = self.auth
45-
self.auth = None
47+
self.user = self.auth[0]
4648
else:
4749
if isinstance(self.auth, requests.auth.AuthBase):
4850
self.user = self.auth.username
49-
if not self.auth:
51+
if not self.auth and (self.user and password):
5052
self.auth = (self.user, encode_requests_password(password))
5153

5254
def request(self, method, url, **kwargs):
@@ -75,18 +77,35 @@ def login(self, user=None, password=None, auth=None, client=None):
7577
self._set_credentials(user, password, auth)
7678
self.session.auth = self.auth
7779
if client:
78-
try:
79-
resp = client.with_attr(json_output=True).get_user()
80-
if not resp.is_ok:
81-
raise NextCloudLoginError(
82-
'Failed to login to NextCloud', self.url, resp)
83-
except requests.exceptions.SSLError as e:
84-
self.logout()
85-
raise e
86-
except Exception as e:
80+
self._check_session(client.with_attr(json_output=True), retry=3)
81+
82+
83+
def _check_session(self, client=None, retry=None):
84+
def _clear():
85+
if self.session:
8786
self.logout()
87+
88+
def _raise(e):
89+
if retry:
90+
_logger.warning('Retry session check (%s)', self.url)
91+
return self._check_session(client, retry=retry - 1)
92+
else:
93+
_clear()
8894
raise e
8995

96+
try:
97+
resp = client.get_user()
98+
if not resp.is_ok:
99+
_raise(NextCloudLoginError(
100+
'Failed to login to NextCloud', self.url, resp))
101+
except requests.exceptions.SSLError as e:
102+
_raise(e)
103+
except NextCloudConnectionError as e:
104+
_raise(e)
105+
except Exception as e:
106+
_clear()
107+
raise e
108+
90109
def logout(self):
91110
"""Log out the authenticated user and close the session.
92111

test.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ case $1 in
8787
NEXTCLOUD_ADMIN_PASSWORD=$NEXTCLOUD_ADMIN_PASSWORD \
8888
NEXTCLOUD_ADMIN_USER=$NEXTCLOUD_ADMIN_USER \
8989
NEXTCLOUD_VERSION=$NEXTCLOUD_VERSION \
90-
pytest ..
90+
pytest .
9191
;;
9292
*)
9393
_usage

0 commit comments

Comments
 (0)