82 lines
2.4 KiB
Python
82 lines
2.4 KiB
Python
import time
|
|
from datetime import datetime
|
|
|
|
from sqlalchemy import select
|
|
|
|
from chongming_worker import rpc_method
|
|
from chongming_password import hash_password, verify_password
|
|
|
|
from ..models.pydantic import (
|
|
ChangePasswordPostRequest,
|
|
ChangePasswordPostResponse
|
|
)
|
|
from ..models.auth import Users
|
|
|
|
|
|
@rpc_method(
|
|
subject="auth.change_password",
|
|
method="POST",
|
|
summary="修改密码",
|
|
response_model=ChangePasswordPostResponse,
|
|
)
|
|
async def change_password(change_password_post_request: ChangePasswordPostRequest) -> ChangePasswordPostResponse:
|
|
from ..global_var import db
|
|
|
|
if db is None:
|
|
raise RuntimeError("Database not initialized")
|
|
|
|
user_id = change_password_post_request.user_id
|
|
old_password = change_password_post_request.old_password
|
|
new_password = change_password_post_request.new_password
|
|
|
|
if not old_password:
|
|
return ChangePasswordPostResponse(
|
|
result="fail",
|
|
message="旧密码不能为空",
|
|
timestamp=time.time()
|
|
)
|
|
if not new_password:
|
|
return ChangePasswordPostResponse(
|
|
result="fail",
|
|
message="新密码不能为空",
|
|
timestamp=time.time()
|
|
)
|
|
if old_password == new_password:
|
|
return ChangePasswordPostResponse(
|
|
result="fail",
|
|
message="新密码不能与旧密码相同",
|
|
timestamp=time.time()
|
|
)
|
|
|
|
async with db.get_session() as session:
|
|
stmt = select(Users).filter_by(id=user_id)
|
|
result = await session.execute(stmt)
|
|
user: Users | None = result.scalar_one_or_none()
|
|
|
|
if user is None:
|
|
return ChangePasswordPostResponse(
|
|
result="fail",
|
|
message="用户不存在",
|
|
timestamp=time.time()
|
|
)
|
|
|
|
# 验证旧密码
|
|
if not verify_password(old_password, user.hashed_password):
|
|
return ChangePasswordPostResponse(
|
|
result="fail",
|
|
message="旧密码错误",
|
|
timestamp=time.time()
|
|
)
|
|
|
|
# 更新密码
|
|
user.hashed_password = hash_password(new_password)
|
|
user.updated_at = datetime.now()
|
|
session.add(user)
|
|
await session.commit()
|
|
|
|
return ChangePasswordPostResponse(
|
|
result="success",
|
|
message="密码修改成功",
|
|
timestamp=time.time()
|
|
)
|