Linus Rath
5105e000f5
feat: add message-list category tabs
2026-07-22 17:22:20 +02:00
Paulhenry Saux and Linus Rath
a679d82cc3
feat: add download file method for files generated by plugin
2026-07-13 21:18:36 +02:00
dealerweb and Linus Rath
c6bd5f645a
Feature: contact groups as single expandable recipient chips
...
Typing a contact group's name in a recipient field suggested the
individual members, and "send email to group" on the contacts page
filled the field with one chip per member - the group itself never
appeared anywhere.
The autocomplete now offers the group as a single entry (group icon
plus member count), and selecting it - like the contacts-page action -
inserts one chip named after the group that carries a snapshot of its
members. The chip expands into the deduplicated member addresses when
the message is sent or saved as a draft, mirroring how Outlook handles
distribution lists. Expansion happens where the outgoing address lists
are built, so validation and every plugin hook see real addresses.
Group chips survive the composer's string boundaries (draft data, dirty
compare, the contacts-page hand-off) as RFC 5322 group syntax
("Team: a@x, b@y;"). A bare colon reliably opens a group there because
display names containing a colon are always quoted. Typed text only
parses as a group when it carries at least one valid member, so stray
"Subject: hello" input stays a plain recipient.
RecipientSuggestion gains an optional group field; plugins that ignore
it keep working unchanged.
2026-07-09 17:46:06 +02:00
752e71198c
feat: add 3 new plugin hooks : onBeforeBlobUpload, onBeforeDraftAutoSave, onBeforeEditDraft ( #586 )
...
Co-authored-by: Linus Rath <minipixxelinfo@gmail.com >
2026-07-09 14:55:34 +02:00
Linus Rath
512adab7e3
feat: add privileged same-origin plugin tier + crypto API surface
2026-06-28 16:51:42 +02:00
Linus Rath
155d99a069
feat: add plugin hooks for email details, headers, and source
2026-06-25 01:04:26 +02:00
Linus Rath
bc322a1e69
feat: add /api/translate proxy and expose email body to plugins
2026-05-31 18:01:00 +02:00
Linus Rath
cf9292262d
feat: pluggable reply/forward quote header #295
2026-05-18 17:53:23 +02:00
Linus Rath
48aa607b56
feat: lock down plugin runtime in sandbox + signing + approval
2026-05-18 12:44:23 +02:00
Linus Rath
088810bd20
feat: harden plugin sandbox and migrate in-tree plugins
2026-05-18 12:17:54 +02:00
Linus Rath
ca1108f455
feat: master-user impersonation route + app-top-banner plugin slot
2026-05-16 17:59:07 +02:00
Linus Rath
178922323d
chore: update version to 1.6.2
2026-05-06 20:07:36 +02:00
Linus Rath
0885d3c13e
feat: http:fetch permission + httpOrigins manifest field
2026-05-05 21:50:04 +02:00
Linus Rath
9f67bc078a
feat: ingest icon/banner/screenshots from source repo
2026-05-05 21:12:23 +02:00
Linus Rath
da411af6d3
feat: project EmailReadView for email-banner slot, expose auth results
2026-05-05 20:31:11 +02:00
Linus Rath
2a769c2b0a
feat: run onBeforeEmailSend hook before send, expose fromEmail on OutgoingEmail
2026-05-05 20:04:00 +02:00
Linus Rath
3e336d459c
feat: plugin hot-reload + dev-folder loading
2026-05-05 18:05:17 +02:00
Linus Rath
f970fd1822
feat: add plugin hooks for compose, attachments, search, lifecycle, and routing
2026-05-02 21:27:56 +02:00
Linus Rath
8935b81f12
chore: update version to 1.5.3
2026-04-28 17:34:06 +02:00
Linus Rath
1b84547211
feat: add Theme API v2 with token compiler, skin slot
2026-04-28 15:39:13 +02:00
Linus Rath
d657aec391
feat: add support for right-side composer sidebar and update related types
2026-04-25 19:45:45 +02:00
Linus Rath
fe1d4861bb
feat: composer-sidebar slot + plugin-declared frame-src origins
2026-04-25 18:40:54 +02:00
Linus Rath
8bdadc7ba3
fix: standardize punctuation
2026-04-16 19:07:42 +02:00
Linus Rath
24949e183f
feat: add i18n API, render hooks, and new intercept hooks to plugin system
2026-04-12 13:57:20 +02:00
Linus Rath
6ee0f6a40a
feat: disable plugins by default, require admin approval
2026-04-02 13:50:02 +02:00
Niklas Voss and Linus Rath
2734fa08b7
feat: instead of exposing auth headers, offer a http proxy api for plugins
2026-04-01 11:26:12 +02:00
Niklas Voss and Linus Rath
67a0d622bc
feat: add auth:read permission and ability to retrieve auth headers
2026-04-01 11:26:12 +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
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
b5d471e9c8
feat: fix: enforce admin theme locks and repair theme ZIP bundles
2026-03-27 19:42:30 +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
54981950b0
feat(plugins): resizable collapsible detail sidebar, auto-init on refresh
...
- Add email-detail-sidebar slot type for right-side plugin panels
- Plugin sidebar inside EmailViewer with ResizeHandle (200-500px, drag/dbl-click reset)
- Collapse/expand toggle with PanelRightClose/PanelRightOpen icons
- Call initializePlugins() on mount so plugins survive page refresh
- Fix plugin loader: call exposePluginExternals() before loading
- Fix CSP: add blob: to script-src for plugin bundle loading
- Fix enablePlugin: wire slot registration bridge before loading
- Fix email-banner PluginSlot: pass email via extraProps
- Fix sidebar-widget PluginSlot: move inside scrollable area
- Emit emailHooks.onEmailOpen/onEmailClose from selectEmail()
2026-03-25 00:44:05 +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