@rapidmx/web-client 0.20.0 → 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +415 -381
- package/apps/admin/_layout.tsx +2 -2
- package/apps/admin/audit-log/index.tsx +4 -4
- package/apps/admin/branding/index.tsx +39 -39
- package/apps/admin/data-requests/index.tsx +482 -482
- package/apps/admin/distribution-lists/[uid].tsx +3 -3
- package/apps/admin/distribution-lists/index.tsx +4 -4
- package/apps/admin/distribution-lists/new/index.tsx +5 -5
- package/apps/admin/domains/[uid].tsx +166 -166
- package/apps/admin/domains/index.tsx +4 -4
- package/apps/admin/domains/new/index.tsx +5 -5
- package/apps/admin/encryption-policy/index.tsx +1 -1
- package/apps/admin/escrow-scopes/[uid].tsx +350 -350
- package/apps/admin/escrow-scopes/index.tsx +4 -4
- package/apps/admin/escrow-scopes/new/index.tsx +5 -5
- package/apps/admin/index.tsx +129 -129
- package/apps/admin/ingest-queue/index.tsx +4 -4
- package/apps/admin/mailbox-policy/index.tsx +1 -1
- package/apps/admin/mailboxes/[uid].tsx +271 -271
- package/apps/admin/mailboxes/new/index.tsx +30 -30
- package/apps/admin/plugins/index.tsx +15 -15
- package/apps/admin/quarantine/index.tsx +5 -5
- package/apps/admin/retention-policy/index.tsx +39 -39
- package/apps/admin/signing-certificates/index.tsx +343 -343
- package/apps/admin/transport-rules/[uid].tsx +5 -5
- package/apps/admin/transport-rules/_transportRuleConfig.tsx +3 -3
- package/apps/admin/transport-rules/index.tsx +4 -4
- package/apps/admin/transport-rules/new/index.tsx +5 -5
- package/apps/escrow/_layout.tsx +1 -1
- package/apps/escrow/audit-log/index.tsx +196 -196
- package/apps/escrow/index.tsx +4 -4
- package/apps/escrow/matters/[uid].tsx +621 -621
- package/apps/escrow/matters/new/index.tsx +6 -6
- package/apps/shared/appearance/AppearanceForm.tsx +3 -3
- package/apps/shared/appearance/AppearanceHead.tsx +1 -1
- package/apps/shared/appearance/AppearanceProvider.tsx +3 -3
- package/apps/shared/appearance/appearanceCache.ts +1 -1
- package/apps/shared/appearance/appearanceContext.ts +1 -1
- package/apps/shared/appearance/theme.ts +1 -1
- package/apps/shared/auth/adminAccess.ts +99 -99
- package/apps/shared/calendar/bookingPlugin.ts +1 -1
- package/apps/shared/calendar/calendarLiveUpdates.ts +1 -1
- package/apps/shared/calendar/calendarReminders.ts +1 -1
- package/apps/shared/calendar/useCalendarReminders.ts +1 -1
- package/apps/shared/components/admin/diagnostics/DiagnosticsManager.tsx +1 -1
- package/apps/shared/components/admin/diagnostics/InstalledPlugins.tsx +2 -2
- package/apps/shared/components/admin/diagnostics/LogsPanel.tsx +2 -2
- package/apps/shared/components/admin/diagnostics/PackagesTable.tsx +1 -1
- package/apps/shared/components/admin/diagnostics/RuntimePanel.tsx +1 -1
- package/apps/shared/components/admin/diagnostics/SystemPanel.tsx +2 -2
- package/apps/shared/components/admin/diagnostics/VersionsPanel.tsx +1 -1
- package/apps/shared/components/admin/diagnostics/diagnosticsApi.ts +1 -1
- package/apps/shared/components/admin/diagnostics/format.ts +1 -1
- package/apps/shared/components/admin/diagnostics/logClient.ts +1 -1
- package/apps/shared/components/admin/distributionLists/MemberListCard.tsx +4 -4
- package/apps/shared/components/admin/elevation.ts +1 -1
- package/apps/shared/components/admin/escrowScopes/EscrowScopeKeyAndHoldersFields.tsx +3 -3
- package/apps/shared/components/admin/layout/AdminShell.tsx +384 -384
- package/apps/shared/components/admin/mailboxes/EraseLeftoverDataDialog.tsx +238 -238
- package/apps/shared/components/admin/mailboxes/EscrowScopeCard.tsx +154 -152
- package/apps/shared/components/admin/mailboxes/LeftoverMailboxesSection.tsx +194 -194
- package/apps/shared/components/admin/mailboxes/MailboxTable.tsx +1 -1
- package/apps/shared/components/admin/mailboxes/ResourceSettingsCard.tsx +19 -14
- package/apps/shared/components/admin/mailboxes/ShareAccessCard.tsx +5 -5
- package/apps/shared/components/admin/settings/BrandingForm.tsx +423 -423
- package/apps/shared/components/admin/settings/DomainDnsSetup.tsx +5 -5
- package/apps/shared/components/admin/settings/EncryptionPolicyForm.tsx +119 -119
- package/apps/shared/components/admin/settings/LoadedSettingsForm.tsx +2 -2
- package/apps/shared/components/admin/settings/MailboxCreateForm.tsx +32 -27
- package/apps/shared/components/admin/settings/MailboxPolicyForm.tsx +198 -198
- package/apps/shared/components/admin/settings/PluginsManager.tsx +2093 -2093
- package/apps/shared/components/admin/settings/RetentionPolicyForm.tsx +182 -182
- package/apps/shared/components/admin/setup/EscrowSetupStep.tsx +288 -288
- package/apps/shared/components/admin/setup/SetupWizard.tsx +450 -446
- package/apps/shared/components/admin/signOut.ts +1 -1
- package/apps/shared/components/admin/usePagedList.tsx +129 -129
- package/apps/shared/components/calendar/AppointmentQuickForm.tsx +3 -3
- package/apps/shared/components/calendar/CalendarListSidebar.tsx +3 -3
- package/apps/shared/components/calendar/DescriptionEditor.tsx +1 -1
- package/apps/shared/components/calendar/EventDescriptionView.tsx +1 -1
- package/apps/shared/components/calendar/EventDetails.tsx +16 -14
- package/apps/shared/components/calendar/EventEditor.tsx +54 -39
- package/apps/shared/components/calendar/EventExpandedForm.tsx +3 -3
- package/apps/shared/components/calendar/EventFormParts.tsx +2 -2
- package/apps/shared/components/calendar/EventModal.tsx +206 -206
- package/apps/shared/components/calendar/EventQuickForm.tsx +3 -3
- package/apps/shared/components/calendar/EventShell.tsx +1 -1
- package/apps/shared/components/calendar/FindATime.tsx +6 -4
- package/apps/shared/components/calendar/GuestInput.tsx +2 -2
- package/apps/shared/components/calendar/MonthView.tsx +185 -185
- package/apps/shared/components/calendar/QuickCreateFaces.tsx +1 -1
- package/apps/shared/components/calendar/QuickFaceFrame.tsx +1 -1
- package/apps/shared/components/calendar/RecurrenceEditor.tsx +227 -227
- package/apps/shared/components/calendar/RequestChangeForm.tsx +8 -6
- package/apps/shared/components/calendar/ResourcePicker.tsx +7 -5
- package/apps/shared/components/calendar/SplitDayView.tsx +144 -144
- package/apps/shared/components/calendar/TaskQuickForm.tsx +23 -18
- package/apps/shared/components/calendar/TimeGridView.tsx +246 -246
- package/apps/shared/components/calendar/allDay.ts +124 -124
- package/apps/shared/components/calendar/eventDialogFields.ts +3 -3
- package/apps/shared/components/calendar/eventForm.ts +3 -3
- package/apps/shared/components/calendar/eventFormat.ts +3 -3
- package/apps/shared/components/calendar/findTimeGrid.ts +2 -2
- package/apps/shared/components/calendar/layout/CalendarShell.tsx +11 -9
- package/apps/shared/components/contacts/ContactDetailPane.tsx +4 -4
- package/apps/shared/components/contacts/ContactForm.tsx +393 -383
- package/apps/shared/components/contacts/ContactsSidebar.tsx +7 -5
- package/apps/shared/components/contacts/ContactsToolbar.tsx +103 -103
- package/apps/shared/components/contacts/KeyChangeReview.tsx +5 -5
- package/apps/shared/components/contacts/contactKeys.ts +3 -3
- package/apps/shared/components/contacts/layout/ContactsShell.tsx +9 -7
- package/apps/shared/components/escrow/layout/EscrowShell.tsx +155 -155
- package/apps/shared/components/forms/StringListField.tsx +1 -1
- package/apps/shared/components/layout/AppShell.tsx +465 -461
- package/apps/shared/components/layout/BrandingChrome.tsx +1 -1
- package/apps/shared/components/layout/KeyEnrollmentGate.tsx +398 -398
- package/apps/shared/components/layout/MailboxProvisioning.tsx +170 -168
- package/apps/shared/components/layout/RecoveryCodeUnlock.tsx +9 -9
- package/apps/shared/components/layout/ResponsiveToolbar.tsx +315 -315
- package/apps/shared/components/layout/ThemeSwitch.tsx +84 -84
- package/apps/shared/components/layout/UnlockPromptProvider.tsx +6 -6
- package/apps/shared/components/layout/UserMenu.tsx +441 -439
- package/apps/shared/components/mail/ConversationList.tsx +334 -332
- package/apps/shared/components/mail/ConversationThreadPane.tsx +624 -613
- package/apps/shared/components/mail/InviteCard.tsx +11 -9
- package/apps/shared/components/mail/LazyReadingPane.tsx +2 -2
- package/apps/shared/components/mail/MailAddress.tsx +1 -1
- package/apps/shared/components/mail/MailListToolbar.tsx +2 -2
- package/apps/shared/components/mail/MailSelectionBar.tsx +240 -240
- package/apps/shared/components/mail/MenuButton.tsx +404 -404
- package/apps/shared/components/mail/MessageDetailPane.tsx +1759 -1757
- package/apps/shared/components/mail/MoveToFolderDialog.tsx +8 -6
- package/apps/shared/components/mail/OutboxRowStatus.tsx +1 -1
- package/apps/shared/components/mail/PermanentDeleteDialog.tsx +2 -2
- package/apps/shared/components/mail/compose/ComposeContext.tsx +323 -312
- package/apps/shared/components/mail/compose/ComposeToolbar.tsx +422 -422
- package/apps/shared/components/mail/compose/ComposeWindow.tsx +1709 -1681
- package/apps/shared/components/mail/compose/ComposeWindowPlaceholder.tsx +4 -4
- package/apps/shared/components/mail/compose/EmojiPicker.tsx +2 -2
- package/apps/shared/components/mail/compose/GifPicker.tsx +3 -3
- package/apps/shared/components/mail/compose/RecipientInput.tsx +1 -1
- package/apps/shared/components/mail/compose/RichTextEditor.tsx +147 -147
- package/apps/shared/components/mail/compose/ScheduleSendPicker.tsx +1 -1
- package/apps/shared/components/mail/compose/composeFlushRegistry.ts +60 -60
- package/apps/shared/components/mail/compose/encryptionRequirement.ts +2 -2
- package/apps/shared/components/mail/compose/quotedBody.ts +161 -161
- package/apps/shared/components/mail/compose/recipients.ts +1 -1
- package/apps/shared/components/mail/invite/InviteRowChip.tsx +2 -2
- package/apps/shared/components/mail/invite/InviteRsvpPopover.tsx +9 -7
- package/apps/shared/components/mail/invite/InviteTimeline.tsx +1 -1
- package/apps/shared/components/mail/invite/ProposeTimeForm.tsx +2 -2
- package/apps/shared/components/mail/invite/inviteFormat.ts +2 -2
- package/apps/shared/components/mail/invite/inviteStore.ts +14 -6
- package/apps/shared/components/mail/labelMenu.tsx +9 -7
- package/apps/shared/components/mail/layout/MailShell.tsx +4 -4
- package/apps/shared/components/mail/listPreferences.ts +2 -2
- package/apps/shared/components/mail/pinnedSigners.ts +45 -19
- package/apps/shared/components/mail/reading/EncryptedBody.tsx +2 -2
- package/apps/shared/components/mail/reading/MessageBody.tsx +6 -6
- package/apps/shared/components/mail/reading/MessageCard.tsx +3 -3
- package/apps/shared/components/mail/reading/MessageMoreMenu.tsx +258 -258
- package/apps/shared/components/mail/reading/MessageSourceDialog.tsx +79 -79
- package/apps/shared/components/mail/reading/PendingMessageCard.tsx +1 -1
- package/apps/shared/components/mail/reading/bodyContent.ts +3 -3
- package/apps/shared/components/mail/reading/bodyHtml.ts +1 -1
- package/apps/shared/components/mail/reading/messageExport.ts +59 -59
- package/apps/shared/components/mail/reading/printMessage.ts +99 -99
- package/apps/shared/components/mail/reading/useMessageActions.ts +450 -443
- package/apps/shared/components/mail/unreadStyle.tsx +1 -1
- package/apps/shared/components/mail/verificationSeals.ts +129 -125
- package/apps/shared/components/mail/writableMailboxes.ts +14 -7
- package/apps/shared/components/rules/RuleBuilder.tsx +311 -311
- package/apps/shared/components/settings/SigningCertificateCard.tsx +344 -344
- package/apps/shared/components/settings/layout/SettingsShell.tsx +8 -6
- package/apps/shared/components/sharing/PrincipalListField.tsx +1 -1
- package/apps/shared/components/sharing/PrincipalPicker.tsx +1 -1
- package/apps/shared/components/sharing/PrincipalResolver.tsx +4 -4
- package/apps/shared/components/tasks/TasksSidebar.tsx +7 -5
- package/apps/shared/components/tasks/layout/TasksShell.tsx +9 -7
- package/apps/shared/keyboard/GlobalShortcuts.tsx +51 -51
- package/apps/shared/keyboard/ShortcutProvider.tsx +62 -62
- package/apps/shared/keyboard/ShortcutsDialog.tsx +84 -84
- package/apps/shared/keyboard/dispatch.ts +124 -124
- package/apps/shared/keyboard/format.ts +89 -89
- package/apps/shared/keyboard/keymap.ts +114 -114
- package/apps/shared/keyboard/registry.ts +65 -65
- package/apps/shared/keyboard/targets.ts +79 -79
- package/apps/shared/mail/findWellKnownFolderUid.ts +6 -4
- package/apps/shared/mail/folderCounts.ts +8 -4
- package/apps/shared/mail/folderOfType.ts +51 -49
- package/apps/shared/mail/folderTree.ts +143 -143
- package/apps/shared/mail/listAllPages.ts +39 -39
- package/apps/shared/mail/listSnapshots.ts +2 -2
- package/apps/shared/mail/messageReadState.ts +6 -5
- package/apps/shared/mail/newMailNotifications.ts +171 -171
- package/apps/shared/mail/outbox/composeBridge.ts +2 -2
- package/apps/shared/mail/outbox/outboxState.ts +1 -1
- package/apps/shared/mail/outbox/outgoingReplies.ts +2 -2
- package/apps/shared/mail/outbox/sendDecision.ts +2 -2
- package/apps/shared/mail/outbox/sendJob.ts +450 -445
- package/apps/shared/mail/outbox/sendOutcomes.ts +160 -155
- package/apps/shared/mail/outbox/useOutboxStatus.ts +5 -3
- package/apps/shared/mail/permanentDelete.ts +8 -7
- package/apps/shared/mail/primaryMailbox.ts +1 -1
- package/apps/shared/mail/reportNotices.ts +66 -66
- package/apps/shared/mail/senderBlocking.ts +157 -141
- package/apps/shared/mail/useMailConnection.ts +207 -205
- package/apps/shared/mail/useMailLiveUpdates.ts +277 -277
- package/apps/shared/mail/useMailboxUpdateAccess.ts +84 -60
- package/apps/shared/mail/useMarkMessageRead.ts +54 -47
- package/apps/shared/mail/useNewMailNotifications.ts +178 -178
- package/apps/shared/mail/usePermanentDelete.tsx +5 -3
- package/apps/shared/navigation/pageTitle.ts +1 -1
- package/apps/shared/notifications/NotificationCenter.tsx +1 -1
- package/apps/shared/notifications/NotificationHistoryDialog.tsx +2 -2
- package/apps/shared/notifications/apiErrors.ts +2 -2
- package/apps/shared/notifications/pushStatus.ts +1 -1
- package/apps/shared/notifications/store.ts +560 -560
- package/apps/shared/notifications/systemErrors.ts +1 -1
- package/apps/shared/search/LocalIndexLifecycle.tsx +120 -114
- package/apps/shared/search/crossMailboxSearch.ts +3 -3
- package/apps/shared/search/localIndexBuilder.ts +493 -481
- package/apps/shared/search/localIndexKey.ts +1 -1
- package/apps/shared/search/localIndexRpcClient.ts +150 -30
- package/apps/shared/search/localIndexTransport.ts +84 -0
- package/apps/shared/search/localIndexWorker.ts +1 -1
- package/apps/shared/search/searchTier2.ts +3 -3
- package/apps/shared/signing/enrollmentStorage.ts +33 -33
- package/apps/shared/signing/enrollmentTracker.ts +385 -385
- package/apps/shared/signing/enrollmentView.ts +251 -251
- package/apps/shared/signing/signingInfo.ts +1 -1
- package/apps/shared/signing/useNow.ts +19 -19
- package/apps/shared/signing/useSigningEnrollmentWatcher.ts +92 -90
- package/apps/shared/styles/app.css +387 -396
- package/apps/www/_layout.tsx +2 -2
- package/apps/www/calendar/index.tsx +583 -581
- package/apps/www/contacts/[uid].tsx +114 -112
- package/apps/www/contacts/index.tsx +19 -17
- package/apps/www/index.tsx +3021 -3012
- package/apps/www/messages/[uid].tsx +141 -139
- package/apps/www/settings/auto-reply/index.tsx +138 -136
- package/apps/www/settings/blocked-senders/index.tsx +305 -303
- package/apps/www/settings/encryption/index.tsx +1296 -1290
- package/apps/www/settings/filters/[uid].tsx +184 -179
- package/apps/www/settings/filters/_mailFilterRuleConfig.tsx +2 -2
- package/apps/www/settings/filters/index.tsx +105 -105
- package/apps/www/settings/filters/new/index.tsx +167 -165
- package/apps/www/settings/labels/index.tsx +209 -207
- package/apps/www/settings/privacy/index.tsx +499 -495
- package/apps/www/settings/profile/index.tsx +256 -251
- package/apps/www/settings/read-receipts/index.tsx +155 -150
- package/apps/www/settings/sharing/index.tsx +259 -259
- package/apps/www/settings/signatures/[uid].tsx +175 -175
- package/apps/www/settings/signatures/index.tsx +91 -91
- package/apps/www/settings/signatures/new/index.tsx +138 -138
- package/apps/www/settings/signatures/signatureDefaults.ts +1 -1
- package/apps/www/tasks/index.tsx +659 -654
- package/dist/apps/admin/_layout.d.ts +1 -1
- package/dist/apps/admin/_layout.js +1 -1
- package/dist/apps/admin/audit-log/index.d.ts +1 -1
- package/dist/apps/admin/audit-log/index.js +4 -4
- package/dist/apps/admin/branding/index.js +3 -3
- package/dist/apps/admin/data-requests/index.js +8 -8
- package/dist/apps/admin/distribution-lists/[uid].js +3 -3
- package/dist/apps/admin/distribution-lists/index.js +4 -4
- package/dist/apps/admin/distribution-lists/new/index.js +5 -5
- package/dist/apps/admin/domains/[uid].js +6 -6
- package/dist/apps/admin/domains/index.js +4 -4
- package/dist/apps/admin/domains/new/index.js +5 -5
- package/dist/apps/admin/encryption-policy/index.js +1 -1
- package/dist/apps/admin/escrow-scopes/[uid].d.ts +1 -1
- package/dist/apps/admin/escrow-scopes/[uid].js +7 -7
- package/dist/apps/admin/escrow-scopes/index.js +4 -4
- package/dist/apps/admin/escrow-scopes/new/index.js +5 -5
- package/dist/apps/admin/index.js +6 -6
- package/dist/apps/admin/ingest-queue/index.js +4 -4
- package/dist/apps/admin/mailbox-policy/index.js +1 -1
- package/dist/apps/admin/mailboxes/[uid].js +5 -5
- package/dist/apps/admin/quarantine/index.js +5 -5
- package/dist/apps/admin/retention-policy/index.js +3 -3
- package/dist/apps/admin/signing-certificates/index.js +5 -5
- package/dist/apps/admin/transport-rules/[uid].js +5 -5
- package/dist/apps/admin/transport-rules/_transportRuleConfig.d.ts +1 -1
- package/dist/apps/admin/transport-rules/_transportRuleConfig.js +2 -2
- package/dist/apps/admin/transport-rules/index.js +4 -4
- package/dist/apps/admin/transport-rules/new/index.js +5 -5
- package/dist/apps/escrow/_layout.d.ts +1 -1
- package/dist/apps/escrow/audit-log/index.d.ts +1 -1
- package/dist/apps/escrow/audit-log/index.js +4 -4
- package/dist/apps/escrow/index.js +4 -4
- package/dist/apps/escrow/matters/[uid].js +10 -10
- package/dist/apps/escrow/matters/new/index.js +6 -6
- package/dist/apps/shared/appearance/AppearanceForm.js +3 -3
- package/dist/apps/shared/appearance/AppearanceHead.js +1 -1
- package/dist/apps/shared/appearance/AppearanceProvider.d.ts +1 -1
- package/dist/apps/shared/appearance/AppearanceProvider.js +3 -3
- package/dist/apps/shared/appearance/appearanceCache.d.ts +1 -1
- package/dist/apps/shared/appearance/appearanceCache.js +1 -1
- package/dist/apps/shared/appearance/appearanceContext.d.ts +1 -1
- package/dist/apps/shared/appearance/theme.d.ts +1 -1
- package/dist/apps/shared/auth/adminAccess.js +1 -1
- package/dist/apps/shared/calendar/bookingPlugin.js +1 -1
- package/dist/apps/shared/calendar/calendarLiveUpdates.d.ts +1 -1
- package/dist/apps/shared/calendar/calendarReminders.d.ts +1 -1
- package/dist/apps/shared/calendar/useCalendarReminders.js +1 -1
- package/dist/apps/shared/components/admin/diagnostics/DiagnosticsManager.js +1 -1
- package/dist/apps/shared/components/admin/diagnostics/InstalledPlugins.d.ts +1 -1
- package/dist/apps/shared/components/admin/diagnostics/InstalledPlugins.js +2 -2
- package/dist/apps/shared/components/admin/diagnostics/LogsPanel.js +2 -2
- package/dist/apps/shared/components/admin/diagnostics/PackagesTable.js +1 -1
- package/dist/apps/shared/components/admin/diagnostics/RuntimePanel.js +1 -1
- package/dist/apps/shared/components/admin/diagnostics/SystemPanel.js +2 -2
- package/dist/apps/shared/components/admin/diagnostics/VersionsPanel.js +1 -1
- package/dist/apps/shared/components/admin/diagnostics/diagnosticsApi.js +1 -1
- package/dist/apps/shared/components/admin/diagnostics/format.js +1 -1
- package/dist/apps/shared/components/admin/diagnostics/logClient.js +1 -1
- package/dist/apps/shared/components/admin/distributionLists/MemberListCard.d.ts +1 -1
- package/dist/apps/shared/components/admin/distributionLists/MemberListCard.js +4 -4
- package/dist/apps/shared/components/admin/elevation.js +1 -1
- package/dist/apps/shared/components/admin/escrowScopes/EscrowScopeKeyAndHoldersFields.js +3 -3
- package/dist/apps/shared/components/admin/layout/AdminShell.d.ts +1 -1
- package/dist/apps/shared/components/admin/layout/AdminShell.js +8 -8
- package/dist/apps/shared/components/admin/mailboxes/EraseLeftoverDataDialog.d.ts +1 -1
- package/dist/apps/shared/components/admin/mailboxes/EraseLeftoverDataDialog.js +6 -6
- package/dist/apps/shared/components/admin/mailboxes/EscrowScopeCard.d.ts +1 -1
- package/dist/apps/shared/components/admin/mailboxes/EscrowScopeCard.js +10 -8
- package/dist/apps/shared/components/admin/mailboxes/LeftoverMailboxesSection.js +4 -4
- package/dist/apps/shared/components/admin/mailboxes/MailboxTable.d.ts +1 -1
- package/dist/apps/shared/components/admin/mailboxes/ResourceSettingsCard.d.ts +1 -1
- package/dist/apps/shared/components/admin/mailboxes/ResourceSettingsCard.js +7 -5
- package/dist/apps/shared/components/admin/mailboxes/ShareAccessCard.js +5 -5
- package/dist/apps/shared/components/admin/settings/BrandingForm.d.ts +1 -1
- package/dist/apps/shared/components/admin/settings/BrandingForm.js +8 -8
- package/dist/apps/shared/components/admin/settings/DomainDnsSetup.d.ts +1 -1
- package/dist/apps/shared/components/admin/settings/DomainDnsSetup.js +5 -5
- package/dist/apps/shared/components/admin/settings/EncryptionPolicyForm.d.ts +1 -1
- package/dist/apps/shared/components/admin/settings/EncryptionPolicyForm.js +4 -4
- package/dist/apps/shared/components/admin/settings/LoadedSettingsForm.js +2 -2
- package/dist/apps/shared/components/admin/settings/MailboxCreateForm.d.ts +1 -1
- package/dist/apps/shared/components/admin/settings/MailboxCreateForm.js +14 -12
- package/dist/apps/shared/components/admin/settings/MailboxPolicyForm.d.ts +1 -1
- package/dist/apps/shared/components/admin/settings/MailboxPolicyForm.js +4 -4
- package/dist/apps/shared/components/admin/settings/PluginsManager.js +5 -5
- package/dist/apps/shared/components/admin/settings/RetentionPolicyForm.d.ts +1 -1
- package/dist/apps/shared/components/admin/settings/RetentionPolicyForm.js +5 -5
- package/dist/apps/shared/components/admin/setup/EscrowSetupStep.js +7 -7
- package/dist/apps/shared/components/admin/setup/SetupWizard.js +26 -22
- package/dist/apps/shared/components/admin/signOut.js +1 -1
- package/dist/apps/shared/components/admin/usePagedList.js +2 -2
- package/dist/apps/shared/components/calendar/AppointmentQuickForm.js +3 -3
- package/dist/apps/shared/components/calendar/CalendarListSidebar.d.ts +1 -1
- package/dist/apps/shared/components/calendar/CalendarListSidebar.js +2 -2
- package/dist/apps/shared/components/calendar/DescriptionEditor.js +1 -1
- package/dist/apps/shared/components/calendar/EventDescriptionView.js +1 -1
- package/dist/apps/shared/components/calendar/EventDetails.d.ts +2 -2
- package/dist/apps/shared/components/calendar/EventDetails.js +16 -14
- package/dist/apps/shared/components/calendar/EventEditor.d.ts +2 -2
- package/dist/apps/shared/components/calendar/EventEditor.js +22 -20
- package/dist/apps/shared/components/calendar/EventExpandedForm.js +2 -2
- package/dist/apps/shared/components/calendar/EventFormParts.d.ts +1 -1
- package/dist/apps/shared/components/calendar/EventFormParts.js +1 -1
- package/dist/apps/shared/components/calendar/EventModal.d.ts +2 -2
- package/dist/apps/shared/components/calendar/EventModal.js +3 -3
- package/dist/apps/shared/components/calendar/EventQuickForm.js +3 -3
- package/dist/apps/shared/components/calendar/EventShell.js +1 -1
- package/dist/apps/shared/components/calendar/FindATime.js +6 -4
- package/dist/apps/shared/components/calendar/GuestInput.d.ts +2 -2
- package/dist/apps/shared/components/calendar/MonthView.d.ts +1 -1
- package/dist/apps/shared/components/calendar/MonthView.js +1 -1
- package/dist/apps/shared/components/calendar/QuickCreateFaces.js +1 -1
- package/dist/apps/shared/components/calendar/QuickFaceFrame.js +1 -1
- package/dist/apps/shared/components/calendar/RecurrenceEditor.d.ts +1 -1
- package/dist/apps/shared/components/calendar/RecurrenceEditor.js +1 -1
- package/dist/apps/shared/components/calendar/RequestChangeForm.js +8 -6
- package/dist/apps/shared/components/calendar/ResourcePicker.d.ts +1 -1
- package/dist/apps/shared/components/calendar/ResourcePicker.js +7 -5
- package/dist/apps/shared/components/calendar/SplitDayView.d.ts +1 -1
- package/dist/apps/shared/components/calendar/TaskQuickForm.d.ts +1 -1
- package/dist/apps/shared/components/calendar/TaskQuickForm.js +9 -7
- package/dist/apps/shared/components/calendar/TimeGridView.d.ts +1 -1
- package/dist/apps/shared/components/calendar/TimeGridView.js +1 -1
- package/dist/apps/shared/components/calendar/allDay.d.ts +2 -2
- package/dist/apps/shared/components/calendar/allDay.js +1 -1
- package/dist/apps/shared/components/calendar/eventDialogFields.d.ts +2 -2
- package/dist/apps/shared/components/calendar/eventDialogFields.js +2 -2
- package/dist/apps/shared/components/calendar/eventForm.d.ts +3 -3
- package/dist/apps/shared/components/calendar/eventFormat.d.ts +1 -1
- package/dist/apps/shared/components/calendar/eventFormat.js +2 -2
- package/dist/apps/shared/components/calendar/findTimeGrid.d.ts +1 -1
- package/dist/apps/shared/components/calendar/findTimeGrid.js +1 -1
- package/dist/apps/shared/components/calendar/layout/CalendarShell.d.ts +1 -1
- package/dist/apps/shared/components/calendar/layout/CalendarShell.js +11 -9
- package/dist/apps/shared/components/contacts/ContactDetailPane.d.ts +1 -1
- package/dist/apps/shared/components/contacts/ContactDetailPane.js +2 -2
- package/dist/apps/shared/components/contacts/ContactForm.d.ts +2 -2
- package/dist/apps/shared/components/contacts/ContactForm.js +12 -8
- package/dist/apps/shared/components/contacts/ContactsSidebar.d.ts +1 -1
- package/dist/apps/shared/components/contacts/ContactsSidebar.js +7 -5
- package/dist/apps/shared/components/contacts/KeyChangeReview.d.ts +1 -1
- package/dist/apps/shared/components/contacts/KeyChangeReview.js +5 -5
- package/dist/apps/shared/components/contacts/contactKeys.d.ts +2 -2
- package/dist/apps/shared/components/contacts/contactKeys.js +2 -2
- package/dist/apps/shared/components/contacts/layout/ContactsShell.d.ts +1 -1
- package/dist/apps/shared/components/contacts/layout/ContactsShell.js +9 -7
- package/dist/apps/shared/components/escrow/layout/EscrowShell.js +7 -7
- package/dist/apps/shared/components/forms/StringListField.js +1 -1
- package/dist/apps/shared/components/layout/AppShell.d.ts +2 -2
- package/dist/apps/shared/components/layout/AppShell.js +14 -10
- package/dist/apps/shared/components/layout/BrandingChrome.d.ts +1 -1
- package/dist/apps/shared/components/layout/KeyEnrollmentGate.d.ts +1 -1
- package/dist/apps/shared/components/layout/KeyEnrollmentGate.js +9 -9
- package/dist/apps/shared/components/layout/MailboxProvisioning.js +8 -6
- package/dist/apps/shared/components/layout/RecoveryCodeUnlock.d.ts +1 -1
- package/dist/apps/shared/components/layout/RecoveryCodeUnlock.js +9 -9
- package/dist/apps/shared/components/layout/UnlockPromptProvider.d.ts +2 -2
- package/dist/apps/shared/components/layout/UnlockPromptProvider.js +5 -5
- package/dist/apps/shared/components/layout/UserMenu.js +6 -4
- package/dist/apps/shared/components/mail/ConversationList.d.ts +2 -2
- package/dist/apps/shared/components/mail/ConversationList.js +6 -4
- package/dist/apps/shared/components/mail/ConversationThreadPane.d.ts +3 -3
- package/dist/apps/shared/components/mail/ConversationThreadPane.js +13 -11
- package/dist/apps/shared/components/mail/InviteCard.js +10 -8
- package/dist/apps/shared/components/mail/LazyReadingPane.js +2 -2
- package/dist/apps/shared/components/mail/MailAddress.d.ts +1 -1
- package/dist/apps/shared/components/mail/MailAddress.js +1 -1
- package/dist/apps/shared/components/mail/MailListToolbar.d.ts +2 -2
- package/dist/apps/shared/components/mail/MailSelectionBar.d.ts +2 -2
- package/dist/apps/shared/components/mail/MenuButton.js +1 -1
- package/dist/apps/shared/components/mail/MessageDetailPane.d.ts +3 -3
- package/dist/apps/shared/components/mail/MessageDetailPane.js +30 -28
- package/dist/apps/shared/components/mail/MoveToFolderDialog.d.ts +1 -1
- package/dist/apps/shared/components/mail/MoveToFolderDialog.js +8 -6
- package/dist/apps/shared/components/mail/OutboxRowStatus.d.ts +1 -1
- package/dist/apps/shared/components/mail/PermanentDeleteDialog.js +2 -2
- package/dist/apps/shared/components/mail/compose/ComposeContext.d.ts +10 -1
- package/dist/apps/shared/components/mail/compose/ComposeContext.js +4 -2
- package/dist/apps/shared/components/mail/compose/ComposeWindow.d.ts +7 -1
- package/dist/apps/shared/components/mail/compose/ComposeWindow.js +54 -31
- package/dist/apps/shared/components/mail/compose/ComposeWindowPlaceholder.js +4 -4
- package/dist/apps/shared/components/mail/compose/EmojiPicker.js +2 -2
- package/dist/apps/shared/components/mail/compose/GifPicker.js +3 -3
- package/dist/apps/shared/components/mail/compose/RecipientInput.d.ts +1 -1
- package/dist/apps/shared/components/mail/compose/RecipientInput.js +1 -1
- package/dist/apps/shared/components/mail/compose/ScheduleSendPicker.js +1 -1
- package/dist/apps/shared/components/mail/compose/encryptionRequirement.d.ts +2 -2
- package/dist/apps/shared/components/mail/compose/encryptionRequirement.js +1 -1
- package/dist/apps/shared/components/mail/compose/quotedBody.d.ts +3 -3
- package/dist/apps/shared/components/mail/compose/quotedBody.js +3 -3
- package/dist/apps/shared/components/mail/compose/recipients.d.ts +1 -1
- package/dist/apps/shared/components/mail/invite/InviteRowChip.d.ts +1 -1
- package/dist/apps/shared/components/mail/invite/InviteRsvpPopover.d.ts +1 -1
- package/dist/apps/shared/components/mail/invite/InviteRsvpPopover.js +9 -7
- package/dist/apps/shared/components/mail/invite/InviteTimeline.d.ts +1 -1
- package/dist/apps/shared/components/mail/invite/ProposeTimeForm.d.ts +1 -1
- package/dist/apps/shared/components/mail/invite/ProposeTimeForm.js +1 -1
- package/dist/apps/shared/components/mail/invite/inviteFormat.d.ts +2 -2
- package/dist/apps/shared/components/mail/invite/inviteStore.d.ts +9 -3
- package/dist/apps/shared/components/mail/invite/inviteStore.js +13 -6
- package/dist/apps/shared/components/mail/labelMenu.d.ts +1 -1
- package/dist/apps/shared/components/mail/labelMenu.js +9 -7
- package/dist/apps/shared/components/mail/layout/MailShell.d.ts +1 -1
- package/dist/apps/shared/components/mail/layout/MailShell.js +3 -3
- package/dist/apps/shared/components/mail/listPreferences.d.ts +2 -2
- package/dist/apps/shared/components/mail/listPreferences.js +1 -1
- package/dist/apps/shared/components/mail/pinnedSigners.d.ts +12 -5
- package/dist/apps/shared/components/mail/pinnedSigners.js +37 -18
- package/dist/apps/shared/components/mail/reading/EncryptedBody.js +2 -2
- package/dist/apps/shared/components/mail/reading/MessageBody.d.ts +2 -2
- package/dist/apps/shared/components/mail/reading/MessageBody.js +4 -4
- package/dist/apps/shared/components/mail/reading/MessageCard.d.ts +1 -1
- package/dist/apps/shared/components/mail/reading/MessageCard.js +2 -2
- package/dist/apps/shared/components/mail/reading/MessageSourceDialog.js +3 -3
- package/dist/apps/shared/components/mail/reading/PendingMessageCard.js +1 -1
- package/dist/apps/shared/components/mail/reading/bodyContent.d.ts +2 -2
- package/dist/apps/shared/components/mail/reading/bodyContent.js +2 -2
- package/dist/apps/shared/components/mail/reading/bodyHtml.js +1 -1
- package/dist/apps/shared/components/mail/reading/messageExport.js +1 -1
- package/dist/apps/shared/components/mail/reading/printMessage.d.ts +2 -2
- package/dist/apps/shared/components/mail/reading/printMessage.js +11 -11
- package/dist/apps/shared/components/mail/reading/useMessageActions.d.ts +1 -1
- package/dist/apps/shared/components/mail/reading/useMessageActions.js +18 -16
- package/dist/apps/shared/components/mail/unreadStyle.d.ts +1 -1
- package/dist/apps/shared/components/mail/verificationSeals.d.ts +27 -6
- package/dist/apps/shared/components/mail/verificationSeals.js +15 -11
- package/dist/apps/shared/components/mail/writableMailboxes.d.ts +8 -3
- package/dist/apps/shared/components/mail/writableMailboxes.js +12 -6
- package/dist/apps/shared/components/rules/RuleBuilder.js +1 -1
- package/dist/apps/shared/components/settings/SigningCertificateCard.d.ts +1 -1
- package/dist/apps/shared/components/settings/SigningCertificateCard.js +3 -3
- package/dist/apps/shared/components/settings/layout/SettingsShell.d.ts +1 -1
- package/dist/apps/shared/components/settings/layout/SettingsShell.js +8 -6
- package/dist/apps/shared/components/sharing/PrincipalListField.d.ts +1 -1
- package/dist/apps/shared/components/sharing/PrincipalPicker.d.ts +1 -1
- package/dist/apps/shared/components/sharing/PrincipalPicker.js +1 -1
- package/dist/apps/shared/components/sharing/PrincipalResolver.d.ts +1 -1
- package/dist/apps/shared/components/sharing/PrincipalResolver.js +3 -3
- package/dist/apps/shared/components/tasks/TasksSidebar.d.ts +1 -1
- package/dist/apps/shared/components/tasks/TasksSidebar.js +7 -5
- package/dist/apps/shared/components/tasks/layout/TasksShell.d.ts +1 -1
- package/dist/apps/shared/components/tasks/layout/TasksShell.js +9 -7
- package/dist/apps/shared/keyboard/ShortcutsDialog.js +1 -1
- package/dist/apps/shared/mail/findWellKnownFolderUid.d.ts +5 -3
- package/dist/apps/shared/mail/findWellKnownFolderUid.js +5 -4
- package/dist/apps/shared/mail/folderCounts.d.ts +1 -1
- package/dist/apps/shared/mail/folderCounts.js +6 -4
- package/dist/apps/shared/mail/folderOfType.d.ts +3 -2
- package/dist/apps/shared/mail/folderOfType.js +4 -4
- package/dist/apps/shared/mail/folderTree.d.ts +1 -1
- package/dist/apps/shared/mail/listSnapshots.d.ts +2 -2
- package/dist/apps/shared/mail/messageReadState.d.ts +4 -3
- package/dist/apps/shared/mail/messageReadState.js +5 -5
- package/dist/apps/shared/mail/newMailNotifications.d.ts +1 -1
- package/dist/apps/shared/mail/newMailNotifications.js +1 -1
- package/dist/apps/shared/mail/outbox/composeBridge.d.ts +2 -2
- package/dist/apps/shared/mail/outbox/outboxState.d.ts +1 -1
- package/dist/apps/shared/mail/outbox/outgoingReplies.d.ts +2 -2
- package/dist/apps/shared/mail/outbox/sendDecision.d.ts +2 -2
- package/dist/apps/shared/mail/outbox/sendDecision.js +1 -1
- package/dist/apps/shared/mail/outbox/sendJob.d.ts +10 -6
- package/dist/apps/shared/mail/outbox/sendJob.js +39 -35
- package/dist/apps/shared/mail/outbox/sendOutcomes.d.ts +6 -3
- package/dist/apps/shared/mail/outbox/sendOutcomes.js +19 -15
- package/dist/apps/shared/mail/outbox/useOutboxStatus.js +5 -3
- package/dist/apps/shared/mail/permanentDelete.d.ts +4 -3
- package/dist/apps/shared/mail/permanentDelete.js +8 -8
- package/dist/apps/shared/mail/primaryMailbox.d.ts +1 -1
- package/dist/apps/shared/mail/primaryMailbox.js +1 -1
- package/dist/apps/shared/mail/reportNotices.d.ts +1 -1
- package/dist/apps/shared/mail/senderBlocking.d.ts +5 -4
- package/dist/apps/shared/mail/senderBlocking.js +19 -16
- package/dist/apps/shared/mail/useMailConnection.d.ts +1 -1
- package/dist/apps/shared/mail/useMailConnection.js +12 -10
- package/dist/apps/shared/mail/useMailLiveUpdates.d.ts +2 -2
- package/dist/apps/shared/mail/useMailLiveUpdates.js +2 -2
- package/dist/apps/shared/mail/useMailboxUpdateAccess.d.ts +3 -2
- package/dist/apps/shared/mail/useMailboxUpdateAccess.js +31 -10
- package/dist/apps/shared/mail/useMarkMessageRead.d.ts +1 -1
- package/dist/apps/shared/mail/useMarkMessageRead.js +5 -3
- package/dist/apps/shared/mail/useNewMailNotifications.d.ts +1 -1
- package/dist/apps/shared/mail/usePermanentDelete.d.ts +1 -1
- package/dist/apps/shared/mail/usePermanentDelete.js +4 -2
- package/dist/apps/shared/navigation/pageTitle.d.ts +1 -1
- package/dist/apps/shared/notifications/NotificationCenter.js +1 -1
- package/dist/apps/shared/notifications/NotificationHistoryDialog.js +2 -2
- package/dist/apps/shared/notifications/apiErrors.js +2 -2
- package/dist/apps/shared/notifications/pushStatus.js +1 -1
- package/dist/apps/shared/notifications/systemErrors.js +1 -1
- package/dist/apps/shared/search/LocalIndexLifecycle.d.ts +2 -2
- package/dist/apps/shared/search/LocalIndexLifecycle.js +15 -10
- package/dist/apps/shared/search/crossMailboxSearch.d.ts +1 -1
- package/dist/apps/shared/search/crossMailboxSearch.js +2 -2
- package/dist/apps/shared/search/localIndexBuilder.d.ts +4 -3
- package/dist/apps/shared/search/localIndexBuilder.js +15 -12
- package/dist/apps/shared/search/localIndexKey.js +1 -1
- package/dist/apps/shared/search/localIndexRpcClient.d.ts +43 -31
- package/dist/apps/shared/search/localIndexRpcClient.js +113 -20
- package/dist/apps/shared/search/localIndexTransport.d.ts +77 -0
- package/dist/apps/shared/search/localIndexTransport.js +1 -0
- package/dist/apps/shared/search/localIndexWorker.d.ts +1 -1
- package/dist/apps/shared/search/searchTier2.d.ts +3 -3
- package/dist/apps/shared/signing/enrollmentTracker.d.ts +1 -1
- package/dist/apps/shared/signing/enrollmentTracker.js +3 -3
- package/dist/apps/shared/signing/enrollmentView.d.ts +1 -1
- package/dist/apps/shared/signing/signingInfo.d.ts +1 -1
- package/dist/apps/shared/signing/signingInfo.js +1 -1
- package/dist/apps/shared/signing/useSigningEnrollmentWatcher.d.ts +1 -1
- package/dist/apps/shared/signing/useSigningEnrollmentWatcher.js +5 -3
- package/dist/apps/shared/styles/app.css +387 -396
- package/dist/apps/www/_layout.d.ts +1 -1
- package/dist/apps/www/_layout.js +1 -1
- package/dist/apps/www/calendar/index.d.ts +1 -1
- package/dist/apps/www/calendar/index.js +20 -18
- package/dist/apps/www/contacts/[uid].d.ts +1 -1
- package/dist/apps/www/contacts/[uid].js +8 -6
- package/dist/apps/www/contacts/index.d.ts +1 -1
- package/dist/apps/www/contacts/index.js +19 -17
- package/dist/apps/www/index.d.ts +1 -1
- package/dist/apps/www/index.js +54 -50
- package/dist/apps/www/messages/[uid].d.ts +1 -1
- package/dist/apps/www/messages/[uid].js +11 -9
- package/dist/apps/www/settings/appearance/index.d.ts +1 -1
- package/dist/apps/www/settings/auto-reply/index.d.ts +1 -1
- package/dist/apps/www/settings/auto-reply/index.js +6 -4
- package/dist/apps/www/settings/blocked-senders/index.d.ts +1 -1
- package/dist/apps/www/settings/blocked-senders/index.js +6 -4
- package/dist/apps/www/settings/encryption/index.d.ts +1 -1
- package/dist/apps/www/settings/encryption/index.js +31 -29
- package/dist/apps/www/settings/filters/[uid].d.ts +1 -1
- package/dist/apps/www/settings/filters/[uid].js +11 -9
- package/dist/apps/www/settings/filters/_mailFilterRuleConfig.d.ts +2 -2
- package/dist/apps/www/settings/filters/index.d.ts +1 -1
- package/dist/apps/www/settings/filters/index.js +4 -4
- package/dist/apps/www/settings/filters/new/index.d.ts +1 -1
- package/dist/apps/www/settings/filters/new/index.js +10 -8
- package/dist/apps/www/settings/labels/index.d.ts +1 -1
- package/dist/apps/www/settings/labels/index.js +12 -10
- package/dist/apps/www/settings/privacy/index.d.ts +1 -1
- package/dist/apps/www/settings/privacy/index.js +18 -14
- package/dist/apps/www/settings/profile/index.d.ts +1 -1
- package/dist/apps/www/settings/profile/index.js +7 -5
- package/dist/apps/www/settings/read-receipts/index.d.ts +1 -1
- package/dist/apps/www/settings/read-receipts/index.js +5 -3
- package/dist/apps/www/settings/sharing/index.d.ts +1 -1
- package/dist/apps/www/settings/sharing/index.js +6 -6
- package/dist/apps/www/settings/signatures/[uid].d.ts +1 -1
- package/dist/apps/www/settings/signatures/[uid].js +5 -5
- package/dist/apps/www/settings/signatures/index.d.ts +1 -1
- package/dist/apps/www/settings/signatures/index.js +4 -4
- package/dist/apps/www/settings/signatures/new/index.d.ts +1 -1
- package/dist/apps/www/settings/signatures/new/index.js +4 -4
- package/dist/apps/www/settings/signatures/signatureDefaults.d.ts +1 -1
- package/dist/apps/www/settings/signatures/signatureDefaults.js +1 -1
- package/dist/apps/www/tasks/index.d.ts +1 -1
- package/dist/apps/www/tasks/index.js +17 -15
- package/dist/lib/admin/auditLogApi.d.ts +32 -0
- package/dist/lib/admin/auditLogApi.js +27 -0
- package/dist/lib/admin/distributionListsApi.d.ts +47 -0
- package/dist/lib/admin/distributionListsApi.js +34 -0
- package/dist/lib/admin/domainsApi.d.ts +75 -0
- package/dist/lib/admin/domainsApi.js +44 -0
- package/dist/lib/admin/escrowAccessRequestsApi.d.ts +79 -0
- package/dist/lib/admin/escrowAccessRequestsApi.js +46 -0
- package/dist/lib/admin/escrowAuditLogApi.d.ts +66 -0
- package/dist/lib/admin/escrowAuditLogApi.js +31 -0
- package/dist/lib/admin/escrowScopesApi.d.ts +78 -0
- package/dist/lib/admin/escrowScopesApi.js +50 -0
- package/dist/lib/admin/leftoverMailboxApi.d.ts +73 -0
- package/dist/lib/admin/leftoverMailboxApi.js +67 -0
- package/dist/lib/admin/mailboxPolicyApi.d.ts +27 -0
- package/dist/lib/admin/mailboxPolicyApi.js +21 -0
- package/dist/lib/admin/matterExportApi.d.ts +40 -0
- package/dist/lib/admin/matterExportApi.js +39 -0
- package/dist/lib/admin/matterSearchApi.d.ts +20 -0
- package/dist/lib/admin/matterSearchApi.js +27 -0
- package/dist/lib/admin/mattersApi.d.ts +56 -0
- package/dist/lib/admin/mattersApi.js +40 -0
- package/dist/lib/admin/pluginsApi.d.ts +265 -0
- package/dist/lib/admin/pluginsApi.js +102 -0
- package/dist/lib/admin/retentionPolicyApi.d.ts +32 -0
- package/dist/lib/admin/retentionPolicyApi.js +29 -0
- package/dist/lib/admin/setupApi.d.ts +23 -0
- package/dist/lib/admin/setupApi.js +26 -0
- package/dist/lib/admin/transportRulesApi.d.ts +66 -0
- package/dist/lib/admin/transportRulesApi.js +43 -0
- package/dist/lib/appearance/preferencesApi.d.ts +128 -0
- package/dist/lib/appearance/preferencesApi.js +257 -0
- package/dist/lib/auth/profileApi.d.ts +33 -0
- package/dist/lib/auth/profileApi.js +52 -0
- package/dist/lib/auth/session.d.ts +70 -0
- package/dist/lib/auth/session.js +210 -0
- package/dist/lib/branding/brandingApi.d.ts +47 -0
- package/dist/lib/branding/brandingApi.js +61 -0
- package/dist/lib/branding/useBranding.d.ts +23 -0
- package/dist/lib/branding/useBranding.js +65 -0
- package/dist/lib/calendar/calendarApi.d.ts +230 -0
- package/dist/lib/calendar/calendarApi.js +106 -0
- package/dist/lib/calendar/calendarColors.d.ts +18 -0
- package/dist/lib/calendar/calendarColors.js +39 -0
- package/dist/lib/calendar/calendarDragIds.d.ts +42 -0
- package/dist/lib/calendar/calendarDragIds.js +92 -0
- package/dist/lib/calendar/calendarMutations.d.ts +68 -0
- package/dist/lib/calendar/calendarMutations.js +190 -0
- package/dist/lib/calendar/eventDescription.d.ts +43 -0
- package/dist/lib/calendar/eventDescription.js +195 -0
- package/dist/lib/calendar/freeBusyApi.d.ts +100 -0
- package/dist/lib/calendar/freeBusyApi.js +119 -0
- package/dist/lib/calendar/inviteApi.d.ts +121 -0
- package/dist/lib/calendar/inviteApi.js +54 -0
- package/dist/lib/calendar/recurrence.d.ts +60 -0
- package/dist/lib/calendar/recurrence.js +225 -0
- package/dist/lib/components/avatar/ContactAvatar.d.ts +8 -0
- package/dist/lib/components/avatar/ContactAvatar.js +26 -0
- package/dist/lib/components/buttons/Button.d.ts +9 -0
- package/dist/lib/components/buttons/Button.js +14 -0
- package/dist/lib/components/buttons/CopyButton.d.ts +18 -0
- package/dist/lib/components/buttons/CopyButton.js +14 -0
- package/dist/lib/components/feedback/Alert.d.ts +4 -0
- package/dist/lib/components/feedback/Alert.js +4 -0
- package/dist/lib/components/feedback/Skeleton.d.ts +21 -0
- package/dist/lib/components/feedback/Skeleton.js +14 -0
- package/dist/lib/components/forms/FormField.d.ts +8 -0
- package/dist/lib/components/forms/FormField.js +5 -0
- package/dist/lib/components/navigation/BottomTabBar.d.ts +27 -0
- package/dist/lib/components/navigation/BottomTabBar.js +32 -0
- package/dist/lib/components/overlays/Drawer.d.ts +20 -0
- package/dist/lib/components/overlays/Drawer.js +27 -0
- package/dist/lib/components/overlays/Modal.d.ts +17 -0
- package/dist/lib/components/overlays/Modal.js +25 -0
- package/dist/lib/components/overlays/PopoverPortal.d.ts +23 -0
- package/dist/lib/components/overlays/PopoverPortal.js +53 -0
- package/dist/lib/components/overlays/overlayStack.d.ts +31 -0
- package/dist/lib/components/overlays/overlayStack.js +143 -0
- package/dist/lib/components/pickers/MiniDatePicker.d.ts +13 -0
- package/dist/lib/components/pickers/MiniDatePicker.js +42 -0
- package/dist/lib/contacts/contactsApi.d.ts +174 -0
- package/dist/lib/contacts/contactsApi.js +139 -0
- package/dist/lib/contacts/vcard.d.ts +23 -0
- package/dist/lib/contacts/vcard.js +179 -0
- package/dist/lib/crypto/composeSecurity.d.ts +67 -0
- package/dist/lib/crypto/composeSecurity.js +93 -0
- package/dist/lib/crypto/encoding.d.ts +9 -0
- package/dist/lib/crypto/encoding.js +32 -0
- package/dist/lib/crypto/escrowKeys.d.ts +25 -0
- package/dist/lib/crypto/escrowKeys.js +59 -0
- package/dist/lib/crypto/idleTimeout.d.ts +16 -0
- package/dist/lib/crypto/idleTimeout.js +47 -0
- package/dist/lib/crypto/keySession.d.ts +159 -0
- package/dist/lib/crypto/keySession.js +367 -0
- package/dist/lib/crypto/keys.d.ts +50 -0
- package/dist/lib/crypto/keys.js +89 -0
- package/dist/lib/crypto/keyvaultApi.d.ts +394 -0
- package/dist/lib/crypto/keyvaultApi.js +350 -0
- package/dist/lib/crypto/masterKey.d.ts +59 -0
- package/dist/lib/crypto/masterKey.js +104 -0
- package/dist/lib/crypto/masterKeyWraps.d.ts +108 -0
- package/dist/lib/crypto/masterKeyWraps.js +228 -0
- package/dist/lib/crypto/messageSecurity.d.ts +248 -0
- package/dist/lib/crypto/messageSecurity.js +367 -0
- package/dist/lib/crypto/mime.d.ts +143 -0
- package/dist/lib/crypto/mime.js +504 -0
- package/dist/lib/crypto/passkeyUnlock.d.ts +20 -0
- package/dist/lib/crypto/passkeyUnlock.js +79 -0
- package/dist/lib/crypto/passwordUnlock.d.ts +39 -0
- package/dist/lib/crypto/passwordUnlock.js +73 -0
- package/dist/lib/crypto/recoveryCode.d.ts +28 -0
- package/dist/lib/crypto/recoveryCode.js +86 -0
- package/dist/lib/crypto/signingProviderApi.d.ts +95 -0
- package/dist/lib/crypto/signingProviderApi.js +60 -0
- package/dist/lib/crypto/smime.d.ts +128 -0
- package/dist/lib/crypto/smime.js +402 -0
- package/dist/lib/crypto/smimeMessage.d.ts +132 -0
- package/dist/lib/crypto/smimeMessage.js +341 -0
- package/dist/lib/crypto/useIdleKeyTimeout.d.ts +10 -0
- package/dist/lib/crypto/useIdleKeyTimeout.js +163 -0
- package/dist/lib/crypto/verificationSeal.d.ts +56 -0
- package/dist/lib/crypto/verificationSeal.js +220 -0
- package/dist/lib/mail/compose/composeQuoting.d.ts +88 -0
- package/dist/lib/mail/compose/composeQuoting.js +204 -0
- package/dist/lib/mail/compose/emojiData.d.ts +9 -0
- package/dist/lib/mail/compose/emojiData.js +18 -0
- package/dist/lib/mail/compose/giphyApi.d.ts +17 -0
- package/dist/lib/mail/compose/giphyApi.js +20 -0
- package/dist/lib/mail/conversationsApi.d.ts +80 -0
- package/dist/lib/mail/conversationsApi.js +44 -0
- package/dist/lib/mail/dataExportApi.d.ts +50 -0
- package/dist/lib/mail/dataExportApi.js +40 -0
- package/dist/lib/mail/directoryApi.d.ts +49 -0
- package/dist/lib/mail/directoryApi.js +101 -0
- package/dist/lib/mail/erasureRequestApi.d.ts +45 -0
- package/dist/lib/mail/erasureRequestApi.js +43 -0
- package/dist/lib/mail/flaggedMessages.d.ts +22 -0
- package/dist/lib/mail/flaggedMessages.js +73 -0
- package/dist/lib/mail/focusedInboxOverridesApi.d.ts +37 -0
- package/dist/lib/mail/focusedInboxOverridesApi.js +34 -0
- package/dist/lib/mail/labelsApi.d.ts +47 -0
- package/dist/lib/mail/labelsApi.js +38 -0
- package/dist/lib/mail/mailAddress.d.ts +27 -0
- package/dist/lib/mail/mailAddress.js +54 -0
- package/dist/lib/mail/mailApi.d.ts +850 -0
- package/dist/lib/mail/mailApi.js +602 -0
- package/dist/lib/mail/mailDetailHooks.d.ts +10 -0
- package/dist/lib/mail/mailDetailHooks.js +53 -0
- package/dist/lib/mail/mailFilterRulesApi.d.ts +76 -0
- package/dist/lib/mail/mailFilterRulesApi.js +45 -0
- package/dist/lib/mail/mailSignaturesApi.d.ts +49 -0
- package/dist/lib/mail/mailSignaturesApi.js +42 -0
- package/dist/lib/mail/mailboxAccessApi.d.ts +74 -0
- package/dist/lib/mail/mailboxAccessApi.js +56 -0
- package/dist/lib/mail/mailboxImportApi.d.ts +53 -0
- package/dist/lib/mail/mailboxImportApi.js +51 -0
- package/dist/lib/mail/messageBodySanitizer.d.ts +16 -0
- package/dist/lib/mail/messageBodySanitizer.js +118 -0
- package/dist/lib/mail/pushClient.d.ts +106 -0
- package/dist/lib/mail/pushClient.js +317 -0
- package/dist/lib/mail/sendEvents.d.ts +33 -0
- package/dist/lib/mail/sendEvents.js +44 -0
- package/dist/lib/mail/sendFailure.d.ts +16 -0
- package/dist/lib/mail/sendFailure.js +86 -0
- package/dist/lib/mail/senderListsApi.d.ts +69 -0
- package/dist/lib/mail/senderListsApi.js +126 -0
- package/dist/lib/search/queryGrammar.d.ts +51 -0
- package/dist/lib/search/queryGrammar.js +111 -0
- package/dist/lib/search/searchApi.d.ts +100 -0
- package/dist/lib/search/searchApi.js +107 -0
- package/dist/lib/search/searchScoring.d.ts +34 -0
- package/dist/lib/search/searchScoring.js +44 -0
- package/dist/lib/search/searchTier3.d.ts +64 -0
- package/dist/lib/search/searchTier3.js +335 -0
- package/dist/lib/tasks/tasksApi.d.ts +85 -0
- package/dist/lib/tasks/tasksApi.js +55 -0
- package/dist/lib/util/api.d.ts +160 -0
- package/dist/lib/util/api.js +251 -0
- package/dist/lib/util/apiClientContext.d.ts +7 -0
- package/dist/lib/util/apiClientContext.js +32 -0
- package/dist/lib/util/apiQuery.d.ts +32 -0
- package/dist/lib/util/apiQuery.js +42 -0
- package/dist/lib/util/clipboard.d.ts +7 -0
- package/dist/lib/util/clipboard.js +56 -0
- package/dist/lib/util/dateInput.d.ts +6 -0
- package/dist/lib/util/dateInput.js +14 -0
- package/dist/lib/util/timeZone.d.ts +12 -0
- package/dist/lib/util/timeZone.js +32 -0
- package/dist/lib/util/useCopyToClipboard.d.ts +12 -0
- package/dist/lib/util/useCopyToClipboard.js +34 -0
- package/dist/lib/util/useIsMobile.d.ts +10 -0
- package/dist/lib/util/useIsMobile.js +29 -0
- package/dist/lib/videoconf/videoMeetingsApi.d.ts +116 -0
- package/dist/lib/videoconf/videoMeetingsApi.js +49 -0
- package/lib/admin/auditLogApi.ts +48 -0
- package/lib/admin/distributionListsApi.ts +77 -0
- package/lib/admin/domainsApi.ts +113 -0
- package/lib/admin/escrowAccessRequestsApi.ts +110 -0
- package/lib/admin/escrowAuditLogApi.ts +101 -0
- package/lib/admin/escrowScopesApi.ts +112 -0
- package/lib/admin/leftoverMailboxApi.ts +120 -0
- package/lib/admin/mailboxPolicyApi.ts +38 -0
- package/lib/admin/matterExportApi.ts +62 -0
- package/lib/admin/matterSearchApi.ts +35 -0
- package/lib/admin/mattersApi.ts +86 -0
- package/lib/admin/pluginsApi.ts +339 -0
- package/lib/admin/retentionPolicyApi.ts +46 -0
- package/lib/admin/setupApi.ts +40 -0
- package/lib/admin/transportRulesApi.ts +106 -0
- package/lib/appearance/preferencesApi.ts +335 -0
- package/lib/auth/profileApi.ts +77 -0
- package/lib/auth/session.ts +238 -0
- package/lib/branding/brandingApi.ts +97 -0
- package/lib/branding/useBranding.ts +81 -0
- package/lib/calendar/calendarApi.ts +309 -0
- package/lib/calendar/calendarColors.ts +45 -0
- package/lib/calendar/calendarDragIds.ts +112 -0
- package/lib/calendar/calendarMutations.ts +236 -0
- package/lib/calendar/eventDescription.ts +211 -0
- package/lib/calendar/freeBusyApi.ts +197 -0
- package/lib/calendar/inviteApi.ts +154 -0
- package/lib/calendar/recurrence.ts +285 -0
- package/lib/components/avatar/ContactAvatar.tsx +47 -0
- package/lib/components/buttons/Button.tsx +40 -0
- package/lib/components/buttons/CopyButton.tsx +45 -0
- package/lib/components/feedback/Alert.tsx +13 -0
- package/lib/components/feedback/Skeleton.tsx +38 -0
- package/lib/components/forms/FormField.tsx +23 -0
- package/lib/components/navigation/BottomTabBar.tsx +66 -0
- package/lib/components/overlays/Drawer.tsx +72 -0
- package/lib/components/overlays/Modal.tsx +64 -0
- package/lib/components/overlays/PopoverPortal.tsx +74 -0
- package/lib/components/overlays/overlayStack.ts +165 -0
- package/lib/components/pickers/MiniDatePicker.tsx +90 -0
- package/lib/contacts/contactsApi.ts +289 -0
- package/lib/contacts/vcard.ts +197 -0
- package/lib/crypto/composeSecurity.ts +140 -0
- package/lib/crypto/encoding.ts +36 -0
- package/lib/crypto/escrowKeys.ts +74 -0
- package/lib/crypto/idleTimeout.ts +49 -0
- package/lib/crypto/keySession.ts +483 -0
- package/lib/crypto/keys.ts +105 -0
- package/lib/crypto/keyvaultApi.ts +674 -0
- package/lib/crypto/masterKey.ts +134 -0
- package/lib/crypto/masterKeyWraps.ts +269 -0
- package/lib/crypto/messageSecurity.ts +600 -0
- package/lib/crypto/mime.ts +568 -0
- package/lib/crypto/passkeyUnlock.ts +103 -0
- package/lib/crypto/passwordUnlock.ts +98 -0
- package/lib/crypto/recoveryCode.ts +93 -0
- package/lib/crypto/signingProviderApi.ts +135 -0
- package/lib/crypto/smime.ts +459 -0
- package/lib/crypto/smimeMessage.ts +491 -0
- package/lib/crypto/useIdleKeyTimeout.ts +176 -0
- package/lib/crypto/verificationSeal.ts +288 -0
- package/lib/mail/compose/composeQuoting.ts +243 -0
- package/lib/mail/compose/emojiData.ts +34 -0
- package/lib/mail/compose/giphyApi.ts +31 -0
- package/lib/mail/conversationsApi.ts +123 -0
- package/lib/mail/dataExportApi.ts +73 -0
- package/lib/mail/directoryApi.ts +161 -0
- package/lib/mail/erasureRequestApi.ts +71 -0
- package/lib/mail/flaggedMessages.ts +80 -0
- package/lib/mail/focusedInboxOverridesApi.ts +64 -0
- package/lib/mail/labelsApi.ts +71 -0
- package/lib/mail/mailAddress.ts +76 -0
- package/lib/mail/mailApi.ts +1286 -0
- package/lib/mail/mailDetailHooks.ts +57 -0
- package/lib/mail/mailFilterRulesApi.ts +116 -0
- package/lib/mail/mailSignaturesApi.ts +84 -0
- package/lib/mail/mailboxAccessApi.ts +106 -0
- package/lib/mail/mailboxImportApi.ts +87 -0
- package/lib/mail/messageBodySanitizer.ts +129 -0
- package/lib/mail/pushClient.ts +375 -0
- package/lib/mail/sendEvents.ts +72 -0
- package/lib/mail/sendFailure.ts +98 -0
- package/lib/mail/senderListsApi.ts +161 -0
- package/lib/search/queryGrammar.ts +179 -0
- package/lib/search/searchApi.ts +199 -0
- package/lib/search/searchScoring.ts +46 -0
- package/lib/search/searchTier3.ts +406 -0
- package/lib/tasks/tasksApi.ts +128 -0
- package/lib/util/api.ts +318 -0
- package/lib/util/apiClientContext.ts +35 -0
- package/lib/util/apiQuery.ts +61 -0
- package/lib/util/clipboard.ts +55 -0
- package/lib/util/dateInput.ts +15 -0
- package/lib/util/timeZone.ts +33 -0
- package/lib/util/useCopyToClipboard.ts +48 -0
- package/lib/util/useIsMobile.ts +34 -0
- package/lib/videoconf/videoMeetingsApi.ts +144 -0
- package/package.json +10 -4
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
// Copyright (C) 2026 Jean-Philippe Steinmetz
|
|
3
|
+
// SPDX-License-Identifier: MPL-2.0
|
|
4
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
5
|
+
/**
|
|
6
|
+
* Evaluates a *received* message's raw MIME source into one of `specs/end-to-end_encryption.md`'s
|
|
7
|
+
* "Message Security Indicators" states, and recovers the plaintext body when applicable. Reads the
|
|
8
|
+
* outer envelope's own `Content-Type` (via `mime.ts`'s `parseMimeEntity()`) to decide whether the message
|
|
9
|
+
* is `multipart/signed`, `application/pkcs7-mime; smime-type="enveloped-data"`, or neither.
|
|
10
|
+
*
|
|
11
|
+
* **What a verified state means.** `"signed_verified"`/`"encrypted_verified"` require ALL of: (1) a
|
|
12
|
+
* cryptographically valid CMS signature (`smime.ts` - detached signatures carrying their own eContent are
|
|
13
|
+
* rejected, the signer certificate is the one matched to the SignerInfo, never simply the first embedded
|
|
14
|
+
* certificate, and a `multipart/signed` body must hold exactly the signed part and the signature); (2) the
|
|
15
|
+
* signer certificate's fingerprint is one the reader already trusts - a pinned `Contact` signing key passed
|
|
16
|
+
* as `pinnedSignerFingerprints`, or the unlocked mailbox's own `signingFingerprint`; (3) the signer
|
|
17
|
+
* certificate names the sender: one of its email addresses (SAN rfc822Name, else subject emailAddress /
|
|
18
|
+
* email-shaped CN) equals the single address in the protected `From` (or the outer `From` when the signed
|
|
19
|
+
* content carries no protected headers, as with non-RFC 9788 senders); (4) the protected `From`/`To`/`Cc`
|
|
20
|
+
* address sets (when present) equal the outer envelope's, a signed-only message's protected `Subject` equals
|
|
21
|
+
* its outer one (what the mail list shows), and neither header block carries more than one
|
|
22
|
+
* `From`/`To`/`Cc`/`Sender` field.
|
|
23
|
+
*
|
|
24
|
+
* **No trust anchor, no verified badge.** Certificates aren't chain-validated (there is no trust store), so
|
|
25
|
+
* checks 1, 3 and 4 alone prove only that *someone* holding a certificate naming the sender signed it - a
|
|
26
|
+
* self-issued certificate with SAN `ceo@victim.com` passes them. Without a matching pin the result is
|
|
27
|
+
* `"signed_unverified_signer"`/`"encrypted_unverified_signer"` instead, carrying `signerFingerprint` and
|
|
28
|
+
* `signerEmails` so a UI can show "signed by an unverified certificate" and offer to trust it. A failure of checks 1, 3
|
|
29
|
+
* or 4 is `"signature_failed"` with `signatureFailureReason` saying which check failed.
|
|
30
|
+
*
|
|
31
|
+
* **Pinned, but a different key.** When pins were supplied and checks 1, 3 and 4 pass but the signer matches no pin, the
|
|
32
|
+
* result is `"signature_failed"` with `signatureFailureReason: "signer_key_changed"`: the sender's certificate names
|
|
33
|
+
* them and the message is intact, but it isn't the key the reader pinned (a rotation the reader hasn't accepted, or an
|
|
34
|
+
* impersonation). Only this failure also carries `signerCertificate`, so a UI can compare it with the pinned keys
|
|
35
|
+
* (`contactsApi.ts`'s `fetchSignerKeyState()`) and let the user accept or reject it (`keyvaultApi.ts`'s
|
|
36
|
+
* `resolveKeyConflict()`). A pin mismatch whose certificate also fails check 3 or 4 (or couldn't be resolved) stays
|
|
37
|
+
* `untrusted_signer`. Previously pinned keys count as pins (see `signingKeyFingerprints()`), so mail signed before an
|
|
38
|
+
* accepted or automatic rotation still verifies.
|
|
39
|
+
*/
|
|
40
|
+
import { decodeHeaderText, extractAddresses, parseMimeEntity, parseParameterizedHeader, plainTextToHtml } from "./mime.js";
|
|
41
|
+
import { toBase64 } from "./encoding.js";
|
|
42
|
+
import { computeCertFingerprint, extractCertificateEmails } from "./smime.js";
|
|
43
|
+
import { parseEncryptedMessageWithKeys, parseSignedOnlyMessage } from "./smimeMessage.js";
|
|
44
|
+
import { isTrustedForVerification } from "./keyvaultApi.js";
|
|
45
|
+
import { KeysLockedError } from "./masterKey.js";
|
|
46
|
+
import { buildVerificationSeal, openVerificationSeal, rawMimeSha256 } from "./verificationSeal.js";
|
|
47
|
+
export { signingKeyFingerprints } from "./keyvaultApi.js";
|
|
48
|
+
function isSignedOnlyContentType(contentTypeValue) {
|
|
49
|
+
return contentTypeValue === "multipart/signed";
|
|
50
|
+
}
|
|
51
|
+
/** Matches `buildEncryptedMessage()`'s own output shape, and leniently accepts the equivalent legacy/
|
|
52
|
+
* AEAD `smime-type` values a foreign S/MIME sender could produce (mirrors `@rapidmx/restapi`'s own
|
|
53
|
+
* server-side `SmimeUtils.isEncryptedBody()` classification, so the two systems agree on what counts as
|
|
54
|
+
* encrypted). Parameters are matched case-insensitively, quoted or not. */
|
|
55
|
+
function isEncryptedContentType(contentType) {
|
|
56
|
+
if (contentType.value === "multipart/encrypted") {
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
if (!contentType.value.endsWith("pkcs7-mime")) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
const smimeType = contentType.params["smime-type"]?.toLowerCase();
|
|
63
|
+
return smimeType === "enveloped-data" || smimeType === "authenveloped-data";
|
|
64
|
+
}
|
|
65
|
+
const NO_KEY_ERROR = "This device doesn't have the key needed to decrypt this message.";
|
|
66
|
+
const UNSUPPORTED_ENCRYPTION_ERROR = "This message uses an older, unauthenticated encryption algorithm that RapidMX doesn't accept, so it can't be opened safely.";
|
|
67
|
+
function renderDisplayBody(display) {
|
|
68
|
+
if (display?.html !== undefined) {
|
|
69
|
+
return { html: display.html };
|
|
70
|
+
}
|
|
71
|
+
if (display?.text !== undefined) {
|
|
72
|
+
return { html: plainTextToHtml(display.text), text: display.text };
|
|
73
|
+
}
|
|
74
|
+
return {};
|
|
75
|
+
}
|
|
76
|
+
function sameAddressSet(a, b) {
|
|
77
|
+
const left = new Set(a);
|
|
78
|
+
const right = new Set(b);
|
|
79
|
+
return left.size === right.size && [...left].every((address) => right.has(address));
|
|
80
|
+
}
|
|
81
|
+
/** Normalizes whitespace runs, so a Subject refolded in transit still compares equal. */
|
|
82
|
+
function normalizeSubject(value) {
|
|
83
|
+
return decodeHeaderText(value ?? "")
|
|
84
|
+
.replace(/\s+/g, " ")
|
|
85
|
+
.trim();
|
|
86
|
+
}
|
|
87
|
+
/** Address header fields a message must carry at most once (RFC 5322 §3.6 allows exactly zero or one). */
|
|
88
|
+
const SINGLETON_ADDRESS_FIELDS = ["from", "to", "cc", "sender"];
|
|
89
|
+
function hasRepeatedAddressField(fields) {
|
|
90
|
+
const counts = new Map();
|
|
91
|
+
for (const { name } of fields ?? []) {
|
|
92
|
+
const key = name.toLowerCase();
|
|
93
|
+
counts.set(key, (counts.get(key) ?? 0) + 1);
|
|
94
|
+
}
|
|
95
|
+
return SINGLETON_ADDRESS_FIELDS.some((name) => (counts.get(name) ?? 0) > 1);
|
|
96
|
+
}
|
|
97
|
+
function normalizePins(pins) {
|
|
98
|
+
return (Array.isArray(pins) ? pins : pins === undefined ? [] : [pins]).map((pin) => pin.toLowerCase());
|
|
99
|
+
}
|
|
100
|
+
/** Checks 2-4 from this module's doc comment for an already cryptographically verified signature.
|
|
101
|
+
* Returns `undefined` when the signer is accepted, otherwise the failure reason. A pin mismatch is
|
|
102
|
+
* `"signer_key_changed"` when checks 3 and 4 pass for the certificate, and `"untrusted_signer"` when they don't (or no
|
|
103
|
+
* certificate was resolved).
|
|
104
|
+
*
|
|
105
|
+
* With no `pinnedSignerFingerprint` (or an empty array), check 2 is skipped and `undefined` means only that the
|
|
106
|
+
* certificate names the sender consistently - NOT that the signer is trusted. Use `evaluateMessageSecurity()`
|
|
107
|
+
* (which reports that case as `*_unverified_signer`) unless you enforce a pin yourself. */
|
|
108
|
+
export async function checkSignerBinding(input) {
|
|
109
|
+
const pins = normalizePins(input.pinnedSignerFingerprint);
|
|
110
|
+
// Fail closed: an absent certificate hashes/extracts as empty, which can never match a pin or From.
|
|
111
|
+
const certDer = input.signerCertificateDer ?? new Uint8Array();
|
|
112
|
+
if (pins.length > 0 && !pins.includes(await computeCertFingerprint(certDer))) {
|
|
113
|
+
// A certificate that otherwise binds cleanly to the sender is a key change for the user to judge; anything else
|
|
114
|
+
// (no certificate, wrong identity, header tampering) stays a plain untrusted signer.
|
|
115
|
+
return input.signerCertificateDer && checkIdentityAndHeaders(input, certDer) === undefined ? "signer_key_changed" : "untrusted_signer";
|
|
116
|
+
}
|
|
117
|
+
return checkIdentityAndHeaders(input, certDer);
|
|
118
|
+
}
|
|
119
|
+
/** Checks 3-4 from this module's doc comment. */
|
|
120
|
+
function checkIdentityAndHeaders(input, certDer) {
|
|
121
|
+
const { protectedHeaders, outerHeaders } = input;
|
|
122
|
+
if (hasRepeatedAddressField(input.outerFields) || hasRepeatedAddressField(input.protectedFields)) {
|
|
123
|
+
return "header_mismatch";
|
|
124
|
+
}
|
|
125
|
+
const outerFrom = extractAddresses(outerHeaders["from"]);
|
|
126
|
+
const protectedFrom = extractAddresses(protectedHeaders?.from);
|
|
127
|
+
const senderAddresses = protectedFrom.length > 0 ? protectedFrom : outerFrom;
|
|
128
|
+
if (senderAddresses.length !== 1 || !extractCertificateEmails(certDer).includes(senderAddresses[0])) {
|
|
129
|
+
return "signer_identity_mismatch";
|
|
130
|
+
}
|
|
131
|
+
const protectedTo = extractAddresses(protectedHeaders?.to);
|
|
132
|
+
if (!sameAddressSet(senderAddresses, outerFrom) || (protectedTo.length > 0 && !sameAddressSet(protectedTo, extractAddresses(outerHeaders["to"])))) {
|
|
133
|
+
return "header_mismatch";
|
|
134
|
+
}
|
|
135
|
+
if (protectedFrom.length > 0) {
|
|
136
|
+
// RFC 9788 protected headers are present, so Cc (possibly absent on both sides) and - for a signed-only
|
|
137
|
+
// message - Subject were signed: an outer copy that differs was changed (or added) after signing.
|
|
138
|
+
if (!sameAddressSet(extractAddresses(protectedHeaders?.cc), extractAddresses(outerHeaders["cc"]))) {
|
|
139
|
+
return "header_mismatch";
|
|
140
|
+
}
|
|
141
|
+
if (input.compareSubject && normalizeSubject(protectedHeaders?.subject) !== normalizeSubject(outerHeaders["subject"])) {
|
|
142
|
+
return "header_mismatch";
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return undefined;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Evaluates one received message's raw MIME source (see `mailApi.ts`'s `getMessageRawContent()`) into
|
|
149
|
+
* a security state + recovered plaintext. Never throws — a parse failure, wrong key, or unrecognized
|
|
150
|
+
* content type all degrade to a result the caller can render directly.
|
|
151
|
+
*
|
|
152
|
+
* `pinnedSignerFingerprints` - the sender's trusted signing-key fingerprint(s): `signingKeyFingerprints()` of the
|
|
153
|
+
* sender's `Contact.keys` and `Contact.previousKeys` (see `contactsApi.ts`'s `fetchPinnedSigningFingerprints()`). A
|
|
154
|
+
* supplied pin that the signer doesn't match is `signer_key_changed` or `untrusted_signer`. The unlocked mailbox's own
|
|
155
|
+
* `signingFingerprint` is always trusted too (mail this mailbox signed itself). Omitted or empty, a valid signature
|
|
156
|
+
* from any other certificate is `*_unverified_signer`, never verified. `readerAddress` - the unlocked mailbox's own
|
|
157
|
+
* address - enables `notAddressedToReader`.
|
|
158
|
+
*
|
|
159
|
+
* An encrypted message is decrypted with `unlocked`'s active encryption key or any of its `retainedEncryptionKeys` (the
|
|
160
|
+
* older keys a rotation replaced - see `keySession.ts`), matched by recipient identifier first.
|
|
161
|
+
*/
|
|
162
|
+
export async function evaluateMessageSecurity(rawMime, unlocked, pinnedSignerFingerprints, readerAddress) {
|
|
163
|
+
return (await evaluateLive(rawMime, unlocked, pinnedSignerFingerprints, readerAddress)).result;
|
|
164
|
+
}
|
|
165
|
+
async function evaluateLive(rawMime, unlocked, pinnedSignerFingerprints, readerAddress) {
|
|
166
|
+
const { headers, body, fields } = parseMimeEntity(rawMime);
|
|
167
|
+
const rawContentType = headers["content-type"];
|
|
168
|
+
if (!rawContentType) {
|
|
169
|
+
return { result: { state: "unprotected" }, kind: "other" };
|
|
170
|
+
}
|
|
171
|
+
const contentType = parseParameterizedHeader(rawContentType);
|
|
172
|
+
const callerPins = normalizePins(pinnedSignerFingerprints);
|
|
173
|
+
// The received message's own *real* outer envelope - what `HP-Outer`'s field copies (written at
|
|
174
|
+
// send time, inside the encrypted content) are compared against to detect post-send tampering.
|
|
175
|
+
const actualOuterHeaders = {
|
|
176
|
+
from: headers["from"],
|
|
177
|
+
to: headers["to"],
|
|
178
|
+
cc: headers["cc"],
|
|
179
|
+
date: headers["date"],
|
|
180
|
+
subject: headers["subject"],
|
|
181
|
+
};
|
|
182
|
+
/** Runs checks 2-4 and resolves the trust outcome: a failure reason, or whether a pin matched. */
|
|
183
|
+
const checkSigner = async (signerCertificateDer, protectedHeaders, protectedFields, compareSubject) => {
|
|
184
|
+
const certDer = signerCertificateDer ?? new Uint8Array();
|
|
185
|
+
const fingerprint = await computeCertFingerprint(certDer);
|
|
186
|
+
const signer = signerCertificateDer ? { signerFingerprint: fingerprint, signerEmails: extractCertificateEmails(certDer) } : {};
|
|
187
|
+
// The certificate itself (for "trust this signer" or a key-changed comparison) only accompanies a signature that
|
|
188
|
+
// didn't fail or failed only as `signer_key_changed` - both always have a certificate (a missing one fails the
|
|
189
|
+
// binding check closed as another reason), so `certDer` is the real one.
|
|
190
|
+
const acceptedSigner = { ...signer, signerCertificate: toBase64(certDer) };
|
|
191
|
+
const trustedPins = unlocked?.signingFingerprint ? [...callerPins, unlocked.signingFingerprint.toLowerCase()] : callerPins;
|
|
192
|
+
const failure = await checkSignerBinding({
|
|
193
|
+
signerCertificateDer,
|
|
194
|
+
protectedHeaders,
|
|
195
|
+
outerHeaders: headers,
|
|
196
|
+
outerFields: fields,
|
|
197
|
+
protectedFields,
|
|
198
|
+
// Only pins the caller supplied make a mismatch a failure; the mailbox's own key alone never does.
|
|
199
|
+
pinnedSignerFingerprint: callerPins.length > 0 ? trustedPins : undefined,
|
|
200
|
+
compareSubject,
|
|
201
|
+
});
|
|
202
|
+
return { failure, trusted: trustedPins.includes(fingerprint), signer, acceptedSigner };
|
|
203
|
+
};
|
|
204
|
+
const addressing = (protectedHeaders) => {
|
|
205
|
+
const recipients = [...extractAddresses(protectedHeaders?.to), ...extractAddresses(protectedHeaders?.cc)];
|
|
206
|
+
if (!readerAddress || recipients.length === 0) {
|
|
207
|
+
return {};
|
|
208
|
+
}
|
|
209
|
+
return { notAddressedToReader: !recipients.includes(readerAddress.trim().toLowerCase()) };
|
|
210
|
+
};
|
|
211
|
+
const exposedHeaders = (protectedHeaders) => {
|
|
212
|
+
if (!protectedHeaders || extractAddresses(protectedHeaders.from).length === 0) {
|
|
213
|
+
return {};
|
|
214
|
+
}
|
|
215
|
+
const { from, to, cc, subject } = protectedHeaders;
|
|
216
|
+
return { protectedHeaders: { from, to, ...(cc !== undefined ? { cc } : {}), subject } };
|
|
217
|
+
};
|
|
218
|
+
if (isSignedOnlyContentType(contentType.value)) {
|
|
219
|
+
const parsed = await parseSignedOnlyMessage(rawContentType, body);
|
|
220
|
+
if (!parsed.verified) {
|
|
221
|
+
return { result: { state: "signature_failed", signatureFailureReason: "invalid_signature" }, kind: "signed" };
|
|
222
|
+
}
|
|
223
|
+
const { failure, trusted, signer, acceptedSigner } = await checkSigner(parsed.signerCertificateDer, parsed.protectedHeaders, parsed.protectedHeaderFields, true);
|
|
224
|
+
const content = {
|
|
225
|
+
...renderDisplayBody(parsed.displayBody),
|
|
226
|
+
subject: parsed.protectedHeaders?.subject || undefined,
|
|
227
|
+
...exposedHeaders(parsed.protectedHeaders),
|
|
228
|
+
attachments: parsed.attachments,
|
|
229
|
+
};
|
|
230
|
+
if (failure) {
|
|
231
|
+
const result = { state: "signature_failed", signatureFailureReason: failure, ...(failure === "signer_key_changed" ? acceptedSigner : signer) };
|
|
232
|
+
return { result, kind: "signed", ...(failure === "signer_key_changed" ? { signedContent: { ...content, ...addressing(parsed.protectedHeaders) } } : {}) };
|
|
233
|
+
}
|
|
234
|
+
return {
|
|
235
|
+
result: { state: trusted ? "signed_verified" : "signed_unverified_signer", ...content, ...acceptedSigner, ...addressing(parsed.protectedHeaders) },
|
|
236
|
+
kind: "signed",
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
if (isEncryptedContentType(contentType)) {
|
|
240
|
+
// The active key first, then the retained older ones (see `keySession.ts`'s `retainedEncryptionKeys`), so mail
|
|
241
|
+
// encrypted to a key since replaced still opens. Only ever used to decrypt here - never to encrypt or sign.
|
|
242
|
+
const keys = [
|
|
243
|
+
...(unlocked?.encryptionPrivateKey && unlocked.encryptionCertDer ? [{ certDer: unlocked.encryptionCertDer, privateKey: unlocked.encryptionPrivateKey }] : []),
|
|
244
|
+
...(unlocked?.retainedEncryptionKeys ?? []).map(({ certDer, privateKey }) => ({ certDer, privateKey })),
|
|
245
|
+
];
|
|
246
|
+
if (keys.length === 0) {
|
|
247
|
+
return { result: { state: "encrypted", decryptError: NO_KEY_ERROR }, kind: "encrypted" };
|
|
248
|
+
}
|
|
249
|
+
const parsed = await parseEncryptedMessageWithKeys(body, keys, actualOuterHeaders);
|
|
250
|
+
if (!parsed.decrypted) {
|
|
251
|
+
return { result: { state: "encrypted", decryptError: parsed.unsupportedContentEncryption ? UNSUPPORTED_ENCRYPTION_ERROR : NO_KEY_ERROR }, kind: "encrypted" };
|
|
252
|
+
}
|
|
253
|
+
const content = {
|
|
254
|
+
...renderDisplayBody(parsed.displayBody),
|
|
255
|
+
headerTamperDetected: parsed.headerTamperDetected,
|
|
256
|
+
subject: parsed.protectedHeaders?.subject || undefined,
|
|
257
|
+
...exposedHeaders(parsed.protectedHeaders),
|
|
258
|
+
attachments: parsed.attachments,
|
|
259
|
+
...addressing(parsed.protectedHeaders),
|
|
260
|
+
};
|
|
261
|
+
if (parsed.signatureVerified === undefined) {
|
|
262
|
+
return { result: { state: "encrypted", ...content }, kind: "encrypted" };
|
|
263
|
+
}
|
|
264
|
+
if (!parsed.signatureVerified) {
|
|
265
|
+
return { result: { state: "signature_failed", signatureFailureReason: "invalid_signature", ...content }, kind: "encrypted" };
|
|
266
|
+
}
|
|
267
|
+
const { failure, trusted, signer, acceptedSigner } = await checkSigner(parsed.signerCertificateDer, parsed.protectedHeaders, parsed.protectedHeaderFields, false);
|
|
268
|
+
if (failure) {
|
|
269
|
+
return { result: { state: "signature_failed", signatureFailureReason: failure, ...content, ...(failure === "signer_key_changed" ? acceptedSigner : signer) }, kind: "encrypted" };
|
|
270
|
+
}
|
|
271
|
+
return { result: { state: trusted ? "encrypted_verified" : "encrypted_unverified_signer", ...content, ...acceptedSigner }, kind: "encrypted" };
|
|
272
|
+
}
|
|
273
|
+
return { result: { state: "unprotected" }, kind: "other" };
|
|
274
|
+
}
|
|
275
|
+
const LIVE_VERIFIED_STATES = ["signed_verified", "encrypted_verified"];
|
|
276
|
+
/** Whether a live result failed only because of the signer key's status - the cases a seal may override. Every other
|
|
277
|
+
* failure (an invalid signature, identity or header mismatch, `untrusted_signer`, HP-Outer tampering) never is. */
|
|
278
|
+
function failedOnlyOnKeyStatus(result) {
|
|
279
|
+
if (result.headerTamperDetected) {
|
|
280
|
+
return false;
|
|
281
|
+
}
|
|
282
|
+
return (result.state === "signed_unverified_signer" ||
|
|
283
|
+
result.state === "encrypted_unverified_signer" ||
|
|
284
|
+
(result.state === "signature_failed" && result.signatureFailureReason === "signer_key_changed"));
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* `evaluateMessageSecurity()` with verification seals (`verificationSeal.ts`). The live evaluation always runs first,
|
|
288
|
+
* with the same arguments; then:
|
|
289
|
+
*
|
|
290
|
+
* **Live verified** (`"signed_verified"`/`"encrypted_verified"`, no HP-Outer tampering), and either no seal opens for this
|
|
291
|
+
* mailbox, message, raw MIME and `options.masterKeyGeneration`, or `options.sealGeneration` is older than
|
|
292
|
+
* `options.masterKeyGeneration`: the result gains `sealToWrite` (`{ seal, masterKeyGeneration }`), sealing the live
|
|
293
|
+
* `signerFingerprint` and state at `options.now` under the current generation. The caller persists it best effort
|
|
294
|
+
* (`setMessageVerificationSeal()`). This is how messages are re-sealed, lazily, after a `rekey()`: seals are never
|
|
295
|
+
* carried across a master key rotation (see `verificationSeal.ts`).
|
|
296
|
+
*
|
|
297
|
+
* **Live failure caused only by key status** (`signer_key_changed`, `signed_unverified_signer`,
|
|
298
|
+
* `encrypted_unverified_signer` - which also covers a signer key since revoked, since `signingKeyFingerprints()` drops
|
|
299
|
+
* such pins): when the seal opens, its `signerFingerprint` equals the live one and its state matches the message kind
|
|
300
|
+
* (signed-only vs. encrypted), the result is `"verified_at_first_open"` with `verifiedAt`, `sealedState`,
|
|
301
|
+
* `signerFingerprint`, the recovered content (for a signed-only `signer_key_changed` message too), `liveState`,
|
|
302
|
+
* `liveSignatureFailureReason` and `laterCompromised` (see `VerificationSealOptions.signerKeys`).
|
|
303
|
+
* `signatureFailureReason` is dropped.
|
|
304
|
+
*
|
|
305
|
+
* **Everything else** returns the live result unchanged: an invalid signature, identity or header mismatch,
|
|
306
|
+
* `untrusted_signer`, HP-Outer tampering, a seal whose MAC fails or whose hash, uids, generation or signer fingerprint differ, and
|
|
307
|
+
* every unsigned state.
|
|
308
|
+
*
|
|
309
|
+
* With `unlocked` undefined (no master key) the seal is ignored and no seal is built. Throws `KeysLockedError` when
|
|
310
|
+
* `unlocked` was destroyed (`keySession.ts`), before evaluating anything, or if it is destroyed while sealing; otherwise
|
|
311
|
+
* never throws - a seal that can't be built (e.g. uids too long for the size limit) just leaves `sealToWrite` unset.
|
|
312
|
+
*/
|
|
313
|
+
export async function evaluateMessageSecurityWithSeal(rawMime, unlocked, pinnedSignerFingerprints, readerAddress, options) {
|
|
314
|
+
if (unlocked?.destroyed) {
|
|
315
|
+
throw new KeysLockedError();
|
|
316
|
+
}
|
|
317
|
+
const live = await evaluateLive(rawMime, unlocked, pinnedSignerFingerprints, readerAddress);
|
|
318
|
+
const { result } = live;
|
|
319
|
+
const isLiveVerified = LIVE_VERIFIED_STATES.includes(result.state) && !result.headerTamperDetected;
|
|
320
|
+
// Every verified and key-status result carries the signer fingerprint (a certificate was always resolved).
|
|
321
|
+
if (!unlocked || !result.signerFingerprint || (!isLiveVerified && !failedOnlyOnKeyStatus(result))) {
|
|
322
|
+
return result;
|
|
323
|
+
}
|
|
324
|
+
const rawSha256 = await rawMimeSha256(rawMime);
|
|
325
|
+
const generation = options.masterKeyGeneration;
|
|
326
|
+
const opened = options.seal ? await openVerificationSeal(options.mailboxUid, unlocked, options.messageUid, options.seal, rawSha256, generation) : undefined;
|
|
327
|
+
const signerFingerprint = result.signerFingerprint.toLowerCase();
|
|
328
|
+
if (isLiveVerified) {
|
|
329
|
+
const storedSealIsOlder = options.sealGeneration !== undefined && options.sealGeneration < generation;
|
|
330
|
+
if (opened && !storedSealIsOlder) {
|
|
331
|
+
return result;
|
|
332
|
+
}
|
|
333
|
+
try {
|
|
334
|
+
const seal = await buildVerificationSeal(options.mailboxUid, unlocked, {
|
|
335
|
+
messageUid: options.messageUid,
|
|
336
|
+
rawSha256,
|
|
337
|
+
signerFingerprint,
|
|
338
|
+
state: result.state,
|
|
339
|
+
verifiedAt: options.now ?? Date.now(),
|
|
340
|
+
masterKeyGeneration: generation,
|
|
341
|
+
});
|
|
342
|
+
return { ...result, sealToWrite: { seal, masterKeyGeneration: generation } };
|
|
343
|
+
}
|
|
344
|
+
catch (err) {
|
|
345
|
+
if (err instanceof KeysLockedError) {
|
|
346
|
+
throw err;
|
|
347
|
+
}
|
|
348
|
+
return result;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
const expectedSealedState = live.kind === "signed" ? "signed_verified" : "encrypted_verified";
|
|
352
|
+
if (!opened || opened.signerFingerprint !== signerFingerprint || opened.state !== expectedSealedState) {
|
|
353
|
+
return result;
|
|
354
|
+
}
|
|
355
|
+
const laterCompromised = (options.signerKeys ?? []).some((key) => key.fingerprint.toLowerCase() === signerFingerprint && !isTrustedForVerification(key));
|
|
356
|
+
const { signatureFailureReason, ...rest } = result;
|
|
357
|
+
return {
|
|
358
|
+
...live.signedContent,
|
|
359
|
+
...rest,
|
|
360
|
+
state: "verified_at_first_open",
|
|
361
|
+
verifiedAt: opened.verifiedAt,
|
|
362
|
+
sealedState: opened.state,
|
|
363
|
+
liveState: result.state,
|
|
364
|
+
...(signatureFailureReason ? { liveSignatureFailureReason: signatureFailureReason } : {}),
|
|
365
|
+
...(laterCompromised ? { laterCompromised: true } : {}),
|
|
366
|
+
};
|
|
367
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A small, dependency-free MIME (RFC 5322 / RFC 2045-2047) parser used by `smimeMessage.ts` and
|
|
3
|
+
* `messageSecurity.ts` to read *received* messages - which, unlike this package's own output, can come
|
|
4
|
+
* from any foreign MUA/MTA. It deliberately covers exactly what S/MIME evaluation needs and nothing more:
|
|
5
|
+
*
|
|
6
|
+
* header unfolding (RFC 5322 §2.2.3) and CRLF-or-bare-LF line endings; case-insensitive RFC 2045
|
|
7
|
+
* `type/subtype; name=value` parameters, quoted or unquoted; RFC 2046 multipart splitting with
|
|
8
|
+
* preamble/epilogue, transport padding after the delimiter, and delimiters only recognized at the start
|
|
9
|
+
* of a line; `Content-Transfer-Encoding` decoding (base64, quoted-printable; 7bit/8bit/binary pass
|
|
10
|
+
* through) plus `charset` decoding via `TextDecoder`; and picking the displayable body (text/html
|
|
11
|
+
* preferred, text/plain otherwise) out of a nested multipart.
|
|
12
|
+
*
|
|
13
|
+
* **Binary strings.** Received message source is handled as a "binary string": one UTF-16 code unit per
|
|
14
|
+
* byte (0x00-0xFF), which is what `mailApi.ts`'s `getMessageRawContent()` returns (it reads the response
|
|
15
|
+
* as bytes and decodes them as Latin-1) and what decrypted CMS content is converted to. That keeps an
|
|
16
|
+
* 8bit body's bytes intact until its own `charset` is known, and keeps signed bytes verifiable exactly.
|
|
17
|
+
* A string containing any code unit above 0xFF can't be a binary string, so it is treated as already
|
|
18
|
+
* decoded text and UTF-8 encoded wherever bytes are needed (the pre-round-4 convention) - see
|
|
19
|
+
* `binaryStringToBytes()`.
|
|
20
|
+
*
|
|
21
|
+
* Not supported (documented, not silently wrong): RFC 2231 parameter continuations/charset-encoded
|
|
22
|
+
* parameters - not needed to classify, decrypt, or verify a message, and left verbatim. RFC 2047
|
|
23
|
+
* encoded-words are decoded only where text is shown to a user (`decodeHeaderText()`); raw header values
|
|
24
|
+
* (`MimeEntity.headers`) stay verbatim so header comparisons remain exact.
|
|
25
|
+
*/
|
|
26
|
+
/** One header field, unfolded, with its name exactly as written and its value trimmed. */
|
|
27
|
+
export interface MimeHeaderField {
|
|
28
|
+
name: string;
|
|
29
|
+
value: string;
|
|
30
|
+
}
|
|
31
|
+
export interface MimeEntity {
|
|
32
|
+
/** Every header field in order - including repeated names (e.g. RFC 9788 `HP-Outer`). */
|
|
33
|
+
fields: MimeHeaderField[];
|
|
34
|
+
/** Lowercased name -> value of that name's FIRST occurrence. */
|
|
35
|
+
headers: Record<string, string>;
|
|
36
|
+
/** The raw, still-folded header block text (everything before the blank separator line). */
|
|
37
|
+
rawHeaderBlock: string;
|
|
38
|
+
/** The raw, undecoded body (everything after the blank separator line). */
|
|
39
|
+
body: string;
|
|
40
|
+
}
|
|
41
|
+
export interface ParameterizedHeader {
|
|
42
|
+
/** The lowercased main value (e.g. `multipart/signed`). */
|
|
43
|
+
value: string;
|
|
44
|
+
/** Lowercased parameter name -> unquoted value. */
|
|
45
|
+
params: Record<string, string>;
|
|
46
|
+
}
|
|
47
|
+
/** Splits a MIME entity into its header fields and body. Never throws. */
|
|
48
|
+
export declare function parseMimeEntity(entity: string): MimeEntity;
|
|
49
|
+
/** Parses an RFC 2045 parameterized header value (`Content-Type`, `Content-Disposition`). */
|
|
50
|
+
export declare function parseParameterizedHeader(headerValue: string | undefined): ParameterizedHeader;
|
|
51
|
+
/**
|
|
52
|
+
* Splits a multipart body on `boundary` per RFC 2046 §5.1.1: a delimiter is `--boundary` at the start of
|
|
53
|
+
* a line (optionally followed by transport-padding whitespace), the CRLF preceding it belongs to the
|
|
54
|
+
* delimiter (not the previous part), text before the first delimiter is preamble and text after the close
|
|
55
|
+
* delimiter (`--boundary--`) is epilogue - both discarded. Each returned part is the exact text between
|
|
56
|
+
* delimiter lines, which is what a `multipart/signed` signature covers.
|
|
57
|
+
*/
|
|
58
|
+
export declare function splitMultipart(body: string, boundary: string): string[];
|
|
59
|
+
/** Decodes a base64 body into bytes, ignoring whitespace/line breaks. Returns `undefined` for invalid
|
|
60
|
+
* base64 rather than throwing. */
|
|
61
|
+
export declare function decodeBase64Text(text: string): Uint8Array | undefined;
|
|
62
|
+
/** `true` when every code unit of `value` is at most 0xFF - i.e. it can be a binary string (see this
|
|
63
|
+
* module's doc comment). */
|
|
64
|
+
export declare function isBinaryString(value: string): boolean;
|
|
65
|
+
/** Converts a binary string to its bytes, or - for a string that can't be one (a code unit above 0xFF) -
|
|
66
|
+
* to its UTF-8 encoding. */
|
|
67
|
+
export declare function binaryStringToBytes(value: string): Uint8Array;
|
|
68
|
+
/** Converts bytes to a binary string (one code unit per byte), in chunks so a large message never exceeds
|
|
69
|
+
* the engine's argument-count limit. */
|
|
70
|
+
export declare function bytesToBinaryString(bytes: Uint8Array): string;
|
|
71
|
+
/** Decodes a quoted-printable body (RFC 2045 §6.7) into bytes, in one linear pass into a preallocated
|
|
72
|
+
* buffer. Literal text between escapes (which can't legally be non-ASCII in QP, but is after an
|
|
73
|
+
* 8-bit-unsafe gateway) is written run by run, decided once for the whole input: as the runs' own bytes
|
|
74
|
+
* when the input is a binary string, else as their UTF-8 encoding (so an already-decoded `é` next to an
|
|
75
|
+
* emoji isn't written as a lone 0xE9 byte). A run always ends at an ASCII `=`, so a surrogate pair is never
|
|
76
|
+
* split. */
|
|
77
|
+
export declare function decodeQuotedPrintable(text: string): Uint8Array;
|
|
78
|
+
/** Decodes an entity's body into bytes per its `Content-Transfer-Encoding`. 7bit/8bit/binary (or no
|
|
79
|
+
* header) return the body's own bytes (see `binaryStringToBytes()`). Returns `undefined` only for invalid
|
|
80
|
+
* base64. */
|
|
81
|
+
export declare function decodeBodyBytes(entity: MimeEntity): Uint8Array | undefined;
|
|
82
|
+
/** Decodes an entity's body to text: transfer encoding first, then its `charset` parameter (UTF-8 when
|
|
83
|
+
* absent). A 7bit/8bit/binary body that isn't a binary string was already decoded by whoever produced the
|
|
84
|
+
* string and passes through unchanged; so does a binary-string body whose bytes are invalid in its charset
|
|
85
|
+
* (e.g. legacy already-decoded Latin-1 text under a UTF-8 charset). */
|
|
86
|
+
export declare function decodeBodyText(entity: MimeEntity): string;
|
|
87
|
+
/**
|
|
88
|
+
* Turns a raw header value into display text: a binary string holding valid UTF-8 (a raw 8-bit header,
|
|
89
|
+
* RFC 6532) is decoded as UTF-8, then RFC 2047 encoded-words (`=?charset?B|Q?text?=`) are decoded, with
|
|
90
|
+
* whitespace between adjacent encoded-words dropped (RFC 2047 §6.2). An encoded-word with an unknown
|
|
91
|
+
* charset or undecodable content is left verbatim.
|
|
92
|
+
*/
|
|
93
|
+
export declare function decodeHeaderText(value: string): string;
|
|
94
|
+
/** Makes an unstructured header value (e.g. `Subject`) safe to serialize: CR/LF/NUL become a space
|
|
95
|
+
* (never a header break), and a value containing non-ASCII is RFC 2047-encoded. */
|
|
96
|
+
export declare function encodeUnstructuredHeaderValue(value: string): string;
|
|
97
|
+
/**
|
|
98
|
+
* Makes an address-list header value (`From`/`To`/`Cc`) safe to serialize: CR/LF/NUL become a space, and
|
|
99
|
+
* each mailbox's non-ASCII display name (`Zoë <z@example.com>`, quoted or not) is RFC 2047-encoded while
|
|
100
|
+
* its addr-spec is kept verbatim (an internationalized address is left to SMTPUTF8, never encoded -
|
|
101
|
+
* RFC 2047 §5 forbids encoded-words in an addr-spec). RFC 5322 group syntax (`Équipe: Zoë <z@x>, b@x;`)
|
|
102
|
+
* keeps its `:` and `;`, with the group label encoded as a phrase of its own. A top-level `:` only opens
|
|
103
|
+
* a group when a `;` follows it, so a stray colon in an unquoted display name isn't mistaken for one.
|
|
104
|
+
*/
|
|
105
|
+
export declare function encodeAddressListHeaderValue(value: string): string;
|
|
106
|
+
/** A message's displayable content: `html` only for a real `text/html` part, `text` only for a
|
|
107
|
+
* `text/plain` part - never plain text mislabeled as HTML. */
|
|
108
|
+
export interface DisplayBody {
|
|
109
|
+
html?: string;
|
|
110
|
+
text?: string;
|
|
111
|
+
}
|
|
112
|
+
/** Picks the displayable body out of an entity: a `text/html` part is preferred over `text/plain`, and a
|
|
113
|
+
* multipart entity is searched (non-attachment children only, bounded depth). Entities with no
|
|
114
|
+
* Content-Type default to text/plain per RFC 2045 §5.2. */
|
|
115
|
+
export declare function extractDisplayBody(entity: MimeEntity, depth?: number): DisplayBody;
|
|
116
|
+
/** One attachment found inside a MIME entity (see `extractAttachments()`). */
|
|
117
|
+
export interface MimeAttachment {
|
|
118
|
+
/** The `Content-Disposition` `filename` (else the `Content-Type` `name`), RFC 2047-decoded; absent if neither. */
|
|
119
|
+
filename?: string;
|
|
120
|
+
/** The lowercased MIME type, e.g. `application/pdf`. */
|
|
121
|
+
contentType: string;
|
|
122
|
+
/** `"attachment"` for `Content-Disposition: attachment`, `"inline"` otherwise (an inline image, or a part with a
|
|
123
|
+
* filename and no disposition). */
|
|
124
|
+
disposition: "attachment" | "inline";
|
|
125
|
+
/** The `Content-ID` without its angle brackets, if any - how an HTML body references an inline part. */
|
|
126
|
+
contentId?: string;
|
|
127
|
+
/** Decodes the part's content (transfer encoding undone) - lazily, so evaluating a message never pays for
|
|
128
|
+
* attachments nobody opens. `undefined` for invalid base64. */
|
|
129
|
+
decode(): Uint8Array | undefined;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Lists the attachments inside `entity` (descending into multipart children, bounded depth): every leaf part
|
|
133
|
+
* with `Content-Disposition: attachment`, a filename, or a non-text type. The `text/plain`/`text/html` parts a
|
|
134
|
+
* reader would display (no disposition, no filename) are not attachments. Nested `message/rfc822` content is
|
|
135
|
+
* reported as one attachment, never expanded.
|
|
136
|
+
*/
|
|
137
|
+
export declare function extractAttachments(entity: MimeEntity, depth?: number): MimeAttachment[];
|
|
138
|
+
/** HTML-escapes plain text and wraps it in a whitespace-preserving `<pre>`, so a `text/plain` body can be
|
|
139
|
+
* rendered through the same HTML path without ever being interpreted as markup. */
|
|
140
|
+
export declare function plainTextToHtml(text: string): string;
|
|
141
|
+
/** Extracts the bare, lowercased addr-specs from an address-list header value (`"Name" <a@b>, c@d`).
|
|
142
|
+
* Handles quoted display names containing commas/angle brackets and RFC 5322 comments. */
|
|
143
|
+
export declare function extractAddresses(headerValue: string | undefined): string[];
|