Commit Graph
8482 Commits
Author SHA1 Message Date
Ashish Kolhe bbcd67f2fe fix(license): publish the rotate_key route and document the dry-run and refresh bodies 2026-11-04 20:18:58 +05:30
Ashish Kolhe 001ca45bc3 test(license): classify the auto-investigate decision log search call site
Main added a search over the meta org auto_investigate_decisions stream behind an open route; list it as exempt like the other per-org run histories.
2026-11-04 20:18:58 +05:30
Ashish Kolhe 5614841ca5 fix(web): say license key on the copy renewed key button 2026-11-04 20:18:58 +05:30
Ashish Kolhe 7c0aca7e9e fix(web): say license key on the copy fetched key button 2026-11-04 20:18:58 +05:30
Ashish Kolhe 184f626527 fix(web): call the installation's refresh key the registration key 2026-11-04 20:18:58 +05:30
Ashish Kolhe a666b8d8a4 fix(license): gate public dashboard data behind the licence search gate
The rebase onto main brought public dashboards (#14789), whose data
endpoint builds results through search_service and promql without any
licence check, so an anonymous link kept reading data while search was
blocked. The data read now answers 429 when the search gate is closed,
warm results included, with the generic rate-limit body so the licence id
never reaches an anonymous viewer; the meta org passes as in the search
route middleware. The three public dashboard build call sites are
classified as helpers behind that check.
2026-11-04 20:18:58 +05:30
Ashish Kolhe b8fc17d241 fix(license): exempt usage, audit and operational streams from the search gate only as logs streams 2026-11-04 20:18:58 +05:30
Ashish Kolhe c4943bbaa6 fix(web): say the installation key is not created yet instead of root-only before the first refresh 2026-11-04 20:18:58 +05:30
Ashish Kolhe 61ed65ab43 fix(web): offer Refresh now on the expiry banner only when online refresh is on 2026-11-04 20:18:58 +05:30
Ashish Kolhe 01a4fb1157 fix(web): accept an unknown ingestion limit type in the key check and drop it from waiver lists 2026-11-04 20:18:58 +05:30
Ashish Kolhe 8455e07f26 chore(license): tidy comments and test constants per repo rules 2026-11-04 20:18:58 +05:30
Ashish Kolhe 24b356d84c fix(license): keep definitive click failures against attempts seen before they resolved 2026-11-04 20:18:58 +05:30
Ashish Kolhe aa617a681b chore(license): drop an unused type import from the refresh card 2026-11-04 20:18:58 +05:30
Ashish Kolhe 80d688b585 fix(license): let failed refresh clicks yield to newer recorded attempts 2026-11-04 20:18:57 +05:30
Ashish Kolhe fe3c09b418 fix(license): pass the recorded attempt time through instead of inferring it
POST /api/license/refresh and /rotate_key now return the attempt_at the enterprise refresh recorded for this call while it held the refresh lock, and attempt_recorded: false (also on 409) when the call recorded no attempt. The before/after status reads that guessed the attempt from actor and outcome are gone. The card clears a clicked outcome only on a strictly newer attempt than attempt_at, or than the pre-click attempt when attempt_recorded is false; a response with neither field keeps the clicked outcome until the next click or page load.
2026-11-04 20:18:57 +05:30
Ashish Kolhe 096acd4b4f fix(license): order clicked refresh outcomes by the server's own attempt time
POST /api/license/refresh and /rotate now return attempt_at, the
refresh.last_attempt_at this click recorded, read from the refresh status
right after the click and kept only when it is newer than the pre-click
attempt and carries this user and this outcome. Clicks refused before an
attempt was recorded return none. The card keeps a clicked outcome until a
strictly newer attempt arrives, falling back to the pre-click attempt when
attempt_at is absent; the Date-header and browser-clock guesses are gone.
2026-11-04 20:18:57 +05:30
Ashish Kolhe 43c11eada0 fix(license): clear a clicked refresh outcome only for strictly newer attempts
A click now clears its inline outcome only when GET /api/license reports an
attempt strictly newer than the click: newer than the server time the
response was sent (Date header, else the browser clock) for an answered
click, or newer than the pre-click attempt for a refused one. Older, equal
and in-flight attempts no longer clear it or get mistaken for the click's own.
2026-11-04 20:18:57 +05:30
Ashish Kolhe d3adf9ddc2 fix(license): show clear messages for pending_reload and rotation_unsettled refresh outcomes 2026-11-04 20:18:57 +05:30
Ashish Kolhe da3df8be2d fix(license): offer rotation on request, an old-node limits refresh, and drop clicked outcomes once newer state arrives 2026-11-04 20:18:57 +05:30
Ashish Kolhe 19ce678d5a fix(license): reload the nodes when a pasted key landed despite its store error 2026-11-04 20:18:57 +05:30
Ashish Kolhe 5c064a112e fix(license): keep the OTLP-writable calibration digest stream behind the search gate 2026-11-04 20:18:57 +05:30
Ashish Kolhe d0a35715e6 fix(license): pluralize over-limit day copy and show a scheduled restore-search start
The paused-search status, the search banner and the restored-by-waiver line
read "1 days" / "1 allowed days"; they now use vue-i18n plural forms.
A scheduled search_unblock waiver now shows "<start> → <end>" in the window
column; active and ended rows keep "until <end>".
2026-11-04 20:18:57 +05:30
Ashish Kolhe 5d3bc39a15 fix(license): guard every PromQL and aliased search call site per fn
The search call-site guard missed promql_service::search::search(, aliased
search::search( and bare imported search( calls, and keyed sites by file so a
second classification in one file collapsed. Sites are now (file, fn) pairs,
duplicates fail, and the newly visible PromQL rule, anomaly query, query
recommendation and service-graph reads are classified as background work.
2026-11-04 20:18:57 +05:30
Ashish Kolhe fcb83e8af7 fix(license): gate fleet pipelines search on the search licence
GET /{org_id}/fleet/pipelines runs PromQL searches over the org metrics but its route sits outside the gated search group, so it kept searching while the licence blocked search. The handler now answers the same 429 as the other in-handler search callers.

The fleet audit read searches the meta org audit stream, which the gate already exempts, so it stays open like the other history reads. Both call sites are classified in SEARCH_CALLERS and /fleet/audit joins OPERATIONAL_READS.
2026-11-04 20:18:57 +05:30
Ashish Kolhe b7edc66465 fix(license): report an unknown outcome when a moved-revision paste cannot be read back 2026-11-04 20:18:57 +05:30
Ashish Kolhe 3e80dc4ea9 fix(license): keep one boundary refetch chain and toast only its first failure 2026-11-04 20:18:57 +05:30
Ashish Kolhe fda6e220ac fix(license): keep a pasted key whose write landed without its ack, and say when the outcome is unknown 2026-11-04 20:18:57 +05:30
Ashish Kolhe 8dfe08f9c8 fix(license): keep router modules, helpers and comments in repo order 2026-11-04 20:18:57 +05:30
Ashish Kolhe 0b877774d5 fix(license): refetch the licence status once a waiver boundary passes 2026-11-04 20:18:57 +05:30
Ashish Kolhe 242571742d fix(license): end a breach waiver preview at its month rollover 2026-11-04 20:18:57 +05:30
Ashish Kolhe b454506566 fix(license): commit pasted keys through the key fence and undo a raise only on a proven miss 2026-11-04 20:18:57 +05:30
Ashish Kolhe 7c138d1190 fix(license): keep base allowance after waiver expiry 2026-11-04 20:18:57 +05:30
Ashish Kolhe b2592fcca4 feat(license): show monthly waiver relief and reporting grace in status 2026-11-04 20:18:57 +05:30
Ashish Kolhe 95c49fdd3a feat(license): render breach-day and reporting-grace waivers 2026-11-04 20:18:57 +05:30
Ashish Kolhe 95e5d17858 fix(license): cancel usage RPCs with their owning checks 2026-11-04 20:18:57 +05:30
Ashish Kolhe 24811c5def test: preserve authorization during license report grace 2026-11-04 20:18:57 +05:30
Ashish Kolhe 02a53fd070 fix: synchronize bound license decisions across nodes 2026-11-04 20:18:57 +05:30
Ashish Kolhe 525e13a55d fix: align renewed license dates with expiry banner 2026-11-04 20:18:57 +05:30
Ashish Kolhe 6578aa262d feat(license): avoid duplicate proxy hints after manual refresh 2026-11-04 20:18:57 +05:30
Ashish Kolhe f0acc05fd0 feat(license): retain approved blocked and disabled status context 2026-11-04 20:18:57 +05:30
Ashish Kolhe 4925049d80 feat(license): preserve banner warnings and refine refresh feedback 2026-11-04 20:18:57 +05:30
Ashish Kolhe 2bbf15db71 feat(license): clarify manual waiver delivery and env key copy 2026-11-04 20:18:57 +05:30
Ashish Kolhe 86fd6ba66b feat(license): add session-dismissible license expiry banner 2026-11-04 20:18:57 +05:30
Ashish Kolhe 844df5e080 feat(license): show manual refresh results in paused search banner 2026-11-04 20:18:57 +05:30
Ashish Kolhe 81406e11d4 feat(license): add manual online refresh status card 2026-11-04 20:18:56 +05:30
Ashish Kolhe 9d40b7706a feat(license): map manual refresh outcomes and return inline results 2026-11-04 20:18:56 +05:30
Ashish Kolhe 6a3c20b309 feat(license): refuse pasting an ancestor of the loaded license 2026-11-04 20:18:56 +05:30
Ashish Kolhe 7048659ece feat(license): expose refresh status and manual key rotation 2026-11-04 20:18:56 +05:30
Ashish Kolhe 27d0e37ed5 feat(license): refresh local limits before manual online refresh 2026-11-04 20:18:56 +05:30
Ashish Kolhe f0500172c5 feat(license): warn when loaded keys trail the applied revision 2026-11-04 20:18:56 +05:30