53 lines
1.2 KiB
Python
53 lines
1.2 KiB
Python
import getpass
|
|
from abc import ABC, abstractmethod
|
|
from .config import Config
|
|
from .utils import typename
|
|
|
|
|
|
HEADER_JSON = {
|
|
"Content-type": "application/json",
|
|
"Accept": "application/json"
|
|
}
|
|
|
|
|
|
class AuthMixin(ABC):
|
|
|
|
def __init__(self, address):
|
|
self.address = address.rstrip("/")
|
|
self._token = None
|
|
tn = typename(self).lower()
|
|
self.config = Config(f".{tn}-tokens")
|
|
|
|
def __repr__(self):
|
|
tn = typename(self)
|
|
return f"{tn} @ {self.address}"
|
|
|
|
@abstractmethod
|
|
def authenticate(self, username, password):
|
|
raise NotImplementedError
|
|
|
|
@property
|
|
def token(self):
|
|
return self._retrieve_token()
|
|
|
|
def _retrieve_token(self):
|
|
username = input("Username: ")
|
|
token = self._token
|
|
if token is None:
|
|
try:
|
|
token = self.config[username]
|
|
except KeyError:
|
|
tn = typename(self)
|
|
password = getpass.getpass(prompt=f"{tn} password for {username}: ")
|
|
token = self.authenticate(username, password)
|
|
self.config[username] = self._token = token
|
|
return token
|
|
|
|
|
|
|
|
class AuthError(Exception):
|
|
pass
|
|
|
|
|
|
|