kiwi-vpn/api/kiwi_vpn_api/routers/install.py

115 lines
2.6 KiB
Python
Raw Normal View History

2022-03-16 13:28:15 +00:00
import json
from pathlib import Path
from secrets import token_hex
2022-03-16 00:23:57 +00:00
from fastapi import APIRouter, Depends, status
from fastapi.responses import JSONResponse
2022-03-15 17:38:24 +00:00
2022-03-16 13:28:15 +00:00
from ..config import CRYPT_CONTEXT, DB, BaseConfig
from ..db import Certificate, DistinguishedName, User, UserCapability
2022-03-15 17:38:24 +00:00
router = APIRouter(prefix="/install")
2022-03-16 13:28:15 +00:00
CONFIG_FILE = "tmp/config.json"
async def has_config() -> bool:
return Path(CONFIG_FILE).is_file()
async def load_config() -> BaseConfig:
try:
with open(CONFIG_FILE, "r") as kv:
return BaseConfig.parse_obj(json.load(kv))
except FileNotFoundError:
return BaseConfig()
2022-03-16 00:23:57 +00:00
@router.get(
"/config",
2022-03-16 00:23:57 +00:00
response_model=BaseConfig,
responses={
2022-03-16 13:28:15 +00:00
status.HTTP_403_FORBIDDEN: {
"description": "Must be admin",
2022-03-16 00:23:57 +00:00
"content": None,
},
},
)
async def get_config(
2022-03-16 13:28:15 +00:00
config: BaseConfig = Depends(load_config),
has_config: bool = Depends(has_config),
2022-03-16 00:23:57 +00:00
):
2022-03-16 13:28:15 +00:00
if has_config:
return JSONResponse(status_code=status.HTTP_403_FORBIDDEN)
2022-03-16 00:23:57 +00:00
2022-03-16 13:28:15 +00:00
return config
2022-03-16 00:23:57 +00:00
@router.put(
"/config",
2022-03-16 00:23:57 +00:00
responses={
status.HTTP_200_OK: {
"content": None,
},
status.HTTP_403_FORBIDDEN: {
"description": "Must be admin",
"content": None,
},
},
)
async def set_config(
2022-03-16 00:23:57 +00:00
config: BaseConfig,
2022-03-16 13:28:15 +00:00
has_config: bool = Depends(has_config),
2022-03-16 00:23:57 +00:00
):
2022-03-16 13:28:15 +00:00
if has_config:
2022-03-16 00:23:57 +00:00
return JSONResponse(status_code=status.HTTP_403_FORBIDDEN)
if config.jwt.secret is None:
config.jwt.secret = token_hex(32)
2022-03-16 13:28:15 +00:00
with open(CONFIG_FILE, "w") as kv:
kv.write(config.json(indent=2))
2022-03-16 00:23:57 +00:00
2022-03-15 17:38:24 +00:00
async def is_installed():
return DB.table_exists(User)
@router.get("/check_installed", responses={
status.HTTP_200_OK: {
"model": bool,
},
})
2022-03-15 17:38:24 +00:00
async def check_installed(is_installed: bool = Depends(is_installed)):
return is_installed
2022-03-16 00:23:57 +00:00
@router.get(
"/create_db",
responses={
status.HTTP_200_OK: {
"content": None,
},
status.HTTP_400_BAD_REQUEST: {
"description": "Could not create Database",
"content": None,
},
},
2022-03-16 00:23:57 +00:00
)
2022-03-15 17:38:24 +00:00
async def create_db(is_installed: bool = Depends(is_installed)):
if is_installed:
return JSONResponse(
status_code=status.HTTP_400_BAD_REQUEST,
)
2022-03-15 17:38:24 +00:00
DB.create_tables([Certificate, DistinguishedName, User, UserCapability])
admin = User.create(name="admin", password=CRYPT_CONTEXT.hash("secret"))
UserCapability.create(user=admin, capability="admin")
User.create(name="johndoe", password=CRYPT_CONTEXT.hash("secret"))
DB.close()