Linus Rath
5319562c94
feat: add update-available detection
2026-05-02 01:58:30 +02:00
Vadim Belov and Linus Rath
210150a02e
Fix push preview JMAP query
...
Resolve the Inbox mailbox id before running Email/query.
The previous query passed a JMAP result reference object directly into the inMailbox filter, which can make the preview endpoint return 502 and cause push notifications to fall back to the generic “New mail” text.
2026-05-01 19:53:25 +02:00
Linus Rath
3f97e6ed8d
fix: scope email notifications to genuine inbox deliveries
2026-05-01 02:08:13 +02:00
Linus Rath
f3d9115ecd
feat: web push notifications for PWA #233
2026-05-01 00:26:48 +02:00
Linus Rath
45a4db1c22
fix: pin JMAP auth verification to configured server URL #237
2026-04-30 15:34:14 +02:00
Linus Rath
8935b81f12
chore: update version to 1.5.3
2026-04-28 17:34:06 +02:00
Linus Rath
81d8465a79
fix: block telemetry endpoint from pointing at internal hosts
2026-04-28 17:16:30 +02:00
Linus Rath
0f3b506604
feat: add extension preview page and API for detailed extension information
2026-04-28 15:55:23 +02:00
Linus Rath
dafc8ace3c
feat: track unique logins
2026-04-28 08:19:46 +02:00
Linus Rath
90acf181f3
fix: harden plugin config, TOTP token exchange, and branding file serving
2026-04-28 01:44:37 +02:00
Linus Rath
54af07f2af
feat: add anonymous instance telemetry
...
Adds a once-per-day heartbeat that lets the project see how many
instances run Bulwark, on what platforms, with what features enabled,
and roughly how many accounts they have. No email addresses, hostnames,
IPs, or any end-user data are ever sent.
- lib/telemetry: state file, payload builder, jittered scheduler,
instance_id persistence at <data-dir>/.telemetry-id (delete to reset)
- app/api/admin/telemetry: admin API for status / set-consent /
set-endpoint / send-now (all audit-logged)
- app/admin/telemetry: settings page with status, JSON payload preview,
endpoint editor, send-now button, link to the privacy page
- instrumentation.node.ts: starts the scheduler on boot
Default state is enabled. The first heartbeat fires 1 hour after boot
so an admin who installs and immediately disables produces zero pings.
Disable via the settings UI, BULWARK_TELEMETRY=off (or
BULWARK_TELEMETRY_DISABLED=1), or by clearing the endpoint.
Account counts are bucketed (1, 2-5, 6-10, 11-50, 51-200, 201+) so a
small instance can't be re-identified by exact size. The /.telemetry-id
file can be deleted to mint a fresh instance_id.
Receiving collector is open source at bulwarkmail/dashboard. Self-host
your own and point at it via BULWARK_TELEMETRY_URL. Full schema,
retention (90d raw → aggregates), and lawful basis are documented at
bulwarkmail.org/docs/legal/privacy/telemetry.
2026-04-28 01:28:41 +02:00
Linus Rath
55099bdcbb
fix: disable Stalwart admin check when custom JMAP endpoints allowed
2026-04-27 22:41:51 +02:00
Linus Rath
3043639d2d
fix: validate URLs before outbound fetch
2026-04-27 22:23:39 +02:00
Linus Rath
fe1d4861bb
feat: composer-sidebar slot + plugin-declared frame-src origins
2026-04-25 18:40:54 +02:00
Linus Rath
4f7c9c332b
feat: enhance OAuth auto-setup with dialog and validation for origin and issuer URLs
2026-04-25 02:53:12 +02:00
Linus Rath
da103ff06f
feat: implement OAuth auto-setup functionality for Stalwart integration
2026-04-25 01:37:18 +02:00
Linus Rath
2111c77870
fix: restore admin panel after Stalwart v0.16 REST API removal
2026-04-25 01:13:17 +02:00
Linus Rath
e5083ec1df
fix: restore admin panel after Stalwart v0.16 REST API removal
2026-04-25 01:12:33 +02:00
Linus Rath
7494fc1776
chore: update version to 1.5.0
2026-04-22 23:49:44 +02:00
Linus Rath
794001fdbd
feat: migrate Stalwart management API to JMAP x: methods (0.16)
...
Drops the 0.15 REST management API and routes all account/auth/crypto/
principal operations through Stalwart 0.16's schema-driven JMAP
endpoint via a single passthrough (/api/account/stalwart/jmap).
- New client helper `stalwartJmap` + typed `requireResult`
- account-security-store rewritten against x:AccountPassword, x:AppPassword,
x:AccountSettings, x:Account (with currentSecret for TOTP ops)
- Client-side TOTP setup via `otpauth`; server-generated app password
secrets shown once on create
- Admin check switched to /api/account permissions
(sysAccountQuery/sysTenantQuery/sysSystemSettingsGet)
- Removed sieve vacation-overwrite workaround (fixed upstream #1251 )
- Deleted old REST routes, StalwartClient, stale tests; added new
tests for passthrough + store
2026-04-21 17:29:23 +02:00
Linus Rath
aa7f886795
refactor: remove deprecated push notification API routes and related logic
2026-04-20 12:41:38 +02:00
Linus Rath
578e60c0bc
feat: nevermind, migrate push notification handling from UnifiedPush to FCM
2026-04-20 12:06:30 +02:00
Linus Rath
8b21851353
feat: migrate to UnifiedPush
2026-04-20 10:54:26 +02:00
Linus Rath
15006086d2
feat: implement JMAP push notification handling and subscription management
2026-04-20 08:26:09 +02:00
Linus Rath
8bdadc7ba3
fix: standardize punctuation
2026-04-16 19:07:42 +02:00
nesgarbo and Linus Rath
8a9dce1a99
feat: dynamic PWA manifest with configurable name, description and icons
...
- Add app/manifest.ts to serve /manifest.webmanifest dynamically at runtime
- Name, short_name, description, theme_color and background_color are read
from env vars (APP_NAME, APP_SHORT_NAME, APP_DESCRIPTION, PWA_THEME_COLOR,
PWA_BACKGROUND_COLOR) with Bulwark defaults as fallback
- Add /api/pwa-icon/[size] route that auto-generates 192x192 and 512x512 PNG
icons from PWA_ICON_URL (or FAVICON_URL as fallback) using Sharp; results
are cached in memory
- Remove static manifest: '/manifest.json' from layout metadata; Next.js
injects the link automatically from app/manifest.ts
- Fix pre-existing ESLint no-undef on RequestInit in browser-navigation.ts
2026-04-15 11:25:16 +02:00
Pascal Dietrich and Linus Rath
f9052eb23f
feat: add SESSION_SECRET_FILE and OAUTH_CLIENT_SECRET_FILE env vars
2026-04-09 22:13:08 +02:00
Linus Rath
63593e2146
fix: use fetch param type instead of RequestInit
2026-04-08 13:18:07 +02:00
Linus Rath
10cbe7a637
fix: stream WebDAV PUT uploads to avoid buffering in memory #162
2026-04-08 13:16:28 +02:00
Linus Rath
14ecae61dc
feat: enhance error handling in Stalwart API responses
2026-04-03 15:10:11 +02:00
Linus Rath
6173a9ad13
fix: resolve settings sync Identity mismatch for OAuth/SSO sessions #127
2026-04-02 10:54:35 +02:00
Linus Rath
aa40c8be26
fix: harden proxy auth and SSRF defenses
2026-03-31 17:47:09 +02:00
Linus Rath
66fe7fd359
fix: enhance security by blocking plugins with dangerous JS patterns and enforcing strict session secret length
2026-03-31 15:56:32 +02:00
Linus Rath
a3d894730b
fix: hardened security, CSP enforcement, SSRF redirect validation, reenabled S/MIME chain verify, IP spoofing prevention, PDF iframe sandbox
2026-03-31 15:11:38 +02:00
Linus Rath
5da0e2bdf1
fix: patch critical auth bypass and credential leak vulnerabilities
2026-03-31 00:46:15 +02:00
Linus Rath
aaa283357e
feat: implemented plugin configuration UI and calendar event action slot
...
- Add configSchema support to plugin manifest and ServerPlugin registry
- Add schema-driven admin config page (string, secret, boolean, number, select fields)
- Add per-plugin config storage backend (JSON files + REST API)
- Add calendar-event-actions and admin-plugin-page slot names to plugin store
- Add registerCalendarEventAction and registerAdminPage to plugin API
- Add calendarFormHooks (onCalendarEventFormOpen/Save) to hook bus
- Add PluginSlot in calendar event modal for plugin action buttons
- Style calendar event action buttons to match Bulwark outline button design
- Add Configure link per plugin in admin plugins dashboard
- Add Jitsi Meet plugin with tests (repos/plugins/jitsi-meet)
- Exclude data/admin/plugins from ESLint (deployed plugin bundles)
2026-03-30 21:12:05 +02:00
Linus Rath
67210c9924
fix: handle 2FA/TOTP session expiry with basic auth #117
2026-03-30 16:37:07 +02:00
Linus Rath
99d5276cfa
feat: add support for custom JMAP server endpoints in login and settings
2026-03-29 00:47:35 +01:00
Linus Rath
415c961937
feat: enforce forced/managed plugins and policy. Split user upload permission
2026-03-27 16:33:17 +01:00
Linus Rath
a9002763e2
feat: show admin panel in sidebar for Stalwart admin users
2026-03-27 01:53:16 +01:00
Linus Rath
6696636df8
feat: implement Stalwart admin authentication and role check across admin routes
2026-03-26 20:21:12 +01:00
Linus Rath
37bc88dbad
feat: implement force enable/disable functionality for plugins and themes
2026-03-26 18:59:30 +01:00
Linus Rath
7a191cf78b
fix: resolve all 69 ESLint warnings across 40 files
...
- Remove unused imports (Mail, CalendarIcon, Plus, Circle, cn, Link,
MessageCircle, User, Tag, FolderUp, useEffect, LogOut, GripVertical,
Check, X, HoverActionsMode, HoverActionsCorner, asn1js, Convert, etc.)
- Prefix unused variables/params with underscore to satisfy no-unused-vars
- Add missing React hook dependencies (exhaustive-deps)
- Wrap handleNavigateUp in useCallback and selectedGroupMembers in useMemo
- Remove unused eslint-disable directives in jmap/client.ts
- Replace as any with typed casts in filter-store and smime-store tests
- Remove dead code (macOk assignment, unused now variable)
2026-03-26 18:35:56 +01:00
Linus Rath
f64306be5e
feat: integrate policy checks for feature enablement in calendar, folder, and plugins settings
2026-03-25 11:06:35 +01:00
Linus Rath
136686f230
feat(settings): enhance error handling for settings operations and improve logging
2026-03-25 10:21:05 +01:00
Linus Rath
29a222eef4
feat: add plugin/theme disable gates and move policy controls to their admin pages
...
- Add `pluginsEnabled` and `themesEnabled` master feature gates to FeatureGates
- Move theme policy UI (default theme, built-in/admin theme toggles, user uploads toggle) from policy page to themes admin page
- Add plugin policy UI (plugins enabled toggle) to plugins admin page
- Remove theme policy section and plugin/theme gates from policy page (with note directing to respective pages)
- Hide Themes and Plugins settings tabs when their feature gate is disabled
- Fix dark mode visibility of all admin toggle switches (bg-white → bg-background, increase off-state track opacity)
2026-03-25 00:44:04 +01:00
Linus Rath
76b21147e4
feat: add plugin/theme harness and admin dashboard
...
Plugin & Theme System:
- Add plugin type definitions, permissions (30+), and validation constants
- Add IndexedDB storage layer for plugin code, theme CSS, and previews
- Add theme CSS sanitization, injection, and safety validation
- Add HookBus event system with 130+ hooks across 20 domains
- Add plugin ZIP extraction and manifest validation with JS security checks
- Add sandboxed PluginAPI factory with scoped storage, logging, and permission gating
- Add plugin loader with blob URL dynamic import and auto-disable circuit breaker
- Add 3 built-in themes (Nord, Catppuccin, Solarized)
- Add Zustand plugin store with install/uninstall/enable/disable lifecycle
- Add PluginSlot, PluginSlotRenderer, and PluginErrorBoundary components
- Add plugins and themes settings UI panels
- Integrate plugin slots into email viewer, composer, navigation rail, sidebar, and context menu
- Extend theme store with custom theme installation and activation
Admin Dashboard:
- Add admin authentication with scrypt password hashing and AES-256-GCM sessions
- Add rate-limited login (5 attempts/15min per IP)
- Add config manager with admin override > env var > default priority
- Add settings policy system with feature gates and per-setting restrictions
- Add audit logging with rotation
- Add admin API routes (login, logout, config, policy, audit, password change)
- Add admin UI pages (login, dashboard, config, policy, audit)
- Add policy store for client-side feature gate enforcement
- Wire admin password initialization into server instrumentation
Tests:
- Add 139 tests across 10 test files covering all plugin/theme modules
2026-03-25 00:44:03 +01:00
Linus Rath
d666bddbc4
fix: improve error handling for user settings retrieval in GET and settings store
2026-03-24 14:20:10 +01:00
Linus Rath
d915e5fb64
feat: add all multi-part TLDs for domain validation #81
2026-03-21 21:33:55 +01:00
Linus Rath
83a0a1e235
feat: add non-interactive SSO login flow for embedded/iframe deployments ( closes #69 )
2026-03-21 20:45:19 +01:00