Smail/backend/services/adminreset/client.go
smail f60d3b0880
Some checks are pending
Security Checks / security (push) Waiting to run
整理前后端与测试构建目录并完善配置和安全引导
统一 frontend、backend、test、test-log 和 out 目录,更新构建、部署及测试入口;纳入配置管理兼容与首次安全引导修复;排除本机配置、密钥和测试产物。
2026-09-05 19:19:52 +08:00

40 lines
1.1 KiB
Go

package adminreset
import (
"context"
"encoding/json"
"fmt"
"net"
"time"
)
func SendReset(ctx context.Context, conn net.Conn, password string) error {
if conn == nil || password == "" {
return ErrInvalidRequest
}
defer clearPassword(&password)
deadline := time.Now().Add(10 * time.Second)
if contextDeadline, ok := ctx.Deadline(); ok && contextDeadline.Before(deadline) {
deadline = contextDeadline
}
if err := conn.SetDeadline(deadline); err != nil {
return fmt.Errorf("set reset deadline: %w", err)
}
defer conn.SetDeadline(time.Time{})
challenge, err := DecodeResponse(conn)
if err != nil || !challenge.OK || challenge.Code != "CHALLENGE" || challenge.Nonce == "" {
return ErrInvalidRequest
}
if err := json.NewEncoder(conn).Encode(Request{Version: ProtocolVersion, Nonce: challenge.Nonce, NewPassword: password}); err != nil {
return fmt.Errorf("send reset request: %w", err)
}
response, err := DecodeResponse(conn)
if err != nil {
return fmt.Errorf("read reset response: %w", err)
}
if !response.OK {
return fmt.Errorf("reset rejected: %s", response.Code)
}
return nil
}