File: credentials.py

package info (click to toggle)
orange3 3.40.0-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 15,912 kB
  • sloc: python: 162,745; ansic: 622; makefile: 322; sh: 93; cpp: 77
file content (52 lines) | stat: -rw-r--r-- 1,522 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import logging

import keyring

SERVICE_NAME = 'Orange3 - {}'

log = logging.getLogger(__name__)


class CredentialManager:
    """
    Class for storage of passwords in the system keyring service.
    All attributes of this class are safely stored.

    Args:
        service_name (str): service name used for storing in keyring.

    Examples:
        >>> cm = CredentialManager('Widget Name')
        >>> cm.some_secret = 'api-key-1234'
        >>> cm.some_secret
        'api-key-1234'
        >>> del cm.some_secret
        >>> cm.some_secret
    """
    def __init__(self, service_name):
        self.__dict__['__service_name'] = SERVICE_NAME.format(service_name)

    @property
    def service_name(self):
        return self.__dict__['__service_name']

    def __setattr__(self, key, value):
        try:
            keyring.set_password(self.service_name, key, value)
        except Exception:
            log.exception("Failed to set secret '%s' of '%r'.",
                          key, self.service_name)

    def __getattr__(self, item):
        try:
            return keyring.get_password(self.service_name, item)
        except Exception:
            log.exception("Failed to get secret '%s' of '%r'.",
                          item, self.service_name)

    def __delattr__(self, item):
        try:
            keyring.delete_password(self.service_name, item)
        except Exception:
            log.exception("Failed to delete secret '%s' of '%r'.",
                          item, self.service_name)