mirror of
https://github.com/CJackHwang/ds2api.git
synced 2026-05-04 08:25:26 +08:00
70 lines
2.1 KiB
Go
70 lines
2.1 KiB
Go
package admin
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
"os"
|
|
"strings"
|
|
"time"
|
|
|
|
authn "ds2api/internal/auth"
|
|
)
|
|
|
|
func (h *Handler) requireAdmin(next http.Handler) http.Handler {
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
if err := authn.VerifyAdminRequest(r); err != nil {
|
|
writeJSON(w, http.StatusUnauthorized, map[string]any{"detail": err.Error()})
|
|
return
|
|
}
|
|
next.ServeHTTP(w, r)
|
|
})
|
|
}
|
|
|
|
func (h *Handler) login(w http.ResponseWriter, r *http.Request) {
|
|
var req map[string]any
|
|
_ = json.NewDecoder(r.Body).Decode(&req)
|
|
adminKey, _ := req["admin_key"].(string)
|
|
expireHours := intFrom(req["expire_hours"])
|
|
if expireHours <= 0 {
|
|
expireHours = 24
|
|
}
|
|
if adminKey != authn.AdminKey() {
|
|
writeJSON(w, http.StatusUnauthorized, map[string]any{"detail": "Invalid admin key"})
|
|
return
|
|
}
|
|
token, err := authn.CreateJWT(expireHours)
|
|
if err != nil {
|
|
writeJSON(w, http.StatusInternalServerError, map[string]any{"detail": err.Error()})
|
|
return
|
|
}
|
|
writeJSON(w, http.StatusOK, map[string]any{"success": true, "token": token, "expires_in": expireHours * 3600})
|
|
}
|
|
|
|
func (h *Handler) verify(w http.ResponseWriter, r *http.Request) {
|
|
header := strings.TrimSpace(r.Header.Get("Authorization"))
|
|
if !strings.HasPrefix(strings.ToLower(header), "bearer ") {
|
|
writeJSON(w, http.StatusUnauthorized, map[string]any{"detail": "No credentials provided"})
|
|
return
|
|
}
|
|
token := strings.TrimSpace(header[7:])
|
|
payload, err := authn.VerifyJWT(token)
|
|
if err != nil {
|
|
writeJSON(w, http.StatusUnauthorized, map[string]any{"detail": err.Error()})
|
|
return
|
|
}
|
|
exp, _ := payload["exp"].(float64)
|
|
remaining := int64(exp) - time.Now().Unix()
|
|
if remaining < 0 {
|
|
remaining = 0
|
|
}
|
|
writeJSON(w, http.StatusOK, map[string]any{"valid": true, "expires_at": int64(exp), "remaining_seconds": remaining})
|
|
}
|
|
|
|
func (h *Handler) getVercelConfig(w http.ResponseWriter, _ *http.Request) {
|
|
writeJSON(w, http.StatusOK, map[string]any{
|
|
"has_token": strings.TrimSpace(os.Getenv("VERCEL_TOKEN")) != "",
|
|
"project_id": strings.TrimSpace(os.Getenv("VERCEL_PROJECT_ID")),
|
|
"team_id": nilIfEmpty(strings.TrimSpace(os.Getenv("VERCEL_TEAM_ID"))),
|
|
})
|
|
}
|