4032 Commits
Author SHA1 Message Date
naibaandnaiba/CloudCode 3e7d9ba603 feat: safely remove inactive custom frontends
Update bundled admin frontend to v2.6.1 and official user frontend to v2.7.0.

Co-authored-by: naiba/CloudCode <hi+cloudcode@nai.ba>
v2.6.1
2026-10-29 10:46:16 +00:00
naibaandnaiba/CloudCode a6a16eabd1 chore: embed released admin frontend v2.6.0
Update the administration template after its release succeeded. Verify every bundled frontend against its latest stable release and validate the published archives; all four user templates already reference their latest versions.

Co-authored-by: naiba/CloudCode <hi+cloudcode@nai.ba>
v2.6.0
2026-10-27 01:24:41 +00:00
naibaandnaiba/CloudCode 7cd0371b56 security: close OAuth and agent control lifecycle regressions
Restore session-aware OAuth binding and read public authentication URLs from committed host policy snapshots. Keep MCP, configuration, upgrade and alert-command admission tied to actual transport sends, while allowing transfer rollback and reply processing to complete without circular lock waits.

Add authenticated-route, persistence rollback, transfer-result ordering and stalled-send regression coverage. Capture task identity before request contexts can be recycled.

Co-authored-by: naiba/CloudCode <hi+cloudcode@nai.ba>
2026-10-26 17:28:58 +00:00
naibaandnaiba/CloudCode 027bfcf652 security: enforce dashboard authorization and resource boundaries
Harden tenant permissions, transfer admission, authentication and bounded request handling. Add member NAT domain settings, migration guidance and regression coverage.

Co-authored-by: naiba/CloudCode <hi+cloudcode@nai.ba>
2026-10-26 16:02:36 +00:00
naibaandnaiba/CloudCode 686e04daf2 feat: support MCP OAuth authorization and client management
Add OAuth discovery, dynamic registration, PKCE consent, rotating credentials,
and session-only authorization management with existing permission enforcement.
Bundle OfficialAdmin v2.5.1 for the independent consent and management pages.

Co-authored-by: naiba/CloudCode <hi+cloudcode@nai.ba>
2026-10-25 16:08:12 +00:00
naibaandnaiba/CloudCode 15fa673c74 test: cover embedded and local frontend path confinement
Co-authored-by: naiba/CloudCode <hi+cloudcode@nai.ba>
2026-10-25 08:00:52 +00:00
naibaandnaiba/CloudCode 6c9726412d chore: update bundled official frontend releases
Co-authored-by: naiba/CloudCode <hi+cloudcode@nai.ba>
v2.5.0
2026-10-25 07:48:08 +00:00
naibaandnaiba/CloudCode c3c478c072 chore: adopt WTFPL license
Co-authored-by: naiba/CloudCode <hi+cloudcode@nai.ba>
2026-10-25 07:32:08 +00:00
naibaandnaiba/CloudCode 4e77ce7fba chore: retire inactive Nezha-ASCII bundled frontend
Co-authored-by: naiba/CloudCode <hi+cloudcode@nai.ba>
2026-10-25 07:32:08 +00:00
naibaandnaiba/CloudCode 891d63920d feat: install and switch frontend releases at runtime
Co-authored-by: naiba/CloudCode <hi+cloudcode@nai.ba>
2026-10-25 07:32:08 +00:00
naiba a20c79b75c chore: upgrade frontend v2.4.1 2026-10-22 17:22:21 +08:00
naiba 2bd1a86429 chore: upgrade frontend v2.4.0 2026-10-22 16:22:26 +08:00
naibaandnaiba/CloudCode efd3e07b90 fix(service): skip retained history for unavailable monitors at startup
Ignore history rows without initialized daily or monthly state so deleted and quarantined services cannot panic dashboard startup. Cover startup and statistics preservation with regression tests.

Thanks to Zachariah Mithani (@zachariah-mithani, AploSec) for privately reporting the retained service history startup panic.

Co-authored-by: naiba/CloudCode <hi+cloudcode@nai.ba>
2026-10-21 13:31:26 +00:00
naibaandnaiba/CloudCode b329755836 docs: add feepay sponsor
Co-authored-by: naiba/CloudCode <hi+cloudcode@nai.ba>
2026-10-17 07:13:01 +00:00
naibaandnaiba/CloudCode 29f1568988 docs(security): add vulnerability reporting email
Co-authored-by: naiba/CloudCode <hi+cloudcode@nai.ba>
2026-10-16 14:31:38 +00:00
github-actions[bot] 05baa2f331 update contributors[no ci] 2026-10-16 19:25:38 +08:00
Sam5440andnaiba/CloudCode 8721a15b12 feat(server): online session history with configurable stats window (#1243)
Add persisted online sessions, configurable retention and online history statistics with lifecycle, recovery, timezone and concurrency regression coverage.

Co-authored-by: naiba/CloudCode <hi+cloudcode@nai.ba>
2026-10-16 19:25:13 +08:00
naiba 9881c47f0c chore: upgrade frontend v2.3.18 2026-10-04 20:03:52 +08:00
naiba ec637a688c docs: replace sponsors with placeholder v2.3.17 2026-10-01 16:37:10 +00:00
Krisandnaiba 8328047aa8 fix(alerts): evaluate fresh reports and order notification delivery (#1242)
* fix(alerts): evaluate fresh reports and make notification transitions reliable

* fix(alerts): identify equal-timestamp reports by sequence

* fix(alerts): preserve notification transition semantics

---------

Co-authored-by: naiba <hi@nai.ba>
2026-10-02 00:31:32 +08:00
naiba 1420dd450c fix(nat): bound dashboard credential classification v2.3.16 2026-10-01 11:48:23 +00:00
github-actions[bot] 34ac50394d update contributors[no ci] 2026-10-01 19:26:01 +08:00
naiba b71188f104 Merge pull request #1241 from xvkong233/fix/nat-selective-authorization-strip
fix(nat): strip only dashboard-issued Authorization credentials at NAT ingress
2026-10-01 19:25:36 +08:00
xvkong233 3ad985f36e fix(nat): scrub dashboard-issued credentials from all accepted token channels
The initial selective strip covered only the Authorization header, but the
dashboard also accepts its JWT via the ?token= query parameter and the
nz-jwt cookie (jwt.go TokenLookup channels). A dashboard credential arriving
through those channels would still reach a NAT backend.

Apply the same classify-then-strip rule to all three channels at NAT
ingress: values verified as dashboard-issued are removed, foreign values
are preserved byte-for-byte. Adds a ServeNAT flow test exercising the live
classifier and a wiring test pinning the gate injection in main().
2026-10-01 11:17:45 +00:00
xvkong233 40240ed02b fix(nat): strip only dashboard-issued Authorization credentials at NAT ingress
Since 2640b86 (v2.2.11, 2026-07-20) the NAT ingress deleted the entire
Authorization header, breaking self-hosted apps behind the tunnel that
authenticate with their own Bearer tokens (e.g. the Qinglong panel login
loop).

Strip only credentials issued by this dashboard and forward foreign ones:

- controller.IsDashboardCredential classifies an Authorization value as
  dashboard-issued via a signature-only JWT parser derived from the auth
  middleware (same key, HS256 pinned, claims validation deliberately
  skipped so an expired panel token is still recognized and kept out of
  the tunnel) or an api_tokens lookup for PAT-shaped values. Unknown PATs,
  foreign signatures, other schemes and missing values pass through. When
  classification cannot complete (parser not ready, DB nil or error) the
  verdict fails closed (strip) and the log carries a fixed reason only,
  never credential content.
- Both NAT capability variants (default, and agent-compat legacy /
  invalid-capability / post-consume paths) replace the unconditional
  Del("Authorization") with stripDashboardCredential. The rpc package
  receives the classifier through SetNATDashboardCredentialGate, the same
  injection pattern as SetMCPKillSwitchObserver; an unwired gate keeps the
  historical strip-everything behavior.

Tests: controller classification semantics (panel JWT, expired panel JWT
and panel PAT stripped; foreign-signed JWT, unknown nzp_ token, random
strings, non-Bearer schemes and missing header pass through; parser
unavailable, DB nil and DB error fail closed with credential-free logs)
plus rpc unit and flow coverage for both variants (dashboard credentials
never reach the forwarded bytes; foreign and missing Authorization are
forwarded untouched).

Compatibility: no API, database or frontend changes; NAT backends that do
not use Authorization behave exactly as before.
2026-10-01 11:17:45 +00:00
naiba 36b742a7e9 fix: harden dashboard security boundaries v2.3.15 2026-10-01 04:28:34 +00:00
naiba c726930833 chore: update frontend v2.3.14 2026-09-26 10:26:05 +08:00
naiba 9dab6a5039 fix: harden notification cache synchronization v2.3.13 2026-09-19 10:44:17 +00:00
github-actions[bot] 589f01f562 update contributors[no ci] 2026-09-14 11:23:19 +08:00
naiba e202c2d9ca Merge pull request #1237 from 77-QiQi/master
Improve: Delete the corresponding DNS record if the IPv4/IPv6 address is empty.
v2.3.12
2026-09-14 11:22:52 +08:00
77-QiQi fa611ebd9e Update ddns_test.go 2026-09-14 11:06:44 +08:00
77-QiQi 39e1c6d1be Update ddns_test.go 2026-09-14 10:57:37 +08:00
77-QiQi c19e8eb252 Update ddns_test.go 2026-09-14 10:51:01 +08:00
77-QiQi db78c34b91 Update ddns_test.go 2026-09-14 10:43:36 +08:00
77-QiQi e9ddd46655 Update ddns_test.go 2026-09-14 10:36:04 +08:00
77-QiQi 09db8b4361 Update ddns_test.go 2026-09-14 10:29:08 +08:00
77-QiQi ed9f21e4ea Update ddns_test.go 2026-09-14 10:13:10 +08:00
77-QiQi f611f0a551 Update ddns_test.go 2026-09-14 10:04:38 +08:00
77-QiQi 19d959c60d Update ddns.go 2026-09-14 10:02:03 +08:00
77-QiQi 02fe54bb80 Update ddns_test.go 2026-09-14 09:10:17 +08:00
77-QiQi 0a71cbdb63 Update ddns_test.go 2026-09-14 08:56:04 +08:00
77-QiQi dd0b598dc3 Update ddns_test.go 2026-09-14 08:50:08 +08:00
77-QiQi 892619c95c Update ddns_test.go 2026-09-14 08:39:52 +08:00
77-QiQi cbc583dd3a Update ddns.go 2026-09-14 08:39:22 +08:00
77-QiQi f2f10ea7bc Update ddns.go 2026-09-13 20:55:03 +08:00
77-QiQi b18e085a2c Merge branch 'nezhahq:master' into master 2026-09-13 20:53:20 +08:00
naiba 06d387779d fix(tsdb): survive low disk space v2.3.11 2026-09-13 01:15:18 +00:00
github-actions[bot] 1155c17573 update contributors[no ci] 2026-09-12 22:59:36 +08:00
NikoCat233 d19952a834 feat(auth): allow JWT IP changes by configuration (#1236)
* feat(auth): allow JWT IP changes by configuration

* fix(auth): make JWT IP change setting concurrency-safe

* test(auth): move JWT IP change setting tests out of MCP test file
v2.3.10
2026-09-12 22:59:17 +08:00
naiba 46d83d6d68 style(ddns): apply gofmt 2026-09-12 13:29:44 +00:00