@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,73 @@
|
|
|
1
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
// Copyright (C) 2026 Jean-Philippe Steinmetz
|
|
3
|
+
// SPDX-License-Identifier: MPL-2.0
|
|
4
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
5
|
+
/**
|
|
6
|
+
* The "password" unlock method from `specs/end-to-end_encryption.md`'s "Master Key Wrapping": derives a
|
|
7
|
+
* single Argon2id output from the user's password, then HKDF-splits it into two independent values so
|
|
8
|
+
* the plaintext password (and the Argon2id output itself) never has to be transmitted or reused for two
|
|
9
|
+
* purposes — an authentication proof and a device-only wrapping key.
|
|
10
|
+
*
|
|
11
|
+
* `wrappingKey` is used with `masterKey.ts`'s `sealWithKey`/`openWithKey` to wrap/unwrap MK, and is never
|
|
12
|
+
* sent anywhere. `authProof` is derived for a future server-side "does this look like the right password"
|
|
13
|
+
* online-guess-rate-limiting check (distinct from `wrappingKey`, so the server can never derive the
|
|
14
|
+
* wrapping key even if it learns the proof) — no such verification endpoint exists in `@rapidmx/restapi`
|
|
15
|
+
* yet, so today only `wrappingKey` is actually consumed; `authProof` is produced now so the wire format
|
|
16
|
+
* (`kdf` string on `MasterKeyWrap`) doesn't need to change when that endpoint is added.
|
|
17
|
+
*/
|
|
18
|
+
import { toBase64 } from "./encoding.js";
|
|
19
|
+
import { hkdfDerive } from "./masterKey.js";
|
|
20
|
+
/** Matches the `kdf` string format `MasterKeyWrap.kdf` documents (`argon2id:m=65536,t=3,p=4`) — OWASP's
|
|
21
|
+
* current recommended minimum for Argon2id (m=19MiB is the OWASP floor; this is deliberately higher,
|
|
22
|
+
* matching the doc comment on `EncryptionCertificateAuthority`'s own conservative defaults elsewhere in
|
|
23
|
+
* this system). */
|
|
24
|
+
export const DEFAULT_ARGON2ID_PARAMS = { memorySize: 65536, iterations: 3, parallelism: 4 };
|
|
25
|
+
const ARGON2ID_HASH_LENGTH_BYTES = 32;
|
|
26
|
+
/** Builds the `kdf` string stored alongside a password-method `MasterKeyWrap`, so parameters can be
|
|
27
|
+
* upgraded over time without breaking existing accounts (each wrap records the parameters it was
|
|
28
|
+
* actually created with). */
|
|
29
|
+
export function argon2idKdfLabel(params) {
|
|
30
|
+
return `argon2id:m=${params.memorySize},t=${params.iterations},p=${params.parallelism}`;
|
|
31
|
+
}
|
|
32
|
+
/** Inverse of `argon2idKdfLabel()` — reads back the exact parameters a `MasterKeyWrap.kdf` string was
|
|
33
|
+
* created with, so unlocking always re-derives with the *original* parameters even if
|
|
34
|
+
* `DEFAULT_ARGON2ID_PARAMS` has since changed (the spec's own "KDF parameters ... MUST be stored
|
|
35
|
+
* alongside each wrap, so costs can be raised over time without breaking existing accounts"). Returns
|
|
36
|
+
* `undefined` for anything that isn't a well-formed `argon2id:m=...,t=...,p=...` label — including a
|
|
37
|
+
* different KDF entirely (e.g. recovery codes' own `"hkdf-sha256"` label), which callers must not
|
|
38
|
+
* attempt to unlock as if it were password-derived.
|
|
39
|
+
*/
|
|
40
|
+
export function parseArgon2idKdfLabel(label) {
|
|
41
|
+
const match = /^argon2id:m=(\d+),t=(\d+),p=(\d+)$/.exec(label);
|
|
42
|
+
if (!match) {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
return { memorySize: Number(match[1]), iterations: Number(match[2]), parallelism: Number(match[3]) };
|
|
46
|
+
}
|
|
47
|
+
/** A fresh random salt for a new password enrollment. 16 bytes is Argon2id's own recommended minimum. */
|
|
48
|
+
export function generateSalt(lengthBytes = 16) {
|
|
49
|
+
return crypto.getRandomValues(new Uint8Array(lengthBytes));
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Runs Argon2id once against `password`/`salt`, then HKDF-splits the result into `authProof` and
|
|
53
|
+
* `wrappingKey` (see this module's doc comment for why two independent values, not one reused for both
|
|
54
|
+
* purposes). The plaintext password itself never leaves this function.
|
|
55
|
+
*/
|
|
56
|
+
export async function deriveFromPassword(password, salt, params = DEFAULT_ARGON2ID_PARAMS) {
|
|
57
|
+
// Loaded on first use: `hash-wasm` carries the Argon2 WebAssembly and is only needed once a password is derived.
|
|
58
|
+
const { argon2id } = await import("hash-wasm");
|
|
59
|
+
const argonOutput = await argon2id({
|
|
60
|
+
password,
|
|
61
|
+
salt,
|
|
62
|
+
memorySize: params.memorySize,
|
|
63
|
+
iterations: params.iterations,
|
|
64
|
+
parallelism: params.parallelism,
|
|
65
|
+
hashLength: ARGON2ID_HASH_LENGTH_BYTES,
|
|
66
|
+
outputType: "binary",
|
|
67
|
+
});
|
|
68
|
+
const [authProofBytes, wrappingKey] = await Promise.all([
|
|
69
|
+
hkdfDerive(argonOutput, salt, "auth-proof"),
|
|
70
|
+
hkdfDerive(argonOutput, salt, "wrap"),
|
|
71
|
+
]);
|
|
72
|
+
return { authProof: toBase64(authProofBytes), wrappingKey };
|
|
73
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/** KDF label for a recovery-code wrap - there's no Argon2id step for these (the code itself is already
|
|
2
|
+
* high-entropy), just a direct HKDF derivation. Re-exported from `masterKeyWraps.ts`, which writes it; defined here
|
|
3
|
+
* so `keySession.ts` can read it without importing `masterKeyWraps.ts` (which imports `keySession.ts`). */
|
|
4
|
+
export declare const RECOVERY_KDF_LABEL = "hkdf-sha256";
|
|
5
|
+
/** Exported for direct unit testing of the padding/remainder-bits path — `generateRecoveryCode()` always
|
|
6
|
+
* calls this with a fixed 20-byte input (160 bits), which happens to divide evenly into 5-bit groups
|
|
7
|
+
* with no remainder, so that path is otherwise unreachable through the public recovery-code API alone. */
|
|
8
|
+
export declare function base32Encode(bytes: Uint8Array): string;
|
|
9
|
+
/** Generates one recovery code, e.g. `"XQ4M-8K2P-7RTN-JY3H-VC9D-WA6F-2E5S"`. Callers should generate
|
|
10
|
+
* several (the spec: "a set of ... codes") and display them once, with explicit user confirmation that
|
|
11
|
+
* they've been saved — losing every unlock method makes the mailbox's encrypted content permanently
|
|
12
|
+
* unreadable (see the spec's "Recovery" section). */
|
|
13
|
+
export declare function generateRecoveryCode(): string;
|
|
14
|
+
/**
|
|
15
|
+
* Canonicalizes user-typed recovery code input into the exact form `generateRecoveryCode()` emits (and
|
|
16
|
+
* therefore the exact string `buildRecoveryWraps()` hashed at enrolment): every whitespace character and
|
|
17
|
+
* dash is stripped, letters are uppercased, Crockford's own decode aliases are applied (`O` → `0`, `I`/`L`
|
|
18
|
+
* → `1` — none of which the generation alphabet ever emits, so a generated code is unchanged by this
|
|
19
|
+
* mapping), and the result is re-grouped into dash-separated `GROUP_SIZE` blocks. The re-grouping is
|
|
20
|
+
* load-bearing, not cosmetic: the dashes were always part of the HKDF input, so stripping them without
|
|
21
|
+
* re-inserting them in the canonical grouping would derive a different key than every existing wrap.
|
|
22
|
+
*/
|
|
23
|
+
export declare function normalizeRecoveryCode(code: string): string;
|
|
24
|
+
/** Derives the wrapping key for one recovery code. `salt` is per-wrap, generated at enrolment and stored
|
|
25
|
+
* alongside the resulting `MasterKeyWrap` (never secret — HKDF's salt need not be). `code` is normalized
|
|
26
|
+
* first (see `normalizeRecoveryCode()`), so lowercase, spacing/dash variations, and O/I/L transcription
|
|
27
|
+
* slips all derive the same key as the code exactly as displayed. */
|
|
28
|
+
export declare function deriveFromRecoveryCode(code: string, salt: Uint8Array): Promise<Uint8Array>;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
// Copyright (C) 2026 Jean-Philippe Steinmetz
|
|
3
|
+
// SPDX-License-Identifier: MPL-2.0
|
|
4
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
5
|
+
/**
|
|
6
|
+
* The "recovery codes" unlock method from `specs/end-to-end_encryption.md`'s "Master Key Wrapping": a
|
|
7
|
+
* set of high-entropy, single-use codes generated client-side and displayed to the user once, at
|
|
8
|
+
* enrolment. Unlike the password method (see `passwordUnlock.ts`), there is no separate auth-proof split
|
|
9
|
+
* — the spec's own wrapping pseudocode derives the wrapping key directly: `wrap_recovery =
|
|
10
|
+
* AEAD(HKDF(recovery_code, salt), MK)`.
|
|
11
|
+
*/
|
|
12
|
+
import { hkdfDerive } from "./masterKey.js";
|
|
13
|
+
/** KDF label for a recovery-code wrap - there's no Argon2id step for these (the code itself is already
|
|
14
|
+
* high-entropy), just a direct HKDF derivation. Re-exported from `masterKeyWraps.ts`, which writes it; defined here
|
|
15
|
+
* so `keySession.ts` can read it without importing `masterKeyWraps.ts` (which imports `keySession.ts`). */
|
|
16
|
+
export const RECOVERY_KDF_LABEL = "hkdf-sha256";
|
|
17
|
+
/** Crockford base32 alphabet — excludes I/L/O/U to avoid transcription ambiguity with 1/0/V, the same
|
|
18
|
+
* reasoning as TOTP/backup-code schemes elsewhere. */
|
|
19
|
+
const CROCKFORD_ALPHABET = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
|
|
20
|
+
/** 20 random bytes (160 bits) — well above the ~20-bit entropy the spec explicitly calls TOTP out for
|
|
21
|
+
* being too weak (`specs/end-to-end_encryption.md`: "A 6-digit code additionally carries only ~20 bits
|
|
22
|
+
* of entropy"). Encoded as Crockford base32 and grouped into 4-character blocks for transcription. */
|
|
23
|
+
const RECOVERY_CODE_ENTROPY_BYTES = 20;
|
|
24
|
+
const GROUP_SIZE = 4;
|
|
25
|
+
/** Exported for direct unit testing of the padding/remainder-bits path — `generateRecoveryCode()` always
|
|
26
|
+
* calls this with a fixed 20-byte input (160 bits), which happens to divide evenly into 5-bit groups
|
|
27
|
+
* with no remainder, so that path is otherwise unreachable through the public recovery-code API alone. */
|
|
28
|
+
export function base32Encode(bytes) {
|
|
29
|
+
let bits = 0;
|
|
30
|
+
let value = 0;
|
|
31
|
+
let output = "";
|
|
32
|
+
for (const byte of bytes) {
|
|
33
|
+
value = (value << 8) | byte;
|
|
34
|
+
bits += 8;
|
|
35
|
+
while (bits >= 5) {
|
|
36
|
+
output += CROCKFORD_ALPHABET[(value >>> (bits - 5)) & 0x1f];
|
|
37
|
+
bits -= 5;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (bits > 0) {
|
|
41
|
+
output += CROCKFORD_ALPHABET[(value << (5 - bits)) & 0x1f];
|
|
42
|
+
}
|
|
43
|
+
return output;
|
|
44
|
+
}
|
|
45
|
+
/** Generates one recovery code, e.g. `"XQ4M-8K2P-7RTN-JY3H-VC9D-WA6F-2E5S"`. Callers should generate
|
|
46
|
+
* several (the spec: "a set of ... codes") and display them once, with explicit user confirmation that
|
|
47
|
+
* they've been saved — losing every unlock method makes the mailbox's encrypted content permanently
|
|
48
|
+
* unreadable (see the spec's "Recovery" section). */
|
|
49
|
+
export function generateRecoveryCode() {
|
|
50
|
+
const bytes = crypto.getRandomValues(new Uint8Array(RECOVERY_CODE_ENTROPY_BYTES));
|
|
51
|
+
const encoded = base32Encode(bytes);
|
|
52
|
+
const groups = [];
|
|
53
|
+
for (let i = 0; i < encoded.length; i += GROUP_SIZE) {
|
|
54
|
+
groups.push(encoded.slice(i, i + GROUP_SIZE));
|
|
55
|
+
}
|
|
56
|
+
return groups.join("-");
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Canonicalizes user-typed recovery code input into the exact form `generateRecoveryCode()` emits (and
|
|
60
|
+
* therefore the exact string `buildRecoveryWraps()` hashed at enrolment): every whitespace character and
|
|
61
|
+
* dash is stripped, letters are uppercased, Crockford's own decode aliases are applied (`O` → `0`, `I`/`L`
|
|
62
|
+
* → `1` — none of which the generation alphabet ever emits, so a generated code is unchanged by this
|
|
63
|
+
* mapping), and the result is re-grouped into dash-separated `GROUP_SIZE` blocks. The re-grouping is
|
|
64
|
+
* load-bearing, not cosmetic: the dashes were always part of the HKDF input, so stripping them without
|
|
65
|
+
* re-inserting them in the canonical grouping would derive a different key than every existing wrap.
|
|
66
|
+
*/
|
|
67
|
+
export function normalizeRecoveryCode(code) {
|
|
68
|
+
const compact = code
|
|
69
|
+
.replace(/[\s-]+/g, "")
|
|
70
|
+
.toUpperCase()
|
|
71
|
+
.replace(/O/g, "0")
|
|
72
|
+
.replace(/[IL]/g, "1");
|
|
73
|
+
const groups = [];
|
|
74
|
+
for (let i = 0; i < compact.length; i += GROUP_SIZE) {
|
|
75
|
+
groups.push(compact.slice(i, i + GROUP_SIZE));
|
|
76
|
+
}
|
|
77
|
+
return groups.join("-");
|
|
78
|
+
}
|
|
79
|
+
/** Derives the wrapping key for one recovery code. `salt` is per-wrap, generated at enrolment and stored
|
|
80
|
+
* alongside the resulting `MasterKeyWrap` (never secret — HKDF's salt need not be). `code` is normalized
|
|
81
|
+
* first (see `normalizeRecoveryCode()`), so lowercase, spacing/dash variations, and O/I/L transcription
|
|
82
|
+
* slips all derive the same key as the code exactly as displayed. */
|
|
83
|
+
export async function deriveFromRecoveryCode(code, salt) {
|
|
84
|
+
const ikm = new TextEncoder().encode(normalizeRecoveryCode(code));
|
|
85
|
+
return hkdfDerive(ikm, salt, "wrap");
|
|
86
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed wrappers over `@rapidmx/restapi`'s signing-certificate backend endpoints:
|
|
3
|
+
*
|
|
4
|
+
* - `getSigningEnrollmentInfo()` — `GET /system/signing-enrollment` (any signed-in user): which backend issues
|
|
5
|
+
* signing certificates in this deployment (`manual`, `rfc8823` or `none`), whether it's automatic, the
|
|
6
|
+
* certificate authority's host, a typical duration, whether an administrator can upload a certificate by hand,
|
|
7
|
+
* and how the background job's last contacts with the CA went. `@rapidmx/web-client`'s Encryption settings page
|
|
8
|
+
* uses this to word a request's status truthfully instead of assuming automatic issuance.
|
|
9
|
+
* - The administrator functions — `BaseSigningEnrollmentAdminRoute` (mounted at `admin/signing-enrollments`,
|
|
10
|
+
* trusted role AND an elevated token): list pending requests, download a request's CSR, upload the certificate a
|
|
11
|
+
* CA issued, or reject a request with a reason its owner sees. This is the manual-issuance workflow, and an
|
|
12
|
+
* escape hatch to inspect an automatic (`rfc8823`) request that has stalled.
|
|
13
|
+
*/
|
|
14
|
+
import { ApiClient } from "../util/api.js";
|
|
15
|
+
/** Mirrors `@rapidmx/restapi`'s `SigningProviderKind`. */
|
|
16
|
+
export type SigningProviderKind = "manual" | "rfc8823";
|
|
17
|
+
/** Mirrors `@rapidmx/restapi`'s `SigningBackendKind`. */
|
|
18
|
+
export type SigningBackendKind = SigningProviderKind | "none";
|
|
19
|
+
/** The code a stale enrollment id (left over from a backend this deployment no longer runs) answers with - a client
|
|
20
|
+
* that sees this on a status check or a "check now" should clear the id and let the user request again. */
|
|
21
|
+
export declare const SIGNING_ENROLLMENT_UNKNOWN = "signing-enrollment-unknown";
|
|
22
|
+
/** How the background job's last contacts with the certificate authority went. Absent fields mean "never contacted yet". */
|
|
23
|
+
export interface SigningEnrollmentHealth {
|
|
24
|
+
ok: boolean;
|
|
25
|
+
checkedAt?: string;
|
|
26
|
+
lastSuccessAt?: string;
|
|
27
|
+
/** Sanitized (no URLs, tokens or key material) and length-capped - safe to show as-is. */
|
|
28
|
+
lastError?: string;
|
|
29
|
+
}
|
|
30
|
+
/** Mirrors `@rapidmx/restapi`'s `SigningBackendInfo` - what `GET /system/signing-enrollment` answers. */
|
|
31
|
+
export interface SigningEnrollmentInfo {
|
|
32
|
+
backend: SigningBackendKind;
|
|
33
|
+
automatic: boolean;
|
|
34
|
+
ca?: {
|
|
35
|
+
host: string;
|
|
36
|
+
};
|
|
37
|
+
contactEmail?: string;
|
|
38
|
+
typicalDurationMinutes?: number;
|
|
39
|
+
adminUpload: boolean;
|
|
40
|
+
health?: SigningEnrollmentHealth;
|
|
41
|
+
}
|
|
42
|
+
/** Mirrors `@rapidmx/restapi`'s `AdminEnrollmentSummary` - one row of `GET /admin/signing-enrollments`. Never a CSR, key or certificate. */
|
|
43
|
+
export interface AdminSigningEnrollment {
|
|
44
|
+
enrollmentId: string;
|
|
45
|
+
identity: string;
|
|
46
|
+
mailboxUid?: string;
|
|
47
|
+
requestedAt: string;
|
|
48
|
+
status: "pending" | "issued" | "failed";
|
|
49
|
+
provider: SigningProviderKind;
|
|
50
|
+
stage?: string;
|
|
51
|
+
lastError?: string;
|
|
52
|
+
/** Whether an administrator can upload a certificate for this request right now. */
|
|
53
|
+
canUpload: boolean;
|
|
54
|
+
/** When `canUpload` is `false`: why (e.g. the automatic provider issues this one itself, or it predates the mailbox's key being kept with it). */
|
|
55
|
+
uploadBlockedReason?: string;
|
|
56
|
+
}
|
|
57
|
+
/** What `POST /admin/signing-enrollments/:id/certificate` answers once the upload is accepted. */
|
|
58
|
+
export interface CertificateUploadResult {
|
|
59
|
+
enrollmentId: string;
|
|
60
|
+
identity: string;
|
|
61
|
+
status: "issued";
|
|
62
|
+
chainLength: number;
|
|
63
|
+
subject: string;
|
|
64
|
+
issuer: string;
|
|
65
|
+
serialNumber: string;
|
|
66
|
+
notBefore: string;
|
|
67
|
+
notAfter: string;
|
|
68
|
+
message: string;
|
|
69
|
+
}
|
|
70
|
+
/** What `POST /admin/signing-enrollments/:id/reject` answers. */
|
|
71
|
+
export interface RejectEnrollmentResult {
|
|
72
|
+
enrollmentId: string;
|
|
73
|
+
status: "failed";
|
|
74
|
+
error: string;
|
|
75
|
+
}
|
|
76
|
+
/** `client`, given by every function below that calls the network, is an explicit `ApiClient` from `createApiClient()`
|
|
77
|
+
* (e.g. one account of a multi-account app) to call instead of the default global `apiFetch()` - see `withClient()`'s
|
|
78
|
+
* own doc comment in `util/api.ts`. Omitted (the default), every function here behaves exactly as before. */
|
|
79
|
+
export declare function getSigningEnrollmentInfo(client?: ApiClient): Promise<SigningEnrollmentInfo>;
|
|
80
|
+
/** The pending (and issued-but-not-yet-installed) signing-certificate requests, metadata only. Trusted role + elevated token required server-side. */
|
|
81
|
+
export declare function listSigningEnrollments(client?: ApiClient): Promise<AdminSigningEnrollment[]>;
|
|
82
|
+
/** A plain URL, not a fetch wrapper — the server streams the CSR back as a PEM file with its own `content-disposition:
|
|
83
|
+
* attachment` header, so a caller renders this directly as `<a href={...}>` (the browser's own native download) —
|
|
84
|
+
* same pattern `dataExportApi.ts`'s `exportRequestDownloadUrl()` already establishes. */
|
|
85
|
+
export declare function signingEnrollmentCsrUrl(enrollmentId: string): string;
|
|
86
|
+
/** Uploads the certificate (or PEM chain, leaf first) a certificate authority issued for a request. Refused (400) with a message to act
|
|
87
|
+
* on when it doesn't fit the request (wrong key, not for e-mail, wrong address, expired); (409) when the request can no longer be
|
|
88
|
+
* completed (already issued/failed, or made before its mailbox's key was kept with it). */
|
|
89
|
+
export declare function uploadSigningEnrollmentCertificate(enrollmentId: string, certificate: string, client?: ApiClient): Promise<CertificateUploadResult>;
|
|
90
|
+
/** Refuses a pending request; `reason` is shown to the mailbox's owner. */
|
|
91
|
+
export declare function rejectSigningEnrollment(enrollmentId: string, reason: string, client?: ApiClient): Promise<RejectEnrollmentResult>;
|
|
92
|
+
/** A quick client-side sanity check of pasted/uploaded certificate text before it is sent to the server: at least one PEM certificate
|
|
93
|
+
* block. The server does the real validation (key match, e-mail usage, address, expiry) - this only catches an empty paste or an
|
|
94
|
+
* obviously wrong file (e.g. a private key) before a round trip. */
|
|
95
|
+
export declare function looksLikePemCertificate(text: string): boolean;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
// Copyright (C) 2026 Jean-Philippe Steinmetz
|
|
3
|
+
// SPDX-License-Identifier: MPL-2.0
|
|
4
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
5
|
+
/**
|
|
6
|
+
* Typed wrappers over `@rapidmx/restapi`'s signing-certificate backend endpoints:
|
|
7
|
+
*
|
|
8
|
+
* - `getSigningEnrollmentInfo()` — `GET /system/signing-enrollment` (any signed-in user): which backend issues
|
|
9
|
+
* signing certificates in this deployment (`manual`, `rfc8823` or `none`), whether it's automatic, the
|
|
10
|
+
* certificate authority's host, a typical duration, whether an administrator can upload a certificate by hand,
|
|
11
|
+
* and how the background job's last contacts with the CA went. `@rapidmx/web-client`'s Encryption settings page
|
|
12
|
+
* uses this to word a request's status truthfully instead of assuming automatic issuance.
|
|
13
|
+
* - The administrator functions — `BaseSigningEnrollmentAdminRoute` (mounted at `admin/signing-enrollments`,
|
|
14
|
+
* trusted role AND an elevated token): list pending requests, download a request's CSR, upload the certificate a
|
|
15
|
+
* CA issued, or reject a request with a reason its owner sees. This is the manual-issuance workflow, and an
|
|
16
|
+
* escape hatch to inspect an automatic (`rfc8823`) request that has stalled.
|
|
17
|
+
*/
|
|
18
|
+
import { apiUrl, withClient } from "../util/api.js";
|
|
19
|
+
/** The code a stale enrollment id (left over from a backend this deployment no longer runs) answers with - a client
|
|
20
|
+
* that sees this on a status check or a "check now" should clear the id and let the user request again. */
|
|
21
|
+
export const SIGNING_ENROLLMENT_UNKNOWN = "signing-enrollment-unknown";
|
|
22
|
+
const ADMIN_BASE = "/admin/signing-enrollments";
|
|
23
|
+
/** `client`, given by every function below that calls the network, is an explicit `ApiClient` from `createApiClient()`
|
|
24
|
+
* (e.g. one account of a multi-account app) to call instead of the default global `apiFetch()` - see `withClient()`'s
|
|
25
|
+
* own doc comment in `util/api.ts`. Omitted (the default), every function here behaves exactly as before. */
|
|
26
|
+
export function getSigningEnrollmentInfo(client) {
|
|
27
|
+
return withClient(client, `/system/signing-enrollment`);
|
|
28
|
+
}
|
|
29
|
+
/** The pending (and issued-but-not-yet-installed) signing-certificate requests, metadata only. Trusted role + elevated token required server-side. */
|
|
30
|
+
export function listSigningEnrollments(client) {
|
|
31
|
+
return withClient(client, ADMIN_BASE);
|
|
32
|
+
}
|
|
33
|
+
/** A plain URL, not a fetch wrapper — the server streams the CSR back as a PEM file with its own `content-disposition:
|
|
34
|
+
* attachment` header, so a caller renders this directly as `<a href={...}>` (the browser's own native download) —
|
|
35
|
+
* same pattern `dataExportApi.ts`'s `exportRequestDownloadUrl()` already establishes. */
|
|
36
|
+
export function signingEnrollmentCsrUrl(enrollmentId) {
|
|
37
|
+
return apiUrl(`${ADMIN_BASE}/${encodeURIComponent(enrollmentId)}/csr`);
|
|
38
|
+
}
|
|
39
|
+
/** Uploads the certificate (or PEM chain, leaf first) a certificate authority issued for a request. Refused (400) with a message to act
|
|
40
|
+
* on when it doesn't fit the request (wrong key, not for e-mail, wrong address, expired); (409) when the request can no longer be
|
|
41
|
+
* completed (already issued/failed, or made before its mailbox's key was kept with it). */
|
|
42
|
+
export function uploadSigningEnrollmentCertificate(enrollmentId, certificate, client) {
|
|
43
|
+
return withClient(client, `${ADMIN_BASE}/${encodeURIComponent(enrollmentId)}/certificate`, {
|
|
44
|
+
method: "POST",
|
|
45
|
+
body: JSON.stringify({ certificate }),
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/** Refuses a pending request; `reason` is shown to the mailbox's owner. */
|
|
49
|
+
export function rejectSigningEnrollment(enrollmentId, reason, client) {
|
|
50
|
+
return withClient(client, `${ADMIN_BASE}/${encodeURIComponent(enrollmentId)}/reject`, {
|
|
51
|
+
method: "POST",
|
|
52
|
+
body: JSON.stringify({ reason }),
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
/** A quick client-side sanity check of pasted/uploaded certificate text before it is sent to the server: at least one PEM certificate
|
|
56
|
+
* block. The server does the real validation (key match, e-mail usage, address, expiry) - this only catches an empty paste or an
|
|
57
|
+
* obviously wrong file (e.g. a private key) before a round trip. */
|
|
58
|
+
export function looksLikePemCertificate(text) {
|
|
59
|
+
return /-----BEGIN CERTIFICATE-----[\s\S]+-----END CERTIFICATE-----/.test(text);
|
|
60
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The CMS (S/MIME) engine behind `specs/end-to-end_encryption.md`'s "Message Format" requirement
|
|
3
|
+
* ("RapidMX MUST use S/MIME (CMS) as the on-the-wire message format for both signatures and
|
|
4
|
+
* encryption"). This module operates on raw CMS structures (`SignedData`/`EnvelopedData`) via
|
|
5
|
+
* `pkijs` — the actual MIME assembly (`multipart/signed`, RFC 9788 header protection, the
|
|
6
|
+
* `application/pkcs7-mime` wrapping) is a distinct, mechanical layer built on top of these
|
|
7
|
+
* primitives, not implemented here.
|
|
8
|
+
*
|
|
9
|
+
* Certificates are always the base64-decoded DER bytes — the same wire format
|
|
10
|
+
* `keyvaultApi.ts`'s `PublicKey.publicKey` already uses — never PEM, so this module composes
|
|
11
|
+
* directly with values read from a `Mailbox`/`Contact`'s `keys` array with no reformatting.
|
|
12
|
+
*/
|
|
13
|
+
import "reflect-metadata";
|
|
14
|
+
/**
|
|
15
|
+
* Thrown by `decryptEnvelopedData()` for content encrypted with a non-AEAD algorithm (e.g. AES-CBC, 3DES).
|
|
16
|
+
* Unauthenticated CBC content is malleable - an attacker who can't read the message can still flip
|
|
17
|
+
* plaintext bits or mount EFAIL-style exfiltration gadgets against the decrypted HTML - so it is rejected
|
|
18
|
+
* outright rather than rendered with a weaker indicator.
|
|
19
|
+
*
|
|
20
|
+
* Interop note: many legacy S/MIME clients still send AES-CBC `EnvelopedData`; those messages are
|
|
21
|
+
* undecryptable in RapidMX clients by design. Everything RapidMX itself sends uses AES-256-GCM.
|
|
22
|
+
*/
|
|
23
|
+
export declare class UnsupportedContentEncryptionError extends Error {
|
|
24
|
+
readonly algorithmOid: string;
|
|
25
|
+
constructor(algorithmOid: string);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Builds a detached CMS `SignedData` structure over `content`, per the spec's "Digital Signatures"
|
|
29
|
+
* section — detached, never opaque, so clients that don't understand S/MIME still render the
|
|
30
|
+
* message body. The signer's own certificate is embedded in the `certificates` field (never sent
|
|
31
|
+
* separately — unlike the encryption key, which travels in the `RapidMX-Key` header).
|
|
32
|
+
*/
|
|
33
|
+
export declare function signDetached(content: Uint8Array, signingCertDer: Uint8Array, signingPrivateKey: CryptoKey): Promise<Uint8Array>;
|
|
34
|
+
export interface VerifyResult {
|
|
35
|
+
valid: boolean;
|
|
36
|
+
/** The certificate pkijs matched to the verified SignerInfo's `sid` (never merely the first embedded
|
|
37
|
+
* certificate) - present whenever `valid` is true. Callers
|
|
38
|
+
* compare its fingerprint against the pinned `Contact` key per the spec's Trust Model (TOFU);
|
|
39
|
+
* this function only proves the signature is mathematically valid over `content`, not that the
|
|
40
|
+
* certificate belongs to who the message claims. */
|
|
41
|
+
signerCertificateDer?: Uint8Array;
|
|
42
|
+
}
|
|
43
|
+
/** Verifies a detached CMS signature (as produced by `signDetached()`) against `content`. A parse
|
|
44
|
+
* failure or content-type mismatch is treated as an invalid signature (`valid: false`), not a thrown
|
|
45
|
+
* error - a malformed/foreign CMS blob is exactly the "signature failed" case the spec's Message
|
|
46
|
+
* Security Indicators table requires being able to render. */
|
|
47
|
+
export declare function verifyDetached(content: Uint8Array, signatureDer: Uint8Array): Promise<VerifyResult>;
|
|
48
|
+
/**
|
|
49
|
+
* Extracts every email address a certificate asserts, lowercased: SAN `rfc822Name` entries when the
|
|
50
|
+
* certificate has any (RFC 5280 §4.2.1.6 - SAN is authoritative when present), otherwise the subject's
|
|
51
|
+
* legacy `emailAddress` attributes plus a `CN` that is itself an email address (how this deployment's
|
|
52
|
+
* own self-signed/test certificates and many older CAs name a mailbox). Used by `messageSecurity.ts` to
|
|
53
|
+
* bind a signer certificate to the message's claimed sender. Returns `[]` for unparseable input -
|
|
54
|
+
* including a certificate whose SubjectAlternativeName extension pkijs couldn't parse (no `parsedValue`),
|
|
55
|
+
* which then fails the identity check (`signature_failed`) rather than throwing out of message evaluation.
|
|
56
|
+
*/
|
|
57
|
+
export declare function extractCertificateEmails(certDer: Uint8Array): string[];
|
|
58
|
+
/**
|
|
59
|
+
* Builds an *opaque* (content embedded, not detached) CMS `SignedData` structure over `content`.
|
|
60
|
+
* Used only when the signed message is going to be encrypted immediately afterward (`buildMessage()`
|
|
61
|
+
* in `smimeMessage.ts` composes this with `encryptForRecipients()` for the combined sign-then-encrypt
|
|
62
|
+
* case) — the spec's "Digital Signatures" section requires *detached* signing only "for
|
|
63
|
+
* signature-only messages"; once the whole thing is being encrypted regardless, there is no legacy
|
|
64
|
+
* client ever exposed to this intermediate opaque layer, so embedding the content here (simpler than
|
|
65
|
+
* building a second detached `multipart/signed` entity solely to immediately encrypt it) is
|
|
66
|
+
* conformant, not a shortcut around that requirement.
|
|
67
|
+
*/
|
|
68
|
+
export declare function signOpaque(content: Uint8Array, signingCertDer: Uint8Array, signingPrivateKey: CryptoKey): Promise<Uint8Array>;
|
|
69
|
+
export interface VerifyOpaqueResult extends VerifyResult {
|
|
70
|
+
/** The embedded content, recovered from the SignedData structure - only present when `valid`. */
|
|
71
|
+
content?: Uint8Array;
|
|
72
|
+
}
|
|
73
|
+
/** Verifies an opaque CMS signature (as produced by `signOpaque()`) and recovers its embedded
|
|
74
|
+
* content — unlike `verifyDetached()`, the content isn't supplied separately by the caller, since the
|
|
75
|
+
* whole point of an opaque signature is that it carries its own content. */
|
|
76
|
+
export declare function verifyOpaque(signedDer: Uint8Array): Promise<VerifyOpaqueResult>;
|
|
77
|
+
/**
|
|
78
|
+
* Builds a CMS `EnvelopedData` structure encrypting `content` to every certificate in
|
|
79
|
+
* `recipientCertDers` — per the spec's "Encrypt to Self" requirement, callers MUST include the
|
|
80
|
+
* sender's own encryption certificate in this list alongside the actual recipients' certificates, or
|
|
81
|
+
* the sender's own Sent-folder copy becomes unreadable to them.
|
|
82
|
+
*/
|
|
83
|
+
export declare function encryptForRecipients(content: Uint8Array, recipientCertDers: Uint8Array[]): Promise<Uint8Array>;
|
|
84
|
+
/**
|
|
85
|
+
* Decrypts a CMS `EnvelopedData` structure using one recipient's own certificate/private key.
|
|
86
|
+
* `EnvelopedData` doesn't label which `RecipientInfo` belongs to which recipient in a way this
|
|
87
|
+
* function's own caller already knows in advance, so it tries every recipient slot in turn with the
|
|
88
|
+
* one keypair it has, succeeding on whichever slot was actually built for it and discarding the rest
|
|
89
|
+
* — the same shape as trying every wrapped-key entry in `KeyVault.masterKeyWraps` until one unwraps.
|
|
90
|
+
* A slot whose recipient identifier names this certificate is tried first. See
|
|
91
|
+
* `decryptEnvelopedDataWithKeys()` for several candidate keys.
|
|
92
|
+
*/
|
|
93
|
+
export declare function decryptEnvelopedData(envelopedDer: Uint8Array, recipientCertDer: Uint8Array, recipientPrivateKey: CryptoKey): Promise<Uint8Array>;
|
|
94
|
+
/** One candidate decryption keypair for `decryptEnvelopedDataWithKeys()`. */
|
|
95
|
+
export interface DecryptionKey {
|
|
96
|
+
/** Base64-decoded DER certificate of the key. */
|
|
97
|
+
certDer: Uint8Array;
|
|
98
|
+
privateKey: CryptoKey;
|
|
99
|
+
}
|
|
100
|
+
/** At most this many candidate keys are considered by `decryptEnvelopedDataWithKeys()` (further ones are ignored) - the
|
|
101
|
+
* active encryption key plus `keySession.ts`'s `MAX_RETAINED_ENCRYPTION_KEYS` retained ones. */
|
|
102
|
+
export declare const MAX_DECRYPTION_KEYS = 21;
|
|
103
|
+
/** Trial decryptions (a key tried against a slot whose recipient identifier doesn't name it) allowed for every key
|
|
104
|
+
* after the first, together. The first key keeps the unbounded every-slot trial `decryptEnvelopedData()` always did;
|
|
105
|
+
* this budget stops a message with many recipient slots from costing `slots x keys` ECDH operations. */
|
|
106
|
+
export declare const MAX_TRIAL_DECRYPTIONS = 64;
|
|
107
|
+
/**
|
|
108
|
+
* Decrypts a CMS `EnvelopedData` structure with whichever of several candidate keys it was encrypted to - the mailbox's
|
|
109
|
+
* active encryption key followed by the retained older ones (`keySession.ts`'s `retainedEncryptionKeys`), so mail
|
|
110
|
+
* encrypted to a key since replaced stays readable.
|
|
111
|
+
*
|
|
112
|
+
* **Matching first:** every recipient slot whose identifier (issuer and serial number, or subject key identifier) names
|
|
113
|
+
* a candidate's certificate is tried with that key, in candidate order - normally one decryption, no guessing.
|
|
114
|
+
* **Trial otherwise** (e.g. the sender encrypted to a reissued certificate for the same key): the first candidate is
|
|
115
|
+
* tried against every remaining slot, then the others in order, sharing `MAX_TRIAL_DECRYPTIONS`.
|
|
116
|
+
*
|
|
117
|
+
* Only the first `MAX_DECRYPTION_KEYS` candidates are considered. A candidate whose certificate can't be parsed is
|
|
118
|
+
* skipped (the parse error is thrown only when no candidate is usable). Throws `UnsupportedContentEncryptionError` for
|
|
119
|
+
* non-AEAD content, and the last decryption error when no key opens any slot.
|
|
120
|
+
*/
|
|
121
|
+
export declare function decryptEnvelopedDataWithKeys(envelopedDer: Uint8Array, keys: DecryptionKey[]): Promise<Uint8Array>;
|
|
122
|
+
/** SHA-256 fingerprint of a DER certificate, hex encoded — matches `keyvaultApi.ts`'s own `PublicKey.
|
|
123
|
+
* fingerprint` format exactly, so a value computed here is directly comparable against one already on
|
|
124
|
+
* a `Mailbox`/`Contact` record. Used by `messageSecurity.ts` to compare a received message's embedded
|
|
125
|
+
* signer certificate against a pinned `Contact` key per the spec's Trust Model (TOFU) — `verifyDetached()`/
|
|
126
|
+
* `verifyOpaque()` only prove a signature is mathematically valid, never that the certificate belongs to
|
|
127
|
+
* who the message claims (see `VerifyResult`'s own doc comment). */
|
|
128
|
+
export declare function computeCertFingerprint(certDer: Uint8Array): Promise<string>;
|