move caps to "User" schema

This commit is contained in:
Jörn-Michael Miehe 2022-03-19 18:31:03 +00:00
parent be9454eb48
commit 5eb9d4d113
4 changed files with 26 additions and 21 deletions

View file

@ -29,6 +29,9 @@ class UserCapability(ORMBaseModel):
) )
capability = Column(String, primary_key=True) capability = Column(String, primary_key=True)
def __str__(self) -> str:
return self.capability
class DistinguishedName(ORMBaseModel): class DistinguishedName(ORMBaseModel):
__tablename__ = "distinguished_names" __tablename__ = "distinguished_names"

View file

@ -1,6 +1,7 @@
from __future__ import annotations from __future__ import annotations
from datetime import datetime from datetime import datetime
from enum import Enum
from passlib.context import CryptContext from passlib.context import CryptContext
from pydantic import BaseModel, validator from pydantic import BaseModel, validator
@ -26,22 +27,12 @@ class Certificate(CertificateBase):
orm_mode = True orm_mode = True
class UserCapability(Enum):
admin = "admin"
class UserBase(BaseModel): class UserBase(BaseModel):
name: str name: str
capabilities: list[str]
@validator("capabilities", pre=True)
@classmethod
def unify_capabilities(
cls,
value: list[models.UserCapability | str]
) -> list[str]:
return [
capability.capability
if isinstance(capability, models.UserCapability)
else str(capability)
for capability in value
]
class UserCreate(UserBase): class UserCreate(UserBase):
@ -50,10 +41,22 @@ class UserCreate(UserBase):
class User(UserBase): class User(UserBase):
certificates: list[Certificate] certificates: list[Certificate]
capabilities: list[UserCapability]
class Config: class Config:
orm_mode = True orm_mode = True
@validator("capabilities", pre=True)
@classmethod
def unify_capabilities(
cls,
value: list[models.UserCapability | str]
) -> list[UserCapability]:
return [
UserCapability(str(capability))
for capability in value
]
@classmethod @classmethod
def from_db( def from_db(
cls, cls,
@ -105,10 +108,7 @@ class User(UserBase):
user = models.User( user = models.User(
name=user.name, name=user.name,
password=crypt_context.hash(user.password), password=crypt_context.hash(user.password),
capabilities=[ capabilities=[models.UserCapability(capability="admin")],
models.UserCapability(capability=capability)
for capability in user.capabilities
]
) )
db.add(user) db.add(user)

View file

@ -26,7 +26,7 @@ async def install(
Connection.connect(await config.db.db_engine) Connection.connect(await config.db.db_engine)
async for db in Connection.get(): async for db in Connection.get():
user.capabilities.append("admin") # user.capabilities.append("admin")
schemas.User.create( schemas.User.create(
db=db, db=db,
@ -52,7 +52,8 @@ async def set_config(
if current_config is None: if current_config is None:
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST) raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST)
if current_user is None or "admin" not in current_user.capabilities: if (current_user is None
or schemas.UserCapability.admin not in current_user.capabilities):
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN) raise HTTPException(status_code=status.HTTP_403_FORBIDDEN)
await new_config.save() await new_config.save()

View file

@ -69,7 +69,8 @@ async def add_user(
if current_config is None: if current_config is None:
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST) raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST)
if current_user is None or "admin" not in current_user.capabilities: if (current_user is None
or schemas.UserCapability.admin not in current_user.capabilities):
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN) raise HTTPException(status_code=status.HTTP_403_FORBIDDEN)
new_user = schemas.User.create( new_user = schemas.User.create(