default values and /install/config routing

This commit is contained in:
Jörn-Michael Miehe 2022-03-16 00:51:40 +00:00
parent d136363256
commit 663196c493
2 changed files with 32 additions and 27 deletions

View file

@ -1,6 +1,7 @@
from __future__ import annotations from __future__ import annotations
from enum import Enum from enum import Enum
import json
from pathlib import Path from pathlib import Path
from typing import Optional from typing import Optional
@ -20,8 +21,6 @@ ACCESS_TOKEN_EXPIRE_MINUTES = 30
CRYPT_CONTEXT = CryptContext(schemes=["bcrypt"], deprecated="auto") CRYPT_CONTEXT = CryptContext(schemes=["bcrypt"], deprecated="auto")
CONFIG_FILE = "tmp/config.json"
class DBType(Enum): class DBType(Enum):
sqlite = "sqlite" sqlite = "sqlite"
@ -29,7 +28,7 @@ class DBType(Enum):
class DBConfig(BaseModel): class DBConfig(BaseModel):
db_type: DBType = "sqlite" db_type: DBType = DBType.sqlite
@property @property
def database(self) -> Database: def database(self) -> Database:
@ -58,3 +57,19 @@ class BaseConfig(BaseModel):
def save(self, filename: Path) -> None: def save(self, filename: Path) -> None:
with open(filename, "w") as kv: with open(filename, "w") as kv:
kv.write(self.json(indent=2)) kv.write(self.json(indent=2))
CONFIG_FILE = "tmp/config.json"
async def get_default_config() -> BaseConfig:
return BaseConfig()
async def is_configured() -> bool:
return Path(CONFIG_FILE).is_file()
async def get_config() -> BaseConfig:
with open(CONFIG_FILE, "r") as kv:
return BaseConfig.parse_obj(json.load(kv))

View file

@ -1,35 +1,22 @@
import json from secrets import token_hex
from pathlib import Path
from fastapi import APIRouter, Depends, status from fastapi import APIRouter, Depends, status
from fastapi.responses import JSONResponse from fastapi.responses import JSONResponse
from ..config import CONFIG_FILE, CRYPT_CONTEXT, DB, BaseConfig from ..config import (CONFIG_FILE, CRYPT_CONTEXT, DB, BaseConfig, get_config,
get_default_config, is_configured)
from ..db import Certificate, DistinguishedName, User, UserCapability from ..db import Certificate, DistinguishedName, User, UserCapability
router = APIRouter(prefix="/install") router = APIRouter(prefix="/install")
async def get_default_config() -> BaseConfig: @router.get("/config/default", response_model=BaseConfig)
return BaseConfig() async def get_default_config(config: BaseConfig = Depends(get_default_config)):
async def get_config() -> BaseConfig:
with open(CONFIG_FILE, "r") as kv:
return BaseConfig.parse_obj(json.load(kv))
async def is_configured() -> bool:
return Path(CONFIG_FILE).is_file()
@router.get("/config/get_default", response_model=BaseConfig)
async def config_get_default(config: BaseConfig = Depends(get_default_config)):
return config return config
@router.get( @router.get(
"/config/get", "/config",
response_model=BaseConfig, response_model=BaseConfig,
responses={ responses={
status.HTTP_404_NOT_FOUND: { status.HTTP_404_NOT_FOUND: {
@ -38,9 +25,9 @@ async def config_get_default(config: BaseConfig = Depends(get_default_config)):
}, },
}, },
) )
async def config_get( async def get_config(
config: BaseConfig = Depends(get_config),
is_configured: bool = Depends(is_configured), is_configured: bool = Depends(is_configured),
config: BaseConfig = Depends(get_config),
): ):
if not is_configured: if not is_configured:
return JSONResponse(status_code=status.HTTP_404_NOT_FOUND) return JSONResponse(status_code=status.HTTP_404_NOT_FOUND)
@ -48,8 +35,8 @@ async def config_get(
return config return config
@router.post( @router.put(
"/config/set", "/config",
responses={ responses={
status.HTTP_200_OK: { status.HTTP_200_OK: {
"content": None, "content": None,
@ -60,13 +47,16 @@ async def config_get(
}, },
}, },
) )
async def config_set( async def set_config(
config: BaseConfig, config: BaseConfig,
is_configured: bool = Depends(is_configured), is_configured: bool = Depends(is_configured),
): ):
if is_configured: if is_configured:
return JSONResponse(status_code=status.HTTP_403_FORBIDDEN) return JSONResponse(status_code=status.HTTP_403_FORBIDDEN)
if config.jwt.secret is None:
config.jwt.secret = token_hex(32)
config.save(CONFIG_FILE) config.save(CONFIG_FILE)