mirror of
https://github.com/Ed1s0nZ/CyberStrikeAI.git
synced 2026-10-20 06:27:53 +02:00
fix: restore listener edit actions and validate required fields
This commit is contained in:
1 parent
ae395f5bf7
commit
7d6d3e77dc
10 files changed
+186
-17
No files matched your search
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user