修复局域网连接出错问题

This commit is contained in:
2026-03-28 19:55:50 +08:00
parent a56e360d43
commit 3a958c2d6a
5 changed files with 124 additions and 3 deletions

View File

@@ -134,6 +134,46 @@ func TestProtectedRoutesAcceptDeviceCredentialsFromCookies(t *testing.T) {
}
}
func TestRegisterDeviceDerivesNetworkGroupFromClientIP(t *testing.T) {
router, _ := newTestRouter()
alpha := registerDeviceWithRemoteAddr(t, router, map[string]any{
"device_id": "alpha",
"name": "Alpha",
"type": "desktop",
}, "192.168.1.10:1234")
bravo := registerDeviceWithRemoteAddr(t, router, map[string]any{
"device_id": "bravo",
"name": "Bravo",
"type": "phone",
}, "192.168.1.77:4567")
_ = registerDeviceWithRemoteAddr(t, router, map[string]any{
"device_id": "charlie",
"name": "Charlie",
"type": "phone",
}, "10.0.0.8:9999")
req := httptest.NewRequest(http.MethodGet, "/api/devices/candidates?deviceId="+alpha.ID, nil)
req.Header.Set("X-Device-ID", alpha.ID)
req.Header.Set("X-Device-Token", alpha.AuthToken)
resp := httptest.NewRecorder()
router.ServeHTTP(resp, req)
if resp.Code != http.StatusOK {
t.Fatalf("expected candidates request 200, got %d: %s", resp.Code, resp.Body.String())
}
var payload struct {
Data []registeredDevice `json:"data"`
}
if err := json.Unmarshal(resp.Body.Bytes(), &payload); err != nil {
t.Fatalf("decode candidates response: %v", err)
}
if len(payload.Data) != 1 || payload.Data[0].ID != bravo.ID {
t.Fatalf("expected only same-network device %q, got %+v", bravo.ID, payload.Data)
}
}
func newTestRouter() (http.Handler, *store.MemoryStore) {
memStore := store.NewMemoryStore(model.RuntimeConfig{})
logger := slog.New(slog.NewTextHandler(io.Discard, nil))
@@ -183,6 +223,33 @@ func registerDevice(t *testing.T, router http.Handler, payload map[string]any) r
return payloadWrapper.Data
}
func registerDeviceWithRemoteAddr(t *testing.T, router http.Handler, payload map[string]any, remoteAddr string) registeredDevice {
t.Helper()
body, err := json.Marshal(payload)
if err != nil {
t.Fatalf("marshal register body: %v", err)
}
req := httptest.NewRequest(http.MethodPost, "/api/devices/register", bytes.NewReader(body))
req.Header.Set("Content-Type", "application/json")
req.RemoteAddr = remoteAddr
resp := httptest.NewRecorder()
router.ServeHTTP(resp, req)
if resp.Code != http.StatusOK {
t.Fatalf("expected register 200, got %d: %s", resp.Code, resp.Body.String())
}
var payloadWrapper struct {
Data registeredDevice `json:"data"`
}
if err := json.Unmarshal(resp.Body.Bytes(), &payloadWrapper); err != nil {
t.Fatalf("decode register response: %v", err)
}
return payloadWrapper.Data
}
func createTransfer(t *testing.T, router http.Handler, device registeredDevice, payload map[string]any) transferRecord {
t.Helper()
body, err := json.Marshal(payload)