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

nextcloud.session.Session.logout()   A

Complexity

Conditions 1

Size

Total Lines 9
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 4
dl 0
loc 9
rs 10
c 0
b 0
f 0
cc 1
nop 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
11
def catch_connection_error(func):
12
13
    @wraps(func)
14
    def wrapper(*args, **kwargs):
15
        try:
16
            return func(*args, **kwargs)
17
        except requests.RequestException as e:
18
            raise NextCloudConnectionError(
19
                'Failed to establish connection to NextCloud', getattr(e.request, 'url', None), e)
20
21
    return wrapper
22
23
24
class Session(object):
25
    """ Session for requesting """
26
27
    def __init__(self, url=None, user=None, password=None, auth=None, session_kwargs=None):
28
        self.session = None
29
        self.auth = None
30
        self.user = None
31
        self._set_credentials(user, password, auth)
32
        self.url = url
33
        self._session_kwargs = session_kwargs or {}
34
35
    def _set_credentials(self, user, password, auth):
36
        if auth:
37
            self.auth = auth
38
        if user:
39
            self.user = user
40
        else:
41
            if isinstance(self.auth, tuple):
42
                (self.user, password) = self.auth
43
                self.auth = None
44
            else:
45
                if isinstance(self.auth, requests.auth.AuthBase):
46
                    self.user = self.auth.username
47
        if not self.auth:
48
            self.auth = (self.user, encode_requests_password(password))
49
50
    def request(self, method, url, **kwargs):
51
        if self.session:
52
            return self.session.request(method=method, url=url, **kwargs)
53
        else:
54
            _kwargs = self._session_kwargs
55
            _kwargs.update(kwargs)
56
            if not kwargs.get('auth', False):
57
                _kwargs['auth'] = self.auth
58
            return requests.request(method, url, **_kwargs)
59
60
    @catch_connection_error
61
    def login(self, user=None, password=None, auth=None, client=None):
62
        """Create a stable session on the server.
63
64
        :param user_id: user id
65
        :param password: password
66
        :param auth: object for any auth method
67
        :param client: object for any auth method
68
        :raises: HTTPResponseError in case an HTTP error status was returned
69
        """
70
        self.session = requests.Session()
71
        for k in self._session_kwargs:
72
            setattr(self.session, k, self._session_kwargs[k])
73
74
        self._set_credentials(user, password, auth)
75
        self.session.auth = self.auth
76
        if client:
77
            try:
78
                resp = client.with_attr(json_output=True).get_user()
79
                if not resp.is_ok:
80
                    raise NextCloudConnectionError(
81
                        'Failed to login to NextCloud', self.url, resp)
82
            except requests.exceptions.SSLError as e:
83
                self.logout()
84
                raise e
85
            except Exception as e:
86
                self.logout()
87
                raise e
88
89
    def logout(self):
90
        """Log out the authenticated user and close the session.
91
92
        :returns: True if the operation succeeded, False otherwise
93
        :raises: HTTPResponseError in case an HTTP error status was returned
94
        """
95
        self.session.close()
96
        self.session = None
97
        return True
98