Commit graph

188 commits

Author SHA1 Message Date
8c9a38166b web: pause toast timers when page is not visible
Use the Page Visibility API to pause toast countdowns and progress bar
animations when the tab is hidden, and resume them when the user returns.
New toasts created while the page is hidden also start in a paused state.
2026-03-28 21:42:17 +07:00
e89a483725 web: add missing timeouts to toast notifications
Add timeout values to the 3 remaining toast calls that lacked them:
- Session error toast on redirect to login (10s)
- Account deleted success toast (5s)
- Database tidy error toast in web-admin (10s)
2026-03-28 21:42:17 +07:00
074e5e864e web: Add progress bar and improve pause/resume behavior
Add a visual progress bar that shrinks over the toast timeout duration,
pause/resume the timer on hover.
2026-03-28 21:42:17 +07:00
40b890a8e3 web: replace @paralleldrive/cuid2 with crypto.randomUUID()
All checks were successful
continuous-integration/drone/push Build is passing
Use the standard Web Crypto API instead of an external dependency for
generating unique IDs in Toast and ProviderForm.
2026-03-26 08:02:15 +07:00
b60dd41455 chore(deps): lock file maintenance
All checks were successful
continuous-integration/drone/push Build is passing
2026-03-23 00:11:59 +00:00
7d89e120a9 web: Add propagation loading screen and wait.preparation/propagation locale keys
All checks were successful
continuous-integration/drone/push Build is passing
2026-03-22 07:42:13 +07:00
a47d0d4196 web: Add service.edit locale key and use it in ServiceDetailsOffcanvas 2026-03-22 07:42:13 +07:00
94f1884ba5 web: Extract domainLink as a shared store utility
Move the domainLink helper from local component functions into the
domains store so it can be reused across layout, sidebars, and page
components.

This fixes links to non-unique domain names.
2026-03-22 07:42:13 +07:00
c020aeece7 chore(deps): lock file maintenance
All checks were successful
continuous-integration/drone/push Build is passing
2026-03-19 04:10:55 +00:00
38caea104f chore(deps): lock file maintenance
Some checks are pending
continuous-integration/drone/push Build is running
2026-03-19 10:43:27 +07:00
ae88b5d892 chore(deps): update dependency @sveltejs/vite-plugin-svelte to v7
Some checks are pending
continuous-integration/drone/push Build is pending
2026-03-19 10:41:50 +07:00
17d6ebd607 chore(deps): update dependency vite to v8
Some checks are pending
continuous-integration/drone/push Build is running
2026-03-19 03:27:25 +00:00
1b4cffec2d chore(deps): update eslint monorepo to v10
Some checks failed
continuous-integration/drone/push Build is failing
2026-03-19 03:16:57 +00:00
5e0eaa5d11 Include generated services_specs into frontend code
This permit to prerender generator pages so they can be referenced
2026-03-17 20:14:57 +07:00
4f9a308a2d Fix service worker registration 2026-03-17 11:20:48 +07:00
f16ae2991e fix: refresh ButtonZonePublish after zone apply
All checks were successful
continuous-integration/drone/push Build is passing
2026-03-16 21:00:35 +07:00
72fa2b3904 fix: wire ActionOnEditableZone into all zone mutation facades
All checks were successful
continuous-integration/drone/push Build is passing
Add/update/delete service calls in the Service facade were bypassing
ActionOnEditableZone, so mutations could silently target a committed or
published zone instead of deriving a new editable snapshot first.

Wraps AddServiceToZone, RemoveServiceFromZone, and UpdateZoneService
with ActionOnEditableZone so the decorator is applied consistently.

Fixes regression introduced by b2b6467575.
2026-03-16 20:07:47 +07:00
a7b225b9df Rework zone diff/apply flow: separate diff from provider API, support partial apply
Decouple diff computation from executable provider closures by fetching
provider records and computing diffs locally via DNSControlDiffByRecord.
On apply, build a target record set from user-selected corrections using
BuildTargetRecords, then ask the provider for executable corrections
against that target. A published snapshot is inserted at ZoneHistory[1]
while the WIP zone at position 0 remains unchanged.
2026-03-16 19:46:09 +07:00
8a2a28e4be providers: Mark secret fields with secret tag; add eye toggle for secret inputs
All checks were successful
continuous-integration/drone/push Build is passing
Also fix a typo in oracle.go label ("Private hey" → "Private key").
2026-03-16 19:44:14 +07:00
e341ea6beb chore(deps): lock file maintenance 2026-03-16 19:44:14 +07:00
9203e71494 web: Rename /join route to /register for clarity 2026-03-16 19:44:14 +07:00
36a7d8e9d3 Fix email validation HMAC weakness and prevent user enumeration on registration 2026-03-16 19:44:14 +07:00
07b5553369 Add public DNS record generator pages at /generator
Expose service editors publicly (no auth required) at /generator for
SEO discoverability. Each page shows an interactive editor alongside
a live DNS zone record preview powered by a new POST
/service_specs/:ssid/records backend endpoint.
2026-03-16 19:44:13 +07:00
572b4ea167 web: New helper domainJoin, fix OpenPGPKEY and SMIMECERT records when dn is empty 2026-03-15 21:35:45 +07:00
89362f473f ci: fix yarn v1 vite hoisting issue for vitest on amd64
All checks were successful
continuous-integration/drone/push Build is passing
2026-03-15 17:40:15 +07:00
943d9b2a0c web: Add drag-and-drop domain group reassignment in ZoneList
When display_by_groups is enabled, domains are now draggable and group
containers act as drop targets. Dropping a domain onto a different group
updates its group via the API and refreshes the domain list.
2026-03-15 17:40:15 +07:00
b4ad9f8092 fix: preserve post-login redirect destination through OIDC flow
The next query parameter was silently dropped when users chose OIDC
login, always redirecting to / after authentication. Forward the
validated next value to /auth/oidc, store it in the session during
redirect, and use it for the final redirect in the callback, matching
the behaviour of password-based login.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-12 15:03:56 +07:00
d979ccefe6 security: validate next redirect parameter to prevent open redirect
Decode and validate the next query parameter before navigating,
ensuring it is a same-origin relative path (starts with / but not //)
to prevent attackers from redirecting users to external sites after login.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-12 15:03:56 +07:00
ca206cf24e fix: make updateSession reject calls without an id
The function silently fell back to creating a new session when session.id
was falsy, which could create unintended API tokens from a partial object.
Session creation is already handled by addSession(); updateSession() now
throws early when no id is present.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-12 15:03:49 +07:00
b0b79efceb security: decouple failure tracking from captcha provider
Previously, RecordFailure/RecordSuccess were only called when a captcha
provider was configured, making brute-force tracking entirely inactive
on deployments without one.

- Always track login failures and successes regardless of captcha config
- When threshold is crossed with a captcha provider: 401 + captcha_required (existing behaviour)
- When threshold is crossed without a captcha provider: 429 + rate_limited flag
- Frontend: show a rate-limited message and disable the submit button on 429
- Add errors.rate-limited translation key to all locales

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-12 15:03:49 +07:00
dcde50f56a web: Highlight current session with a Badge 2026-03-11 18:30:41 +07:00
6565b25473 fix: use first 6 bytes of SHA-256 for session fingerprint display
SHA-1 is cryptographically broken. Replace with SHA-256 and slice to
the first 6 bytes (12 hex chars) for a compact, human-readable token
fingerprint. 48 bits is more than sufficient to distinguish a handful
of active sessions without sacrificing readability.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-11 18:30:41 +07:00
36890cc432 web: Fix infinite loop on 401 when user is not logged in 2026-03-11 18:30:41 +07:00
d99e31d587 web: Increase margin under root domain name 2026-03-11 18:30:41 +07:00
8cf643131d web: fix ServiceCombined JSON serialization for new service creation 2026-03-11 18:30:41 +07:00
54857e19c6 web: cache zone diff API results to avoid redundant network calls 2026-03-06 14:43:09 +07:00
7b8e6600fe web: replace /domains/new navigation with PickProvider modal
Introduces ProviderPicker and PickProvider reusable components so that
adding a domain from NewDomainInput or FilterDomainInput opens an
inline provider-selection modal instead of navigating away to
/domains/new/:dn.
2026-03-06 14:43:09 +07:00
e8af55a989 web: display onboarding form on home page with ?onboarding 2026-03-06 14:43:09 +07:00
03be1f7348 web: replace domains home page with an interactive table 2026-03-06 14:43:09 +07:00
0677b82dfc web: relook provider edit page and add provider sidebar 2026-03-06 14:43:09 +07:00
5f6b9a22b9 web: sync home filter state with URL query params 2026-03-06 14:43:02 +07:00
2e7713fec0 web: Format files and remove unused dependencies 2026-03-06 12:44:15 +07:00
827a92e77e web: replace providers list with an interactive table
Replace the ListGroup-based provider list with a Bootstrap Table on the
providers page. Rows are clickable to edit, the domain count links to
the domains page pre-filtered by provider, and action buttons handle
propagation correctly.
2026-03-06 12:44:15 +07:00
6a00090d0c web: replace providers/new page with NewProvider modal
Replace the dedicated provider type selection page with a modal,
using a module-level controller pattern. The /providers/new route
now redirects to /providers?newProvider, which auto-opens the modal.
2026-03-06 12:44:15 +07:00
77f9dde4bf web: add PageTitle component and apply it across all pages
Introduces a reusable PageTitle component with a teal overline accent,
display-3 heading, optional monospace domain label, subtitle, and a
children slot for future domain health/check badges. Applied consistently
to the zone viewer, history, logs, export, import, resolver, providers,
account settings, and new-domain pages.
2026-03-06 12:44:15 +07:00
5ece0f15ca web: document all functions in dns.ts with JSDoc 2026-03-06 12:44:15 +07:00
ba29d13a17 web: add service details offcanvas with DNS records and actions
Introduce ServiceDetailsOffcanvas, an offcanvas panel that opens when
clicking a service card. It displays the service description, its DNS
records, and provides actions buttons.

Also remove raw DNS record from service form.
2026-03-06 12:44:15 +07:00
efebd7e4e2 web: add DNS syntax highlighting with highlight.js
Install highlight.js and apply DNS zone file syntax highlighting on the
export page and in the RecordText component. Uses the github theme and
imports only the dns language to keep the bundle small.
2026-03-05 16:25:44 +07:00
044c6da31a web: replace ModalViewZone with a dedicated export page
Convert the zone file viewer from a modal dialog to a dedicated page at
/domains/[dn]/export, following the same pattern used for service pages.
Adds a "Copy to clipboard" button in the page title bar and adds the
common.copy-clipboard translation key to all supported locales.
2026-03-05 16:25:44 +07:00
91c431f23c web: Improve abstract view 2026-03-05 16:25:44 +07:00