CI / go-test (push) Waiting to run
CI / postgres-durable-first (push) Waiting to run
CI / codegen (push) Waiting to run
CI / govulncheck (push) Waiting to run
CI / race (push) Waiting to run
CI / fuzz-smoke (push) Waiting to run
CI / golangci (push) Waiting to run
CI / frontend (push) Waiting to run
Docs CI / build (push) Waiting to run
Docs Deploy (GitHub Pages) / build (push) Waiting to run
Docs Deploy (GitHub Pages) / deploy (push) Blocked by required conditions
Release 3X-UI / build (386) (push) Waiting to run
Release 3X-UI / build (amd64) (push) Waiting to run
Release 3X-UI / build (arm64) (push) Waiting to run
Release 3X-UI / build (armv5) (push) Waiting to run
Release 3X-UI / build (armv6) (push) Waiting to run
Release 3X-UI / build (armv7) (push) Waiting to run
Release 3X-UI / build (s390x) (push) Waiting to run
Release 3X-UI / Build for Windows (amd64) (push) Waiting to run
Release 3X-UI / Publish rolling dev release (push) Blocked by required conditions
CodeQL Advanced / Analyze (go) (push) Waiting to run
CodeQL Advanced / Analyze (actions) (push) Waiting to run
CodeQL Advanced / Analyze (javascript-typescript) (push) Waiting to run
- 0: sing-box gen overrides fragment listen/port from the inbound row (empty listen -> "::"), Update/Add recompute the stored fragment; non-loopback E2E against the real core binary. - 1: agent fetches the sing-box core from the Gitea release when missing, self-checks it, and only then latches the switch. - 2: node list shows the sing-box core version (heartbeat field, persisted on the node row), xray version as fallback. - 3: public-page fallback returns 404 to anonymous visitors when the page is disabled. - 4: settings restart hint bar removed, dead i18n keys cleaned. - 5: two PUT calls missing JSON headers fixed (audit: only those two), batch probe-task creation endpoint + UI. - 6: cf-probe retirement card and coverage pipeline removed. - 7: generated vless links no longer carry spx (panel export + sub); parser still accepts spx; golden fixtures updated. - probe batch: dedicated probe settings tab (public-page settings, tasks, per-node meta), retention_days editable, per-node traffic calibration + stat-interface pinning, runtime metrics split into a lightweight fast report (default 3s, 1-60s adjustable). - 8: sing-box core processes start with GOMEMLIMIT=32MiB, GOGC=50. - 9: dead /getTwoFactorEnable docs entries removed (frontend call and contract entry already gone at base; verified by grep).
54 lines
2.2 KiB
Go
54 lines
2.2 KiB
Go
package controller
|
|
|
|
import (
|
|
"net/http"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
)
|
|
|
|
// V2.0.1 ③: with the public page off, the root path and theme paths
|
|
// answer a plain 404 to anonymous visitors instead of the theme
|
|
// shell (whose "public page off" redirect chain dead-ends on
|
|
// /admin). A logged-in operator still reaches the theme, and with
|
|
// the page on the shell is public again.
|
|
func TestProbeFallbackPublicPageGate(t *testing.T) {
|
|
rig := newProbeTestRig(t)
|
|
|
|
themeDir := filepath.Join(rig.dbDir, "themes", "testtheme", "dist")
|
|
if err := os.MkdirAll(themeDir, 0o755); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
manifest := `{"name":"Test Theme","short":"testtheme","description":"gate test fixture","version":"0.0.1","author":"tests","url":""}`
|
|
if err := os.WriteFile(filepath.Join(rig.dbDir, "themes", "testtheme", "theme.json"), []byte(manifest), 0o644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
indexHTML := "<!doctype html><title>theme</title>"
|
|
if err := os.WriteFile(filepath.Join(themeDir, "index.html"), []byte(indexHTML), 0o644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
rig.setSetting(t, "theme", "testtheme")
|
|
|
|
// Public page off (the default): anonymous root + SPA paths 404.
|
|
if rec := rig.do(http.MethodGet, "/", nil, false); rec.Code != http.StatusNotFound {
|
|
t.Fatalf("anon root with public page off: %d, want 404", rec.Code)
|
|
}
|
|
if rec := rig.do(http.MethodGet, "/some/spa/route", nil, false); rec.Code != http.StatusNotFound {
|
|
t.Fatalf("anon spa path with public page off: %d, want 404", rec.Code)
|
|
}
|
|
// API 404 discipline is unchanged.
|
|
if rec := rig.do(http.MethodGet, "/api/nope", nil, false); rec.Code != http.StatusNotFound {
|
|
t.Fatalf("api 404 with public page off: %d", rec.Code)
|
|
}
|
|
// Logged-in operator still reaches the theme shell.
|
|
if rec := rig.do(http.MethodGet, "/", nil, true); rec.Code != 200 || rec.Body.String() != indexHTML {
|
|
t.Fatalf("authed root with public page off: %d %q", rec.Code, rec.Body.String())
|
|
}
|
|
|
|
// Public page on: anonymous shell access is back.
|
|
rig.setSetting(t, "public_page", "on")
|
|
if rec := rig.do(http.MethodGet, "/", nil, false); rec.Code != 200 || rec.Body.String() != indexHTML {
|
|
t.Fatalf("anon root with public page on: %d %q", rec.Code, rec.Body.String())
|
|
}
|
|
}
|