mirror of
https://github.com/enpaul/keyosk.git
synced 2024-11-24 23:47:49 +00:00
Add account model definition
This commit is contained in:
parent
425d39cd48
commit
fc4eb38c9e
106
keyosk/database/account.py
Normal file
106
keyosk/database/account.py
Normal file
@ -0,0 +1,106 @@
|
||||
"""Authentication account model definition"""
|
||||
import datetime
|
||||
import json
|
||||
import secrets
|
||||
from typing import List
|
||||
|
||||
import passlib.hash
|
||||
import peewee
|
||||
|
||||
from keyosk.database._shared import KeyoskBaseModel
|
||||
from keyosk.database.domain import Domain
|
||||
from keyosk.datatypes import Extras
|
||||
|
||||
|
||||
class Account(KeyoskBaseModel):
|
||||
"""Authentication account storage model
|
||||
|
||||
:attribute created: Datetime indicating when the account was first created
|
||||
:attribute updated: Datetime indicating when the account was last modified
|
||||
:attribute username: Account authentication identity
|
||||
:attribute encrypted_client_set_secret: Client-provided account authentication
|
||||
secret
|
||||
:attribute encrypted_server_set_secret: Server-provided account authentication
|
||||
secret
|
||||
:attribute enabled: Whether the account is enabled for authentication
|
||||
:property extras: Key/value pairs of arbitrary additional infomration for the
|
||||
account
|
||||
"""
|
||||
|
||||
class Meta: # pylint: disable=missing-docstring,too-few-public-methods
|
||||
table_name = "account"
|
||||
|
||||
created = peewee.DateTimeField(null=False, default=datetime.datetime.utcnow)
|
||||
updated = peewee.DateTimeField(null=False, default=datetime.datetime.utcnow)
|
||||
username = peewee.CharField(null=False, unique=True)
|
||||
encrypted_client_set_secret = peewee.CharField(null=False)
|
||||
encrypted_server_set_secret = peewee.CharField(null=False)
|
||||
enabled = peewee.BooleanField(null=False)
|
||||
_extras = peewee.CharField(null=False, default="{}")
|
||||
|
||||
@property
|
||||
def extras(self) -> Extras:
|
||||
"""Return the loaded extras dictionary"""
|
||||
return json.loads(self._extras)
|
||||
|
||||
@extras.setter
|
||||
def extras(self, value: Extras):
|
||||
"""Set the extras dictionary"""
|
||||
self._extras = json.dumps(value)
|
||||
|
||||
def verify_client_set_secret(self, value: str) -> bool:
|
||||
"""Verify the client set secret matches a value
|
||||
|
||||
:param value: The string to check matches the client-set-secret
|
||||
:returns: Boolean indicating whether the provided value matches the encrypted
|
||||
secret
|
||||
"""
|
||||
return passlib.hash.pbkdf2_sha512.verify(
|
||||
value, self.encrypted_client_set_secret
|
||||
)
|
||||
|
||||
def verify_server_set_secret(self, value: str) -> bool:
|
||||
"""Verify the server set secret matches a value
|
||||
|
||||
:param value: The string to check matches the server-set-secret
|
||||
:returns: Boolean indicating whether the provided value matches the encrypted
|
||||
secret
|
||||
"""
|
||||
return passlib.hash.pdkdf2_sha512.verify(
|
||||
value, self.encrypted_server_set_secret
|
||||
)
|
||||
|
||||
def update_client_set_secret(self, value: str) -> None:
|
||||
"""Update the client set secret
|
||||
|
||||
:param value: The string to set the encrypted client-set-secret to
|
||||
"""
|
||||
self.encrypted_client_set_secret = passlib.hash.pdkdf2_sha512.hash(value)
|
||||
|
||||
def update_server_set_secret(self, length: int = 42) -> str:
|
||||
"""Update the server set secret
|
||||
|
||||
:param length: Optional length of the generated token
|
||||
:returns: The new value of the server set secret
|
||||
"""
|
||||
value = secrets.token_urlsafe(length)
|
||||
self.encrypted_server_set_secret = passlib.hash.pdkdf2_sha512.hash(value)
|
||||
return value
|
||||
|
||||
@staticmethod
|
||||
def dict_keys() -> List[str]:
|
||||
return ["uuid", "created", "updated", "username", "enabled", "extras"]
|
||||
|
||||
|
||||
class AccountAssignment(KeyoskBaseModel):
|
||||
"""Many-to-many mapping for assigning accounts to domains
|
||||
|
||||
:attribute account: Account to assign to a domain
|
||||
:attribute domain: Domain to assign an account to
|
||||
"""
|
||||
|
||||
class Meta: # pylint: disable=missing-docstring,too-few-public-methods
|
||||
table_name = "account_assignment"
|
||||
|
||||
account = peewee.ForeignKeyField(Account)
|
||||
domain = peewee.ForeignKeyField(Domain)
|
Loading…
Reference in New Issue
Block a user