"install" endpoint

This commit is contained in:
Jörn-Michael Miehe 2022-03-19 17:11:52 +00:00
parent b38216a223
commit b70806195e
2 changed files with 59 additions and 47 deletions

View file

@ -8,6 +8,29 @@ from ..db import Connection, schemas
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="user/auth") oauth2_scheme = OAuth2PasswordBearer(tokenUrl="user/auth")
# just a namespace
class Responses:
ok = {
"content": None,
}
installed = {
"description": "kiwi-vpn already installed",
"content": None,
}
not_installed = {
"description": "kiwi-vpn not installed",
"content": None,
}
needs_user = {
"description": "Must be logged in",
"content": None,
}
needs_admin = {
"description": "Must be admin",
"content": None,
}
async def get_current_user( async def get_current_user(
token: str = Depends(oauth2_scheme), token: str = Depends(oauth2_scheme),
db: Session | None = Depends(Connection.get), db: Session | None = Depends(Connection.get),

View file

@ -1,7 +1,4 @@
from secrets import token_hex
from fastapi import APIRouter, Depends, HTTPException, status from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.orm import Session
from ..config import Config from ..config import Config
from ..db import Connection, schemas from ..db import Connection, schemas
@ -10,61 +7,53 @@ from . import _deps
router = APIRouter(prefix="/admin") router = APIRouter(prefix="/admin")
@router.put(
"/install",
responses={
status.HTTP_200_OK: _deps.Responses.ok,
status.HTTP_400_BAD_REQUEST: _deps.Responses.installed,
},
)
async def install(
config: Config,
user: schemas.UserCreate,
current_config: Config | None = Depends(Config.load),
):
if current_config is not None:
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST)
await config.save()
Connection.connect(await config.db.db_engine)
async for db in Connection.get():
user.capabilities.append("admin")
schemas.User.create(
db=db,
user=user,
crypt_context=await config.crypto.crypt_context,
)
@router.put( @router.put(
"/config", "/config",
responses={ responses={
status.HTTP_200_OK: { status.HTTP_200_OK: _deps.Responses.ok,
"content": None, status.HTTP_400_BAD_REQUEST: _deps.Responses.not_installed,
}, status.HTTP_401_UNAUTHORIZED: _deps.Responses.needs_user,
status.HTTP_403_FORBIDDEN: { status.HTTP_403_FORBIDDEN: _deps.Responses.needs_admin,
"description": "Must be admin",
"content": None,
},
}, },
) )
async def set_config( async def set_config(
new_config: Config, new_config: Config,
current_config: Config | None = Depends(Config.load), current_config: Config | None = Depends(Config.load),
current_user: schemas.User | None = Depends(_deps.get_current_user), current_user: schemas.User | None = Depends(_deps.get_current_user),
):
print(current_config, current_user)
if current_config is not None:
# server is configured, needs authorization
if current_user is None or "admin" not in current_user.capabilities:
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN)
if new_config.jwt.secret is None:
new_config.jwt.secret = token_hex(32)
await new_config.save()
Connection.connect(await new_config.db.db_engine)
@router.post(
"/user",
responses={
status.HTTP_200_OK: {
"content": None,
},
status.HTTP_400_BAD_REQUEST: {
"description": "Server is not configured",
"content": None,
},
},
)
async def add_user(
user: schemas.UserCreate,
current_config: Config | None = Depends(Config.load),
db: Session | None = Depends(Connection.get),
): ):
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)
user.capabilities.append("admin") if current_user is None or "admin" not in current_user.capabilities:
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN)
schemas.User.create( await new_config.save()
db=db, Connection.connect(await new_config.db.db_engine)
user=user,
crypt_context=await current_config.crypto.crypt_context,
)