relay-server/admin/handlers.go
2025-12-26 19:54:07 +03:00

67 lines
1.4 KiB
Go

package admin
import (
"net/http"
"strings"
"relay/device"
tunnelpb "relay/proto/tunnel"
"relay/registry"
)
func domainsHandler(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case "GET":
registry.Global.Mu.Lock()
defer registry.Global.Mu.Unlock()
for d := range registry.Global.Domains {
w.Write([]byte(d + "\n"))
}
case "POST":
domain := strings.ToLower(r.URL.Query().Get("domain"))
if domain == "" {
http.Error(w, "domain required", http.StatusBadRequest)
return
}
registry.Global.Mu.Lock()
if _, exists := registry.Global.Domains[domain]; exists {
w.Write([]byte("already registered\n"))
} else {
registry.Global.Domains[domain] = nil
adminLogger.Printf(
"ADMIN ADD domain=%s ip=%s",
domain, r.RemoteAddr,
)
w.Write([]byte("registered\n"))
}
registry.Global.Mu.Unlock()
case "DELETE":
domain := strings.ToLower(r.URL.Query().Get("domain"))
var dev *device.Device
var existed bool
registry.Global.Mu.Lock()
if d, ok := registry.Global.Domains[domain]; ok {
existed = true
dev = d
delete(registry.Global.Domains, domain)
}
registry.Global.Mu.Unlock()
if existed && dev != nil {
dev.SendFrame(&tunnelpb.Frame{
Type: tunnelpb.FrameType_FRAME_BIND_REJECTED,
Payload: []byte(domain),
})
}
default:
http.Error(w, "method not allowed", http.StatusMethodNotAllowed)
}
}