ソースを参照

feat: change password support

Timothy J. Baek 1 年間 前
コミット
9bd48ffd93

+ 23 - 1
backend/apps/web/models/auths.py

@@ -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)

+ 19 - 0
backend/apps/web/routers/auths.py

@@ -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
 ############################
 ############################

+ 66 - 0
src/lib/components/chat/SettingsModal.svelte

@@ -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">