diff --git a/http/server.go b/http/server.go index 879a37e..13a5748 100644 --- a/http/server.go +++ b/http/server.go @@ -82,6 +82,10 @@ func (s *Server) Start() error { if s.config.EnableAPI { // 登录API端点,不需要认证 mux.HandleFunc("/api/login", s.handleLogin) + // 注销API端点,不需要认证 + mux.HandleFunc("/api/logout", s.handleLogout) + // 修改密码API端点,需要认证 + mux.HandleFunc("/api/change-password", s.loginRequired(s.handleChangePassword)) // 重定向/api到Swagger UI页面 mux.HandleFunc("/api", s.loginRequired(func(w http.ResponseWriter, r *http.Request) { @@ -1468,3 +1472,82 @@ func (s *Server) handleLogin(w http.ResponseWriter, r *http.Request) { json.NewEncoder(w).Encode(map[string]string{"status": "success", "message": "登录成功"}) logger.Info(fmt.Sprintf("用户 %s 登录成功", loginData.Username)) } + +// handleLogout 处理注销请求 +func (s *Server) handleLogout(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) + return + } + + // 从Cookie中获取会话ID + cookie, err := r.Cookie("session_id") + if err == nil { + // 删除会话 + s.sessionsMutex.Lock() + delete(s.sessions, cookie.Value) + s.sessionsMutex.Unlock() + } + + // 清除Cookie + clearCookie := &http.Cookie{ + Name: "session_id", + Value: "", + Path: "/", + Expires: time.Unix(0, 0), + HttpOnly: true, + Secure: false, + } + http.SetCookie(w, clearCookie) + + // 返回成功响应 + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(map[string]string{"status": "success", "message": "注销成功"}) + logger.Info("用户注销成功") +} + +// handleChangePassword 处理修改密码请求 +func (s *Server) handleChangePassword(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) + return + } + + // 解析请求体 + var changePasswordData struct { + CurrentPassword string `json:"currentPassword"` + NewPassword string `json:"newPassword"` + } + + if err := json.NewDecoder(r.Body).Decode(&changePasswordData); err != nil { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusBadRequest) + json.NewEncoder(w).Encode(map[string]string{"error": "无效的请求体"}) + return + } + + // 验证当前密码 + if changePasswordData.CurrentPassword != s.config.Password { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusUnauthorized) + json.NewEncoder(w).Encode(map[string]string{"error": "当前密码错误"}) + return + } + + // 更新密码 + s.config.Password = changePasswordData.NewPassword + + // 保存配置到文件 + if err := saveConfigToFile(s.globalConfig, "./config.json"); err != nil { + logger.Error("保存配置文件失败", "error", err) + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusInternalServerError) + json.NewEncoder(w).Encode(map[string]string{"error": "保存密码失败"}) + return + } + + // 返回成功响应 + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(map[string]string{"status": "success", "message": "密码修改成功"}) + logger.Info("密码修改成功") +} diff --git a/server.log b/server.log deleted file mode 100644 index 64307d1..0000000 --- a/server.log +++ /dev/null @@ -1,41 +0,0 @@ -2025/11/30 11:09:05 正在创建所需的文件和文件夹... -2025/11/30 11:09:05 所需文件和文件夹创建成功 -time="2025-11-30T11:09:05+08:00" level=debug msg="尝试加载Shield统计数据" file=/root/dnsbak/data/shield_stats.json -time="2025-11-30T11:09:05+08:00" level=info msg="Shield计数数据加载成功" blocked_entries=0 resolved_entries=0 -time="2025-11-30T11:09:05+08:00" level=info msg="从缓存加载远程规则" url="https://gitea.amazehome.xyz/AMAZEHOME/hosts-and-filters/raw/branch/main/filter.txt" -time="2025-11-30T11:09:05+08:00" level=info msg="从缓存加载远程规则" url="https://gitea.amazehome.xyz/AMAZEHOME/hosts-and-Filters/raw/branch/main/hosts/adaway.txt" -time="2025-11-30T11:09:06+08:00" level=info msg="从缓存加载远程规则" url="https://gitea.amazehome.xyz/AMAZEHOME/hosts-and-Filters/raw/branch/main/list/easylist.txt" -time="2025-11-30T11:09:06+08:00" level=info msg="从缓存加载远程规则" url="https://gitea.amazehome.xyz/AMAZEHOME/hosts-and-filters/raw/branch/main/rules/costomize.txt" -time="2025-11-30T11:09:06+08:00" level=info msg="从缓存加载远程规则" url="http://gitea.amazehome.xyz/AMAZEHOME/hosts-and-Filters/raw/branch/main/hosts/dsjh.txt" -time="2025-11-30T11:09:06+08:00" level=info msg="从缓存加载远程规则" url="http://gitea.amazehome.xyz/AMAZEHOME/hosts-and-filters/raw/branch/main/hate-and-junk-extended.txt" -time="2025-11-30T11:09:06+08:00" level=info msg="从缓存加载远程规则" url="http://gitea.amazehome.xyz/AMAZEHOME/hosts-and-filters/raw/branch/main/hosts/costomize.txt" -time="2025-11-30T11:09:06+08:00" level=info msg="从缓存加载远程规则" url="http://gitea.amazehome.xyz/AMAZEHOME/hosts-and-filters/raw/branch/main/hosts/anti-remoterequests.txt" -time="2025-11-30T11:09:07+08:00" level=info msg="从缓存加载远程规则" url="http://gitea.amazehome.xyz/AMAZEHOME/hosts-and-filters/raw/branch/main/rules/url-based-adguard.txt" -time="2025-11-30T11:09:07+08:00" level=info msg="从缓存加载远程规则" url="http://gitea.amazehome.xyz/AMAZEHOME/hosts-and-filters/raw/branch/main/rules/ads-and-trackers.txt" -time="2025-11-30T11:09:08+08:00" level=info msg="从缓存加载远程规则" url="http://gitea.amazehome.xyz/AMAZEHOME/hosts-and-filters/raw/branch/main/rules/malware.txt" -time="2025-11-30T11:09:09+08:00" level=info msg="从缓存加载远程规则" url="http://gitea.amazehome.xyz/AMAZEHOME/hosts-and-Filters/raw/branch/main/hosts/costomize.txt" -time="2025-11-30T11:09:09+08:00" level=info msg="从缓存加载远程规则" url="http://gitea.amazehome.xyz/AMAZEHOME/hosts-and-Filters/raw/branch/main/rules/AWAvenue-Ads-Rule.txt" -time="2025-11-30T11:09:09+08:00" level=info msg="从缓存加载远程规则" url="https://gitea.amazehome.xyz/AMAZEHOME/hosts-and-filters/raw/branch/main/rules/cheat.txt" -time="2025-11-30T11:09:10+08:00" level=info msg="规则加载完成,域名规则: 189895, 排除规则: 653, 正则规则: 24094, hosts规则: 0" -time="2025-11-30T11:09:10+08:00" level=info msg="统计数据加载成功" -time="2025-11-30T11:09:10+08:00" level=info msg="查询日志加载成功" count=8608 -time="2025-11-30T11:09:10+08:00" level=info msg="DNS服务器已启动,监听端口: 5353" -time="2025-11-30T11:09:10+08:00" level=info msg="HTTP控制台已启动,监听端口: 8081" -time="2025-11-30T11:09:10+08:00" level=info msg="DNS TCP服务器启动,监听端口: 5353" -time="2025-11-30T11:09:10+08:00" level=info msg="启动Shield计数数据自动保存功能" file=./data/shield_stats.json interval=60 -time="2025-11-30T11:09:10+08:00" level=info msg="HTTP控制台服务器启动,监听地址: 0.0.0.0:8081" -time="2025-11-30T11:09:10+08:00" level=info msg="规则自动更新已启动" interval=3600 -time="2025-11-30T11:09:10+08:00" level=info msg="DNS UDP服务器启动,监听端口: 5353" -time="2025-11-30T11:09:10+08:00" level=info msg="启动统计数据自动保存功能" file=data/stats.json interval=300 -time="2025-11-30T11:09:10+08:00" level=error msg="DNS UDP服务器启动失败" error="listen udp :5353: bind: address already in use" -time="2025-11-30T11:09:10+08:00" level=info msg="Shield计数数据保存成功" blocked_entries=0 file=/root/dnsbak/data/shield_stats.json resolved_entries=0 -2025/11/30 11:09:18 正在关闭服务... -time="2025-11-30T11:09:18+08:00" level=info msg="统计数据保存成功" file=/root/dnsbak/data/stats.json -time="2025-11-30T11:09:18+08:00" level=info msg="查询日志保存成功" file=/root/dnsbak/data/querylog.json -time="2025-11-30T11:09:18+08:00" level=info msg="DNS服务器已停止" -time="2025-11-30T11:09:18+08:00" level=error msg="HTTP控制台服务器启动失败" error="http: Server closed" -time="2025-11-30T11:09:18+08:00" level=info msg="HTTP控制台服务器已停止" -time="2025-11-30T11:09:18+08:00" level=info msg="Shield计数数据保存成功" blocked_entries=0 file=/root/dnsbak/data/shield_stats.json resolved_entries=0 -time="2025-11-30T11:09:18+08:00" level=info msg="规则自动更新已停止" -2025/11/30 11:09:18 服务已关闭 -time="2025-11-30T11:09:18+08:00" level=warning msg="日志系统已关闭" diff --git a/static/index.html b/static/index.html index 0219a95..10cb62b 100644 --- a/static/index.html +++ b/static/index.html @@ -149,9 +149,22 @@ -