785.js.map (63176B)
1 {"version":3,"file":"bundles/12c8185ea2689492c07b/785.js","mappings":"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","sources":["webpack://element-web/./src/async-components/views/dialogs/security/CreateSecretStorageDialog.tsx","webpack://element-web/./src/components/views/auth/PassphraseConfirmField.tsx","webpack://element-web/./src/components/views/auth/PassphraseField.tsx","webpack://element-web/../node_modules/.pnpm/file-saver@2.0.5/node_modules/file-saver/src/FileSaver.js"],"sourcesContent":["/*\nCopyright 2024 New Vector Ltd.\nCopyright 2019, 2020 , 2023 The Matrix.org Foundation C.I.C.\nCopyright 2018, 2019 New Vector Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX, createRef } from \"react\";\nimport FileSaver from \"file-saver\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport { type AuthDict } from \"matrix-js-sdk/src/matrix\";\nimport { type GeneratedSecretStorageKey } from \"matrix-js-sdk/src/crypto-api\";\nimport classNames from \"classnames\";\nimport CheckmarkIcon from \"@vector-im/compound-design-tokens/assets/web/icons/check\";\n\nimport { MatrixClientPeg } from \"../../../../MatrixClientPeg\";\nimport { _t, _td } from \"../../../../languageHandler\";\nimport Modal from \"../../../../Modal\";\nimport { copyNode } from \"../../../../utils/strings\";\nimport { SSOAuthEntry } from \"../../../../components/views/auth/InteractiveAuthEntryComponents\";\nimport PassphraseField from \"../../../../components/views/auth/PassphraseField\";\nimport StyledRadioButton from \"../../../../components/views/elements/StyledRadioButton\";\nimport AccessibleButton from \"../../../../components/views/elements/AccessibleButton\";\nimport DialogButtons from \"../../../../components/views/elements/DialogButtons\";\nimport InlineSpinner from \"../../../../components/views/elements/InlineSpinner\";\nimport { ModuleRunner } from \"../../../../modules/ModuleRunner\";\nimport type Field from \"../../../../components/views/elements/Field\";\nimport BaseDialog from \"../../../../components/views/dialogs/BaseDialog\";\nimport Spinner from \"../../../../components/views/elements/Spinner\";\nimport InteractiveAuthDialog from \"../../../../components/views/dialogs/InteractiveAuthDialog\";\nimport { type IValidationResult } from \"../../../../components/views/elements/Validation\";\nimport PassphraseConfirmField from \"../../../../components/views/auth/PassphraseConfirmField\";\nimport { initialiseDehydrationIfEnabled } from \"../../../../utils/device/dehydration\";\n\nenum SecureBackupSetupMethod {\n Key = \"key\",\n Passphrase = \"passphrase\",\n}\n\n// I made a mistake while converting this and it has to be fixed!\nenum Phase {\n Loading = \"loading\",\n LoadError = \"load_error\",\n ChooseKeyPassphrase = \"choose_key_passphrase\",\n Passphrase = \"passphrase\",\n PassphraseConfirm = \"passphrase_confirm\",\n ShowKey = \"show_key\",\n Storing = \"storing\",\n Stored = \"stored\",\n ConfirmSkip = \"confirm_skip\",\n}\n\nconst PASSWORD_MIN_SCORE = 4; // So secure, many characters, much complex, wow, etc, etc.\n\ninterface IProps {\n forceReset?: boolean;\n onFinished(ok?: boolean): void;\n}\n\ninterface IState {\n phase: Phase;\n passPhrase: string;\n passPhraseValid: boolean;\n passPhraseConfirm: string;\n copied: boolean;\n downloaded: boolean;\n setPassphrase: boolean;\n\n passPhraseKeySelected: string;\n error?: boolean;\n}\n\n/**\n * Walks the user through the process of creating a 4S passphrase and bootstrapping secret storage.\n *\n * If the user already has a key backup, follows a \"migration\" flow (aka \"Upgrade your encryption\") which\n * prompts the user to enter their backup decryption password (a Curve25519 private key, possibly derived\n * from a passphrase), and uses that as the (AES) 4S encryption key.\n *\n * @deprecated send the user to EncryptionUserSettingsTab instead\n */\nexport default class CreateSecretStorageDialog extends React.PureComponent<IProps, IState> {\n public static defaultProps: Partial<IProps> = {\n forceReset: false,\n };\n private recoveryKey?: GeneratedSecretStorageKey;\n private recoveryKeyNode = createRef<HTMLElement>();\n private passphraseField = createRef<Field>();\n\n public constructor(props: IProps) {\n super(props);\n\n const keyFromCustomisations = ModuleRunner.instance.extensions.cryptoSetup.createSecretStorageKey();\n const phase = keyFromCustomisations ? Phase.Loading : Phase.ChooseKeyPassphrase;\n\n this.state = {\n phase,\n passPhrase: \"\",\n passPhraseValid: false,\n passPhraseConfirm: \"\",\n copied: false,\n downloaded: false,\n setPassphrase: false,\n passPhraseKeySelected: SecureBackupSetupMethod.Key,\n };\n }\n\n public componentDidMount(): void {\n const keyFromCustomisations = ModuleRunner.instance.extensions.cryptoSetup.createSecretStorageKey();\n if (keyFromCustomisations) this.initExtension(keyFromCustomisations);\n }\n\n private initExtension(keyFromCustomisations: Uint8Array<ArrayBuffer>): void {\n logger.log(\"CryptoSetupExtension: Created key via extension, jumping to bootstrap step\");\n this.recoveryKey = {\n privateKey: keyFromCustomisations,\n };\n this.bootstrapSecretStorage();\n }\n\n private onKeyPassphraseChange = (e: React.ChangeEvent<HTMLInputElement>): void => {\n this.setState({\n passPhraseKeySelected: e.target.value,\n });\n };\n\n private onChooseKeyPassphraseFormSubmit = async (): Promise<void> => {\n if (this.state.passPhraseKeySelected === SecureBackupSetupMethod.Key) {\n this.recoveryKey = await MatrixClientPeg.safeGet().getCrypto()!.createRecoveryKeyFromPassphrase();\n this.setState({\n copied: false,\n downloaded: false,\n setPassphrase: false,\n phase: Phase.ShowKey,\n });\n } else {\n this.setState({\n copied: false,\n downloaded: false,\n phase: Phase.Passphrase,\n });\n }\n };\n\n private onCopyClick = (): void => {\n const successful = copyNode(this.recoveryKeyNode.current);\n if (successful) {\n this.setState({\n copied: true,\n });\n }\n };\n\n private onDownloadClick = (): void => {\n if (!this.recoveryKey) return;\n const blob = new Blob([this.recoveryKey.encodedPrivateKey!], {\n type: \"text/plain;charset=us-ascii\",\n });\n FileSaver.saveAs(blob, \"security-key.txt\");\n\n this.setState({\n downloaded: true,\n });\n };\n\n private doBootstrapUIAuth = async (makeRequest: (authData: AuthDict) => Promise<void>): Promise<void> => {\n const dialogAesthetics = {\n [SSOAuthEntry.PHASE_PREAUTH]: {\n title: _t(\"auth|uia|sso_title\"),\n body: _t(\"auth|uia|sso_preauth_body\"),\n continueText: _t(\"auth|sso\"),\n continueKind: \"primary\",\n },\n [SSOAuthEntry.PHASE_POSTAUTH]: {\n title: _t(\"encryption|confirm_encryption_setup_title\"),\n body: _t(\"encryption|confirm_encryption_setup_body\"),\n continueText: _t(\"action|confirm\"),\n continueKind: \"primary\",\n },\n };\n\n const { finished } = Modal.createDialog(InteractiveAuthDialog, {\n title: _t(\"encryption|bootstrap_title\"),\n matrixClient: MatrixClientPeg.safeGet(),\n makeRequest,\n aestheticsForStagePhases: {\n [SSOAuthEntry.LOGIN_TYPE]: dialogAesthetics,\n [SSOAuthEntry.UNSTABLE_LOGIN_TYPE]: dialogAesthetics,\n },\n });\n const [confirmed] = await finished;\n if (!confirmed) {\n throw new Error(\"Cross-signing key upload auth canceled\");\n }\n };\n\n private bootstrapSecretStorage = async (): Promise<void> => {\n const cli = MatrixClientPeg.safeGet();\n const crypto = cli.getCrypto()!;\n const { forceReset } = this.props;\n\n let backupInfo;\n // First, unless we know we want to do a reset, we see if there is an existing key backup\n if (!forceReset) {\n try {\n this.setState({ phase: Phase.Loading });\n backupInfo = await crypto.getKeyBackupInfo();\n } catch (e) {\n logger.error(\"Error fetching backup data from server\", e);\n this.setState({ phase: Phase.LoadError });\n return;\n }\n }\n\n this.setState({\n phase: Phase.Storing,\n error: undefined,\n });\n\n try {\n if (forceReset) {\n /* Resetting cross-signing requires secret storage to be reset\n * (otherwise it will try to store the cross-signing keys in the\n * old secret storage, and may prompt for the old key, which is\n * probably not available), and resetting key backup requires\n * cross-signing to be reset (so that the new backup can be\n * signed by the new cross-signing key). So we reset secret\n * storage first, then cross-signing, then key backup.\n */\n logger.log(\"Forcing secret storage reset\");\n await crypto.bootstrapSecretStorage({\n createSecretStorageKey: async () => this.recoveryKey!,\n setupNewSecretStorage: true,\n });\n logger.log(\"Resetting key backup\");\n await crypto.resetKeyBackup();\n } else {\n // For password authentication users after 2020-09, this cross-signing\n // step will be a no-op since it is now setup during registration or login\n // when needed. We should keep this here to cover other cases such as:\n // * Users with existing sessions prior to 2020-09 changes\n // * SSO authentication users which require interactive auth to upload\n // keys (and also happen to skip all post-authentication flows at the\n // moment via token login)\n await crypto.bootstrapCrossSigning({\n authUploadDeviceSigningKeys: this.doBootstrapUIAuth,\n });\n await crypto.bootstrapSecretStorage({\n createSecretStorageKey: async () => this.recoveryKey!,\n setupNewKeyBackup: !backupInfo,\n });\n }\n await initialiseDehydrationIfEnabled(cli, { createNewKey: true });\n\n this.setState({\n phase: Phase.Stored,\n });\n } catch (e) {\n this.setState({ error: true });\n logger.error(\"Error bootstrapping secret storage\", e);\n }\n };\n\n private onCancel = (): void => {\n this.props.onFinished(false);\n };\n\n private onLoadRetryClick = (): void => {\n this.bootstrapSecretStorage();\n };\n\n private onShowKeyContinueClick = (): void => {\n this.bootstrapSecretStorage();\n };\n\n private onCancelClick = (): void => {\n this.setState({ phase: Phase.ConfirmSkip });\n };\n\n private onGoBackClick = (): void => {\n this.setState({ phase: Phase.ChooseKeyPassphrase });\n };\n\n private onPassPhraseNextClick = async (e: React.FormEvent): Promise<void> => {\n e.preventDefault();\n if (!this.passphraseField.current) return; // unmounting\n\n await this.passphraseField.current.validate({ allowEmpty: false });\n if (!this.passphraseField.current.state.valid) {\n this.passphraseField.current.focus();\n this.passphraseField.current.validate({ allowEmpty: false, focused: true });\n return;\n }\n\n this.setState({ phase: Phase.PassphraseConfirm });\n };\n\n private onPassPhraseConfirmNextClick = async (e: React.FormEvent): Promise<void> => {\n e.preventDefault();\n\n if (this.state.passPhrase !== this.state.passPhraseConfirm) return;\n\n this.recoveryKey = await MatrixClientPeg.safeGet()\n .getCrypto()!\n .createRecoveryKeyFromPassphrase(this.state.passPhrase);\n this.setState({\n copied: false,\n downloaded: false,\n setPassphrase: true,\n phase: Phase.ShowKey,\n });\n };\n\n private onSetAgainClick = (): void => {\n this.setState({\n passPhrase: \"\",\n passPhraseValid: false,\n passPhraseConfirm: \"\",\n phase: Phase.Passphrase,\n });\n };\n\n private onPassPhraseValidate = (result: IValidationResult): void => {\n this.setState({\n passPhraseValid: !!result.valid,\n });\n };\n\n private onPassPhraseChange = (e: React.ChangeEvent<HTMLInputElement>): void => {\n this.setState({\n passPhrase: e.target.value,\n });\n };\n\n private onPassPhraseConfirmChange = (e: React.ChangeEvent<HTMLInputElement>): void => {\n this.setState({\n passPhraseConfirm: e.target.value,\n });\n };\n\n private renderOptionKey(): JSX.Element {\n return (\n <StyledRadioButton\n key={SecureBackupSetupMethod.Key}\n value={SecureBackupSetupMethod.Key}\n name=\"keyPassphrase\"\n checked={this.state.passPhraseKeySelected === SecureBackupSetupMethod.Key}\n onChange={this.onKeyPassphraseChange}\n outlined\n >\n <div className=\"mx_CreateSecretStorageDialog_optionTitle\">\n {_t(\"settings|key_backup|setup_secure_backup|generate_security_key_title\")}\n </div>\n <div>{_t(\"settings|key_backup|setup_secure_backup|generate_security_key_description\")}</div>\n </StyledRadioButton>\n );\n }\n\n private renderOptionPassphrase(): JSX.Element {\n return (\n <StyledRadioButton\n key={SecureBackupSetupMethod.Passphrase}\n value={SecureBackupSetupMethod.Passphrase}\n name=\"keyPassphrase\"\n checked={this.state.passPhraseKeySelected === SecureBackupSetupMethod.Passphrase}\n onChange={this.onKeyPassphraseChange}\n outlined\n >\n <div className=\"mx_CreateSecretStorageDialog_optionTitle\">\n {_t(\"settings|key_backup|setup_secure_backup|enter_phrase_title\")}\n </div>\n <div>{_t(\"settings|key_backup|setup_secure_backup|use_phrase_only_you_know\")}</div>\n </StyledRadioButton>\n );\n }\n\n private renderPhaseChooseKeyPassphrase(): JSX.Element {\n const optionKey = this.renderOptionKey();\n const optionPassphrase = this.renderOptionPassphrase();\n\n return (\n <form onSubmit={this.onChooseKeyPassphraseFormSubmit}>\n <p className=\"mx_CreateSecretStorageDialog_centeredBody\">\n {_t(\"settings|key_backup|setup_secure_backup|description\")}\n </p>\n <div className=\"mx_CreateSecretStorageDialog_primaryContainer\" role=\"radiogroup\">\n {optionKey}\n {optionPassphrase}\n </div>\n <DialogButtons\n primaryButton={_t(\"action|continue\")}\n onPrimaryButtonClick={this.onChooseKeyPassphraseFormSubmit}\n onCancel={this.onCancelClick}\n />\n </form>\n );\n }\n\n private renderPhasePassPhrase(): JSX.Element {\n return (\n <form onSubmit={this.onPassPhraseNextClick}>\n <p>{_t(\"settings|key_backup|setup_secure_backup|enter_phrase_description\")}</p>\n\n <div className=\"mx_CreateSecretStorageDialog_passPhraseContainer\">\n <PassphraseField\n id=\"mx_passPhraseInput\"\n className=\"mx_CreateSecretStorageDialog_passPhraseField\"\n onChange={this.onPassPhraseChange}\n minScore={PASSWORD_MIN_SCORE}\n value={this.state.passPhrase}\n onValidate={this.onPassPhraseValidate}\n fieldRef={this.passphraseField}\n autoFocus={true}\n label={_td(\"settings|key_backup|setup_secure_backup|enter_phrase_title\")}\n labelEnterPassword={_td(\"settings|key_backup|setup_secure_backup|enter_phrase_title\")}\n labelStrongPassword={_td(\"settings|key_backup|setup_secure_backup|phrase_strong_enough\")}\n labelAllowedButUnsafe={_td(\"settings|key_backup|setup_secure_backup|phrase_strong_enough\")}\n />\n </div>\n\n <DialogButtons\n primaryButton={_t(\"action|continue\")}\n onPrimaryButtonClick={this.onPassPhraseNextClick}\n hasCancel={false}\n disabled={!this.state.passPhraseValid}\n >\n <button type=\"button\" onClick={this.onCancelClick} className=\"danger\">\n {_t(\"action|cancel\")}\n </button>\n </DialogButtons>\n </form>\n );\n }\n\n private renderPhasePassPhraseConfirm(): JSX.Element {\n let matchText;\n let changeText;\n if (this.state.passPhraseConfirm === this.state.passPhrase) {\n matchText = _t(\"settings|key_backup|setup_secure_backup|pass_phrase_match_success\");\n changeText = _t(\"settings|key_backup|setup_secure_backup|use_different_passphrase\");\n } else if (!this.state.passPhrase.startsWith(this.state.passPhraseConfirm)) {\n // only tell them they're wrong if they've actually gone wrong.\n // Security conscious readers will note that if you left element-web unattended\n // on this screen, this would make it easy for a malicious person to guess\n // your passphrase one letter at a time, but they could get this faster by\n // just opening the browser's developer tools and reading it.\n // Note that not having typed anything at all will not hit this clause and\n // fall through so empty box === no hint.\n matchText = _t(\"settings|key_backup|setup_secure_backup|pass_phrase_match_failed\");\n changeText = _t(\"settings|key_backup|setup_secure_backup|set_phrase_again\");\n }\n\n let passPhraseMatch: JSX.Element | undefined;\n if (matchText) {\n passPhraseMatch = (\n <div>\n <div>{matchText}</div>\n <AccessibleButton kind=\"link\" onClick={this.onSetAgainClick}>\n {changeText}\n </AccessibleButton>\n </div>\n );\n }\n return (\n <form onSubmit={this.onPassPhraseConfirmNextClick}>\n <p>{_t(\"settings|key_backup|setup_secure_backup|enter_phrase_to_confirm\")}</p>\n <div className=\"mx_CreateSecretStorageDialog_passPhraseContainer\">\n <PassphraseConfirmField\n id=\"mx_passPhraseInput\"\n onChange={this.onPassPhraseConfirmChange}\n value={this.state.passPhraseConfirm}\n className=\"mx_CreateSecretStorageDialog_passPhraseField\"\n label={_td(\"settings|key_backup|setup_secure_backup|confirm_security_phrase\")}\n labelRequired={_td(\"settings|key_backup|setup_secure_backup|confirm_security_phrase\")}\n labelInvalid={_td(\"settings|key_backup|setup_secure_backup|pass_phrase_match_failed\")}\n autoFocus={true}\n password={this.state.passPhrase}\n />\n <div className=\"mx_CreateSecretStorageDialog_passPhraseMatch\">{passPhraseMatch}</div>\n </div>\n <DialogButtons\n primaryButton={_t(\"action|continue\")}\n onPrimaryButtonClick={this.onPassPhraseConfirmNextClick}\n hasCancel={false}\n disabled={this.state.passPhrase !== this.state.passPhraseConfirm}\n >\n <button type=\"button\" onClick={this.onCancelClick} className=\"danger\">\n {_t(\"action|skip\")}\n </button>\n </DialogButtons>\n </form>\n );\n }\n\n private renderPhaseShowKey(): JSX.Element {\n let continueButton: JSX.Element;\n if (this.state.phase === Phase.ShowKey) {\n continueButton = (\n <DialogButtons\n primaryButton={_t(\"action|continue\")}\n disabled={!this.state.downloaded && !this.state.copied && !this.state.setPassphrase}\n onPrimaryButtonClick={this.onShowKeyContinueClick}\n hasCancel={false}\n />\n );\n } else {\n continueButton = (\n <div className=\"mx_CreateSecretStorageDialog_continueSpinner\">\n <InlineSpinner />\n </div>\n );\n }\n\n return (\n <div>\n <p>{_t(\"settings|key_backup|setup_secure_backup|security_key_safety_reminder\")}</p>\n <div className=\"mx_CreateSecretStorageDialog_primaryContainer mx_CreateSecretStorageDialog_recoveryKeyPrimarycontainer\">\n <div className=\"mx_CreateSecretStorageDialog_recoveryKeyContainer\">\n <div className=\"mx_CreateSecretStorageDialog_recoveryKey\">\n <code ref={this.recoveryKeyNode}>{this.recoveryKey?.encodedPrivateKey}</code>\n </div>\n <div className=\"mx_CreateSecretStorageDialog_recoveryKeyButtons\">\n <AccessibleButton\n kind=\"primary\"\n className=\"mx_Dialog_primary\"\n onClick={this.onDownloadClick}\n disabled={this.state.phase === Phase.Storing}\n >\n {_t(\"action|download\")}\n </AccessibleButton>\n <span>\n {_t(\"settings|key_backup|setup_secure_backup|download_or_copy\", {\n downloadButton: \"\",\n copyButton: \"\",\n })}\n </span>\n <AccessibleButton\n kind=\"primary\"\n className=\"mx_Dialog_primary mx_CreateSecretStorageDialog_recoveryKeyButtons_copyBtn\"\n onClick={this.onCopyClick}\n disabled={this.state.phase === Phase.Storing}\n >\n {this.state.copied ? _t(\"common|copied\") : _t(\"action|copy\")}\n </AccessibleButton>\n </div>\n </div>\n </div>\n {continueButton}\n </div>\n );\n }\n\n private renderBusyPhase(): JSX.Element {\n return (\n <div>\n <Spinner />\n </div>\n );\n }\n\n private renderStoredPhase(): JSX.Element {\n return (\n <>\n <p className=\"mx_Dialog_content\">\n {_t(\"settings|key_backup|setup_secure_backup|backup_setup_success_description\")}\n </p>\n <DialogButtons\n primaryButton={_t(\"action|done\")}\n onPrimaryButtonClick={() => this.props.onFinished(true)}\n hasCancel={false}\n />\n </>\n );\n }\n\n private renderPhaseLoadError(): JSX.Element {\n return (\n <div>\n <p>{_t(\"settings|key_backup|setup_secure_backup|secret_storage_query_failure\")}</p>\n <div className=\"mx_Dialog_buttons\">\n <DialogButtons\n primaryButton={_t(\"action|retry\")}\n onPrimaryButtonClick={this.onLoadRetryClick}\n onCancel={this.onCancel}\n />\n </div>\n </div>\n );\n }\n\n private renderPhaseSkipConfirm(): JSX.Element {\n return (\n <div>\n <p>{_t(\"settings|key_backup|setup_secure_backup|cancel_warning\")}</p>\n <p>{_t(\"settings|key_backup|setup_secure_backup|settings_reminder\")}</p>\n <DialogButtons\n primaryButton={_t(\"action|go_back\")}\n onPrimaryButtonClick={this.onGoBackClick}\n hasCancel={false}\n >\n <button type=\"button\" className=\"danger\" onClick={this.onCancel}>\n {_t(\"action|cancel\")}\n </button>\n </DialogButtons>\n </div>\n );\n }\n\n private titleForPhase(phase: Phase): string {\n switch (phase) {\n case Phase.ChooseKeyPassphrase:\n return _t(\"encryption|set_up_toast_title\");\n case Phase.Passphrase:\n return _t(\"settings|key_backup|setup_secure_backup|title_set_phrase\");\n case Phase.PassphraseConfirm:\n return _t(\"settings|key_backup|setup_secure_backup|title_confirm_phrase\");\n case Phase.ConfirmSkip:\n return _t(\"common|are_you_sure\");\n case Phase.ShowKey:\n return _t(\"settings|key_backup|setup_secure_backup|title_save_key\");\n case Phase.Storing:\n return _t(\"encryption|bootstrap_title\");\n case Phase.Stored:\n return _t(\"settings|key_backup|setup_secure_backup|backup_setup_success_title\");\n default:\n return \"\";\n }\n }\n\n private get topComponent(): React.ReactNode | null {\n if (this.state.phase === Phase.Stored) {\n return <CheckmarkIcon className=\"mx_Icon mx_Icon_circle-40 mx_Icon_accent mx_Icon_bg-accent-light\" />;\n }\n\n return null;\n }\n\n private get classNames(): string {\n return classNames(\"mx_CreateSecretStorageDialog\", {\n mx_SuccessDialog: this.state.phase === Phase.Stored,\n });\n }\n\n public render(): React.ReactNode {\n let content;\n if (this.state.error) {\n content = (\n <div>\n <p>{_t(\"settings|key_backup|setup_secure_backup|unable_to_setup\")}</p>\n <div className=\"mx_Dialog_buttons\">\n <DialogButtons\n primaryButton={_t(\"action|retry\")}\n onPrimaryButtonClick={this.bootstrapSecretStorage}\n onCancel={this.onCancel}\n />\n </div>\n </div>\n );\n } else {\n switch (this.state.phase) {\n case Phase.Loading:\n content = this.renderBusyPhase();\n break;\n case Phase.LoadError:\n content = this.renderPhaseLoadError();\n break;\n case Phase.ChooseKeyPassphrase:\n content = this.renderPhaseChooseKeyPassphrase();\n break;\n case Phase.Passphrase:\n content = this.renderPhasePassPhrase();\n break;\n case Phase.PassphraseConfirm:\n content = this.renderPhasePassPhraseConfirm();\n break;\n case Phase.ShowKey:\n content = this.renderPhaseShowKey();\n break;\n case Phase.Storing:\n content = this.renderBusyPhase();\n break;\n case Phase.Stored:\n content = this.renderStoredPhase();\n break;\n case Phase.ConfirmSkip:\n content = this.renderPhaseSkipConfirm();\n break;\n }\n }\n\n let titleClass: string | string[] | undefined;\n switch (this.state.phase) {\n case Phase.ChooseKeyPassphrase:\n titleClass = \"mx_CreateSecretStorageDialog_centeredTitle\";\n break;\n }\n\n return (\n <BaseDialog\n className={this.classNames}\n onFinished={this.props.onFinished}\n top={this.topComponent}\n title={this.titleForPhase(this.state.phase)}\n titleClass={titleClass}\n hasCancel={false}\n fixedWidth={false}\n >\n <div>{content}</div>\n </BaseDialog>\n );\n }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type ComponentProps, PureComponent, type Ref } from \"react\";\n\nimport Field, { type IInputProps } from \"../elements/Field\";\nimport withValidation, { type IFieldState, type IValidationResult } from \"../elements/Validation\";\nimport { _t, _td } from \"../../../languageHandler\";\n\ninterface IProps extends Omit<IInputProps, \"onValidate\" | \"label\" | \"element\"> {\n id?: string;\n fieldRef?: Ref<Field>;\n autoComplete?: string;\n value: string;\n password: string; // The password we're confirming\n\n label: TranslationKey;\n labelRequired: TranslationKey;\n labelInvalid: TranslationKey;\n tooltipAlignment?: ComponentProps<typeof Field>[\"tooltipAlignment\"];\n onChange(ev: React.FormEvent<HTMLElement>): void;\n onValidate?(result: IValidationResult): void;\n}\n\nclass PassphraseConfirmField extends PureComponent<IProps> {\n public static defaultProps = {\n label: _td(\"auth|change_password_confirm_label\"),\n labelRequired: _td(\"auth|change_password_confirm_label\"),\n labelInvalid: _td(\"auth|change_password_confirm_invalid\"),\n };\n\n private validate = withValidation({\n rules: [\n {\n key: \"required\",\n test: ({ value, allowEmpty }) => allowEmpty || !!value,\n invalid: () => _t(this.props.labelRequired),\n },\n {\n key: \"match\",\n test: ({ value }) => !value || value === this.props.password,\n invalid: () => _t(this.props.labelInvalid),\n },\n ],\n });\n\n private onValidate = async (fieldState: IFieldState): Promise<IValidationResult> => {\n const result = await this.validate(fieldState);\n if (this.props.onValidate) {\n this.props.onValidate(result);\n }\n\n return result;\n };\n\n public render(): React.ReactNode {\n return (\n <Field\n id={this.props.id}\n ref={this.props.fieldRef}\n type=\"password\"\n label={_t(this.props.label)}\n autoComplete={this.props.autoComplete}\n value={this.props.value}\n onChange={this.props.onChange}\n onValidate={this.onValidate}\n autoFocus={this.props.autoFocus}\n tooltipAlignment={this.props.tooltipAlignment}\n />\n );\n }\n}\n\nexport default PassphraseConfirmField;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type ComponentProps, PureComponent, type Ref } from \"react\";\nimport classNames from \"classnames\";\n\nimport type { ZxcvbnResult } from \"@zxcvbn-ts/core\";\nimport SdkConfig from \"../../../SdkConfig\";\nimport withValidation, { type IFieldState, type IValidationResult } from \"../elements/Validation\";\nimport { _t, _td } from \"../../../languageHandler\";\nimport Field, { type IInputProps } from \"../elements/Field\";\nimport { MatrixClientPeg } from \"../../../MatrixClientPeg\";\n\ninterface IProps extends Omit<IInputProps, \"onValidate\" | \"element\"> {\n autoFocus?: boolean;\n id?: string;\n className?: string;\n minScore: 0 | 1 | 2 | 3 | 4;\n value: string;\n fieldRef?: Ref<Field>;\n // Additional strings such as a username used to catch bad passwords\n userInputs?: string[];\n\n label: TranslationKey;\n labelEnterPassword: TranslationKey;\n labelStrongPassword: TranslationKey;\n labelAllowedButUnsafe: TranslationKey;\n tooltipAlignment?: ComponentProps<typeof Field>[\"tooltipAlignment\"];\n\n onChange(ev: React.FormEvent<HTMLElement>): void;\n onValidate?(result: IValidationResult): void;\n}\n\nclass PassphraseField extends PureComponent<IProps> {\n public static defaultProps = {\n label: _td(\"common|password\"),\n labelEnterPassword: _td(\"auth|password_field_label\"),\n labelStrongPassword: _td(\"auth|password_field_strong_label\"),\n labelAllowedButUnsafe: _td(\"auth|password_field_weak_label\"),\n };\n\n public readonly validate = withValidation<this, ZxcvbnResult | null>({\n description: function (complexity) {\n const score = complexity ? complexity.score : 0;\n return <progress className=\"mx_PassphraseField_progress\" max={4} value={score} />;\n },\n deriveData: async ({ value }): Promise<ZxcvbnResult | null> => {\n if (!value) return null;\n const { scorePassword } = await import(\"../../../utils/PasswordScorer\");\n return scorePassword(MatrixClientPeg.get(), value, this.props.userInputs);\n },\n rules: [\n {\n key: \"required\",\n test: ({ value, allowEmpty }) => allowEmpty || !!value,\n invalid: () => _t(this.props.labelEnterPassword),\n },\n {\n key: \"complexity\",\n test: async function ({ value }, complexity): Promise<boolean> {\n if (!value || !complexity) {\n return false;\n }\n const safe = complexity.score >= this.props.minScore;\n const allowUnsafe = SdkConfig.get(\"dangerously_allow_unsafe_and_insecure_passwords\");\n return allowUnsafe || safe;\n },\n valid: function (complexity) {\n // Unsafe passwords that are valid are only possible through a\n // configuration flag. We'll print some helper text to signal\n // to the user that their password is allowed, but unsafe.\n if (complexity && complexity.score >= this.props.minScore) {\n return _t(this.props.labelStrongPassword);\n }\n return _t(this.props.labelAllowedButUnsafe);\n },\n invalid: function (complexity) {\n if (!complexity) {\n return null;\n }\n const { feedback } = complexity;\n return feedback.warning || feedback.suggestions[0] || _t(\"auth|password_field_keep_going_prompt\");\n },\n },\n ],\n memoize: true,\n });\n\n public onValidate = async (fieldState: IFieldState): Promise<IValidationResult> => {\n const result = await this.validate(fieldState);\n if (this.props.onValidate) {\n this.props.onValidate(result);\n }\n return result;\n };\n\n public render(): React.ReactNode {\n return (\n <Field\n id={this.props.id}\n autoFocus={this.props.autoFocus}\n className={classNames(\"mx_PassphraseField\", this.props.className)}\n ref={this.props.fieldRef}\n type=\"password\"\n autoComplete=\"new-password\"\n label={_t(this.props.label)}\n value={this.props.value}\n onChange={this.props.onChange}\n onValidate={this.onValidate}\n tooltipAlignment={this.props.tooltipAlignment}\n />\n );\n }\n}\n\nexport default PassphraseField;\n","/*\n* FileSaver.js\n* A saveAs() FileSaver implementation.\n*\n* By Eli Grey, http://eligrey.com\n*\n* License : https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md (MIT)\n* source : http://purl.eligrey.com/github/FileSaver.js\n*/\n\n// The one and only way of getting global scope in all environments\n// https://stackoverflow.com/q/3277182/1008999\nvar _global = typeof window === 'object' && window.window === window\n ? window : typeof self === 'object' && self.self === self\n ? self : typeof global === 'object' && global.global === global\n ? global\n : this\n\nfunction bom (blob, opts) {\n if (typeof opts === 'undefined') opts = { autoBom: false }\n else if (typeof opts !== 'object') {\n console.warn('Deprecated: Expected third argument to be a object')\n opts = { autoBom: !opts }\n }\n\n // prepend BOM for UTF-8 XML and text/* types (including HTML)\n // note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF\n if (opts.autoBom && /^\\s*(?:text\\/\\S*|application\\/xml|\\S*\\/\\S*\\+xml)\\s*;.*charset\\s*=\\s*utf-8/i.test(blob.type)) {\n return new Blob([String.fromCharCode(0xFEFF), blob], { type: blob.type })\n }\n return blob\n}\n\nfunction download (url, name, opts) {\n var xhr = new XMLHttpRequest()\n xhr.open('GET', url)\n xhr.responseType = 'blob'\n xhr.onload = function () {\n saveAs(xhr.response, name, opts)\n }\n xhr.onerror = function () {\n console.error('could not download file')\n }\n xhr.send()\n}\n\nfunction corsEnabled (url) {\n var xhr = new XMLHttpRequest()\n // use sync to avoid popup blocker\n xhr.open('HEAD', url, false)\n try {\n xhr.send()\n } catch (e) {}\n return xhr.status >= 200 && xhr.status <= 299\n}\n\n// `a.click()` doesn't work for all browsers (#465)\nfunction click (node) {\n try {\n node.dispatchEvent(new MouseEvent('click'))\n } catch (e) {\n var evt = document.createEvent('MouseEvents')\n evt.initMouseEvent('click', true, true, window, 0, 0, 0, 80,\n 20, false, false, false, false, 0, null)\n node.dispatchEvent(evt)\n }\n}\n\n// Detect WebView inside a native macOS app by ruling out all browsers\n// We just need to check for 'Safari' because all other browsers (besides Firefox) include that too\n// https://www.whatismybrowser.com/guides/the-latest-user-agent/macos\nvar isMacOSWebView = _global.navigator && /Macintosh/.test(navigator.userAgent) && /AppleWebKit/.test(navigator.userAgent) && !/Safari/.test(navigator.userAgent)\n\nvar saveAs = _global.saveAs || (\n // probably in some web worker\n (typeof window !== 'object' || window !== _global)\n ? function saveAs () { /* noop */ }\n\n // Use download attribute first if possible (#193 Lumia mobile) unless this is a macOS WebView\n : ('download' in HTMLAnchorElement.prototype && !isMacOSWebView)\n ? function saveAs (blob, name, opts) {\n var URL = _global.URL || _global.webkitURL\n var a = document.createElement('a')\n name = name || blob.name || 'download'\n\n a.download = name\n a.rel = 'noopener' // tabnabbing\n\n // TODO: detect chrome extensions & packaged apps\n // a.target = '_blank'\n\n if (typeof blob === 'string') {\n // Support regular links\n a.href = blob\n if (a.origin !== location.origin) {\n corsEnabled(a.href)\n ? download(blob, name, opts)\n : click(a, a.target = '_blank')\n } else {\n click(a)\n }\n } else {\n // Support blobs\n a.href = URL.createObjectURL(blob)\n setTimeout(function () { URL.revokeObjectURL(a.href) }, 4E4) // 40s\n setTimeout(function () { click(a) }, 0)\n }\n }\n\n // Use msSaveOrOpenBlob as a second approach\n : 'msSaveOrOpenBlob' in navigator\n ? function saveAs (blob, name, opts) {\n name = name || blob.name || 'download'\n\n if (typeof blob === 'string') {\n if (corsEnabled(blob)) {\n download(blob, name, opts)\n } else {\n var a = document.createElement('a')\n a.href = blob\n a.target = '_blank'\n setTimeout(function () { click(a) })\n }\n } else {\n navigator.msSaveOrOpenBlob(bom(blob, opts), name)\n }\n }\n\n // Fallback to using FileReader and a popup\n : function saveAs (blob, name, opts, popup) {\n // Open a popup immediately do go around popup blocker\n // Mostly only available on user interaction and the fileReader is async so...\n popup = popup || open('', '_blank')\n if (popup) {\n popup.document.title =\n popup.document.body.innerText = 'downloading...'\n }\n\n if (typeof blob === 'string') return download(blob, name, opts)\n\n var force = blob.type === 'application/octet-stream'\n var isSafari = /constructor/i.test(_global.HTMLElement) || _global.safari\n var isChromeIOS = /CriOS\\/[\\d]+/.test(navigator.userAgent)\n\n if ((isChromeIOS || (force && isSafari) || isMacOSWebView) && typeof FileReader !== 'undefined') {\n // Safari doesn't allow downloading of blob URLs\n var reader = new FileReader()\n reader.onloadend = function () {\n var url = reader.result\n url = isChromeIOS ? url : url.replace(/^data:[^;]*;/, 'data:attachment/file;')\n if (popup) popup.location.href = url\n else location = url\n popup = null // reverse-tabnabbing #460\n }\n reader.readAsDataURL(blob)\n } else {\n var URL = _global.URL || _global.webkitURL\n var url = URL.createObjectURL(blob)\n if (popup) popup.location = url\n else location.href = url\n popup = null // reverse-tabnabbing #460\n setTimeout(function () { URL.revokeObjectURL(url) }, 4E4) // 40s\n }\n }\n)\n\n_global.saveAs = saveAs.saveAs = saveAs\n\nif (typeof module !== 'undefined') {\n module.exports = saveAs;\n}\n"],"names":["SecureBackupSetupMethod","Phase","CreateSecretStorageDialog","React","constructor","props","super","_defineProperty","this","createRef","e","setState","passPhraseKeySelected","target","value","async","state","Key","recoveryKey","MatrixClientPeg","safeGet","getCrypto","createRecoveryKeyFromPassphrase","copied","downloaded","setPassphrase","phase","ShowKey","Passphrase","copyNode","recoveryKeyNode","current","blob","Blob","encodedPrivateKey","type","FileSaver","dialogAesthetics","SSOAuthEntry","PHASE_PREAUTH","title","_t","body","continueText","continueKind","PHASE_POSTAUTH","finished","Modal","createDialog","InteractiveAuthDialog","matrixClient","makeRequest","aestheticsForStagePhases","LOGIN_TYPE","UNSTABLE_LOGIN_TYPE","confirmed","Error","cli","crypto","forceReset","backupInfo","Loading","getKeyBackupInfo","logger","error","LoadError","Storing","undefined","log","bootstrapSecretStorage","createSecretStorageKey","setupNewSecretStorage","resetKeyBackup","bootstrapCrossSigning","authUploadDeviceSigningKeys","doBootstrapUIAuth","setupNewKeyBackup","initialiseDehydrationIfEnabled","createNewKey","Stored","onFinished","ConfirmSkip","ChooseKeyPassphrase","preventDefault","passphraseField","validate","allowEmpty","valid","focus","focused","PassphraseConfirm","passPhrase","passPhraseConfirm","passPhraseValid","result","ModuleRunner","instance","extensions","cryptoSetup","componentDidMount","keyFromCustomisations","initExtension","privateKey","renderOptionKey","StyledRadioButton","key","name","checked","onChange","onKeyPassphraseChange","outlined","className","renderOptionPassphrase","renderPhaseChooseKeyPassphrase","optionKey","optionPassphrase","onSubmit","onChooseKeyPassphraseFormSubmit","role","DialogButtons","primaryButton","onPrimaryButtonClick","onCancel","onCancelClick","renderPhasePassPhrase","onPassPhraseNextClick","PassphraseField","id","onPassPhraseChange","minScore","onValidate","onPassPhraseValidate","fieldRef","autoFocus","label","_td","labelEnterPassword","labelStrongPassword","labelAllowedButUnsafe","hasCancel","disabled","onClick","renderPhasePassPhraseConfirm","matchText","changeText","passPhraseMatch","startsWith","AccessibleButton","kind","onSetAgainClick","onPassPhraseConfirmNextClick","PassphraseConfirmField","onPassPhraseConfirmChange","labelRequired","labelInvalid","password","renderPhaseShowKey","_this$recoveryKey","continueButton","onShowKeyContinueClick","InlineSpinner","ref","onDownloadClick","downloadButton","copyButton","onCopyClick","renderBusyPhase","Spinner","renderStoredPhase","renderPhaseLoadError","onLoadRetryClick","renderPhaseSkipConfirm","onGoBackClick","titleForPhase","topComponent","CheckmarkIcon","classNames","mx_SuccessDialog","render","content","titleClass","BaseDialog","top","fixedWidth","PureComponent","args","withValidation","rules","test","invalid","fieldState","Field","autoComplete","tooltipAlignment","__WEBPACK_DEFAULT_EXPORT__","description","complexity","score","max","deriveData","scorePassword","Promise","all","__webpack_require__","then","bind","get","userInputs","safe","SdkConfig","feedback","warning","suggestions","memoize","b","a","autoBom","console","warn","c","d","XMLHttpRequest","open","responseType","onload","g","response","onerror","send","status","dispatchEvent","MouseEvent","document","createEvent","initMouseEvent","window","f","self","global","navigator","userAgent","saveAs","HTMLAnchorElement","prototype","h","i","URL","webkitURL","j","createElement","download","rel","href","origin","location","createObjectURL","setTimeout","revokeObjectURL","msSaveOrOpenBlob","innerText","HTMLElement","safari","FileReader","k","onloadend","replace","readAsDataURL","l","m","module","exports"],"sourceRoot":""}