54 lines
1.3 KiB
Python
54 lines
1.3 KiB
Python
from __future__ import annotations
|
|
|
|
from enum import Enum
|
|
from typing import Optional
|
|
|
|
from jose.constants import ALGORITHMS
|
|
from passlib.context import CryptContext
|
|
from peewee import Database, SqliteDatabase
|
|
from pydantic import BaseModel, Field
|
|
|
|
DB = SqliteDatabase("tmp/vpn.db")
|
|
PRODUCTION_MODE = False
|
|
|
|
# to get a string like this run:
|
|
# openssl rand -hex 32
|
|
SECRET_KEY = "2f7875b0d2be8a76eba8077ab4d9f8b1c749e02647e9ac9e0f909c3acbfc9856"
|
|
ALGORITHM = "HS256"
|
|
ACCESS_TOKEN_EXPIRE_MINUTES = 30
|
|
|
|
CRYPT_CONTEXT = CryptContext(schemes=["bcrypt"], deprecated="auto")
|
|
|
|
|
|
class DBType(Enum):
|
|
sqlite = "sqlite"
|
|
mysql = "mysql"
|
|
|
|
|
|
class DBConfig(BaseModel):
|
|
db_type: DBType = DBType.sqlite
|
|
|
|
@property
|
|
async def database(self) -> Database:
|
|
if self.db_type == DBType.sqlite:
|
|
return SqliteDatabase("tmp/vpn.db")
|
|
|
|
|
|
class JWTConfig(BaseModel):
|
|
secret: Optional[str] = None
|
|
hash_algorithm: str = ALGORITHMS.HS256
|
|
expiry_minutes: int = 30
|
|
|
|
|
|
class CryptoConfig(BaseModel):
|
|
schemes: list[str] = ["bcrypt"]
|
|
|
|
@property
|
|
async def cryptContext(self) -> CryptContext:
|
|
return CryptContext(schemes=self.schemes, deprecated="auto")
|
|
|
|
|
|
class BaseConfig(BaseModel):
|
|
db: DBConfig = Field(default_factory=DBConfig)
|
|
jwt: JWTConfig = Field(default_factory=JWTConfig)
|
|
crypto: CryptoConfig = Field(default_factory=CryptoConfig)
|