forked from open-webui/open-webui
		
	Merge pull request #1688 from cheahjs/feat/disable-all-users-export
feat: add ALLOW_ADMIN_EXPORT to disable exporting of chats and the db
This commit is contained in:
		
						commit
						48e37973a3
					
				
					 6 changed files with 44 additions and 28 deletions
				
			
		|  | @ -28,7 +28,7 @@ from apps.web.models.tags import ( | |||
| 
 | ||||
| from constants import ERROR_MESSAGES | ||||
| 
 | ||||
| from config import SRC_LOG_LEVELS | ||||
| from config import SRC_LOG_LEVELS, ENABLE_ADMIN_EXPORT | ||||
| 
 | ||||
| log = logging.getLogger(__name__) | ||||
| log.setLevel(SRC_LOG_LEVELS["MODELS"]) | ||||
|  | @ -79,6 +79,11 @@ async def get_all_user_chats(user=Depends(get_current_user)): | |||
| 
 | ||||
| @router.get("/all/db", response_model=List[ChatResponse]) | ||||
| async def get_all_user_chats_in_db(user=Depends(get_admin_user)): | ||||
|     if not ENABLE_ADMIN_EXPORT: | ||||
|         raise HTTPException( | ||||
|             status_code=status.HTTP_401_UNAUTHORIZED, | ||||
|             detail=ERROR_MESSAGES.ACCESS_PROHIBITED, | ||||
|         ) | ||||
|     return [ | ||||
|         ChatResponse(**{**chat.model_dump(), "chat": json.loads(chat.chat)}) | ||||
|         for chat in Chats.get_all_chats() | ||||
|  |  | |||
|  | @ -91,7 +91,11 @@ async def download_chat_as_pdf( | |||
| 
 | ||||
| @router.get("/db/download") | ||||
| async def download_db(user=Depends(get_admin_user)): | ||||
| 
 | ||||
|     if not ENABLE_ADMIN_EXPORT: | ||||
|         raise HTTPException( | ||||
|             status_code=status.HTTP_401_UNAUTHORIZED, | ||||
|             detail=ERROR_MESSAGES.ACCESS_PROHIBITED, | ||||
|         ) | ||||
|     return FileResponse( | ||||
|         f"{DATA_DIR}/webui.db", | ||||
|         media_type="application/octet-stream", | ||||
|  |  | |||
|  | @ -382,6 +382,8 @@ MODEL_FILTER_LIST = [model.strip() for model in MODEL_FILTER_LIST.split(";")] | |||
| 
 | ||||
| WEBHOOK_URL = os.environ.get("WEBHOOK_URL", "") | ||||
| 
 | ||||
| ENABLE_ADMIN_EXPORT = os.environ.get("ENABLE_ADMIN_EXPORT", "True").lower() == "true" | ||||
| 
 | ||||
| #################################### | ||||
| # WEBUI_VERSION | ||||
| #################################### | ||||
|  |  | |||
|  | @ -52,6 +52,7 @@ from config import ( | |||
|     GLOBAL_LOG_LEVEL, | ||||
|     SRC_LOG_LEVELS, | ||||
|     WEBHOOK_URL, | ||||
|     ENABLE_ADMIN_EXPORT, | ||||
| ) | ||||
| from constants import ERROR_MESSAGES | ||||
| 
 | ||||
|  | @ -207,6 +208,7 @@ async def get_app_config(): | |||
|         "default_models": webui_app.state.DEFAULT_MODELS, | ||||
|         "default_prompt_suggestions": webui_app.state.DEFAULT_PROMPT_SUGGESTIONS, | ||||
|         "trusted_header_auth": bool(webui_app.state.AUTH_TRUSTED_EMAIL_HEADER), | ||||
|         "admin_export_enabled": ENABLE_ADMIN_EXPORT, | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,6 +1,7 @@ | |||
| <script lang="ts"> | ||||
| 	import { downloadDatabase } from '$lib/apis/utils'; | ||||
| 	import { onMount, getContext } from 'svelte'; | ||||
| 	import { config } from '$lib/stores'; | ||||
| 
 | ||||
| 	const i18n = getContext('i18n'); | ||||
| 
 | ||||
|  | @ -24,32 +25,34 @@ | |||
| 			<div class="  flex w-full justify-between"> | ||||
| 				<!-- <div class=" self-center text-xs font-medium">{$i18n.t('Allow Chat Deletion')}</div> --> | ||||
| 
 | ||||
| 				<button | ||||
| 					class=" flex rounded-md py-1.5 px-3 w-full hover:bg-gray-200 dark:hover:bg-gray-800 transition" | ||||
| 					type="button" | ||||
| 					on:click={() => { | ||||
| 						// exportAllUserChats(); | ||||
| 				{#if $config?.admin_export_enabled ?? true} | ||||
| 					<button | ||||
| 						class=" flex rounded-md py-1.5 px-3 w-full hover:bg-gray-200 dark:hover:bg-gray-800 transition" | ||||
| 						type="button" | ||||
| 						on:click={() => { | ||||
| 							// exportAllUserChats(); | ||||
| 
 | ||||
| 						downloadDatabase(localStorage.token); | ||||
| 					}} | ||||
| 				> | ||||
| 					<div class=" self-center mr-3"> | ||||
| 						<svg | ||||
| 							xmlns="http://www.w3.org/2000/svg" | ||||
| 							viewBox="0 0 16 16" | ||||
| 							fill="currentColor" | ||||
| 							class="w-4 h-4" | ||||
| 						> | ||||
| 							<path d="M2 3a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V3Z" /> | ||||
| 							<path | ||||
| 								fill-rule="evenodd" | ||||
| 								d="M13 6H3v6a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V6ZM8.75 7.75a.75.75 0 0 0-1.5 0v2.69L6.03 9.22a.75.75 0 0 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l2.5-2.5a.75.75 0 1 0-1.06-1.06l-1.22 1.22V7.75Z" | ||||
| 								clip-rule="evenodd" | ||||
| 							/> | ||||
| 						</svg> | ||||
| 					</div> | ||||
| 					<div class=" self-center text-sm font-medium">{$i18n.t('Download Database')}</div> | ||||
| 				</button> | ||||
| 							downloadDatabase(localStorage.token); | ||||
| 						}} | ||||
| 					> | ||||
| 						<div class=" self-center mr-3"> | ||||
| 							<svg | ||||
| 								xmlns="http://www.w3.org/2000/svg" | ||||
| 								viewBox="0 0 16 16" | ||||
| 								fill="currentColor" | ||||
| 								class="w-4 h-4" | ||||
| 							> | ||||
| 								<path d="M2 3a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V3Z" /> | ||||
| 								<path | ||||
| 									fill-rule="evenodd" | ||||
| 									d="M13 6H3v6a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V6ZM8.75 7.75a.75.75 0 0 0-1.5 0v2.69L6.03 9.22a.75.75 0 0 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l2.5-2.5a.75.75 0 1 0-1.06-1.06l-1.22 1.22V7.75Z" | ||||
| 									clip-rule="evenodd" | ||||
| 								/> | ||||
| 							</svg> | ||||
| 						</div> | ||||
| 						<div class=" self-center text-sm font-medium">{$i18n.t('Download Database')}</div> | ||||
| 					</button> | ||||
| 				{/if} | ||||
| 			</div> | ||||
| 		</div> | ||||
| 	</div> | ||||
|  |  | |||
|  | @ -301,7 +301,7 @@ | |||
| 			</button> | ||||
| 		{/if} | ||||
| 
 | ||||
| 		{#if $user?.role === 'admin'} | ||||
| 		{#if $user?.role === 'admin' && ($config?.admin_export_enabled ?? true)} | ||||
| 			<hr class=" dark:border-gray-700" /> | ||||
| 
 | ||||
| 			<button | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Timothy Jaeryang Baek
						Timothy Jaeryang Baek