Passed
Pull Request — master (#69)
by
unknown
01:14
created

nextcloud.session   A

Complexity

Total Complexity 19

Size/Duplication

Total Lines 99
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 19
eloc 65
dl 0
loc 99
rs 10
c 0
b 0
f 0

1 Function

Rating   Name   Duplication   Size   Complexity  
A catch_connection_error() 0 11 2

5 Methods

Rating   Name   Duplication   Size   Complexity  
B Session.login() 0 27 6
A Session.request() 0 9 3
B Session._set_credentials() 0 14 6
A Session.__init__() 0 7 1
A Session.logout() 0 9 1
1
# -*- coding: utf-8 -*-
2
from functools import wraps
3
import requests
4
from .compat import encode_requests_password
5
6
7
class NextCloudConnectionError(Exception):
8
    """ A connection error occurred """
9
10
class NextCloudLoginError(Exception):
11
    """ A login error occurred """
12
13
def catch_connection_error(func):
14
15
    @wraps(func)
16
    def wrapper(*args, **kwargs):
17
        try:
18
            return func(*args, **kwargs)
19
        except requests.RequestException as e:
20
            raise NextCloudConnectionError(
21
                'Failed to establish connection to NextCloud', getattr(e.request, 'url', None), e)
22
23
    return wrapper
24
25
26
class Session(object):
27
    """ Session for requesting """
28
29
    def __init__(self, url=None, user=None, password=None, auth=None, session_kwargs=None):
30
        self.session = None
31
        self.auth = None
32
        self.user = None
33
        self._set_credentials(user, password, auth)
34
        self.url = url
35
        self._session_kwargs = session_kwargs or {}
36
37
    def _set_credentials(self, user, password, auth):
38
        if auth:
39
            self.auth = auth
40
        if user:
41
            self.user = user
42
        else:
43
            if isinstance(self.auth, tuple):
44
                (self.user, password) = self.auth
45
                self.auth = None
46
            else:
47
                if isinstance(self.auth, requests.auth.AuthBase):
48
                    self.user = self.auth.username
49
        if not self.auth:
50
            self.auth = (self.user, encode_requests_password(password))
51
52
    def request(self, method, url, **kwargs):
53
        if self.session:
54
            return self.session.request(method=method, url=url, **kwargs)
55
        else:
56
            _kwargs = self._session_kwargs
57
            _kwargs.update(kwargs)
58
            if not kwargs.get('auth', False):
59
                _kwargs['auth'] = self.auth
60
            return requests.request(method, url, **_kwargs)
61
62
    def login(self, user=None, password=None, auth=None, client=None):
63
        """Create a stable session on the server.
64
65
        :param user_id: user id
66
        :param password: password
67
        :param auth: object for any auth method
68
        :param client: object for any auth method
69
        :raises: HTTPResponseError in case an HTTP error status was returned
70
        """
71
        self.session = requests.Session()
72
        for k in self._session_kwargs:
73
            setattr(self.session, k, self._session_kwargs[k])
74
75
        self._set_credentials(user, password, auth)
76
        self.session.auth = self.auth
77
        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:
87
                self.logout()
88
                raise e
89
90
    def logout(self):
91
        """Log out the authenticated user and close the session.
92
93
        :returns: True if the operation succeeded, False otherwise
94
        :raises: HTTPResponseError in case an HTTP error status was returned
95
        """
96
        self.session.close()
97
        self.session = None
98
        return True
99