Whitelableing for Logo / Name via Admin panel

This commit is contained in:
Weves
2024-04-07 14:02:38 -07:00
committed by Chris Weaver
parent fa8cc10063
commit 153007c57c
20 changed files with 470 additions and 41 deletions

View File

@@ -19,6 +19,12 @@ from danswer.utils.variable_functionality import global_version
from ee.danswer.configs.app_configs import OPENID_CONFIG_URL
from ee.danswer.server.analytics.api import router as analytics_router
from ee.danswer.server.api_key.api import router as api_key_router
from ee.danswer.server.enterprise_settings.api import (
admin_router as enterprise_settings_admin_router,
)
from ee.danswer.server.enterprise_settings.api import (
basic_router as enterprise_settings_router,
)
from ee.danswer.server.query_and_chat.chat_backend import (
router as chat_router,
)
@@ -74,6 +80,11 @@ def get_ee_application() -> FastAPI:
# EE only backend APIs
include_router_with_global_prefix_prepended(application, query_router)
include_router_with_global_prefix_prepended(application, chat_router)
# Enterprise-only global settings
include_router_with_global_prefix_prepended(
application, enterprise_settings_admin_router
)
include_router_with_global_prefix_prepended(application, enterprise_settings_router)
return application

View File

@@ -0,0 +1,65 @@
from fastapi import APIRouter
from fastapi import Depends
from fastapi import HTTPException
from fastapi import UploadFile
from fastapi.responses import StreamingResponse
from sqlalchemy.orm import Session
from danswer.auth.users import current_admin_user
from danswer.db.engine import get_session
from danswer.db.file_store import get_default_file_store
from danswer.db.models import User
from ee.danswer.server.enterprise_settings.models import EnterpriseSettings
from ee.danswer.server.enterprise_settings.store import load_settings
from ee.danswer.server.enterprise_settings.store import store_settings
admin_router = APIRouter(prefix="/admin/enterprise-settings")
basic_router = APIRouter(prefix="/enterprise-settings")
@admin_router.put("")
def put_settings(
settings: EnterpriseSettings, _: User | None = Depends(current_admin_user)
) -> None:
try:
settings.check_validity()
except ValueError as e:
raise HTTPException(status_code=400, detail=str(e))
store_settings(settings)
@basic_router.get("")
def fetch_settings() -> EnterpriseSettings:
return load_settings()
_LOGO_FILENAME = "__logo__"
@admin_router.put("/logo")
def upload_logo(
file: UploadFile,
db_session: Session = Depends(get_session),
_: User | None = Depends(current_admin_user),
) -> None:
if (
not file.filename.endswith(".png")
and not file.filename.endswith(".jpg")
and not file.filename.endswith(".jpeg")
):
raise HTTPException(
status_code=400,
detail="Invalid file type - only .png, .jpg, and .jpeg files are allowed",
)
# Save the file to the server
file_store = get_default_file_store(db_session)
file_store.save_file(_LOGO_FILENAME, file.file)
@basic_router.get("/logo")
def fetch_logo(db_session: Session = Depends(get_session)) -> StreamingResponse:
file_store = get_default_file_store(db_session)
file_io = file_store.read_file(_LOGO_FILENAME, mode="b")
return StreamingResponse(content=file_io, media_type="image/jpeg")

View File

@@ -0,0 +1,13 @@
from pydantic import BaseModel
class EnterpriseSettings(BaseModel):
"""General settings that only apply to the Enterprise Edition of Danswer
NOTE: don't put anything sensitive in here, as this is accessible without auth."""
application_name: str | None = None
use_custom_logo: bool = False
def check_validity(self) -> None:
return

View File

@@ -0,0 +1,25 @@
from typing import cast
from danswer.dynamic_configs.factory import get_dynamic_config_store
from danswer.dynamic_configs.interface import ConfigNotFoundError
from ee.danswer.server.enterprise_settings.models import EnterpriseSettings
_ENTERPRISE_SETTINGS_KEY = "danswer_enterprise_settings"
def load_settings() -> EnterpriseSettings:
dynamic_config_store = get_dynamic_config_store()
try:
settings = EnterpriseSettings(
**cast(dict, dynamic_config_store.load(_ENTERPRISE_SETTINGS_KEY))
)
except ConfigNotFoundError:
settings = EnterpriseSettings()
dynamic_config_store.store(_ENTERPRISE_SETTINGS_KEY, settings.dict())
return settings
def store_settings(settings: EnterpriseSettings) -> None:
get_dynamic_config_store().store(_ENTERPRISE_SETTINGS_KEY, settings.dict())