forked from open-webui/open-webui
		
	feat: admin settings
This commit is contained in:
		
							parent
							
								
									b0a07e5265
								
							
						
					
					
						commit
						511e939b5d
					
				
					 13 changed files with 526 additions and 51 deletions
				
			
		|  | @ -11,7 +11,15 @@ from apps.web.routers import ( | |||
|     configs, | ||||
|     utils, | ||||
| ) | ||||
| from config import WEBUI_VERSION, WEBUI_AUTH, DEFAULT_MODELS, DEFAULT_PROMPT_SUGGESTIONS, ENABLE_SIGNUP | ||||
| from config import ( | ||||
|     WEBUI_VERSION, | ||||
|     WEBUI_AUTH, | ||||
|     DEFAULT_MODELS, | ||||
|     DEFAULT_PROMPT_SUGGESTIONS, | ||||
|     DEFAULT_USER_ROLE, | ||||
|     ENABLE_SIGNUP, | ||||
|     USER_PERMISSIONS, | ||||
| ) | ||||
| 
 | ||||
| app = FastAPI() | ||||
| 
 | ||||
|  | @ -20,6 +28,9 @@ origins = ["*"] | |||
| app.state.ENABLE_SIGNUP = ENABLE_SIGNUP | ||||
| app.state.DEFAULT_MODELS = DEFAULT_MODELS | ||||
| app.state.DEFAULT_PROMPT_SUGGESTIONS = DEFAULT_PROMPT_SUGGESTIONS | ||||
| app.state.DEFAULT_USER_ROLE = DEFAULT_USER_ROLE | ||||
| app.state.USER_PERMISSIONS = USER_PERMISSIONS | ||||
| 
 | ||||
| 
 | ||||
| app.add_middleware( | ||||
|     CORSMiddleware, | ||||
|  |  | |||
|  | @ -19,7 +19,12 @@ from apps.web.models.auths import ( | |||
| ) | ||||
| from apps.web.models.users import Users | ||||
| 
 | ||||
| from utils.utils import get_password_hash, get_current_user, get_admin_user, create_token | ||||
| from utils.utils import ( | ||||
|     get_password_hash, | ||||
|     get_current_user, | ||||
|     get_admin_user, | ||||
|     create_token, | ||||
| ) | ||||
| from utils.misc import get_gravatar_url, validate_email_format | ||||
| from constants import ERROR_MESSAGES | ||||
| 
 | ||||
|  | @ -116,16 +121,24 @@ async def signin(form_data: SigninForm): | |||
| @router.post("/signup", response_model=SigninResponse) | ||||
| async def signup(request: Request, form_data: SignupForm): | ||||
|     if not request.app.state.ENABLE_SIGNUP: | ||||
|         raise HTTPException(status.HTTP_403_FORBIDDEN, detail=ERROR_MESSAGES.ACCESS_PROHIBITED) | ||||
|         raise HTTPException( | ||||
|             status.HTTP_403_FORBIDDEN, detail=ERROR_MESSAGES.ACCESS_PROHIBITED | ||||
|         ) | ||||
| 
 | ||||
|     if not validate_email_format(form_data.email.lower()): | ||||
|         raise HTTPException(status.HTTP_400_BAD_REQUEST, detail=ERROR_MESSAGES.INVALID_EMAIL_FORMAT) | ||||
|         raise HTTPException( | ||||
|             status.HTTP_400_BAD_REQUEST, detail=ERROR_MESSAGES.INVALID_EMAIL_FORMAT | ||||
|         ) | ||||
| 
 | ||||
|     if Users.get_user_by_email(form_data.email.lower()): | ||||
|         raise HTTPException(400, detail=ERROR_MESSAGES.EMAIL_TAKEN) | ||||
| 
 | ||||
|     try: | ||||
|         role = "admin" if Users.get_num_users() == 0 else "pending" | ||||
|         role = ( | ||||
|             "admin" | ||||
|             if Users.get_num_users() == 0 | ||||
|             else request.app.state.DEFAULT_USER_ROLE | ||||
|         ) | ||||
|         hashed = get_password_hash(form_data.password) | ||||
|         user = Auths.insert_new_auth( | ||||
|             form_data.email.lower(), hashed, form_data.name, role | ||||
|  | @ -164,3 +177,26 @@ async def get_sign_up_status(request: Request, user=Depends(get_admin_user)): | |||
| async def toggle_sign_up(request: Request, user=Depends(get_admin_user)): | ||||
|     request.app.state.ENABLE_SIGNUP = not request.app.state.ENABLE_SIGNUP | ||||
|     return request.app.state.ENABLE_SIGNUP | ||||
| 
 | ||||
| 
 | ||||
| ############################ | ||||
| # Default User Role | ||||
| ############################ | ||||
| 
 | ||||
| 
 | ||||
| @router.get("/signup/user/role") | ||||
| async def get_default_user_role(request: Request, user=Depends(get_admin_user)): | ||||
|     return request.app.state.DEFAULT_USER_ROLE | ||||
| 
 | ||||
| 
 | ||||
| class UpdateRoleForm(BaseModel): | ||||
|     role: str | ||||
| 
 | ||||
| 
 | ||||
| @router.post("/signup/user/role") | ||||
| async def update_default_user_role( | ||||
|     request: Request, form_data: UpdateRoleForm, user=Depends(get_admin_user) | ||||
| ): | ||||
|     if form_data.role in ["pending", "user", "admin"]: | ||||
|         request.app.state.DEFAULT_USER_ROLE = form_data.role | ||||
|     return request.app.state.DEFAULT_USER_ROLE | ||||
|  |  | |||
|  | @ -165,7 +165,17 @@ async def update_chat_by_id( | |||
| 
 | ||||
| 
 | ||||
| @router.delete("/{id}", response_model=bool) | ||||
| async def delete_chat_by_id(id: str, user=Depends(get_current_user)): | ||||
| async def delete_chat_by_id(request: Request, id: str, user=Depends(get_current_user)): | ||||
| 
 | ||||
|     if ( | ||||
|         user.role == "user" | ||||
|         and not request.app.state.USER_PERMISSIONS["chat"]["deletion"] | ||||
|     ): | ||||
|         raise HTTPException( | ||||
|             status_code=status.HTTP_401_UNAUTHORIZED, | ||||
|             detail=ERROR_MESSAGES.ACCESS_PROHIBITED, | ||||
|         ) | ||||
| 
 | ||||
|     result = Chats.delete_chat_by_id_and_user_id(id, user.id) | ||||
|     return result | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| from fastapi import Response | ||||
| from fastapi import Response, Request | ||||
| from fastapi import Depends, FastAPI, HTTPException, status | ||||
| from datetime import datetime, timedelta | ||||
| from typing import List, Union, Optional | ||||
|  | @ -26,6 +26,24 @@ async def get_users(skip: int = 0, limit: int = 50, user=Depends(get_admin_user) | |||
|     return Users.get_users(skip, limit) | ||||
| 
 | ||||
| 
 | ||||
| ############################ | ||||
| # User Permissions | ||||
| ############################ | ||||
| 
 | ||||
| 
 | ||||
| @router.get("/permissions/user") | ||||
| async def get_user_permissions(request: Request, user=Depends(get_admin_user)): | ||||
|     return request.app.state.USER_PERMISSIONS | ||||
| 
 | ||||
| 
 | ||||
| @router.post("/permissions/user") | ||||
| async def update_user_permissions( | ||||
|     request: Request, form_data: dict, user=Depends(get_admin_user) | ||||
| ): | ||||
|     request.app.state.USER_PERMISSIONS = form_data | ||||
|     return request.app.state.USER_PERMISSIONS | ||||
| 
 | ||||
| 
 | ||||
| ############################ | ||||
| # UpdateUserRole | ||||
| ############################ | ||||
|  |  | |||
|  | @ -93,6 +93,9 @@ DEFAULT_PROMPT_SUGGESTIONS = os.environ.get( | |||
|         }, | ||||
|     ], | ||||
| ) | ||||
| DEFAULT_USER_ROLE = "pending" | ||||
| USER_PERMISSIONS = {"chat": {"deletion": True}} | ||||
| 
 | ||||
| 
 | ||||
| #################################### | ||||
| # WEBUI_VERSION | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Timothy J. Baek
						Timothy J. Baek