forked from open-webui/open-webui
		
	feat: change password support
This commit is contained in:
		
							parent
							
								
									450b9b6aef
								
							
						
					
					
						commit
						9bd48ffd93
					
				
					 3 changed files with 108 additions and 1 deletions
				
			
		|  | @ -64,6 +64,11 @@ class SigninForm(BaseModel): | ||||||
|     password: str |     password: str | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | class UpdatePasswordForm(BaseModel): | ||||||
|  |     password: str | ||||||
|  |     new_password: str | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| class SignupForm(BaseModel): | class SignupForm(BaseModel): | ||||||
|     name: str |     name: str | ||||||
|     email: str |     email: str | ||||||
|  | @ -109,7 +114,24 @@ class AuthsTable: | ||||||
|         except: |         except: | ||||||
|             return None |             return None | ||||||
| 
 | 
 | ||||||
|     def delete_auth_by_id(self, id: str) -> Optional[UserModel]: |     def update_user_password_by_id( | ||||||
|  |         self, id: str, password: str, new_password: str | ||||||
|  |     ) -> bool: | ||||||
|  |         try: | ||||||
|  |             auth = Auth.get(Auth.id == id, Auth.active == True) | ||||||
|  |             if auth: | ||||||
|  |                 if verify_password(password, auth.password): | ||||||
|  |                     query = Auth.update(password=new_password).where(Auth.id == id) | ||||||
|  |                     result = query.execute() | ||||||
|  |                     print(result) | ||||||
|  |                     return True | ||||||
|  |                 else: | ||||||
|  |                     return False | ||||||
|  |             return True | ||||||
|  |         except: | ||||||
|  |             return False | ||||||
|  | 
 | ||||||
|  |     def delete_auth_by_id(self, id: str) -> bool: | ||||||
|         try: |         try: | ||||||
|             # Delete User |             # Delete User | ||||||
|             result = Users.delete_user_by_id(id) |             result = Users.delete_user_by_id(id) | ||||||
|  |  | ||||||
|  | @ -11,6 +11,7 @@ import uuid | ||||||
| from apps.web.models.auths import ( | from apps.web.models.auths import ( | ||||||
|     SigninForm, |     SigninForm, | ||||||
|     SignupForm, |     SignupForm, | ||||||
|  |     UpdatePasswordForm, | ||||||
|     UserResponse, |     UserResponse, | ||||||
|     SigninResponse, |     SigninResponse, | ||||||
|     Auths, |     Auths, | ||||||
|  | @ -53,6 +54,24 @@ async def get_session_user(cred=Depends(bearer_scheme)): | ||||||
|         ) |         ) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | ############################ | ||||||
|  | # Update Password | ||||||
|  | ############################ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @router.post("/update/password", response_model=bool) | ||||||
|  | async def update_password(form_data: UpdatePasswordForm, cred=Depends(bearer_scheme)): | ||||||
|  |     token = cred.credentials | ||||||
|  |     user = Users.get_user_by_token(token) | ||||||
|  | 
 | ||||||
|  |     if user: | ||||||
|  |         hashed = get_password_hash(form_data.new_password) | ||||||
|  |         return Auths.update_user_password_by_id(user.id, form_data.password, hashed) | ||||||
|  | 
 | ||||||
|  |     else: | ||||||
|  |         raise HTTPException(400, detail=ERROR_MESSAGES.INVALID_CRED) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| ############################ | ############################ | ||||||
| # SignIn | # SignIn | ||||||
| ############################ | ############################ | ||||||
|  |  | ||||||
|  | @ -118,6 +118,11 @@ | ||||||
| 	let authType = 'Basic'; | 	let authType = 'Basic'; | ||||||
| 	let authContent = ''; | 	let authContent = ''; | ||||||
| 
 | 
 | ||||||
|  | 	// Account | ||||||
|  | 	let currentPassword = ''; | ||||||
|  | 	let newPassword = ''; | ||||||
|  | 	let newPasswordConfirm = ''; | ||||||
|  | 
 | ||||||
| 	// About | 	// About | ||||||
| 	let ollamaVersion = ''; | 	let ollamaVersion = ''; | ||||||
| 
 | 
 | ||||||
|  | @ -1843,6 +1848,67 @@ | ||||||
| 							</button> | 							</button> | ||||||
| 						</div> | 						</div> | ||||||
| 					</form> | 					</form> | ||||||
|  | 				{:else if selectedTab === 'account'} | ||||||
|  | 					<form | ||||||
|  | 						class="flex flex-col h-full text-sm" | ||||||
|  | 						on:submit|preventDefault={() => { | ||||||
|  | 							console.log('change save'); | ||||||
|  | 						}} | ||||||
|  | 					> | ||||||
|  | 						<div class=" mb-2.5 font-medium">Change Password</div> | ||||||
|  | 
 | ||||||
|  | 						<div class=" space-y-1.5"> | ||||||
|  | 							<div class="flex flex-col w-full"> | ||||||
|  | 								<div class=" mb-1 text-xs text-gray-500">Current Password</div> | ||||||
|  | 
 | ||||||
|  | 								<div class="flex-1"> | ||||||
|  | 									<input | ||||||
|  | 										class="w-full rounded py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-800 outline-none" | ||||||
|  | 										type="password" | ||||||
|  | 										bind:value={currentPassword} | ||||||
|  | 										autocomplete="current-password" | ||||||
|  | 										required | ||||||
|  | 									/> | ||||||
|  | 								</div> | ||||||
|  | 							</div> | ||||||
|  | 
 | ||||||
|  | 							<div class="flex flex-col w-full"> | ||||||
|  | 								<div class=" mb-1 text-xs text-gray-500">New Password</div> | ||||||
|  | 
 | ||||||
|  | 								<div class="flex-1"> | ||||||
|  | 									<input | ||||||
|  | 										class="w-full rounded py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-800 outline-none" | ||||||
|  | 										type="password" | ||||||
|  | 										bind:value={newPassword} | ||||||
|  | 										autocomplete="new-password" | ||||||
|  | 										required | ||||||
|  | 									/> | ||||||
|  | 								</div> | ||||||
|  | 							</div> | ||||||
|  | 
 | ||||||
|  | 							<div class="flex flex-col w-full"> | ||||||
|  | 								<div class=" mb-1 text-xs text-gray-500">Confirm Password</div> | ||||||
|  | 
 | ||||||
|  | 								<div class="flex-1"> | ||||||
|  | 									<input | ||||||
|  | 										class="w-full rounded py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-800 outline-none" | ||||||
|  | 										type="password" | ||||||
|  | 										bind:value={newPasswordConfirm} | ||||||
|  | 										autocomplete="off" | ||||||
|  | 										required | ||||||
|  | 									/> | ||||||
|  | 								</div> | ||||||
|  | 							</div> | ||||||
|  | 						</div> | ||||||
|  | 
 | ||||||
|  | 						<div class="mt-3 flex justify-end"> | ||||||
|  | 							<button | ||||||
|  | 								class=" px-4 py-2 text-xs bg-gray-800 hover:bg-gray-900 dark:bg-gray-700 dark:hover:bg-gray-800 text-gray-100 transition rounded-md font-medium" | ||||||
|  | 							> | ||||||
|  | 								Update password | ||||||
|  | 							</button> | ||||||
|  | 						</div> | ||||||
|  | 					</form> | ||||||
| 				{:else if selectedTab === 'about'} | 				{:else if selectedTab === 'about'} | ||||||
| 					<div class="flex flex-col h-full justify-between space-y-3 text-sm mb-6"> | 					<div class="flex flex-col h-full justify-between space-y-3 text-sm mb-6"> | ||||||
| 						<div class=" space-y-3"> | 						<div class=" space-y-3"> | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Timothy J. Baek
						Timothy J. Baek