feat: add password management, reading persistence on feed switch, and spin animation
This commit is contained in:
@@ -84,6 +84,29 @@ func (s *AuthService) Authenticate(username, password string) (string, error) {
|
||||
return tokenString, nil
|
||||
}
|
||||
|
||||
func (s *AuthService) UpdatePassword(userID, oldPassword, newPassword string) error {
|
||||
var currentHash string
|
||||
err := s.db.QueryRow("SELECT password_hash FROM users WHERE id = ?", userID).Scan(¤tHash)
|
||||
if err != nil {
|
||||
return errors.New("user not found")
|
||||
}
|
||||
|
||||
if err := bcrypt.CompareHashAndPassword([]byte(currentHash), []byte(oldPassword)); err != nil {
|
||||
return errors.New("incorrect current password")
|
||||
}
|
||||
|
||||
if len(strings.TrimSpace(newPassword)) < 6 {
|
||||
return errors.New("new password must be at least 6 characters long")
|
||||
}
|
||||
|
||||
newHash, err := bcrypt.GenerateFromPassword([]byte(newPassword), bcrypt.DefaultCost)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to hash new password: %w", err)
|
||||
}
|
||||
|
||||
return s.db.UpdateUserPassword(userID, string(newHash))
|
||||
}
|
||||
|
||||
func (s *AuthService) ValidateToken(tokenString string) (*Claims, error) {
|
||||
token, err := jwt.ParseWithClaims(tokenString, &Claims{}, func(token *jwt.Token) (interface{}, error) {
|
||||
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
|
||||
|
||||
Reference in New Issue
Block a user