fix: restore listener edit actions and validate required fields

This commit is contained in:
Ed1s0nZ committed 2026-10-06 02:54:27 +08:00
1 parent ae395f5bf7
commit 7d6d3e77dc
10 files changed
+186 -17

No files matched your search

+9
View File
@@ -177,6 +177,15 @@ func (h *C2Handler) UpdateListener(c *gin.Context) {
return
}
if strings.TrimSpace(req.Name) == "" {
c.JSON(http.StatusBadRequest, gin.H{"error": "listener name is required"})
return
}
if err := c2.SafeBindPort(req.BindPort); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
// 若监听器在运行,不能修改关键字段
if h.mgr().IsListenerRunning(id) {
if req.BindHost != listener.BindHost || req.BindPort != listener.BindPort {
@@ -0,0 +1,55 @@
package handler
import (
"bytes"
"fmt"
"net/http"
"net/http/httptest"
"path/filepath"
"testing"
"time"
"cyberstrike-ai/internal/c2"
"cyberstrike-ai/internal/database"
"github.com/gin-gonic/gin"
"go.uber.org/zap"
)
func TestC2ListenerEditRejectsInvalidFieldsWithoutSaving(t *testing.T) {
db, err := database.NewDB(filepath.Join(t.TempDir(), "listener.db"), zap.NewNop())
if err != nil {
t.Fatal(err)
}
t.Cleanup(func() { _ = db.Close() })
original := &database.C2Listener{ID: "listener", Name: "original", Type: "http_beacon", BindHost: "127.0.0.1", BindPort: 8080, Status: "stopped", CreatedAt: time.Now()}
if err := db.CreateC2Listener(original); err != nil {
t.Fatal(err)
}
h := NewC2Handler(c2.NewManager(db, zap.NewNop(), t.TempDir()), zap.NewNop())
r := gin.New()
r.PUT("/listeners/:id", h.UpdateListener)
for _, tc := range []struct {
name string
port int
status int
}{{"", 8080, 400}, {" ", 8080, 400}, {"changed", 0, 400}, {"changed", 65536, 400}, {"changed", 8081, 200}} {
body := fmt.Sprintf(`{"name":%q,"bind_host":"127.0.0.1","bind_port":%d,"remark":"new remark"}`, tc.name, tc.port)
req := httptest.NewRequest(http.MethodPut, "/listeners/listener", bytes.NewBufferString(body))
req.Header.Set("Content-Type", "application/json")
w := httptest.NewRecorder()
r.ServeHTTP(w, req)
if w.Code != tc.status {
t.Fatalf("status %d: %s", w.Code, w.Body.String())
}
saved, err := db.GetC2Listener("listener")
if err != nil {
t.Fatal(err)
}
if tc.status == 400 && (saved.Name != "original" || saved.BindPort != 8080 || saved.Remark != "") {
t.Fatalf("invalid request saved fields: %#v", saved)
}
if tc.status == 200 && (saved.Name != "changed" || saved.BindPort != 8081 || saved.Remark != "new remark") {
t.Fatalf("valid edit not saved: %#v", saved)
}
}
}