From 5533449c5b14a58266decff14e878dd57d3cbb40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Rame=CC=81?= Date: Thu, 24 Sep 2026 19:53:08 +0200 Subject: [PATCH] wip integration to review --- .../assets/encryption/document-encrypted.svg | 89 +++++++ .../assets/encryption/document-encrypting.svg | 90 +++++++ .../encryption/document-shield-check.png | Bin 0 -> 30565 bytes .../assets/encryption/document-shield-x.png | Bin 0 -> 30351 bytes .../src/assets/encryption/shield-check.png | Bin 0 -> 45753 bytes .../src/assets/encryption/shield-x.png | Bin 0 -> 45565 bytes .../features/auth/components/AccountMenu.tsx | 4 +- .../auth/components/EncryptionHostBody.tsx | 95 +++++++ .../components/ModalEncryptionOnboarding.tsx | 34 ++- .../components/ModalEncryptionSettings.tsx | 34 ++- .../doc-collaboration/vault/client-sdk.d.ts | 25 +- .../docs/doc-header/components/DocToolBox.tsx | 21 +- .../components/EncryptionLayout.tsx | 165 ++++++++++++ .../components/KeyMismatchPanel.tsx | 93 ++++--- .../components/ModalEncryptDoc.tsx | 251 ++++++------------ .../components/ModalRemoveDocEncryption.tsx | 74 +++--- .../components/DocShareInvitation.tsx | 3 + .../doc-share/components/DocShareMember.tsx | 13 +- .../doc-share/components/DocShareModal.tsx | 107 +++----- .../doc-share/components/ModalKeyMismatch.tsx | 142 +++++----- .../components/PendingEncryptionSection.tsx | 98 ++++--- .../doc-share/components/SearchUserRow.tsx | 26 +- .../apps/impress/src/i18n/translations.json | 49 +++- .../impress/src/pages/docs/[id]/index.tsx | 214 ++++++++------- .../apps/impress/src/pages/globals.css | 34 +++ 25 files changed, 1066 insertions(+), 595 deletions(-) create mode 100644 src/frontend/apps/impress/src/assets/encryption/document-encrypted.svg create mode 100644 src/frontend/apps/impress/src/assets/encryption/document-encrypting.svg create mode 100644 src/frontend/apps/impress/src/assets/encryption/document-shield-check.png create mode 100644 src/frontend/apps/impress/src/assets/encryption/document-shield-x.png create mode 100644 src/frontend/apps/impress/src/assets/encryption/shield-check.png create mode 100644 src/frontend/apps/impress/src/assets/encryption/shield-x.png create mode 100644 src/frontend/apps/impress/src/features/auth/components/EncryptionHostBody.tsx create mode 100644 src/frontend/apps/impress/src/features/docs/doc-management/components/EncryptionLayout.tsx diff --git a/src/frontend/apps/impress/src/assets/encryption/document-encrypted.svg b/src/frontend/apps/impress/src/assets/encryption/document-encrypted.svg new file mode 100644 index 000000000..9e748eb96 --- /dev/null +++ b/src/frontend/apps/impress/src/assets/encryption/document-encrypted.svg @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/frontend/apps/impress/src/assets/encryption/document-encrypting.svg b/src/frontend/apps/impress/src/assets/encryption/document-encrypting.svg new file mode 100644 index 000000000..7df0e620d --- /dev/null +++ b/src/frontend/apps/impress/src/assets/encryption/document-encrypting.svg @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/frontend/apps/impress/src/assets/encryption/document-shield-check.png b/src/frontend/apps/impress/src/assets/encryption/document-shield-check.png new file mode 100644 index 0000000000000000000000000000000000000000..7fc9a76965a72bcee5fbb7614d8334875c218e05 GIT binary patch literal 30565 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 Cp=%QW literal 0 HcmV?d00001 diff --git a/src/frontend/apps/impress/src/assets/encryption/document-shield-x.png b/src/frontend/apps/impress/src/assets/encryption/document-shield-x.png new file mode 100644 index 0000000000000000000000000000000000000000..73ee075261ddd312acd57ddc37edf8cd73a6b5ae GIT binary patch literal 30351 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 literal 0 HcmV?d00001 diff --git a/src/frontend/apps/impress/src/assets/encryption/shield-check.png b/src/frontend/apps/impress/src/assets/encryption/shield-check.png new file mode 100644 index 0000000000000000000000000000000000000000..54165863ce9fc20a8392f8109c000bb6e48243b6 GIT binary patch literal 45753 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 aeqgMrC;T88p(urdl(e|QkLvG6LH`fY>Kab~ literal 0 HcmV?d00001 diff --git a/src/frontend/apps/impress/src/assets/encryption/shield-x.png b/src/frontend/apps/impress/src/assets/encryption/shield-x.png new file mode 100644 index 0000000000000000000000000000000000000000..a3d68ba42ffc2a29d37691cde3978bd6ab9d7082 GIT binary patch literal 45565 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 literal 0 HcmV?d00001 diff --git a/src/frontend/apps/impress/src/features/auth/components/AccountMenu.tsx b/src/frontend/apps/impress/src/features/auth/components/AccountMenu.tsx index 465b7e3fa..1f8aa3b13 100644 --- a/src/frontend/apps/impress/src/features/auth/components/AccountMenu.tsx +++ b/src/frontend/apps/impress/src/features/auth/components/AccountMenu.tsx @@ -30,7 +30,7 @@ export const AccountMenu = () => { if (hasEncryptionSetup) { return { label: t('Encryption settings'), - icon: 'lock', + icon: 'verified_user', callback: () => setIsSettingsOpen(true), showSeparator: true, }; @@ -38,7 +38,7 @@ export const AccountMenu = () => { return { label: t('Enable encryption'), - icon: 'lock_open', + icon: 'add_moderator', callback: () => setIsOnboardingOpen(true), showSeparator: true, }; diff --git a/src/frontend/apps/impress/src/features/auth/components/EncryptionHostBody.tsx b/src/frontend/apps/impress/src/features/auth/components/EncryptionHostBody.tsx new file mode 100644 index 000000000..3702ed815 --- /dev/null +++ b/src/frontend/apps/impress/src/features/auth/components/EncryptionHostBody.tsx @@ -0,0 +1,95 @@ +import { Button, ModalSize } from '@gouvfr-lasuite/cunningham-react'; +import { useEffect, useState } from 'react'; +import { useTranslation } from 'react-i18next'; + +import { Loading } from '@/components'; +import { useVaultClient } from '@/features/docs/doc-collaboration/vault'; +import { EncryptionModalContent } from '@/features/docs/doc-management/components/EncryptionLayout'; + +/** + * The size the interface asks for its host modal: small (350px) by default, the + * design system's medium one when the shown screen needs the room. Resets to + * small whenever the modal closes, so the next opening starts at the default. + */ +export const useInterfaceModalSize = (isOpen: boolean): ModalSize => { + const { client } = useVaultClient(); + const [size, setSize] = useState(ModalSize.SMALL); + + useEffect(() => { + if (!client) { + return; + } + + const handleSize = ({ size: wanted }: { size: 'small' | 'medium' }) => { + setSize(wanted === 'medium' ? ModalSize.MEDIUM : ModalSize.SMALL); + }; + + client.on('interface:size', handleSize); + + return () => { + client.off('interface:size', handleSize); + }; + }, [client]); + + useEffect(() => { + if (!isOpen) { + setSize(ModalSize.SMALL); + } + }, [isOpen]); + + return size; +}; + +interface EncryptionHostBodyProps { + /** Receives the element the interface iframe is mounted into. */ + hostRef: (element: HTMLDivElement | null) => void; + onClose: () => void; +} + +/** + * The body of a modal hosting the encryption interface. The interface can only + * be opened once the SDK script has loaded from the vault domain: until then a + * loader, and if that load failed an explanation with a retry, instead of the + * empty host the interface would otherwise never fill. + */ +export const EncryptionHostBody = ({ + hostRef, + onClose, +}: EncryptionHostBodyProps) => { + const { t } = useTranslation(); + const { client, isLoading, error } = useVaultClient(); + + if (error) { + return ( + + + + + } + /> + ); + } + + if (!client || isLoading) { + return ; + } + + return ( +

+ ); +}; diff --git a/src/frontend/apps/impress/src/features/auth/components/ModalEncryptionOnboarding.tsx b/src/frontend/apps/impress/src/features/auth/components/ModalEncryptionOnboarding.tsx index 6d509956f..c5c6b93fe 100644 --- a/src/frontend/apps/impress/src/features/auth/components/ModalEncryptionOnboarding.tsx +++ b/src/frontend/apps/impress/src/features/auth/components/ModalEncryptionOnboarding.tsx @@ -6,13 +6,18 @@ * The product (Docs) doesn't manage public keys — it only stores fingerprints * on document accesses for UI purposes. */ -import { Modal, ModalSize } from '@gouvfr-lasuite/cunningham-react'; +import { Modal } from '@gouvfr-lasuite/cunningham-react'; import { useCallback, useEffect, useRef, useState } from 'react'; +import { useTranslation } from 'react-i18next'; -import { Box } from '@/components'; import { useUserEncryption } from '@/docs/doc-collaboration'; import { useVaultClient } from '@/features/docs/doc-collaboration/vault'; +import { + EncryptionHostBody, + useInterfaceModalSize, +} from './EncryptionHostBody'; + interface ModalEncryptionOnboardingProps { isOpen: boolean; onClose: () => void; @@ -24,6 +29,7 @@ export const ModalEncryptionOnboarding = ({ onClose, onSuccess, }: ModalEncryptionOnboardingProps) => { + const { t } = useTranslation(); const { client: vaultClient, refreshKeyState } = useVaultClient(); const { refreshEncryption } = useUserEncryption(); const onboardingOpenedRef = useRef(false); @@ -70,10 +76,15 @@ export const ModalEncryptionOnboarding = ({ }; }, [vaultClient, refreshKeyState, refreshEncryption, onSuccess, onClose]); + // The modal's close control only ASKS the interface to close: it may hold an + // unsaved recovery phrase and answer with its own confirmation. The modal goes + // away on 'interface:closed', which the interface emits once really done. const handleClose = useCallback(() => { - vaultClient?.closeInterface(); - onboardingOpenedRef.current = false; - onClose(); + if (vaultClient) { + vaultClient.requestClose(); + } else { + onClose(); + } }, [vaultClient, onClose]); useEffect(() => { @@ -82,20 +93,17 @@ export const ModalEncryptionOnboarding = ({ } }, [isOpen]); + const size = useInterfaceModalSize(isOpen); + return ( - -
- + ); }; diff --git a/src/frontend/apps/impress/src/features/auth/components/ModalEncryptionSettings.tsx b/src/frontend/apps/impress/src/features/auth/components/ModalEncryptionSettings.tsx index 9eaf03e5d..5cffe4d5f 100644 --- a/src/frontend/apps/impress/src/features/auth/components/ModalEncryptionSettings.tsx +++ b/src/frontend/apps/impress/src/features/auth/components/ModalEncryptionSettings.tsx @@ -4,13 +4,18 @@ * Opens the encryption service's settings interface iframe which handles: * fingerprint display, key deletion, device transfer export, and server key management. */ -import { Modal, ModalSize } from '@gouvfr-lasuite/cunningham-react'; +import { Modal } from '@gouvfr-lasuite/cunningham-react'; import { useCallback, useEffect, useState } from 'react'; +import { useTranslation } from 'react-i18next'; -import { Box } from '@/components'; import { useUserEncryption } from '@/docs/doc-collaboration'; import { useVaultClient } from '@/features/docs/doc-collaboration/vault'; +import { + EncryptionHostBody, + useInterfaceModalSize, +} from './EncryptionHostBody'; + interface ModalEncryptionSettingsProps { isOpen: boolean; onClose: () => void; @@ -21,6 +26,7 @@ export const ModalEncryptionSettings = ({ isOpen, onClose, }: ModalEncryptionSettingsProps) => { + const { t } = useTranslation(); const { client: vaultClient, refreshKeyState } = useVaultClient(); const { refreshEncryption } = useUserEncryption(); const [containerEl, setContainerEl] = useState(null); @@ -61,10 +67,15 @@ export const ModalEncryptionSettings = ({ }; }, [vaultClient, refreshKeyState, refreshEncryption, onClose]); + // The modal's close control only ASKS the interface to close: it may hold an + // unsaved recovery phrase and answer with its own confirmation. The modal goes + // away on 'interface:closed', which the interface emits once really done. const handleClose = useCallback(() => { - vaultClient?.closeInterface(); - setSettingsOpened(false); - onClose(); + if (vaultClient) { + vaultClient.requestClose(); + } else { + onClose(); + } }, [vaultClient, onClose]); useEffect(() => { @@ -73,20 +84,17 @@ export const ModalEncryptionSettings = ({ } }, [isOpen]); + const size = useInterfaceModalSize(isOpen); + return ( - -
- + ); }; diff --git a/src/frontend/apps/impress/src/features/docs/doc-collaboration/vault/client-sdk.d.ts b/src/frontend/apps/impress/src/features/docs/doc-collaboration/vault/client-sdk.d.ts index 0f1ffbb37..6d355f3d6 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-collaboration/vault/client-sdk.d.ts +++ b/src/frontend/apps/impress/src/features/docs/doc-collaboration/vault/client-sdk.d.ts @@ -19,6 +19,14 @@ export declare interface EncryptionClientEventMap { }; /** Fired when the user cancels or closes the interface */ [MSG_INTERFACE_CLOSED]: void; + /** + * Fired when the shown screen wants a modal of another width: the product + * switches its modal between the design system's small (350px) and medium + * (600px) sizes. Emitted on every screen change, so a product can also ignore it. + */ + 'interface:size': { + size: 'small' | 'medium'; + }; /** Fired on errors from the vault or the interface */ error: Error; /** Fired when keys changed from another tab/product (via BroadcastChannel) */ @@ -218,8 +226,7 @@ export declare class VaultClient { * @param keyVersion - the recipient's encryption-key VERSION this wrap was * produced against, as stored by the product on the access row. The vault * unwraps with exactly that retained key (a version this device no longer - * holds throws WRONG_SECRET_KEY). For Drive chains it is the version of the - * ENTRY-point key; the chain links themselves are symmetric. + * holds throws WRONG_SECRET_KEY). * @param encryptedKeyChain - optional chain of wrapped keys for Drive's key hierarchy. * When provided, resolves the chain from entry point to target before decrypting. */ @@ -385,6 +392,16 @@ export declare class VaultClient { * `userId` is the recipient's OIDC sub, like every id a product passes. */ openRecipientProfile(container: HTMLElement, userId: string, label: RecipientLabel): void; + /** + * Ask the interface to close, from the product's own close control (the X of + * the modal hosting the iframe). The interface owns the decision: mid-backup + * it shows its "cancel setup?" confirmation instead of closing, so a product + * must NOT unmount its modal here. It waits for the 'interface:closed' event, + * which fires once the interface has really closed (for this request or any + * other reason). With no interface open this is a no-op that still emits + * 'interface:closed', so a product's close handler stays uniform. + */ + requestClose(): void; /** * Close the interface iframe if it is open. */ @@ -526,6 +543,10 @@ export declare const VaultErrorCode: { readonly IFRAME_REQUIRED: "IFRAME_REQUIRED"; /** Ciphertext / encrypted-key payload too short to be valid (truncated). */ readonly CIPHERTEXT_TOO_SHORT: "CIPHERTEXT_TOO_SHORT"; + /** Ciphertext structure is inconsistent (e.g. a wrong length field): corrupt, not merely truncated. */ + readonly MALFORMED_CIPHERTEXT: "MALFORMED_CIPHERTEXT"; + /** A field cannot be represented in the canonical signed-payload encoding (length or number out of range). */ + readonly INVALID_CANONICAL_PAYLOAD: "INVALID_CANONICAL_PAYLOAD"; /** Blob's leading version byte doesn't match a format this build can decode. */ readonly UNSUPPORTED_CRYPTO_VERSION: "UNSUPPORTED_CRYPTO_VERSION"; /** A signature public key didn't have the expected Ed25519 length. */ diff --git a/src/frontend/apps/impress/src/features/docs/doc-header/components/DocToolBox.tsx b/src/frontend/apps/impress/src/features/docs/doc-header/components/DocToolBox.tsx index 2659b0cca..46dcc5a6c 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-header/components/DocToolBox.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-header/components/DocToolBox.tsx @@ -12,6 +12,7 @@ import { DropdownMenuOption, Icon, IconOptions, + Text, } from '@/components'; import { useCunninghamTheme } from '@/cunningham'; import { @@ -149,7 +150,7 @@ export const DocToolBox = ({ }, { label: t('Encrypt document'), - icon: 'https', + icon: 'add_moderator', disabled: !doc.abilities.accesses_manage, callback: () => { setIsModalEncryptOpen(true); @@ -158,8 +159,8 @@ export const DocToolBox = ({ showSeparator: isTopRoot ? true : false, }, { - label: t('Remove document encryption'), - icon: 'no_encryption', + label: t('Remove encryption'), + icon: 'remove_moderator', disabled: !doc.abilities.accesses_manage, callback: () => { setIsModalRemoveEncryptionOpen(true); @@ -242,21 +243,15 @@ export const DocToolBox = ({ - - + + {t('Encrypted')} - + )} diff --git a/src/frontend/apps/impress/src/features/docs/doc-management/components/EncryptionLayout.tsx b/src/frontend/apps/impress/src/features/docs/doc-management/components/EncryptionLayout.tsx new file mode 100644 index 000000000..399a4414a --- /dev/null +++ b/src/frontend/apps/impress/src/features/docs/doc-management/components/EncryptionLayout.tsx @@ -0,0 +1,165 @@ +import type { StaticImageData } from 'next/image'; +import { ReactNode } from 'react'; +import { css } from 'styled-components'; + +import DocumentEncrypted from '@/assets/encryption/document-encrypted.svg'; +import DocumentEncrypting from '@/assets/encryption/document-encrypting.svg'; +import documentShieldCheck from '@/assets/encryption/document-shield-check.png'; +import documentShieldX from '@/assets/encryption/document-shield-x.png'; +import shieldCheck from '@/assets/encryption/shield-check.png'; +import shieldX from '@/assets/encryption/shield-x.png'; +import { Box, Text } from '@/components'; + +const MODAL_ILLUSTRATIONS = { + 'shield-check': shieldCheck, + 'shield-x': shieldX, + 'document-shield-check': documentShieldCheck, + 'document-shield-x': documentShieldX, +} satisfies Record; + +const STATE_ILLUSTRATIONS = { + 'document-encrypted': DocumentEncrypted, + 'document-encrypting': DocumentEncrypting, +}; + +export type ModalIllustration = keyof typeof MODAL_ILLUSTRATIONS; +export type StateIllustration = keyof typeof STATE_ILLUSTRATIONS; + +interface EncryptionModalContentProps { + illustration?: ModalIllustration; + title: ReactNode; + titleId?: string; + description?: ReactNode; + children?: ReactNode; + actions?: ReactNode; + actionsLayout?: 'stack' | 'row'; +} + +/** + * The content of an encryption modal: illustration, title, description, body + * and stacked full-width actions. Rendered inside a Cunningham small modal + * (widened to 350px by `globals.css`) with the modal's own close control. + */ +export const EncryptionModalContent = ({ + illustration, + title, + titleId, + description, + children, + actions, + actionsLayout = 'stack', +}: EncryptionModalContentProps) => ( + + {illustration && ( + + + + )} + + + {title} + + {description && ( + + {description} + + )} + + {children && {children}} + {actions && ( + .c__button { + width: 100%; + justify-content: center; + } + ` + } + > + {actions} + + )} + +); + +interface EncryptionEmptyStateProps { + illustration?: StateIllustration; + title: ReactNode; + description?: ReactNode; + children?: ReactNode; + actions?: ReactNode; +} + +/** + * A compact centered state on a page or in a panel: small illustration, bold + * title, short description and text-link actions. + */ +export const EncryptionEmptyState = ({ + illustration = 'document-encrypted', + title, + description, + children, + actions, +}: EncryptionEmptyStateProps) => { + const Illustration = STATE_ILLUSTRATIONS[illustration]; + + return ( + + + + {children} + {actions && ( + + {actions} + + )} + + ); +}; diff --git a/src/frontend/apps/impress/src/features/docs/doc-management/components/KeyMismatchPanel.tsx b/src/frontend/apps/impress/src/features/docs/doc-management/components/KeyMismatchPanel.tsx index c880227e7..ce6fc8b76 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-management/components/KeyMismatchPanel.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-management/components/KeyMismatchPanel.tsx @@ -1,7 +1,8 @@ +import { Button } from '@gouvfr-lasuite/cunningham-react'; import { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; -import { Box, Icon, Text } from '@/components'; +import { Icon, StyledLink, Text } from '@/components'; import { useAuth } from '@/features/auth'; import { fetchRegisteredKeys, @@ -10,6 +11,8 @@ import { import type { Doc } from '../types'; +import { EncryptionEmptyState } from './EncryptionLayout'; + /** * True when the SDK threw a `VaultError` carrying the * `WRONG_SECRET_KEY` code. In docs this means the document was @@ -79,55 +82,61 @@ export const KeyMismatchPanel = ({ doc }: Props) => { }; }, [vaultClient, user?.suite_user_id]); + const versionChip = (value: number) => ( + + {value} + + ); + return ( - - - - {t('This document was encrypted with a different key')} - - - - {t( - 'The document was encrypted for you at a time when you were using a different encryption key — possibly before you reset your keys or switched device without restoring a backup. Your current key can no longer decrypt it. Ask an owner or administrator of this document to remove you from the access list and add you back so it gets re-encrypted for your current key.', - )} - - + + + + } + > {(shareTimeVersion !== null || currentVersion !== null) && ( - + {shareTimeVersion !== null && ( - + {t('Encryption key version at the time it was shared with you:')}{' '} - - {shareTimeVersion} - - + {versionChip(shareTimeVersion)} + )} {currentVersion !== null && ( - + {t('Your current encryption key version:')}{' '} - - {currentVersion} - - + {versionChip(currentVersion)} + )} - + )} - + ); }; diff --git a/src/frontend/apps/impress/src/features/docs/doc-management/components/ModalEncryptDoc.tsx b/src/frontend/apps/impress/src/features/docs/doc-management/components/ModalEncryptDoc.tsx index ff5a21fb9..231d67fc8 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-management/components/ModalEncryptDoc.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-management/components/ModalEncryptDoc.tsx @@ -11,7 +11,7 @@ import { useEffect, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import * as Y from 'yjs'; -import { Box, ButtonCloseModal, Icon, Text, TextErrors } from '@/components'; +import { TextErrors } from '@/components'; import { useUserEncryption } from '@/docs/doc-collaboration'; import { createDocAttachment } from '@/docs/doc-editor/api'; import { useAuth } from '@/features/auth'; @@ -35,6 +35,8 @@ import { useDocAccesses } from '@/features/docs/doc-share/api/useDocAccesses'; import { useDocInvitations } from '@/features/docs/doc-share/api/useDocInvitations'; import { useKeyboardAction } from '@/hooks'; +import { EncryptionModalContent } from './EncryptionLayout'; + /** * encrypt existing unencrypted attachments and return: * - a modified Yjs state with URLs pointing to new encrypted files @@ -372,185 +374,94 @@ export const ModalEncryptDoc = ({ doc, onClose }: ModalEncryptDocProps) => { const handleCloseKeyDown = keyboardAction(handleClose); const handleEncryptKeyDown = keyboardAction(handleEncrypt); + // Only the conditions that are NOT met are worth a word: the modal describes + // what encrypting does, and warns about what still blocks it. + const blockers: string[] = []; + if (!hasEncryptionKeys) { + blockers.push(t('You must enable encryption from your account menu first')); + } + if (!isRestricted) { + blockers.push( + t('Document must be set to private (currently {{reach}})', { + reach: + effectiveReach === LinkReach.PUBLIC ? t('public') : t('connected'), + }), + ); + } + if (hasPendingInvitations) { + blockers.push(t('Pending invitations must be resolved first')); + } + return ( - -
- ) : undefined - } - > - {t('Confirm')} - - - } - size={ModalSize.MEDIUM} - title={ - - - {t('Encrypt document')} - - - - } + size={ModalSize.SMALL} + aria-label={t('Encrypt document')} > - - {!isError && ( - - - - - {t( - 'Encrypting a document ensures that only authorized members can read its content. Keep in mind before proceeding any access will then require its user to do the encryption onboarding, with the complication of ensuring keys backups.', - )} - - - + +
+ ) : undefined + } + > + {t('Encrypt')} + + + + } + > + {!isError && blockers.length > 0 && ( + + {blockers.length === 1 ? ( + blockers[0] + ) : ( +
    + {blockers.map((blocker) => ( +
  • {blocker}
  • + ))} +
+ )} +
+ )} - - {t('Here the conditions that must be met:')} - - - - - - - {hasEncryptionKeys - ? t('Encryption is enabled on your account') - : t( - 'You must enable encryption from your account menu first', - )} - - - - - - - {isRestricted - ? t('Document access is private') - : t( - 'Document must be set to private (currently {{reach}})', - { - reach: - effectiveReach === LinkReach.PUBLIC - ? t('public') - : t('connected'), - }, - )} - - - - - - - {!hasPendingInvitations - ? t('No pending invitations') - : t('Pending invitations must be resolved first')} - - - - - - - - {othersWithoutKey.length === 0 - ? t('All members have encryption enabled') - : t( - '{{count}} member(s) haven’t completed encryption onboarding yet. They will be added as pending and won’t be able to decrypt the document until another validated collaborator accepts them from the share dialog.', - { count: othersWithoutKey.length }, - )} - - - {othersWithoutKey.length > 0 && ( - - {othersWithoutKey.map((access) => ( - - {access.user.full_name || access.user.email} - - ))} - - )} - - -
+ {!isError && blockers.length === 0 && othersWithoutKey.length > 0 && ( + + {t( + '{{count}} collaborator(s) have not enabled encryption yet. They will be added as pending and cannot open the document until someone accepts them from the share dialog.', + { count: othersWithoutKey.length }, + )} + )} {isError && } - +
); }; diff --git a/src/frontend/apps/impress/src/features/docs/doc-management/components/ModalRemoveDocEncryption.tsx b/src/frontend/apps/impress/src/features/docs/doc-management/components/ModalRemoveDocEncryption.tsx index 442b06791..464c99c8b 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-management/components/ModalRemoveDocEncryption.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-management/components/ModalRemoveDocEncryption.tsx @@ -10,7 +10,7 @@ import { useState } from 'react'; import { useTranslation } from 'react-i18next'; import * as Y from 'yjs'; -import { Box, ButtonCloseModal, Text, TextErrors } from '@/components'; +import { TextErrors } from '@/components'; import { createDocAttachment } from '@/docs/doc-editor/api'; import { useAuth } from '@/features/auth'; import { useVaultClient } from '@/features/docs/doc-collaboration/vault'; @@ -25,6 +25,8 @@ import { } from '@/features/docs/doc-management'; import { useKeyboardAction } from '@/hooks'; +import { EncryptionModalContent } from './EncryptionLayout'; + /** * Decrypt existing encrypted attachments using the vault and upload decrypted copies. */ @@ -188,47 +190,39 @@ export const ModalRemoveDocEncryption = ({ isOpen closeOnClickOutside onClose={handleClose} - size={ModalSize.MEDIUM} - rightActions={ - <> - - - - } - title={ - - - {t('Remove document encryption')} - - - - } - hideCloseButton + size={ModalSize.SMALL} + aria-label={t('Remove encryption')} > - - - {t( - 'This will permanently remove encryption from this document. All content will be stored in plain text.', - )} - + + + + + } + > {isError && error && } - + ); }; diff --git a/src/frontend/apps/impress/src/features/docs/doc-share/components/DocShareInvitation.tsx b/src/frontend/apps/impress/src/features/docs/doc-share/components/DocShareInvitation.tsx index da35a0707..a3ebf3779 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-share/components/DocShareInvitation.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-share/components/DocShareInvitation.tsx @@ -93,10 +93,12 @@ export const DocShareInvitationItem = ({ type DocShareModalInviteUserRowProps = { user: User; suffix?: string; + suffixIcon?: string; }; export const DocShareModalInviteUserRow = ({ user, suffix, + suffixIcon, }: DocShareModalInviteUserRowProps) => { const { t } = useTranslation(); return ( @@ -108,6 +110,7 @@ export const DocShareModalInviteUserRow = ({ void; }; export const DocShareMemberItem = ({ @@ -31,6 +32,7 @@ export const DocShareMemberItem = ({ access, isInherited = false, suffix, + suffixIcon, onSuffixClick, }: Props) => { const { t } = useTranslation(); @@ -76,6 +78,7 @@ export const DocShareMemberItem = ({ alwaysShowRight={true} user={access.user} suffix={suffix} + suffixIcon={suffixIcon} onSuffixClick={onSuffixClick} right={ @@ -147,12 +150,13 @@ export const QuickSearchGroupMember = ({ (!uid || !doc.accesses_versions_per_user?.[uid]); let suffix: string | undefined; + let suffixIcon: string | undefined; if (hasMismatch) { - suffix = t('DIFFERENT PUBLIC KEY, PLEASE VERIFY'); + suffix = t('Verify key'); + suffixIcon = 'gpp_maybe'; } else if (hasNoEncryptionKey) { - suffix = t( - 'ENCRYPTION DISABLED - consider removing this member since unable to read the document', - ); + suffix = t('No encryption'); + suffixIcon = 'gpp_bad'; } return ( @@ -160,6 +164,7 @@ export const QuickSearchGroupMember = ({ doc={doc} access={access} suffix={suffix} + suffixIcon={suffixIcon} onSuffixClick={ hasMismatch && uid ? () => setMismatchUserId(uid) : undefined } diff --git a/src/frontend/apps/impress/src/features/docs/doc-share/components/DocShareModal.tsx b/src/frontend/apps/impress/src/features/docs/doc-share/components/DocShareModal.tsx index 9ee654aa9..b8127dd3c 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-share/components/DocShareModal.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-share/components/DocShareModal.tsx @@ -9,7 +9,6 @@ import { Box, ButtonCloseModal, HorizontalSeparator, - Icon, Loading, Text, } from '@/components'; @@ -27,6 +26,10 @@ import type { DocumentEncryptionSettings } from '@/docs/doc-collaboration/hook/u import type { PublicKeyMismatch } from '@/docs/doc-collaboration/hook/usePublicKeyRegistry'; import { Doc } from '@/docs/doc-management'; import { User, useAuth } from '@/features/auth'; +import { + EncryptionEmptyState, + EncryptionModalContent, +} from '@/features/docs/doc-management/components/EncryptionLayout'; import { useResponsiveStore } from '@/stores'; import { isValidEmail } from '@/utils'; @@ -272,39 +275,23 @@ export const DocShareModal = ({
{isEncryptionDeriving && } {!isEncryptionDeriving && derivedEncryptionError && ( - - - - {t('Encryption keys unavailable')} - - - {t( - 'This is an encrypted document, but your current device does not have the required encryption keys to decrypt it.', - )} - - {(encryptionError === 'missing_private_key' || - encryptionError === 'missing_public_key') && ( - - {t( - 'This usually happens when you switch to a new device or browser without restoring your encryption backup, please go to your "Encryption Settings" to fix it.', - )} - - )} - {documentEncryptionError === 'missing_symmetric_key' && ( - - {t( - 'You do not have access to this encrypted document. Ask the document owner to share it with you again.', - )} - - )} - {documentEncryptionError === 'decryption_failed' && ( - - {t( - 'Your encryption keys could not decrypt this document. This may happen if your keys were recreated. Ask the document owner to share it with you again.', - )} - - )} - + )} {!isEncryptionDeriving && !derivedEncryptionError && ( { if (user.suite_user_id && keyMismatchUserIds?.has(user.suite_user_id)) { - return t('DIFFERENT PUBLIC KEY, PLEASE VERIFY'); + return t('Verify key'); } if ( isEncrypted && (!user.suite_user_id || !doc.accesses_versions_per_user?.[user.suite_user_id]) ) { - return t(`(encryption not enabled)`); + return t('No encryption'); } return undefined; }, @@ -560,6 +547,11 @@ const QuickSearchInviteInputSection = ({ )} /> @@ -580,37 +572,20 @@ const QuickSearchInviteInputSection = ({ closeOnClickOutside onClose={() => setShowNoKeyModal(false)} size={ModalSize.SMALL} - rightActions={ - - } - title={ - - - {t('Encryption required')} - - } + aria-label={t('Encryption required')} > - - - {t( - 'This user has not enabled encryption on their account yet. It is not possible to share encrypted content with them.', - )} - - - {t( - 'Please ask them to enable encryption in their account settings first.', - )} - - + setShowNoKeyModal(false)}> + {t('Understood')} + + } + /> )} {mismatchUser && diff --git a/src/frontend/apps/impress/src/features/docs/doc-share/components/ModalKeyMismatch.tsx b/src/frontend/apps/impress/src/features/docs/doc-share/components/ModalKeyMismatch.tsx index 633698066..a1fdea2c2 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-share/components/ModalKeyMismatch.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-share/components/ModalKeyMismatch.tsx @@ -1,8 +1,15 @@ -import { Button, Modal, ModalSize } from '@gouvfr-lasuite/cunningham-react'; +import { + Alert, + Button, + Modal, + ModalSize, + VariantType, +} from '@gouvfr-lasuite/cunningham-react'; import { useTranslation } from 'react-i18next'; -import { Box, Icon, Text } from '@/components'; +import { Box, Text } from '@/components'; import { useKeyFingerprint } from '@/docs/doc-collaboration'; +import { EncryptionModalContent } from '@/features/docs/doc-management/components/EncryptionLayout'; interface ModalKeyMismatchProps { onClose: () => void; @@ -11,6 +18,21 @@ interface ModalKeyMismatchProps { currentKey?: string; } +const Fingerprint = ({ label, value }: { label: string; value: string }) => ( + + + {label} + + + {value} + + +); + export const ModalKeyMismatch = ({ onClose, onAcceptKey, @@ -26,94 +48,60 @@ export const ModalKeyMismatch = ({ isOpen closeOnClickOutside onClose={onClose} - size={ModalSize.MEDIUM} - rightActions={ - <> - - {onAcceptKey && ( - - )} - - } - title={ - - - {t('Public key change detected')} - - } + size={ModalSize.SMALL} + aria-label={t('Verify encryption key')} > - - + + + {onAcceptKey && ( + + )} + + } + > + {t( - "This user's encryption public key has changed since you last interacted with them.", + "This person's encryption key has changed. Verify it before continuing.", )} - - - {t( - 'This could mean the user has regenerated their encryption keys, but it could also indicate that their account has been compromised.', - )} - - - {t( - 'We recommend verifying with this person directly (e.g. via video call) that they have indeed changed their encryption key before proceeding.', - )} - + {(knownFingerprint || currentFingerprint) && ( {knownFingerprint && ( - - - {t('Previously known:')} - - - {knownFingerprint} - - + )} {currentFingerprint && ( - - - {t('Current key:')} - - - {currentFingerprint} - - + )} )} - + ); }; diff --git a/src/frontend/apps/impress/src/features/docs/doc-share/components/PendingEncryptionSection.tsx b/src/frontend/apps/impress/src/features/docs/doc-share/components/PendingEncryptionSection.tsx index 41bc413b4..1a5b1e531 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-share/components/PendingEncryptionSection.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-share/components/PendingEncryptionSection.tsx @@ -3,6 +3,7 @@ import { useEffect, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Box, Icon, Text } from '@/components'; +import { UserAvatar } from '@/features/auth'; import type { DocumentEncryptionSettings } from '@/features/docs/doc-collaboration/hook/useDocumentEncryption'; import { fetchRegisteredKeys, @@ -167,24 +168,14 @@ export const PendingEncryptionSection = ({ return ( - - - - {t('Users pending encryption access ({{count}})', { - count: pending.length, - })} - - - + + {t('Action needed')} + + {pending.map((access) => { const sub = access.user?.suite_user_id; const isBusy = inFlight.has(access.id); @@ -195,45 +186,76 @@ export const PendingEncryptionSection = ({ !!documentEncryptionSettings && hasPublicKey === true && !probing; + const name = access.user?.full_name || access.user?.email || ''; + return ( - - - {access.user?.full_name || access.user?.email} - - {access.user?.email && access.user?.full_name && ( - - {access.user.email} + + + + + {name} - )} - {!canAccept && !probing && ( - - {t( - "Waiting for this user to complete their encryption onboarding. You'll be able to accept them once they have.", - )} - - )} - {error && ( - - {error} - - )} + {access.user?.email && access.user?.full_name && ( + + {access.user.email} + + )} + {!canAccept && !probing && ( + + {t( + 'Waiting for them to enable encryption. You will be able to accept them once they have.', + )} + + )} + {error && ( + + {error} + + )} + - {canAccept && ( + {canAccept ? ( + ) : ( + + + + {t('Pending encryption')} + + )} ); diff --git a/src/frontend/apps/impress/src/features/docs/doc-share/components/SearchUserRow.tsx b/src/frontend/apps/impress/src/features/docs/doc-share/components/SearchUserRow.tsx index ab277ebf1..5d9020aca 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-share/components/SearchUserRow.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-share/components/SearchUserRow.tsx @@ -1,4 +1,4 @@ -import { Box, Text } from '@/components'; +import { Box, Icon, Text } from '@/components'; import { QuickSearchItemContent, QuickSearchItemContentProps, @@ -11,7 +11,10 @@ type Props = { alwaysShowRight?: boolean; right?: QuickSearchItemContentProps['right']; isInvitation?: boolean; + /** A short status ("Verify key", "No encryption") shown as an icon with the text as tooltip. */ suffix?: string; + /** Material icon for the suffix; the shield-with-question mark by default. */ + suffixIcon?: string; onSuffixClick?: () => void; }; @@ -21,6 +24,7 @@ export const SearchUserRow = ({ alwaysShowRight = false, isInvitation = false, suffix, + suffixIcon = 'gpp_maybe', onSuffixClick, }: Props) => { const hasFullName = !!user.full_name; @@ -47,10 +51,13 @@ export const SearchUserRow = ({ {hasFullName ? user.full_name : user.email} {suffix && ( - { e.stopPropagation(); @@ -58,14 +65,9 @@ export const SearchUserRow = ({ }, role: 'button', tabIndex: 0, - style: { - cursor: 'pointer', - textDecoration: 'underline', - }, + style: { cursor: 'pointer' }, })} - > - {suffix} - + /> )} {hasFullName && ( diff --git a/src/frontend/apps/impress/src/i18n/translations.json b/src/frontend/apps/impress/src/i18n/translations.json index 3e9cb6d6c..30ad0ca4f 100644 --- a/src/frontend/apps/impress/src/i18n/translations.json +++ b/src/frontend/apps/impress/src/i18n/translations.json @@ -1000,7 +1000,50 @@ "pdf": "pdf", "{{action}}, current role: {{role}}": "{{action}}, rôle actuel : {{role}}", "{{name}} added to invite list. Add more members or press Tab to select role and invite.": "{{name}} a été ajouté à la liste d'invitation. Ajoutez plus de membres ou appuyez sur Tab pour sélectionner le rôle et inviter.", - "{{name}} removed from invite list": "{{name}} a été retiré de la liste d'invitation" + "{{name}} removed from invite list": "{{name}} a été retiré de la liste d'invitation", + "Encryption": "Chiffrement", + "Remove encryption": "Retirer le chiffrement", + "Encrypted": "Chiffré", + "Encrypt": "Chiffrer", + "The document and its attachments will be encrypted end-to-end. Only people you share it with will be able to access its contents.": "Le document et ses pièces jointes seront chiffrés de bout en bout. Seules les personnes avec qui vous le partagez pourront y accéder.", + "The document will be decrypted and stored in plain text on the server.": "Le document sera déchiffré et stocké en clair sur le serveur.", + "{{count}} collaborator(s) have not enabled encryption yet. They will be added as pending and cannot open the document until someone accepts them from the share dialog.": "{{count}} collaborateur(s) n'ont pas encore activé le chiffrement. Ils seront ajoutés en attente et ne pourront pas ouvrir le document tant qu'une personne ne les aura pas acceptés depuis la fenêtre de partage.", + "You must enable encryption from your account menu first": "Vous devez d'abord activer le chiffrement depuis le menu de votre compte", + "Document must be set to private (currently {{reach}})": "Le document doit être privé (actuellement {{reach}})", + "Pending invitations must be resolved first": "Les invitations en attente doivent d'abord être traitées", + "Encrypted document": "Document chiffré", + "Encryption service unavailable": "Service de chiffrement indisponible", + "The encryption service could not be loaded. Check your connection and try again.": "Le service de chiffrement n'a pas pu être chargé. Vérifiez votre connexion et réessayez.", + "This document is encrypted and the encryption service could not be loaded. Check your connection and try again.": "Ce document est chiffré et le service de chiffrement n'a pas pu être chargé. Vérifiez votre connexion et réessayez.", + "Retry": "Réessayer", + "Close": "Fermer", + "This document is encrypted. You must enable encryption on your account to access it.": "Ce document est chiffré. Vous devez activer le chiffrement sur votre compte pour y accéder.", + "You do not have access to this encrypted document. Ask the document owner to share it with you again.": "Vous n'avez pas accès à ce document chiffré. Demandez à son propriétaire de le partager à nouveau avec vous.", + "You do not have the correct encryption key to decrypt this document. Ask the document owner to share it with you again.": "Vous n'avez pas la bonne clé de chiffrement pour déchiffrer ce document. Demandez à son propriétaire de le partager à nouveau avec vous.", + "Enable encryption": "Activer le chiffrement", + "Encryption in progress": "Chiffrement en cours", + "Removing encryption": "Retrait du chiffrement", + "The document owner is encrypting this document. Please wait.": "Le propriétaire du document est en train de le chiffrer. Veuillez patienter.", + "The document owner is removing encryption from this document. Please wait.": "Le propriétaire du document est en train d'en retirer le chiffrement. Veuillez patienter.", + "This document was encrypted with a different key": "Ce document a été chiffré avec une autre clé", + "Verify key": "Vérifier la clé", + "No encryption": "Pas de chiffrement", + "Encryption required": "Chiffrement requis", + "This person has not enabled encryption yet, so the document cannot be shared with them. Ask them to enable encryption first.": "Cette personne n'a pas encore activé le chiffrement, le document ne peut donc pas être partagé avec elle. Demandez-lui d'activer le chiffrement d'abord.", + "Understood": "Compris", + "Verify encryption key": "Vérifier la clé de chiffrement", + "This person's encryption key has changed. Verify it before continuing.": "La clé de chiffrement de cette personne a changé. Vérifiez-la avant de continuer.", + "We recommend verifying with this person directly (for example on a call) that they really changed their encryption key before proceeding.": "Nous vous recommandons de vérifier directement avec cette personne (par exemple lors d'un appel) qu'elle a bien changé sa clé de chiffrement avant de continuer.", + "Don't trust": "Ne pas faire confiance", + "Trust": "Faire confiance", + "Previously known:": "Clé connue :", + "Current key:": "Clé actuelle :", + "Action needed": "Action requise", + "Waiting for them to enable encryption. You will be able to accept them once they have.": "En attente de l'activation du chiffrement par cette personne. Vous pourrez l'accepter une fois que ce sera fait.", + "Accept": "Accepter", + "Accepting…": "Acceptation…", + "Pending encryption": "Chiffrement en attente", + "Encryption settings": "Paramètres de chiffrement" } }, "it": { @@ -1449,7 +1492,9 @@ "{{name}} removed from invite list": "{{name}} verwijderd uit de uitnodigingslijst" } }, - "pt": { "translation": {} }, + "pt": { + "translation": {} + }, "ru": { "translation": { "\"{{email}}\" is already invited to the document.": "\"{{email}}\" уже имеет приглашение для этого документа.", diff --git a/src/frontend/apps/impress/src/pages/docs/[id]/index.tsx b/src/frontend/apps/impress/src/pages/docs/[id]/index.tsx index e1081c23b..75965a28b 100644 --- a/src/frontend/apps/impress/src/pages/docs/[id]/index.tsx +++ b/src/frontend/apps/impress/src/pages/docs/[id]/index.tsx @@ -1,12 +1,12 @@ import { Button } from '@gouvfr-lasuite/cunningham-react'; -import { Spinner, TreeProvider } from '@gouvfr-lasuite/ui-kit'; +import { TreeProvider } from '@gouvfr-lasuite/ui-kit'; import { useQueryClient } from '@tanstack/react-query'; import Head from 'next/head'; import { useRouter } from 'next/router'; import { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; -import { Box, Icon, Loading, StyledLink, Text, TextErrors } from '@/components'; +import { Box, Icon, Loading, StyledLink, TextErrors } from '@/components'; import { DEFAULT_QUERY_RETRY } from '@/core'; import { DocEditor } from '@/docs/doc-editor'; import { @@ -19,11 +19,18 @@ import { useProviderStore, useTrans, } from '@/docs/doc-management/'; -import { KEY_AUTH, setAuthUrl, useAuth } from '@/features/auth'; +import { + KEY_AUTH, + ModalEncryptionOnboarding, + setAuthUrl, + useAuth, +} from '@/features/auth'; import { useDocumentEncryption, useUserEncryption, } from '@/features/docs/doc-collaboration'; +import { useVaultClient } from '@/features/docs/doc-collaboration/vault'; +import { EncryptionEmptyState } from '@/features/docs/doc-management/components/EncryptionLayout'; import { KeyMismatchPanel } from '@/features/docs/doc-management/components/KeyMismatchPanel'; import { getDocChildren, subPageToTree } from '@/features/docs/doc-tree/'; import { useSkeletonStore } from '@/features/skeletons'; @@ -102,6 +109,9 @@ const DocPage = ({ id }: DocProps) => { const { authenticated, user } = useAuth(); const [doc, setDoc] = useState(); + const [isOnboardingOpen, setIsOnboardingOpen] = useState(false); + const { isEnabled: isEncryptionEnabled, error: vaultClientError } = + useVaultClient(); const { encryptionLoading, encryptionError } = useUserEncryption(); const { documentEncryptionLoading, @@ -295,112 +305,114 @@ const DocPage = ({ id }: DocProps) => { return ; } - if (doc.is_encrypted && (encryptionError || documentEncryptionError)) { + if (doc.is_encrypted && vaultClientError) { return ( - - - - {t('Encryption keys unavailable')} - - - - {t( - 'This is an encrypted document, but your current device does not have the required encryption keys to decrypt it.', - )} - - - {(encryptionError === 'missing_private_key' || - encryptionError === 'missing_public_key') && ( - - {t( - 'This usually happens when you switch to a new device or browser without restoring your encryption backup, please go to your "Encryption Settings" to fix it.', - )} - - )} - - {documentEncryptionError === 'missing_symmetric_key' && ( - - {t( - 'You do not have access to this encrypted document. Ask the document owner to share it with you again.', - )} - - )} - - {documentEncryptionError === 'decryption_failed' && ( - - {t( - 'Your encryption keys could not decrypt this document. This may happen if your keys were recreated. Ask the document owner to share it with you again.', - )} - - )} - - - {(encryptionError === 'missing_private_key' || - encryptionError === 'missing_public_key') && ( - - - - {t('Restore from backup (recommended)')} - - - {t( - 'If you have previously exported your encryption backup, you can restore it in your account settings to regain access to all your encrypted documents.', - )} - - - - - {t('Recreate encryption keys (not recommended)')} - - - {t( - 'Creating new encryption keys means you will lose access to all previously encrypted documents. Document owners will need to share them with you again.', - )} - - - + + + + + + + } + /> + ); + } - - - - + if (doc.is_encrypted && (encryptionError || documentEncryptionError)) { + const needsSetup = + encryptionError === 'missing_private_key' || + encryptionError === 'missing_public_key'; + + return ( + <> + + + + + {needsSetup && isEncryptionEnabled && ( + + )} + + } + /> + {isOnboardingOpen && ( + setIsOnboardingOpen(false)} + onSuccess={() => setIsOnboardingOpen(false)} + /> + )} + ); } if (encryptionTransition) { return ( - - - - {encryptionTransition === 'encrypting' - ? t('Document encryption in progress, please wait...') - : t('Removing document encryption, please wait...')} - - + ); } diff --git a/src/frontend/apps/impress/src/pages/globals.css b/src/frontend/apps/impress/src/pages/globals.css index 54ff40a24..df6830a36 100644 --- a/src/frontend/apps/impress/src/pages/globals.css +++ b/src/frontend/apps/impress/src/pages/globals.css @@ -20,6 +20,40 @@ body > #__next > .c__app > div:has(> .c__loader) { box-sizing: border-box; } +/* The modals hosting the encryption service's screens use the design system's + 350px "small" modal; Cunningham's small is 300px. */ +.c__modal--small:has(.--docs--encryption-host), +.c__modal--small:has(.--docs--encryption-modal) { + width: 350px; +} + +/* The interface pads its own screens: the modal gives its iframe the bare box. */ +.c__modal:has(.--docs--encryption-host) .c__modal__scroller { + padding: 0; +} + +/* The design system's close control is a zero-height sticky spot inside the + scroller: while the modal does not scroll it sits in the top padding, and once + it scrolls it pins elsewhere, so the cross jumps and the content shows through + around it. Anchoring it to the modal box itself keeps it in the same corner + in every case, and a halo in the modal's colour masks what scrolls under it. */ +.c__modal:has(.--docs--encryption-host) .c__modal__close, +.c__modal:has(.--docs--encryption-modal) .c__modal__close { + position: absolute; + top: 0.4rem; + right: 0.4rem; + height: auto; + z-index: 1; +} + +.c__modal:has(.--docs--encryption-host) .c__modal__close .c__button, +.c__modal:has(.--docs--encryption-modal) .c__modal__close .c__button { + top: 0; + right: 0; + background: var(--c--components--modal--background-color); + box-shadow: 0 0 0 4px var(--c--components--modal--background-color); +} + main ::-webkit-scrollbar, .ReactModalPortal ::-webkit-scrollbar { width: 20px;