@rapidmx/web-client 0.21.0 → 0.23.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 +48 -14
- package/apps/admin/_layout.tsx +2 -2
- package/apps/admin/audit-log/index.tsx +4 -4
- package/apps/admin/branding/index.tsx +3 -3
- package/apps/admin/data-requests/index.tsx +8 -8
- 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 +6 -6
- 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 +7 -7
- package/apps/admin/escrow-scopes/index.tsx +4 -4
- package/apps/admin/escrow-scopes/new/index.tsx +5 -5
- package/apps/admin/index.tsx +6 -6
- package/apps/admin/ingest-queue/index.tsx +4 -4
- package/apps/admin/mailbox-policy/index.tsx +1 -1
- package/apps/admin/mailboxes/[uid].tsx +5 -5
- package/apps/admin/quarantine/index.tsx +5 -5
- package/apps/admin/retention-policy/index.tsx +3 -3
- package/apps/admin/signing-certificates/index.tsx +5 -5
- 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 +4 -4
- package/apps/escrow/index.tsx +4 -4
- package/apps/escrow/matters/[uid].tsx +10 -10
- 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 +1 -1
- 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 +8 -8
- package/apps/shared/components/admin/mailboxes/EraseLeftoverDataDialog.tsx +6 -6
- package/apps/shared/components/admin/mailboxes/EscrowScopeCard.tsx +10 -8
- package/apps/shared/components/admin/mailboxes/LeftoverMailboxesSection.tsx +4 -4
- 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 +5 -5
- package/apps/shared/components/admin/settings/DomainDnsSetup.tsx +5 -5
- package/apps/shared/components/admin/settings/EncryptionPolicyForm.tsx +4 -4
- 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 +4 -4
- package/apps/shared/components/admin/settings/PluginsManager.tsx +5 -5
- package/apps/shared/components/admin/settings/RetentionPolicyForm.tsx +5 -5
- package/apps/shared/components/admin/setup/EscrowSetupStep.tsx +7 -7
- package/apps/shared/components/admin/setup/SetupWizard.tsx +28 -24
- package/apps/shared/components/admin/signOut.ts +1 -1
- package/apps/shared/components/admin/usePagedList.tsx +2 -2
- 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 +5 -5
- 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 +2 -2
- 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 +2 -2
- 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 +1 -1
- package/apps/shared/components/calendar/TaskQuickForm.tsx +23 -18
- package/apps/shared/components/calendar/TimeGridView.tsx +5 -3
- package/apps/shared/components/calendar/allDay.ts +2 -2
- 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 +27 -17
- package/apps/shared/components/contacts/ContactsSidebar.tsx +7 -5
- 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 +6 -6
- package/apps/shared/components/forms/StringListField.tsx +1 -1
- package/apps/shared/components/layout/AppShell.tsx +12 -10
- package/apps/shared/components/layout/BrandingChrome.tsx +1 -1
- package/apps/shared/components/layout/KeyEnrollmentGate.tsx +9 -9
- package/apps/shared/components/layout/MailboxProvisioning.tsx +8 -6
- package/apps/shared/components/layout/RecoveryCodeUnlock.tsx +9 -9
- package/apps/shared/components/layout/ThemeSwitch.tsx +1 -1
- package/apps/shared/components/layout/UnlockPromptProvider.tsx +6 -6
- package/apps/shared/components/layout/UserMenu.tsx +6 -4
- package/apps/shared/components/mail/ConversationList.tsx +25 -10
- package/apps/shared/components/mail/ConversationThreadPane.tsx +33 -17
- 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 +2 -2
- package/apps/shared/components/mail/MenuButton.tsx +1 -1
- package/apps/shared/components/mail/MessageDetailPane.tsx +69 -48
- 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 +14 -3
- package/apps/shared/components/mail/compose/ComposeWindow.tsx +34 -30
- 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/ScheduleSendPicker.tsx +1 -1
- package/apps/shared/components/mail/compose/encryptionRequirement.ts +2 -2
- package/apps/shared/components/mail/compose/quotedBody.ts +5 -5
- package/apps/shared/components/mail/compose/recipients.ts +1 -1
- package/apps/shared/components/mail/invite/InviteRowChip.tsx +10 -14
- package/apps/shared/components/mail/invite/InviteRsvpPopover.tsx +11 -9
- 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/MessageSourceDialog.tsx +3 -3
- 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/conversationPrint.ts +76 -0
- package/apps/shared/components/mail/reading/messageExport.ts +1 -1
- package/apps/shared/components/mail/reading/printMessage.ts +46 -9
- package/apps/shared/components/mail/reading/useMessageActions.ts +28 -21
- package/apps/shared/components/mail/unreadStyle.tsx +1 -1
- package/apps/shared/components/mail/verificationSeals.ts +16 -12
- package/apps/shared/components/mail/writableMailboxes.ts +14 -7
- package/apps/shared/components/rules/RuleBuilder.tsx +1 -1
- package/apps/shared/components/settings/SigningCertificateCard.tsx +4 -4
- 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/ShortcutsDialog.tsx +1 -1
- package/apps/shared/keyboard/keymap.ts +1 -0
- package/apps/shared/mail/decryptedMessages.ts +116 -0
- package/apps/shared/mail/findWellKnownFolderUid.ts +6 -4
- package/apps/shared/mail/folderCounts.ts +8 -4
- package/apps/shared/mail/folderOfType.ts +5 -3
- package/apps/shared/mail/folderTree.ts +1 -1
- package/apps/shared/mail/listSnapshots.ts +2 -2
- package/apps/shared/mail/messageReadState.ts +6 -5
- package/apps/shared/mail/newMailNotifications.ts +2 -2
- 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 +40 -35
- package/apps/shared/mail/outbox/sendOutcomes.ts +20 -15
- 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 +1 -1
- package/apps/shared/mail/senderBlocking.ts +36 -20
- package/apps/shared/mail/useMailConnection.ts +12 -10
- package/apps/shared/mail/useMailLiveUpdates.ts +3 -3
- package/apps/shared/mail/useMailboxUpdateAccess.ts +35 -11
- package/apps/shared/mail/useMarkMessageRead.ts +14 -7
- package/apps/shared/mail/useNewMailNotifications.ts +1 -1
- 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/systemErrors.ts +1 -1
- package/apps/shared/search/LocalIndexLifecycle.tsx +18 -12
- package/apps/shared/search/crossMailboxSearch.ts +3 -3
- package/apps/shared/search/localIndexBuilder.ts +24 -12
- 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/enrollmentTracker.ts +3 -3
- package/apps/shared/signing/enrollmentView.ts +1 -1
- package/apps/shared/signing/signingInfo.ts +1 -1
- package/apps/shared/signing/useSigningEnrollmentWatcher.ts +6 -4
- package/apps/shared/styles/app.css +14 -23
- package/apps/www/_layout.tsx +2 -2
- package/apps/www/calendar/index.tsx +20 -18
- package/apps/www/contacts/[uid].tsx +8 -6
- package/apps/www/contacts/index.tsx +19 -17
- package/apps/www/index.tsx +68 -48
- package/apps/www/messages/[uid].tsx +11 -9
- package/apps/www/settings/auto-reply/index.tsx +6 -4
- package/apps/www/settings/blocked-senders/index.tsx +9 -7
- package/apps/www/settings/encryption/index.tsx +38 -32
- package/apps/www/settings/filters/[uid].tsx +19 -14
- package/apps/www/settings/filters/_mailFilterRuleConfig.tsx +2 -2
- package/apps/www/settings/filters/index.tsx +4 -4
- package/apps/www/settings/filters/new/index.tsx +10 -8
- package/apps/www/settings/labels/index.tsx +12 -10
- package/apps/www/settings/privacy/index.tsx +18 -14
- package/apps/www/settings/profile/index.tsx +16 -11
- package/apps/www/settings/read-receipts/index.tsx +17 -12
- package/apps/www/settings/sharing/index.tsx +6 -6
- package/apps/www/settings/signatures/[uid].tsx +5 -5
- package/apps/www/settings/signatures/index.tsx +4 -4
- package/apps/www/settings/signatures/new/index.tsx +4 -4
- package/apps/www/settings/signatures/signatureDefaults.ts +1 -1
- package/apps/www/tasks/index.tsx +28 -23
- 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 +7 -7
- 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 +5 -5
- 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.d.ts +4 -4
- package/dist/apps/shared/components/admin/setup/SetupWizard.js +27 -23
- 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 +2 -2
- 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 +6 -6
- 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 +11 -9
- 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 +23 -8
- package/dist/apps/shared/components/mail/ConversationThreadPane.d.ts +3 -3
- package/dist/apps/shared/components/mail/ConversationThreadPane.js +19 -13
- 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 +61 -46
- 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.js +34 -30
- 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 +3 -3
- package/dist/apps/shared/components/mail/invite/InviteRowChip.js +7 -9
- package/dist/apps/shared/components/mail/invite/InviteRsvpPopover.d.ts +2 -2
- package/dist/apps/shared/components/mail/invite/InviteRsvpPopover.js +11 -9
- 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/conversationPrint.d.ts +15 -0
- package/dist/apps/shared/components/mail/reading/conversationPrint.js +69 -0
- package/dist/apps/shared/components/mail/reading/messageExport.js +1 -1
- package/dist/apps/shared/components/mail/reading/printMessage.d.ts +9 -3
- package/dist/apps/shared/components/mail/reading/printMessage.js +33 -6
- 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/keyboard/keymap.d.ts +6 -0
- package/dist/apps/shared/keyboard/keymap.js +1 -0
- package/dist/apps/shared/mail/decryptedMessages.d.ts +27 -0
- package/dist/apps/shared/mail/decryptedMessages.js +97 -0
- 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 +14 -23
- 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 +64 -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,228 @@
|
|
|
1
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
// Copyright (C) 2026 Jean-Philippe Steinmetz
|
|
3
|
+
// SPDX-License-Identifier: MPL-2.0
|
|
4
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
5
|
+
/**
|
|
6
|
+
* Builds a fresh `MasterKeyWrap` for the password and recovery-code unlock methods, given an
|
|
7
|
+
* already-generated (or already-unwrapped) master key (MK). Extracted from `web-client`'s
|
|
8
|
+
* `KeyEnrollmentGate.tsx` (first-sign-in provisioning) so its Settings page's "add a password
|
|
9
|
+
* method"/"regenerate recovery codes" actions - which wrap the *same* MK a second time, not a freshly
|
|
10
|
+
* generated one - can reuse the exact same wrap-construction logic rather than a second, potentially
|
|
11
|
+
* drifting copy of it.
|
|
12
|
+
*
|
|
13
|
+
* Every builder throws `KeysLockedError` (`masterKey.ts`) when `mk` is a destroyed (all-zero) master key -
|
|
14
|
+
* wrapping one would upload a wrap that "unlocks" to a useless key.
|
|
15
|
+
*/
|
|
16
|
+
import { toBase64 } from "./encoding.js";
|
|
17
|
+
import { KeysLockedError, assertKeyMaterialUsable, buildAad, sealWithKey } from "./masterKey.js";
|
|
18
|
+
import { MASTER_KEY_AAD_PURPOSE } from "./keySession.js";
|
|
19
|
+
import { addMasterKeyWrap, getKeyVault, removeMasterKeyWrap } from "./keyvaultApi.js";
|
|
20
|
+
import { DEFAULT_ARGON2ID_PARAMS, argon2idKdfLabel, deriveFromPassword, generateSalt } from "./passwordUnlock.js";
|
|
21
|
+
import { RECOVERY_KDF_LABEL, deriveFromRecoveryCode, generateRecoveryCode } from "./recoveryCode.js";
|
|
22
|
+
export { RECOVERY_KDF_LABEL };
|
|
23
|
+
export const WRAP_SCHEME_VERSION = 1;
|
|
24
|
+
export const RECOVERY_CODE_COUNT = 8;
|
|
25
|
+
/** Wraps `mk` under `password` (fresh Argon2id salt every time, even when replacing an existing
|
|
26
|
+
* password wrap). `params` defaults to this module's own recommended parameters - overridable only so
|
|
27
|
+
* tests can substitute cheaper ones; production callers should omit it and let the default (which can
|
|
28
|
+
* be raised over time, per `passwordUnlock.ts`'s own doc comment on why each wrap stores the exact
|
|
29
|
+
* parameters it was created with) apply. */
|
|
30
|
+
export async function buildPasswordWrap(mailboxUid, mk, password, params = DEFAULT_ARGON2ID_PARAMS) {
|
|
31
|
+
assertKeyMaterialUsable(mk);
|
|
32
|
+
const salt = generateSalt();
|
|
33
|
+
const { wrappingKey } = await deriveFromPassword(password, salt, params);
|
|
34
|
+
const sealed = await sealWithKey(wrappingKey, mk, buildAad(mailboxUid, MASTER_KEY_AAD_PURPOSE));
|
|
35
|
+
return {
|
|
36
|
+
method: "password",
|
|
37
|
+
ciphertext: sealed.ciphertext,
|
|
38
|
+
nonce: sealed.nonce,
|
|
39
|
+
salt: toBase64(salt),
|
|
40
|
+
kdf: argon2idKdfLabel(params),
|
|
41
|
+
schemeVersion: WRAP_SCHEME_VERSION,
|
|
42
|
+
createdAt: Date.now(),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/** Generates `count` fresh recovery codes and wraps `mk` under each, returning both the wraps (to
|
|
46
|
+
* upload) and the plaintext codes (to show the user exactly once - callers must never persist these
|
|
47
|
+
* themselves). Each wrap's `methodId` is a sequence label, deliberately not derived from the code
|
|
48
|
+
* itself - that would let anyone who saw a wrap's `methodId` narrow down which physical code it
|
|
49
|
+
* corresponds to. */
|
|
50
|
+
export async function buildRecoveryWraps(mailboxUid, mk, count = RECOVERY_CODE_COUNT) {
|
|
51
|
+
assertKeyMaterialUsable(mk);
|
|
52
|
+
const aad = buildAad(mailboxUid, MASTER_KEY_AAD_PURPOSE);
|
|
53
|
+
const codes = [];
|
|
54
|
+
const wraps = [];
|
|
55
|
+
for (let i = 0; i < count; i++) {
|
|
56
|
+
const code = generateRecoveryCode();
|
|
57
|
+
const salt = generateSalt();
|
|
58
|
+
const wrappingKey = await deriveFromRecoveryCode(code, salt);
|
|
59
|
+
const sealed = await sealWithKey(wrappingKey, mk, aad);
|
|
60
|
+
codes.push(code);
|
|
61
|
+
wraps.push({
|
|
62
|
+
method: "recovery",
|
|
63
|
+
methodId: `recovery-${i + 1}`,
|
|
64
|
+
ciphertext: sealed.ciphertext,
|
|
65
|
+
nonce: sealed.nonce,
|
|
66
|
+
salt: toBase64(salt),
|
|
67
|
+
kdf: RECOVERY_KDF_LABEL,
|
|
68
|
+
schemeVersion: WRAP_SCHEME_VERSION,
|
|
69
|
+
createdAt: Date.now(),
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
return { wraps, codes };
|
|
73
|
+
}
|
|
74
|
+
/** `nonce`/`salt` labels for an escrow wrap - see `buildEscrowWrap()`'s own doc comment for why these
|
|
75
|
+
* are fixed placeholders rather than freshly generated values, unlike every other wrap method.
|
|
76
|
+
* Deliberately NOT valid base64 (`fromBase64("n/a")` decodes to 2 arbitrary bytes rather than throwing,
|
|
77
|
+
* since only a length of `4n+1` makes `atob()` reject its input) - any future generic
|
|
78
|
+
* `fromBase64(wrap.salt)`/`fromBase64(wrap.nonce)` refactor across every wrap method MUST special-case
|
|
79
|
+
* (or simply skip) `method === "escrow"` first, or it will silently "succeed" with garbage bytes instead
|
|
80
|
+
* of failing loudly. Nothing in this codebase does that generically today (`keySession.ts` only ever
|
|
81
|
+
* reads `.salt`/`.nonce` after already filtering to `method === "password"` or `method === "recovery"`), but it's exactly the kind
|
|
82
|
+
* of innocent-looking refactor that would reintroduce this as a real bug. */
|
|
83
|
+
export const ESCROW_KDF_LABEL = "cms-enveloped-data";
|
|
84
|
+
const ESCROW_NONCE_PLACEHOLDER = "n/a";
|
|
85
|
+
const ESCROW_SALT_PLACEHOLDER = "n/a";
|
|
86
|
+
/**
|
|
87
|
+
* Wraps `mk` for the `escrow` unlock method: encrypts it as a CMS `EnvelopedData` structure to the
|
|
88
|
+
* escrow scope's own X.509 public-key certificate (`keyvaultApi.ts`'s `getEscrowInfo()` return value) -
|
|
89
|
+
* the exact same "encrypt to a recipient's certificate" operation `smime.ts`'s `encryptForRecipients()`
|
|
90
|
+
* already implements for message bodies, just applied to MK instead. Matches
|
|
91
|
+
* `specs/end-to-end_encryption.md`'s `wrap_escrow = AEAD(escrow scope public key, MK)` pseudocode.
|
|
92
|
+
*
|
|
93
|
+
* Unlike `buildPasswordWrap()`/`buildRecoveryWraps()`, there is no separately-generated salt or nonce
|
|
94
|
+
* here - CMS `EnvelopedData` already embeds everything a holder's own offline tooling needs to unwrap
|
|
95
|
+
* (the content-encryption algorithm, its IV, and the ECDH key-agreement material) inside the ciphertext
|
|
96
|
+
* itself. `nonce`/`salt` are still populated with a fixed, documented placeholder rather than left empty
|
|
97
|
+
* because restapi's own `validateMasterKeyWrap()` requires every `MasterKeyWrap` field to be a non-empty
|
|
98
|
+
* string regardless of method - they carry no cryptographic meaning for this method and a holder's
|
|
99
|
+
* unwrap tooling must never read them.
|
|
100
|
+
*
|
|
101
|
+
* This client never has (and this function never touches) the scope's *private* key - only a holder's
|
|
102
|
+
* own external tooling can ever unwrap the result. `escrowScopeId` is required so `resolveAllowEscrow()`
|
|
103
|
+
* (server-side) can confirm it matches the mailbox's actually-assigned scope before persisting.
|
|
104
|
+
*/
|
|
105
|
+
export async function buildEscrowWrap(mk, escrowScopeId, scopePublicKeyCertDer) {
|
|
106
|
+
assertKeyMaterialUsable(mk);
|
|
107
|
+
// Loaded here, the one place it is used: `smime.ts` carries PKI.js and the ASN.1/X.509 libraries (over half a megabyte),
|
|
108
|
+
// and this module is imported by every shell that can unlock keys.
|
|
109
|
+
const { encryptForRecipients } = await import("./smime.js");
|
|
110
|
+
const envelopedDer = await encryptForRecipients(mk, [scopePublicKeyCertDer]);
|
|
111
|
+
return {
|
|
112
|
+
method: "escrow",
|
|
113
|
+
escrowScopeId,
|
|
114
|
+
ciphertext: toBase64(envelopedDer),
|
|
115
|
+
nonce: ESCROW_NONCE_PLACEHOLDER,
|
|
116
|
+
salt: ESCROW_SALT_PLACEHOLDER,
|
|
117
|
+
kdf: ESCROW_KDF_LABEL,
|
|
118
|
+
schemeVersion: WRAP_SCHEME_VERSION,
|
|
119
|
+
createdAt: Date.now(),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Removes the recovery wrap a recovery code just opened (`unlockWithRecoveryCode()`'s `recoveryMethodId`) - recovery
|
|
124
|
+
* codes are single-use. A thin, intention-revealing wrapper over `removeMasterKeyWrap(mailboxUid, "recovery",
|
|
125
|
+
* methodId)`; `methodId` is required, so a missing id can never make the server pick "the" recovery wrap itself.
|
|
126
|
+
*
|
|
127
|
+
* restapi (`BaseKeyVaultRoute.removeMasterKeyWrap()`) refuses with `409` when this wrap is the vault's last non-escrow
|
|
128
|
+
* wrap (the owner's last own unlock method) - e.g. the last recovery code of a vault whose password wrap is gone. A
|
|
129
|
+
* caller replacing a forgotten password should therefore call `replacePasswordWrap()` *before* this, never after:
|
|
130
|
+
* while the code's wrap still exists it is the other unlock method that makes replacing the password safe. A `404`
|
|
131
|
+
* means the wrap is already gone (e.g. consumed from another tab) and is safe to treat as done.
|
|
132
|
+
*/
|
|
133
|
+
export function consumeRecoveryCode(mailboxUid, methodId) {
|
|
134
|
+
if (!methodId) {
|
|
135
|
+
return Promise.reject(new Error("A recovery wrap's methodId is required to consume it."));
|
|
136
|
+
}
|
|
137
|
+
return removeMasterKeyWrap(mailboxUid, "recovery", methodId);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Thrown by `replacePasswordWrap()`. For every `reason` except `"add_failed"` nothing was written. `"add_failed"` means
|
|
141
|
+
* the old password wrap was removed but the new one couldn't be added: `restored` says whether the old wrap was put
|
|
142
|
+
* back (the vault is then as it was), and `cause` holds the add's own error (e.g. an `ApiRequestError` `409` for a
|
|
143
|
+
* master key rotated in the meantime). Either way the mailbox still has the other unlock method checked beforehand.
|
|
144
|
+
*/
|
|
145
|
+
export class PasswordWrapReplaceError extends Error {
|
|
146
|
+
constructor(reason, message, options = {}) {
|
|
147
|
+
super(message);
|
|
148
|
+
this.name = "PasswordWrapReplaceError";
|
|
149
|
+
this.reason = reason;
|
|
150
|
+
this.restored = options.restored;
|
|
151
|
+
this.cause = options.cause;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/** Copies only `MasterKeyWrap`'s own fields, so a wrap read back from the server can be re-posted as-is. */
|
|
155
|
+
function wireWrap(wrap) {
|
|
156
|
+
const { method, methodId, escrowScopeId, ciphertext, nonce, salt, kdf, schemeVersion, createdAt } = wrap;
|
|
157
|
+
return {
|
|
158
|
+
method,
|
|
159
|
+
...(methodId !== undefined ? { methodId } : {}),
|
|
160
|
+
...(escrowScopeId !== undefined ? { escrowScopeId } : {}),
|
|
161
|
+
ciphertext,
|
|
162
|
+
nonce,
|
|
163
|
+
salt,
|
|
164
|
+
kdf,
|
|
165
|
+
schemeVersion,
|
|
166
|
+
createdAt,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Replaces the mailbox's password wrap with one for `newPassword`, wrapping the session's master key
|
|
171
|
+
* (`unlocked.masterKey`, e.g. after `unlockWithRecoveryCode()` for a forgotten password). Resolves with the vault after
|
|
172
|
+
* the new wrap was added.
|
|
173
|
+
*
|
|
174
|
+
* Why remove-then-add: `unlockWithPassword()` only ever tries the first password wrap, and password wraps carry no
|
|
175
|
+
* `methodId`, so restapi can't remove one of two (a `DELETE .../wraps/password` without `methodId` matching two wraps is
|
|
176
|
+
* a `400`). Adding first would leave an unremovable, unused second wrap. The safest order is therefore:
|
|
177
|
+
*
|
|
178
|
+
* 1. Build the new wrap (Argon2id) - fails, e.g. with `KeysLockedError` for destroyed keys, before any request.
|
|
179
|
+
* 2. Read the vault and refuse, writing nothing, with `PasswordWrapReplaceError` when: `expectedMasterKeyGeneration` was
|
|
180
|
+
* given and isn't the vault's (`"master_key_rotated"` - the remove endpoint doesn't check it, so it is checked here);
|
|
181
|
+
* the vault holds more than one password wrap (`"multiple_password_wraps"`); or removing the password wrap would
|
|
182
|
+
* leave no other own unlock wrap, i.e. no non-escrow, non-password wrap (`"no_other_unlock_method"` - restapi's
|
|
183
|
+
* remove endpoint refuses that with `409` too, since it counts only non-escrow wraps as the owner's own; checking
|
|
184
|
+
* here first gives a typed reason without a write attempt).
|
|
185
|
+
* 3. Remove the old password wrap (skipped when there is none: the new wrap is simply added). A failure here is
|
|
186
|
+
* rethrown as-is; nothing changed.
|
|
187
|
+
* 4. Add the new wrap, sending `expectedMasterKeyGeneration` when given (restapi answers `409` if the master key was
|
|
188
|
+
* rotated since). If this fails, the removed wrap is re-added (with the generation read in step 2) and
|
|
189
|
+
* `PasswordWrapReplaceError` `"add_failed"` is thrown with `restored`. If even that fails the mailbox has no password
|
|
190
|
+
* wrap, but step 2 guaranteed another own unlock method remains - the user can unlock with it and retry.
|
|
191
|
+
*
|
|
192
|
+
* Because step 2 needs another own unlock method, a caller replacing a password after a recovery-code unlock must call
|
|
193
|
+
* this *before* `consumeRecoveryCode()`: the not-yet-consumed code's wrap is that other method.
|
|
194
|
+
*/
|
|
195
|
+
export async function replacePasswordWrap(mailboxUid, unlocked, newPassword, expectedMasterKeyGeneration, params = DEFAULT_ARGON2ID_PARAMS) {
|
|
196
|
+
if (unlocked.destroyed) {
|
|
197
|
+
throw new KeysLockedError();
|
|
198
|
+
}
|
|
199
|
+
const newWrap = await buildPasswordWrap(mailboxUid, unlocked.masterKey, newPassword, params);
|
|
200
|
+
const vault = await getKeyVault(mailboxUid);
|
|
201
|
+
if (expectedMasterKeyGeneration !== undefined && (vault.masterKeyGeneration ?? 0) !== expectedMasterKeyGeneration) {
|
|
202
|
+
throw new PasswordWrapReplaceError("master_key_rotated", "This mailbox's master key was rotated since it was unlocked - unlock it again before changing the password.");
|
|
203
|
+
}
|
|
204
|
+
const passwordWraps = vault.masterKeyWraps.filter((w) => w.method === "password");
|
|
205
|
+
if (passwordWraps.length > 1) {
|
|
206
|
+
throw new PasswordWrapReplaceError("multiple_password_wraps", "This mailbox has more than one password wrap, so the old one can't be removed safely.");
|
|
207
|
+
}
|
|
208
|
+
const oldWrap = passwordWraps[0];
|
|
209
|
+
if (oldWrap && !vault.masterKeyWraps.some((w) => w.method !== "password" && w.method !== "escrow")) {
|
|
210
|
+
throw new PasswordWrapReplaceError("no_other_unlock_method", "The password is this mailbox's only unlock method - add another one (e.g. recovery codes) before replacing it.");
|
|
211
|
+
}
|
|
212
|
+
if (unlocked.destroyed) {
|
|
213
|
+
throw new KeysLockedError();
|
|
214
|
+
}
|
|
215
|
+
if (oldWrap) {
|
|
216
|
+
await removeMasterKeyWrap(mailboxUid, "password");
|
|
217
|
+
}
|
|
218
|
+
try {
|
|
219
|
+
return await addMasterKeyWrap(mailboxUid, newWrap, expectedMasterKeyGeneration);
|
|
220
|
+
}
|
|
221
|
+
catch (err) {
|
|
222
|
+
if (!oldWrap) {
|
|
223
|
+
throw err;
|
|
224
|
+
}
|
|
225
|
+
const restored = await addMasterKeyWrap(mailboxUid, wireWrap(oldWrap), vault.masterKeyGeneration).then(() => true, () => false);
|
|
226
|
+
throw new PasswordWrapReplaceError("add_failed", "The new password couldn't be saved.", { restored, cause: err });
|
|
227
|
+
}
|
|
228
|
+
}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evaluates a *received* message's raw MIME source into one of `specs/end-to-end_encryption.md`'s
|
|
3
|
+
* "Message Security Indicators" states, and recovers the plaintext body when applicable. Reads the
|
|
4
|
+
* outer envelope's own `Content-Type` (via `mime.ts`'s `parseMimeEntity()`) to decide whether the message
|
|
5
|
+
* is `multipart/signed`, `application/pkcs7-mime; smime-type="enveloped-data"`, or neither.
|
|
6
|
+
*
|
|
7
|
+
* **What a verified state means.** `"signed_verified"`/`"encrypted_verified"` require ALL of: (1) a
|
|
8
|
+
* cryptographically valid CMS signature (`smime.ts` - detached signatures carrying their own eContent are
|
|
9
|
+
* rejected, the signer certificate is the one matched to the SignerInfo, never simply the first embedded
|
|
10
|
+
* certificate, and a `multipart/signed` body must hold exactly the signed part and the signature); (2) the
|
|
11
|
+
* signer certificate's fingerprint is one the reader already trusts - a pinned `Contact` signing key passed
|
|
12
|
+
* as `pinnedSignerFingerprints`, or the unlocked mailbox's own `signingFingerprint`; (3) the signer
|
|
13
|
+
* certificate names the sender: one of its email addresses (SAN rfc822Name, else subject emailAddress /
|
|
14
|
+
* email-shaped CN) equals the single address in the protected `From` (or the outer `From` when the signed
|
|
15
|
+
* content carries no protected headers, as with non-RFC 9788 senders); (4) the protected `From`/`To`/`Cc`
|
|
16
|
+
* address sets (when present) equal the outer envelope's, a signed-only message's protected `Subject` equals
|
|
17
|
+
* its outer one (what the mail list shows), and neither header block carries more than one
|
|
18
|
+
* `From`/`To`/`Cc`/`Sender` field.
|
|
19
|
+
*
|
|
20
|
+
* **No trust anchor, no verified badge.** Certificates aren't chain-validated (there is no trust store), so
|
|
21
|
+
* checks 1, 3 and 4 alone prove only that *someone* holding a certificate naming the sender signed it - a
|
|
22
|
+
* self-issued certificate with SAN `ceo@victim.com` passes them. Without a matching pin the result is
|
|
23
|
+
* `"signed_unverified_signer"`/`"encrypted_unverified_signer"` instead, carrying `signerFingerprint` and
|
|
24
|
+
* `signerEmails` so a UI can show "signed by an unverified certificate" and offer to trust it. A failure of checks 1, 3
|
|
25
|
+
* or 4 is `"signature_failed"` with `signatureFailureReason` saying which check failed.
|
|
26
|
+
*
|
|
27
|
+
* **Pinned, but a different key.** When pins were supplied and checks 1, 3 and 4 pass but the signer matches no pin, the
|
|
28
|
+
* result is `"signature_failed"` with `signatureFailureReason: "signer_key_changed"`: the sender's certificate names
|
|
29
|
+
* them and the message is intact, but it isn't the key the reader pinned (a rotation the reader hasn't accepted, or an
|
|
30
|
+
* impersonation). Only this failure also carries `signerCertificate`, so a UI can compare it with the pinned keys
|
|
31
|
+
* (`contactsApi.ts`'s `fetchSignerKeyState()`) and let the user accept or reject it (`keyvaultApi.ts`'s
|
|
32
|
+
* `resolveKeyConflict()`). A pin mismatch whose certificate also fails check 3 or 4 (or couldn't be resolved) stays
|
|
33
|
+
* `untrusted_signer`. Previously pinned keys count as pins (see `signingKeyFingerprints()`), so mail signed before an
|
|
34
|
+
* accepted or automatic rotation still verifies.
|
|
35
|
+
*/
|
|
36
|
+
import { MimeAttachment, MimeHeaderField } from "./mime.js";
|
|
37
|
+
import { ProtectedHeaders } from "./smimeMessage.js";
|
|
38
|
+
import { type PublicKey } from "./keyvaultApi.js";
|
|
39
|
+
import { type SealKeyMaterial, type SealedVerificationState } from "./verificationSeal.js";
|
|
40
|
+
export { signingKeyFingerprints } from "./keyvaultApi.js";
|
|
41
|
+
/** `"signed_unverified_signer"`/`"encrypted_unverified_signer"`: the signature is valid and its certificate
|
|
42
|
+
* names the sender, but the certificate isn't one the reader trusts (no pinned key matched) - see this module's
|
|
43
|
+
* doc comment. The encrypted variant's content was decrypted like `"encrypted_verified"`'s.
|
|
44
|
+
*
|
|
45
|
+
* `"verified_at_first_open"`: only ever returned by `evaluateMessageSecurityWithSeal()`. The live check now fails only
|
|
46
|
+
* because of the signer key's status (`signer_key_changed`, or `*_unverified_signer` - the pins are gone or no longer
|
|
47
|
+
* trust the key), but the message carries a valid verification seal (`verificationSeal.ts`) for this exact raw MIME and
|
|
48
|
+
* this same signer certificate, recording that it verified when first opened. The result carries `verifiedAt`,
|
|
49
|
+
* `sealedState`, `signerFingerprint`, the recovered content, `liveState`/`liveSignatureFailureReason`, and
|
|
50
|
+
* `laterCompromised` when the signer key has since been revoked as compromised. A UI should show it as "verified when
|
|
51
|
+
* first opened" - distinct from the live verified states, and with a warning when `laterCompromised` is set. */
|
|
52
|
+
export type MessageSecurityState = "encrypted" | "signed_verified" | "encrypted_verified" | "signed_unverified_signer" | "encrypted_unverified_signer" | "signature_failed" | "verified_at_first_open" | "unprotected";
|
|
53
|
+
/** Why a message is `"signature_failed"`. `invalid_signature`: the CMS signature itself is malformed or
|
|
54
|
+
* doesn't verify over the content (or a `multipart/signed` body doesn't hold exactly two parts).
|
|
55
|
+
* `signer_key_changed`: pinned fingerprints were supplied and the signer certificate matches none of them, but it
|
|
56
|
+
* names the sender and every header check passes - the sender appears to use a new key (see this module's doc
|
|
57
|
+
* comment); the result carries `signerCertificate`. `untrusted_signer`: pinned fingerprints were supplied and the signer
|
|
58
|
+
* certificate matches none of them and also fails the identity or header checks (or no signer certificate could be
|
|
59
|
+
* resolved at all). `signer_identity_mismatch`: the signer certificate doesn't name the message's `From` address (or
|
|
60
|
+
* `From` doesn't hold exactly one address). `header_mismatch`: the signed/protected `From`/`To`/`Cc` (or a signed-only
|
|
61
|
+
* message's `Subject`) disagree with the outer envelope's, or either header block repeats a `From`/`To`/`Cc`/`Sender`
|
|
62
|
+
* field. */
|
|
63
|
+
export type SignatureFailureReason = "invalid_signature" | "signer_key_changed" | "untrusted_signer" | "signer_identity_mismatch" | "header_mismatch";
|
|
64
|
+
/** The header fields recovered from inside the signed/encrypted entity (RFC 9788 header protection), decoded
|
|
65
|
+
* for display where they are text. */
|
|
66
|
+
export interface MessageProtectedHeaders {
|
|
67
|
+
from: string;
|
|
68
|
+
to: string;
|
|
69
|
+
cc?: string;
|
|
70
|
+
subject: string;
|
|
71
|
+
}
|
|
72
|
+
export interface MessageSecurityResult {
|
|
73
|
+
state: MessageSecurityState;
|
|
74
|
+
/** The verified/decrypted content as HTML - still needs client-side sanitization before touching the
|
|
75
|
+
* DOM (this module does none itself; see `MessageDetailPane.tsx`). For a `text/html` body this is that
|
|
76
|
+
* HTML; for a `text/plain` body it is the text HTML-escaped inside a whitespace-preserving `<pre>`
|
|
77
|
+
* (never plain text passed through as markup), with the raw text in `text`. Absent for
|
|
78
|
+
* `"unprotected"` (the caller should keep using the server's own sanitized `/content` body) and for an
|
|
79
|
+
* encrypted message this device couldn't open (see `decryptError`). */
|
|
80
|
+
html?: string;
|
|
81
|
+
/** The raw plain text, present only when the recovered body was `text/plain` (not `text/html`). */
|
|
82
|
+
text?: string;
|
|
83
|
+
/** `true` when `evaluateMessageSecurity()` was given a `readerAddress` and recovered protected `To`/`Cc`
|
|
84
|
+
* headers that don't include it - e.g. a genuinely signed message re-sent verbatim to someone it was
|
|
85
|
+
* never addressed to. Informational, orthogonal to `state` (a Bcc recipient legitimately sees this
|
|
86
|
+
* too), so a UI can say "this message wasn't addressed to you" next to an otherwise valid signature.
|
|
87
|
+
* `undefined` when no reader address was given or nothing protected was recovered. */
|
|
88
|
+
notAddressedToReader?: boolean;
|
|
89
|
+
/** Present only for `"signature_failed"`: which verification step failed. */
|
|
90
|
+
signatureFailureReason?: SignatureFailureReason;
|
|
91
|
+
/** Present only when the message was encrypted but this device couldn't decrypt it (a wrong or
|
|
92
|
+
* since-rotated key, non-AEAD content encryption, or corrupt/foreign data) - the caller should keep
|
|
93
|
+
* showing whatever `GET /:id/content` already produced alongside this explanation. */
|
|
94
|
+
decryptError?: string;
|
|
95
|
+
/** See `ParsedEncryptedMessage.headerTamperDetected`'s own doc comment - a deliberately separate,
|
|
96
|
+
* orthogonal signal from `state`, since RFC 9788's `HP-Outer` is written on every encrypted message
|
|
97
|
+
* regardless of whether it's also signed. `undefined` for anything that isn't an encrypted message
|
|
98
|
+
* this device could decrypt. */
|
|
99
|
+
headerTamperDetected?: boolean;
|
|
100
|
+
/** The real subject recovered from the message's protected headers - RFC 9788 header protection
|
|
101
|
+
* obscures the outer envelope's own `Subject` to `"[...]"`. Populated only when content was actually
|
|
102
|
+
* recovered and it carried a protected Subject. */
|
|
103
|
+
subject?: string;
|
|
104
|
+
/** Every protected header recovered from inside the signed/decrypted entity - present only when that entity
|
|
105
|
+
* carries RFC 9788 protected headers (a protected `From`). Absent for a legacy S/MIME sender's signed-only
|
|
106
|
+
* message: its outer Subject/To/Cc were then never signed, and a UI should not present them as verified. */
|
|
107
|
+
protectedHeaders?: MessageProtectedHeaders;
|
|
108
|
+
/** The attachments inside the verified/decrypted entity - for a signed-only message the only attachments the
|
|
109
|
+
* signature covers, so a UI showing a verified badge should list these rather than the server's attachment
|
|
110
|
+
* records (which include anything outside the signed part). Present whenever content was recovered. */
|
|
111
|
+
attachments?: MimeAttachment[];
|
|
112
|
+
/** SHA-256 fingerprint (hex) of the certificate that produced a cryptographically valid signature - present
|
|
113
|
+
* for `"signed_verified"`, `"encrypted_verified"`, the `*_unverified_signer` states and a `"signature_failed"`
|
|
114
|
+
* whose signature itself was valid. Compare against / pin as a `PublicKey.fingerprint`. */
|
|
115
|
+
signerFingerprint?: string;
|
|
116
|
+
/** The email addresses that signer certificate asserts (lowercased), alongside `signerFingerprint`. */
|
|
117
|
+
signerEmails?: string[];
|
|
118
|
+
/** Base64 DER of the certificate that verified the signature - what `keyvaultApi.ts`'s `trustSigner()` pins for
|
|
119
|
+
* a "trust this signer" action. Present alongside `signerFingerprint` for `"signed_verified"`,
|
|
120
|
+
* `"encrypted_verified"`, the `*_unverified_signer` states, and `"signature_failed"` with reason
|
|
121
|
+
* `"signer_key_changed"` (for a key-changed comparison and `resolveKeyConflict()`'s `certificate`). Never for any
|
|
122
|
+
* other `"signature_failed"`, even when its signature itself was valid (a failed binding is not something to offer
|
|
123
|
+
* trusting). */
|
|
124
|
+
signerCertificate?: string;
|
|
125
|
+
/** Only from `evaluateMessageSecurityWithSeal()`: a seal for a live `"signed_verified"`/`"encrypted_verified"` result
|
|
126
|
+
* when no stored seal opens under the current master key generation, or the stored seal is from an older generation.
|
|
127
|
+
* Persist it best effort with `mailApi.ts`'s `setMessageVerificationSeal(messageUid, sealToWrite.seal,
|
|
128
|
+
* sealToWrite.masterKeyGeneration)` (a `VerificationSealConflictError` means the server kept the stored seal - ignore
|
|
129
|
+
* it). */
|
|
130
|
+
sealToWrite?: SealToWrite;
|
|
131
|
+
/** For `"verified_at_first_open"`: when the sealed verification happened (epoch ms). */
|
|
132
|
+
verifiedAt?: number;
|
|
133
|
+
/** For `"verified_at_first_open"`: the verified state the seal recorded. */
|
|
134
|
+
sealedState?: SealedVerificationState;
|
|
135
|
+
/** For `"verified_at_first_open"`: the live state the seal overrode (`"signature_failed"` or `*_unverified_signer`). */
|
|
136
|
+
liveState?: MessageSecurityState;
|
|
137
|
+
/** For `"verified_at_first_open"` over a live `"signature_failed"`: its reason (always `"signer_key_changed"`). */
|
|
138
|
+
liveSignatureFailureReason?: SignatureFailureReason;
|
|
139
|
+
/** For `"verified_at_first_open"`: `true` when the caller's `signerKeys` show the signer key is now revoked as
|
|
140
|
+
* compromised (or revoked with no reason) - the seal proves it verified then, not that the key was safe then. */
|
|
141
|
+
laterCompromised?: boolean;
|
|
142
|
+
}
|
|
143
|
+
/** A seal for the caller to store, with the master key generation it was written under. */
|
|
144
|
+
export interface SealToWrite {
|
|
145
|
+
seal: string;
|
|
146
|
+
masterKeyGeneration: number;
|
|
147
|
+
}
|
|
148
|
+
export interface SignerBindingInput {
|
|
149
|
+
/** The certificate matched to the verified SignerInfo; `undefined` fails closed. */
|
|
150
|
+
signerCertificateDer: Uint8Array | undefined;
|
|
151
|
+
/** Headers recovered from inside the signed content (RFC 9788), if any. */
|
|
152
|
+
protectedHeaders: (Pick<ProtectedHeaders, "from" | "to"> & Partial<Pick<ProtectedHeaders, "cc" | "subject">>) | undefined;
|
|
153
|
+
/** The received message's outer header map (lowercased names), as `parseMimeEntity()` returns it. */
|
|
154
|
+
outerHeaders: Record<string, string>;
|
|
155
|
+
/** Every outer header field in order (`parseMimeEntity()`'s `fields`) - checked for repeated
|
|
156
|
+
* `From`/`To`/`Cc`/`Sender`. Omitted, only the first-occurrence map above is available. */
|
|
157
|
+
outerFields?: MimeHeaderField[];
|
|
158
|
+
/** Every protected header field in order - checked for repeats the same way. */
|
|
159
|
+
protectedFields?: MimeHeaderField[];
|
|
160
|
+
/** One trusted fingerprint or several (any match is accepted). An empty array counts as none supplied. */
|
|
161
|
+
pinnedSignerFingerprint?: string | string[];
|
|
162
|
+
/** Also require the protected `Subject` (when protected headers are present) to equal the outer one - right for
|
|
163
|
+
* a signed-only (`hp="clear"`) message, wrong for an encrypted one whose outer Subject is obscured. */
|
|
164
|
+
compareSubject?: boolean;
|
|
165
|
+
}
|
|
166
|
+
/** Checks 2-4 from this module's doc comment for an already cryptographically verified signature.
|
|
167
|
+
* Returns `undefined` when the signer is accepted, otherwise the failure reason. A pin mismatch is
|
|
168
|
+
* `"signer_key_changed"` when checks 3 and 4 pass for the certificate, and `"untrusted_signer"` when they don't (or no
|
|
169
|
+
* certificate was resolved).
|
|
170
|
+
*
|
|
171
|
+
* With no `pinnedSignerFingerprint` (or an empty array), check 2 is skipped and `undefined` means only that the
|
|
172
|
+
* certificate names the sender consistently - NOT that the signer is trusted. Use `evaluateMessageSecurity()`
|
|
173
|
+
* (which reports that case as `*_unverified_signer`) unless you enforce a pin yourself. */
|
|
174
|
+
export declare function checkSignerBinding(input: SignerBindingInput): Promise<SignatureFailureReason | undefined>;
|
|
175
|
+
/**
|
|
176
|
+
* Evaluates one received message's raw MIME source (see `mailApi.ts`'s `getMessageRawContent()`) into
|
|
177
|
+
* a security state + recovered plaintext. Never throws — a parse failure, wrong key, or unrecognized
|
|
178
|
+
* content type all degrade to a result the caller can render directly.
|
|
179
|
+
*
|
|
180
|
+
* `pinnedSignerFingerprints` - the sender's trusted signing-key fingerprint(s): `signingKeyFingerprints()` of the
|
|
181
|
+
* sender's `Contact.keys` and `Contact.previousKeys` (see `contactsApi.ts`'s `fetchPinnedSigningFingerprints()`). A
|
|
182
|
+
* supplied pin that the signer doesn't match is `signer_key_changed` or `untrusted_signer`. The unlocked mailbox's own
|
|
183
|
+
* `signingFingerprint` is always trusted too (mail this mailbox signed itself). Omitted or empty, a valid signature
|
|
184
|
+
* from any other certificate is `*_unverified_signer`, never verified. `readerAddress` - the unlocked mailbox's own
|
|
185
|
+
* address - enables `notAddressedToReader`.
|
|
186
|
+
*
|
|
187
|
+
* An encrypted message is decrypted with `unlocked`'s active encryption key or any of its `retainedEncryptionKeys` (the
|
|
188
|
+
* older keys a rotation replaced - see `keySession.ts`), matched by recipient identifier first.
|
|
189
|
+
*/
|
|
190
|
+
export declare function evaluateMessageSecurity(rawMime: string, unlocked: MessageSecurityKeys | undefined, pinnedSignerFingerprints?: string | string[], readerAddress?: string): Promise<MessageSecurityResult>;
|
|
191
|
+
/** The keys `evaluateMessageSecurity()` reads from an unlocked session (`keySession.ts`'s `UnlockedKeys`). */
|
|
192
|
+
export interface MessageSecurityKeys {
|
|
193
|
+
encryptionPrivateKey?: CryptoKey;
|
|
194
|
+
encryptionCertDer?: Uint8Array;
|
|
195
|
+
retainedEncryptionKeys?: {
|
|
196
|
+
certDer: Uint8Array;
|
|
197
|
+
privateKey: CryptoKey;
|
|
198
|
+
}[];
|
|
199
|
+
signingFingerprint?: string;
|
|
200
|
+
}
|
|
201
|
+
/** Options for `evaluateMessageSecurityWithSeal()`. */
|
|
202
|
+
export interface VerificationSealOptions {
|
|
203
|
+
mailboxUid: string;
|
|
204
|
+
messageUid: string;
|
|
205
|
+
/** The message's stored `Message.verificationSeal`, if any. */
|
|
206
|
+
seal?: string;
|
|
207
|
+
/** The vault's current `KeyVault.masterKeyGeneration` (`0` when it reports none): the generation a stored seal must
|
|
208
|
+
* carry to be honoured, and the one a new `sealToWrite` is written under. */
|
|
209
|
+
masterKeyGeneration: number;
|
|
210
|
+
/** The message's stored `Message.verificationSealGeneration`, if any. When it is older than `masterKeyGeneration`, a
|
|
211
|
+
* live verified message is re-sealed (after a `rekey()`). */
|
|
212
|
+
sealGeneration?: number;
|
|
213
|
+
/** The signer's key records the caller knows about, to tell whether the sealed signer key has since been revoked as
|
|
214
|
+
* compromised: e.g. `[...state.pinned, ...state.previous]` from `contactsApi.ts`'s `fetchSignerKeyState()` for the
|
|
215
|
+
* sender, plus the mailbox's own `keys` for mail from its own address. A record whose fingerprint equals the signer's
|
|
216
|
+
* and fails `isTrustedForVerification()` sets `laterCompromised`. Omitted, `laterCompromised` is never set. */
|
|
217
|
+
signerKeys?: readonly PublicKey[];
|
|
218
|
+
/** The `verifiedAt` recorded in a new `sealToWrite`. Defaults to `Date.now()`. */
|
|
219
|
+
now?: number;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* `evaluateMessageSecurity()` with verification seals (`verificationSeal.ts`). The live evaluation always runs first,
|
|
223
|
+
* with the same arguments; then:
|
|
224
|
+
*
|
|
225
|
+
* **Live verified** (`"signed_verified"`/`"encrypted_verified"`, no HP-Outer tampering), and either no seal opens for this
|
|
226
|
+
* mailbox, message, raw MIME and `options.masterKeyGeneration`, or `options.sealGeneration` is older than
|
|
227
|
+
* `options.masterKeyGeneration`: the result gains `sealToWrite` (`{ seal, masterKeyGeneration }`), sealing the live
|
|
228
|
+
* `signerFingerprint` and state at `options.now` under the current generation. The caller persists it best effort
|
|
229
|
+
* (`setMessageVerificationSeal()`). This is how messages are re-sealed, lazily, after a `rekey()`: seals are never
|
|
230
|
+
* carried across a master key rotation (see `verificationSeal.ts`).
|
|
231
|
+
*
|
|
232
|
+
* **Live failure caused only by key status** (`signer_key_changed`, `signed_unverified_signer`,
|
|
233
|
+
* `encrypted_unverified_signer` - which also covers a signer key since revoked, since `signingKeyFingerprints()` drops
|
|
234
|
+
* such pins): when the seal opens, its `signerFingerprint` equals the live one and its state matches the message kind
|
|
235
|
+
* (signed-only vs. encrypted), the result is `"verified_at_first_open"` with `verifiedAt`, `sealedState`,
|
|
236
|
+
* `signerFingerprint`, the recovered content (for a signed-only `signer_key_changed` message too), `liveState`,
|
|
237
|
+
* `liveSignatureFailureReason` and `laterCompromised` (see `VerificationSealOptions.signerKeys`).
|
|
238
|
+
* `signatureFailureReason` is dropped.
|
|
239
|
+
*
|
|
240
|
+
* **Everything else** returns the live result unchanged: an invalid signature, identity or header mismatch,
|
|
241
|
+
* `untrusted_signer`, HP-Outer tampering, a seal whose MAC fails or whose hash, uids, generation or signer fingerprint differ, and
|
|
242
|
+
* every unsigned state.
|
|
243
|
+
*
|
|
244
|
+
* With `unlocked` undefined (no master key) the seal is ignored and no seal is built. Throws `KeysLockedError` when
|
|
245
|
+
* `unlocked` was destroyed (`keySession.ts`), before evaluating anything, or if it is destroyed while sealing; otherwise
|
|
246
|
+
* never throws - a seal that can't be built (e.g. uids too long for the size limit) just leaves `sealToWrite` unset.
|
|
247
|
+
*/
|
|
248
|
+
export declare function evaluateMessageSecurityWithSeal(rawMime: string, unlocked: (MessageSecurityKeys & SealKeyMaterial) | undefined, pinnedSignerFingerprints: string | string[] | undefined, readerAddress: string | undefined, options: VerificationSealOptions): Promise<MessageSecurityResult>;
|