8481.js.map (52385B)
1 {"version":3,"file":"bundles/12c8185ea2689492c07b/8481.js","mappings":"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","sources":["webpack://element-web/./src/async-components/views/dialogs/QrLoginDialog.tsx","webpack://element-web/./src/components/views/auth/LoginWithQRFlow.tsx","webpack://element-web/./src/components/views/auth/LoginWithQR.tsx"],"sourcesContent":["/*\nCopyright 2026 Element Creations 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 FC, useMemo, useState } from \"react\";\nimport { RendezvousIntent } from \"matrix-js-sdk/src/rendezvous\";\nimport { createClient } from \"matrix-js-sdk/src/matrix\";\n\nimport { type ValidatedServerConfig } from \"../../../utils/ValidatedServerConfig\";\nimport LoginWithQR, { type QrLoginCredentials } from \"../../../components/views/auth/LoginWithQR.tsx\";\nimport { Mode, Phase } from \"../../../components/views/auth/LoginWithQR-types.ts\";\nimport BaseDialog from \"../../../components/views/dialogs/BaseDialog.tsx\";\nimport { _t } from \"../../../languageHandler.tsx\";\n\ninterface Props {\n /**\n * The server config to use for QR code login\n */\n serverConfig: ValidatedServerConfig;\n\n /**\n * Handler for when the dialog is to be closed\n */\n onFinished(this: void): void;\n\n /**\n * Handler for successful completion of QR Login\n * @param credentials - the credentials to log in with\n */\n onLoggedIn(this: void, credentials: QrLoginCredentials): Promise<void>;\n}\n\n/**\n * Dialog for facilitating the Login with QR flow, shown from DefaultWelcome.\n */\nconst QrLoginDialog: FC<Props> = ({ serverConfig, onLoggedIn, onFinished }) => {\n const tempClient = useMemo(() => createClient({ baseUrl: serverConfig.hsUrl }), [serverConfig]);\n\n const [phase, setPhase] = useState<Phase>();\n\n const hasCancel = phase === Phase.ShowingQR;\n\n return (\n <BaseDialog\n onFinished={onFinished}\n hasCancel={hasCancel}\n aria-label={_t(\"auth|sign_in_with_qr\")}\n fixedWidth={false}\n >\n <LoginWithQR\n intent={RendezvousIntent.LOGIN_ON_NEW_DEVICE}\n client={tempClient}\n onFinished={onFinished}\n onLoggedIn={onLoggedIn}\n mode={Mode.Show}\n onPhaseChange={setPhase}\n />\n </BaseDialog>\n );\n};\n\nexport default QrLoginDialog;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022-2024 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, createRef, type JSX, type ReactNode } from \"react\";\nimport { ClientRendezvousFailureReason, MSC4108FailureReason, RendezvousIntent } from \"matrix-js-sdk/src/rendezvous\";\nimport ChevronLeftIcon from \"@vector-im/compound-design-tokens/assets/web/icons/chevron-left\";\nimport CheckCircleSolidIcon from \"@vector-im/compound-design-tokens/assets/web/icons/check-circle-solid\";\nimport ErrorIcon from \"@vector-im/compound-design-tokens/assets/web/icons/error-solid\";\nimport { BigIcon, Button, Heading, MFAInput, Text } from \"@vector-im/compound-web\";\nimport classNames from \"classnames\";\nimport { LockSolidIcon, MobileIcon, QrCodeIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\n\nimport { _t } from \"../../../languageHandler\";\nimport AccessibleButton from \"../elements/AccessibleButton\";\nimport QRCode from \"../elements/QRCode\";\nimport Spinner from \"../elements/Spinner\";\nimport { Click, Phase } from \"./LoginWithQR-types\";\nimport SdkConfig from \"../../../SdkConfig\";\nimport { type FailureReason, LoginWithQRFailureReason } from \"./LoginWithQR\";\nimport { ErrorMessage } from \"../../structures/ErrorMessage\";\n\ninterface Props {\n /**\n * The phase the flow is to be rendered in\n */\n phase: Phase;\n /**\n * The QR code data to render in Phase.ShowingQR\n */\n code?: Uint8Array;\n /**\n * The intent mode of the flow (login or reciprocate).\n */\n intent: RendezvousIntent;\n /**\n * State transition handler\n * @param type the type of transition to take\n * @param checkCodeEntered the check code entered, only present for Click.Approve\n */\n onClick(type: Click, checkCodeEntered?: string): Promise<void>;\n /**\n * The failure reason to render in Phase.Error\n */\n failureReason?: FailureReason;\n /**\n * The 6 digit user code to render in Phase.WaitingForDevice\n */\n userCode?: string;\n}\n\n/**\n * A component that implements the UI for sign in and E2EE set up by rendering a QR code in both login & reciprocate directions.\n *\n * Implements the v2024 version of MSC4108: https://github.com/matrix-org/matrix-spec-proposals/pull/4108\n */\nexport default class LoginWithQRFlow extends React.Component<Props> {\n private checkCodeInput = createRef<HTMLInputElement>();\n\n private handleClick = (type: Click): ((e: React.FormEvent) => Promise<void>) => {\n return async (e: React.FormEvent): Promise<void> => {\n e.preventDefault();\n await this.props.onClick(type, type === Click.Approve ? this.checkCodeInput.current?.value : undefined);\n };\n };\n\n private cancelButton = (): JSX.Element => (\n <Button data-testid=\"cancel-button\" kind=\"primary\" size=\"lg\" onClick={this.handleClick(Click.Cancel)}>\n {_t(\"action|cancel\")}\n </Button>\n );\n\n private simpleSpinner = (description?: string): JSX.Element => {\n return (\n <div className=\"mx_LoginWithQR_spinner\">\n <div>\n <Spinner />\n {description && <p>{description}</p>}\n </div>\n </div>\n );\n };\n\n public render(): React.ReactNode {\n let main: JSX.Element | undefined;\n let buttons: JSX.Element | undefined;\n let backButton = true;\n let className = \"\";\n\n switch (this.props.phase) {\n case Phase.Error: {\n backButton = false;\n buttons = (\n <Button kind=\"primary\" size=\"lg\" onClick={this.handleClick(Click.ShowQr)}>\n {this.props.intent === RendezvousIntent.LOGIN_ON_NEW_DEVICE\n ? _t(\"auth|qr_code_login|start_over\")\n : _t(\"action|try_again\")}\n </Button>\n );\n\n let Icon = ErrorIcon;\n let iconKind: ComponentProps<typeof BigIcon>[\"kind\"] = \"critical\";\n let title: string | undefined;\n let message: ReactNode | undefined;\n\n switch (this.props.failureReason) {\n case MSC4108FailureReason.UnsupportedProtocol:\n title = _t(\"auth|qr_code_login|error_unsupported_protocol_title\");\n message = _t(\"auth|qr_code_login|error_unsupported_protocol\");\n break;\n\n case MSC4108FailureReason.UserCancelled:\n title = _t(\"auth|qr_code_login|error_user_cancelled_title\");\n message = _t(\"auth|qr_code_login|error_user_cancelled\");\n if (this.props.intent === RendezvousIntent.LOGIN_ON_NEW_DEVICE) {\n buttons = this.cancelButton();\n }\n break;\n\n case MSC4108FailureReason.AuthorizationExpired:\n case ClientRendezvousFailureReason.Expired:\n title = _t(\"auth|qr_code_login|error_expired_title\");\n message = _t(\"auth|qr_code_login|error_expired\");\n break;\n\n case ClientRendezvousFailureReason.InsecureChannelDetected:\n title = _t(\"auth|qr_code_login|error_insecure_channel_detected_title\");\n message = (\n <>\n {_t(\"auth|qr_code_login|error_insecure_channel_detected\")}\n\n <Text as=\"h2\" size=\"lg\" weight=\"semibold\" data-testid=\"cancellation-message\">\n {_t(\"auth|qr_code_login|error_insecure_channel_detected_instructions\")}\n </Text>\n <ol>\n <li>{_t(\"auth|qr_code_login|error_insecure_channel_detected_instructions_1\")}</li>\n <li>{_t(\"auth|qr_code_login|error_insecure_channel_detected_instructions_2\")}</li>\n <li>{_t(\"auth|qr_code_login|error_insecure_channel_detected_instructions_3\")}</li>\n </ol>\n </>\n );\n break;\n\n case ClientRendezvousFailureReason.OtherDeviceAlreadySignedIn:\n iconKind = \"success\";\n Icon = CheckCircleSolidIcon;\n title = _t(\"auth|qr_code_login|error_other_device_already_signed_in_title\");\n message = _t(\"auth|qr_code_login|error_other_device_already_signed_in\");\n break;\n\n case ClientRendezvousFailureReason.UserDeclined:\n title = _t(\"auth|qr_code_login|error_user_declined_title\");\n message = _t(\"auth|qr_code_login|error_user_declined\");\n if (this.props.intent === RendezvousIntent.LOGIN_ON_NEW_DEVICE) {\n buttons = this.cancelButton();\n }\n break;\n\n case LoginWithQRFailureReason.RateLimited:\n title = _t(\"error|something_went_wrong\");\n message = _t(\"auth|qr_code_login|error_rate_limited\");\n break;\n\n case ClientRendezvousFailureReason.ETagMissing:\n title = _t(\"error|something_went_wrong\");\n message = _t(\"auth|qr_code_login|error_etag_missing\");\n break;\n\n case ClientRendezvousFailureReason.HomeserverLacksSupport:\n Icon = QrCodeIcon;\n backButton = true;\n title = _t(\"auth|qr_code_login|unsupported_heading\");\n message = _t(\"auth|qr_code_login|unsupported_explainer\");\n if (this.props.intent === RendezvousIntent.LOGIN_ON_NEW_DEVICE) {\n buttons = this.cancelButton();\n }\n break;\n\n case MSC4108FailureReason.DeviceAlreadyExists:\n case MSC4108FailureReason.DeviceNotFound:\n case MSC4108FailureReason.UnexpectedMessageReceived:\n case ClientRendezvousFailureReason.OtherDeviceNotSignedIn:\n case ClientRendezvousFailureReason.Unknown:\n default:\n title = _t(\"error|something_went_wrong\");\n message = _t(\"auth|qr_code_login|error_unexpected\");\n break;\n }\n className = \"mx_LoginWithQR_error\";\n main = (\n <>\n <BigIcon kind={iconKind}>\n <Icon />\n </BigIcon>\n <Heading as=\"h1\" size=\"sm\" weight=\"semibold\">\n {title}\n </Heading>\n {typeof message === \"object\" ? message : <p data-testid=\"cancellation-message\">{message}</p>}\n </>\n );\n break;\n }\n case Phase.OutOfBandConfirmation:\n backButton = false;\n main = (\n <>\n {this.props.intent === RendezvousIntent.LOGIN_ON_NEW_DEVICE && (\n <BigIcon>\n <MobileIcon />\n </BigIcon>\n )}\n <Heading as=\"h1\" size=\"sm\" weight=\"semibold\">\n {_t(\"auth|qr_code_login|check_code_heading\")}\n </Heading>\n <Text size=\"md\">{_t(\"auth|qr_code_login|check_code_explainer\")}</Text>\n <label htmlFor=\"mx_LoginWithQR_checkCode\">\n {_t(\"auth|qr_code_login|check_code_input_label\")}\n </label>\n <MFAInput\n className=\"mx_LoginWithQR_checkCode_input mx_no_textinput\"\n ref={this.checkCodeInput}\n length={2}\n autoFocus\n id=\"mx_LoginWithQR_checkCode\"\n data-invalid={\n this.props.failureReason === LoginWithQRFailureReason.CheckCodeMismatch\n ? true\n : undefined\n }\n />\n <ErrorMessage\n message={\n this.props.failureReason === LoginWithQRFailureReason.CheckCodeMismatch\n ? _t(\"auth|qr_code_login|check_code_mismatch\")\n : null\n }\n />\n </>\n );\n\n buttons = (\n <>\n <Button\n data-testid=\"approve-login-button\"\n kind=\"primary\"\n size=\"lg\"\n onClick={this.handleClick(Click.Approve)}\n >\n {_t(\"action|continue\")}\n </Button>\n <Button\n data-testid=\"decline-login-button\"\n kind=\"tertiary\"\n size=\"lg\"\n onClick={this.handleClick(Click.Decline)}\n >\n {_t(\"action|cancel\")}\n </Button>\n </>\n );\n break;\n case Phase.ShowingQR: {\n let steps: ReactNode[];\n if (this.props.intent === RendezvousIntent.LOGIN_ON_NEW_DEVICE) {\n steps = [\n _t(\"auth|qr_code_login|open_element_mobile_device\", {\n brand: SdkConfig.get().brand,\n }),\n _t(\"auth|qr_code_login|tap_avatar_link_new_device\", {\n linkNewDevice: <strong>{_t(\"settings|sessions|sign_in_with_qr\")}</strong>,\n }),\n _t(\"auth|qr_code_login|choose_desktop_computer\", {\n desktopComputer: <strong>{_t(\"auth|qr_code_login|desktop_computer\")}</strong>,\n }),\n _t(\"auth|qr_code_login|select_ready_to_scan\", {\n readyToScan: <strong>{_t(\"auth|qr_code_login|ready_to_scan\")}</strong>,\n }),\n _t(\"auth|qr_code_login|follow_remaining_instructions\"),\n ];\n } else {\n steps = [\n _t(\"auth|qr_code_login|open_element_other_device\", {\n brand: SdkConfig.get().brand,\n }),\n _t(\"auth|qr_code_login|select_qr_code\", {\n scanQRCode: <strong>{_t(\"auth|qr_code_login|scan_qr_code\")}</strong>,\n }),\n _t(\"auth|qr_code_login|point_the_camera\"),\n _t(\"auth|qr_code_login|follow_remaining_instructions\"),\n ];\n }\n\n main = (\n <>\n <Heading as=\"h1\" size=\"sm\" weight=\"semibold\">\n {this.props.intent === RendezvousIntent.LOGIN_ON_NEW_DEVICE\n ? _t(\"auth|qr_code_login|scan_code_instruction\")\n : _t(\"auth|qr_code_login|scan_code_instruction_reciprocate\")}\n </Heading>\n <div className=\"mx_LoginWithQR_qrWrapper\">\n {this.props.code ? (\n <QRCode data={[{ data: this.props.code, mode: \"byte\" }]} width={200} />\n ) : (\n <Spinner />\n )}\n </div>\n <ol>\n {steps.map((step, i) => (\n <li key={this.props.intent + i}>{step}</li>\n ))}\n </ol>\n </>\n );\n break;\n }\n case Phase.Loading:\n main = this.simpleSpinner();\n break;\n case Phase.WaitingForDevice:\n main =\n this.props.intent === RendezvousIntent.LOGIN_ON_NEW_DEVICE ? (\n <>\n <BigIcon>\n <LockSolidIcon />\n </BigIcon>\n <Heading as=\"h1\" size=\"sm\" weight=\"semibold\">\n {_t(\"auth|qr_code_login|security_code_title\")}\n </Heading>\n <Text size=\"md\">{_t(\"auth|qr_code_login|security_code_prompt\")}</Text>\n <MFAInput\n className=\"mx_LoginWithQR_checkCode_input mx_no_textinput\"\n length={6}\n value={this.props.userCode}\n disabled\n />\n {this.simpleSpinner(_t(\"auth|qr_code_login|waiting_for_device\"))}\n </>\n ) : (\n this.simpleSpinner(_t(\"auth|qr_code_login|waiting_for_device\"))\n );\n buttons = this.cancelButton();\n break;\n case Phase.Verifying:\n main = this.simpleSpinner(_t(\"auth|qr_code_login|completing_setup\"));\n break;\n }\n\n return (\n <div data-testid=\"login-with-qr\" className={classNames(\"mx_LoginWithQR\", className)}>\n {this.props.intent === RendezvousIntent.RECIPROCATE_LOGIN_ON_EXISTING_DEVICE && backButton ? (\n <div className=\"mx_LoginWithQR_heading\">\n <AccessibleButton\n data-testid=\"back-button\"\n className=\"mx_LoginWithQR_BackButton\"\n onClick={this.handleClick(Click.Cancel)}\n title={_t(\"action|back\")}\n >\n <ChevronLeftIcon />\n </AccessibleButton>\n <div className=\"mx_LoginWithQR_breadcrumbs\">\n {_t(\"settings|sessions|title\")} / {_t(\"settings|sessions|sign_in_with_qr\")}\n </div>\n </div>\n ) : null}\n <div className=\"mx_LoginWithQR_main\">{main}</div>\n <div className=\"mx_LoginWithQR_buttons\">{buttons}</div>\n </div>\n );\n }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 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 from \"react\";\nimport {\n ClientRendezvousFailureReason,\n linkNewDeviceByGeneratingQR,\n MSC4108FailureReason,\n MSC4108SignInWithQR,\n RendezvousError,\n type RendezvousFailureReason,\n RendezvousIntent,\n signInByGeneratingQR,\n} from \"matrix-js-sdk/src/rendezvous\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport {\n AutoDiscovery,\n MatrixClient,\n OAuthGrantType,\n type ValidatedAuthMetadata,\n type XOR,\n} from \"matrix-js-sdk/src/matrix\";\nimport { sleep } from \"matrix-js-sdk/src/utils\";\nimport { secureRandomString } from \"matrix-js-sdk/src/randomstring\";\n\nimport { Click, Mode, Phase } from \"./LoginWithQR-types\";\nimport LoginWithQRFlow from \"./LoginWithQRFlow\";\nimport { type CompleteOAuthLoginResponse } from \"../../../utils/oauth/authorize\";\nimport { getOAuthClientId } from \"../../../utils/oauth/registerClient.ts\";\nimport SdkConfig from \"../../../SdkConfig.ts\";\nimport { type Context } from \"../../../utils/oauth/persistOAuthSettings.ts\";\n\nexport type QrLoginCredentials = CompleteOAuthLoginResponse &\n Awaited<ReturnType<MSC4108SignInWithQR[\"shareSecrets\"]>> & {\n deviceId: string;\n };\n\ntype BaseProps = {\n /**\n * The MatrixClient to use for the rendezvous communication with the other device.\n */\n client: MatrixClient;\n /**\n * Whether to show a QR code or facilitate scanning one. Only Mode.Show is currently supported.\n */\n mode: Mode;\n /**\n * Callback when the internal phase state has changed\n * @param phase - the new phase which is being entered\n */\n onPhaseChange?(phase: Phase): void;\n /**\n * Callback when the flow is concluded\n * @param success - whether it was successful\n */\n onFinished(this: void, success?: boolean): void;\n};\n\ntype Props = XOR<\n {\n /**\n * Intent to facilitate logging into this device from an existing device\n */\n intent: RendezvousIntent.LOGIN_ON_NEW_DEVICE;\n /**\n * Callback for successful login\n * @param credentials - the credentials to authenticate with\n */\n onLoggedIn(credentials: QrLoginCredentials): Promise<void>;\n },\n {\n /**\n * Intent to facilitate logging into another device from this existing device\n */\n intent: RendezvousIntent.RECIPROCATE_LOGIN_ON_EXISTING_DEVICE;\n }\n> &\n BaseProps;\n\ninterface IState {\n /**\n * The current phase of the flow\n */\n phase: Phase;\n /**\n * The rendezvous channel in use\n */\n rendezvous?: MSC4108SignInWithQR;\n /**\n * TODO\n */\n verificationUri?: string;\n /**\n * TODO\n */\n userCode?: string;\n /**\n * TODO\n */\n checkCode?: string;\n /**\n * TODO\n */\n failureReason?: FailureReason;\n /**\n * Details of the server we are logging into, set after initial protocol negotiation.\n */\n loginServerDetails?: Pick<Context, \"homeserverUrl\" | \"identityServerUrl\" | \"metadata\"> &\n Pick<Context[\"authContext\"], \"clientId\">;\n}\n\nexport enum LoginWithQRFailureReason {\n RateLimited = \"rate_limited\",\n CheckCodeMismatch = \"check_code_mismatch\",\n}\n\nexport type FailureReason = RendezvousFailureReason | LoginWithQRFailureReason;\n\n/**\n * Resolve a server name or baseURL to the homeserver & identity server URLs.\n * @param serverNameOrBaseUrl the name or URL to resolve\n * Whilst the 2024 version of MSC4108 says that we always get a server name, in practise the\n * rust-sdk is currently misbehaving and we may receive a base URL instead. Additionally, the 2025\n * version of MSC4108 will always give the base URL.\n * As such, we should be resilient and support both formats until the spec and implementations have\n * stabilised.\n */\nasync function resolveServerURLs(\n serverNameOrBaseUrl: string,\n): Promise<Pick<Partial<Context>, \"homeserverUrl\" | \"identityServerUrl\">> {\n if (serverNameOrBaseUrl.startsWith(\"http://\") || serverNameOrBaseUrl.startsWith(\"https://\")) {\n // treat as base URL and skip discovery\n return {\n homeserverUrl: serverNameOrBaseUrl,\n };\n }\n\n // treat as server name and do discovery\n const clientConfig = await AutoDiscovery.findClientConfig(serverNameOrBaseUrl);\n const homeserverUrl = clientConfig?.[\"m.homeserver\"]?.base_url ?? undefined;\n\n const identityServerUrl = clientConfig?.[\"m.identity_server\"]?.base_url ?? undefined;\n\n return {\n homeserverUrl,\n identityServerUrl,\n };\n}\n\n/**\n * A component that allows sign in and E2EE set up with a QR code.\n *\n * It implements `login.reciprocate` & `login.start` capabilities and showing QR codes.\n * It does not implement any flows requiring the scanning of QR codes.\n *\n * Implements the v2024 version of MSC4108: https://github.com/matrix-org/matrix-spec-proposals/pull/4108\n */\nexport default class LoginWithQR extends React.Component<Props, IState> {\n private finished = false;\n private abortController?: AbortController;\n\n public constructor(props: Props) {\n super(props);\n\n this.state = {\n phase: Phase.Loading,\n };\n this.props.onPhaseChange?.(this.state.phase);\n }\n\n public componentDidMount(): void {\n void this.updateMode(this.props.mode);\n }\n\n public componentDidUpdate(prevProps: Readonly<Props>, prevState: Readonly<IState>): void {\n if (prevState.phase !== this.state.phase) {\n this.props.onPhaseChange?.(this.state.phase);\n }\n\n if (prevProps.mode !== this.props.mode) {\n void this.updateMode(this.props.mode);\n }\n }\n\n private async updateMode(mode: Mode, showLoading = true): Promise<void> {\n this.abortController?.abort();\n this.abortController = new AbortController();\n this.setState({ rendezvous: undefined });\n if (showLoading) {\n this.setState({ phase: Phase.Loading });\n }\n\n if (mode === Mode.Show) {\n await this.generateAndShowCode(this.abortController);\n }\n }\n\n public componentWillUnmount(): void {\n if (!this.finished) {\n this.abortController?.abort();\n }\n }\n\n private onFinished(success: boolean): void {\n this.finished = true;\n if (!success) {\n this.abortController?.abort();\n }\n this.props.onFinished(success);\n }\n\n private generateAndShowCode = async (abortController: AbortController): Promise<void> => {\n let rendezvous: MSC4108SignInWithQR;\n try {\n rendezvous =\n this.props.intent === RendezvousIntent.LOGIN_ON_NEW_DEVICE\n ? await signInByGeneratingQR(this.props.client, this.onFailure, abortController.signal)\n : await linkNewDeviceByGeneratingQR(this.props.client, this.onFailure, abortController.signal);\n if (abortController.signal.aborted) return;\n this.setState({\n phase: Phase.ShowingQR,\n rendezvous,\n failureReason: undefined,\n });\n } catch (e) {\n if (abortController.signal.aborted) return;\n logger.error(\"Error whilst generating QR code\", e);\n this.setState({ phase: Phase.Error, failureReason: ClientRendezvousFailureReason.HomeserverLacksSupport });\n return;\n }\n\n try {\n if (this.props.intent === RendezvousIntent.RECIPROCATE_LOGIN_ON_EXISTING_DEVICE) {\n // MSC4108-Flow: NewScanned\n await rendezvous.negotiateProtocols();\n const { verificationUri } = await rendezvous.deviceAuthorizationGrant();\n this.setState({\n phase: Phase.OutOfBandConfirmation,\n verificationUri,\n });\n } else {\n const { serverName } = await rendezvous.negotiateProtocols();\n const { homeserverUrl, identityServerUrl } = await resolveServerURLs(serverName!);\n\n if (!homeserverUrl) {\n this.setState({ phase: Phase.Error, failureReason: ClientRendezvousFailureReason.Unknown });\n logger.error(\"Failed to discover homeserver URL\");\n throw new Error(\"Failed to discover homeserver URL\");\n }\n\n let metadata: ValidatedAuthMetadata;\n let clientId: string;\n try {\n // Create a new client as the homeserver URL may not be the same as we used for the secure channel\n metadata = await new MatrixClient({ baseUrl: homeserverUrl }).getAuthMetadata();\n if (!metadata.grant_types_supported.includes(OAuthGrantType.DeviceAuthorization)) {\n throw new Error(\"Server does not support Device Authorization Grant\");\n }\n clientId = await getOAuthClientId(metadata, SdkConfig.get().oidc_static_clients);\n } catch (e) {\n this.setState({\n phase: Phase.Error,\n failureReason: ClientRendezvousFailureReason.HomeserverLacksSupport,\n });\n logger.error(\"Failed to register OIDC Client ID\", e);\n throw new Error(\"Failed to register OIDC Client ID\", { cause: e });\n }\n\n this.setState({\n phase: Phase.OutOfBandConfirmation,\n loginServerDetails: {\n homeserverUrl,\n identityServerUrl,\n metadata,\n clientId,\n },\n });\n }\n\n // we ask the user to confirm that the channel is secure\n } catch (e: RendezvousError | unknown) {\n if (abortController.signal.aborted) return;\n logger.error(\"Error whilst approving login\", e);\n await rendezvous.cancel(\n e instanceof RendezvousError ? (e.code as MSC4108FailureReason) : ClientRendezvousFailureReason.Unknown,\n );\n }\n };\n\n private approveLogin = async (checkCode: string | undefined): Promise<void> => {\n if (!(this.state.rendezvous instanceof MSC4108SignInWithQR)) {\n this.setState({ phase: Phase.Error, failureReason: ClientRendezvousFailureReason.Unknown });\n throw new Error(\"Rendezvous not found\");\n }\n\n if (this.state.rendezvous?.checkCode !== checkCode) {\n this.setState({ failureReason: LoginWithQRFailureReason.CheckCodeMismatch });\n return;\n }\n\n try {\n if (this.props.intent === RendezvousIntent.RECIPROCATE_LOGIN_ON_EXISTING_DEVICE) {\n // MSC4108-Flow: NewScanned\n this.setState({ phase: Phase.Loading });\n\n if (this.state.verificationUri) {\n window.open(this.state.verificationUri, \"_blank\");\n }\n\n this.setState({ phase: Phase.WaitingForDevice });\n\n // send secrets\n await this.state.rendezvous.shareSecrets();\n\n // done\n this.onFinished(true);\n } else {\n if (!this.state.loginServerDetails) {\n this.setState({ phase: Phase.Error, failureReason: ClientRendezvousFailureReason.Unknown });\n throw new Error(\"Server details not found in state\");\n }\n\n const { homeserverUrl, identityServerUrl, clientId, metadata } = this.state.loginServerDetails;\n\n // Generate our new device ID\n const deviceId = secureRandomString(10);\n const { userCode } = await this.state.rendezvous.deviceAuthorizationGrant({\n metadata,\n clientId,\n deviceId,\n });\n this.setState({ phase: Phase.WaitingForDevice, userCode });\n\n const tokenResponse = await this.state.rendezvous.completeLoginOnNewDevice({ clientId });\n\n if (tokenResponse) {\n const { secrets } = await this.state.rendezvous.shareSecrets();\n\n await this.props.onLoggedIn({\n accessToken: tokenResponse.access_token,\n refreshToken: tokenResponse.refresh_token,\n homeserverUrl,\n clientId,\n identityServerUrl,\n secrets,\n deviceId,\n });\n\n this.onFinished(true);\n }\n }\n } catch (e: RendezvousError | unknown) {\n logger.error(\"Error whilst approving sign in\", e);\n this.setState({\n phase: Phase.Error,\n failureReason: e instanceof RendezvousError ? e.code : ClientRendezvousFailureReason.Unknown,\n });\n }\n };\n\n private onFailure = async (reason: RendezvousFailureReason): Promise<void> => {\n if (this.state.phase === Phase.Error) return; // Already in failed state\n logger.warn(`Rendezvous failed: ${reason}`);\n\n // Generate a new rendezvous channel & qr code if we hit expiry whilst still showing the QR code\n if (reason === ClientRendezvousFailureReason.Expired && this.state.phase === Phase.ShowingQR) {\n try {\n this.reset();\n // Add a sleep to make the UX looks less flickery and more intentional\n await sleep(1000);\n await this.updateMode(Mode.Show, false);\n return;\n } catch (e) {\n logger.warn(\"Failed to re-roll qr code on expiry\", e);\n }\n }\n this.setState({ phase: Phase.Error, failureReason: reason });\n };\n\n public reset(): void {\n this.abortController?.abort();\n this.setState({\n rendezvous: undefined,\n verificationUri: undefined,\n failureReason: undefined,\n userCode: undefined,\n });\n }\n\n private onClick = async (type: Click, checkCode?: string): Promise<void> => {\n switch (type) {\n case Click.Cancel:\n await this.state.rendezvous?.cancel(MSC4108FailureReason.UserCancelled);\n this.onFinished(false);\n break;\n case Click.Approve:\n await this.approveLogin(checkCode);\n break;\n case Click.Decline:\n if (this.props.intent === RendezvousIntent.LOGIN_ON_NEW_DEVICE) {\n await this.state.rendezvous?.cancel(MSC4108FailureReason.UserCancelled);\n } else {\n await this.state.rendezvous?.declineLoginOnExistingDevice();\n }\n this.onFinished(false);\n break;\n case Click.ShowQr:\n await this.updateMode(Mode.Show);\n break;\n }\n };\n\n public render(): React.ReactNode {\n return (\n <LoginWithQRFlow\n onClick={this.onClick}\n phase={this.state.phase}\n code={this.state.phase === Phase.ShowingQR ? this.state.rendezvous?.code : undefined}\n failureReason={this.state.failureReason}\n userCode={this.state.userCode}\n intent={this.props.intent}\n />\n );\n }\n}\n"],"names":["__WEBPACK_DEFAULT_EXPORT__","QrLoginDialog","serverConfig","onLoggedIn","onFinished","tempClient","useMemo","createClient","baseUrl","hsUrl","phase","setPhase","useState","hasCancel","Phase","ShowingQR","React","BaseDialog","_t","fixedWidth","LoginWithQR","intent","RendezvousIntent","LOGIN_ON_NEW_DEVICE","client","mode","Mode","Show","onPhaseChange","LoginWithQRFlow","constructor","args","super","_defineProperty","this","createRef","type","async","_this$checkCodeInput$","e","preventDefault","props","onClick","Click","Approve","checkCodeInput","current","value","undefined","Button","kind","size","handleClick","Cancel","description","className","Spinner","render","main","buttons","backButton","Error","ShowQr","title","message","Icon","ErrorIcon","iconKind","failureReason","MSC4108FailureReason","UnsupportedProtocol","UserCancelled","cancelButton","AuthorizationExpired","ClientRendezvousFailureReason","Expired","InsecureChannelDetected","Text","as","weight","OtherDeviceAlreadySignedIn","CheckCircleSolidIcon","UserDeclined","LoginWithQRFailureReason","RateLimited","ETagMissing","HomeserverLacksSupport","QrCodeIcon","DeviceAlreadyExists","DeviceNotFound","UnexpectedMessageReceived","OtherDeviceNotSignedIn","Unknown","BigIcon","Heading","OutOfBandConfirmation","MobileIcon","htmlFor","MFAInput","ref","length","autoFocus","id","CheckCodeMismatch","ErrorMessage","Decline","steps","brand","SdkConfig","get","linkNewDevice","desktopComputer","readyToScan","scanQRCode","code","QRCode","data","width","map","step","i","key","Loading","simpleSpinner","WaitingForDevice","LockSolidIcon","userCode","disabled","Verifying","classNames","RECIPROCATE_LOGIN_ON_EXISTING_DEVICE","AccessibleButton","ChevronLeftIcon","_this$props$onPhaseCh","_this$props","rendezvous","signInByGeneratingQR","onFailure","abortController","signal","linkNewDeviceByGeneratingQR","aborted","setState","logger","error","negotiateProtocols","verificationUri","deviceAuthorizationGrant","serverName","homeserverUrl","identityServerUrl","serverNameOrBaseUrl","_clientConfig$mHomes","_clientConfig$mHomes2","_clientConfig$mIdent","_clientConfig$mIdent2","startsWith","clientConfig","AutoDiscovery","findClientConfig","base_url","resolveServerURLs","metadata","clientId","MatrixClient","getAuthMetadata","grant_types_supported","includes","OAuthGrantType","DeviceAuthorization","getOAuthClientId","oidc_static_clients","cause","loginServerDetails","cancel","RendezvousError","_this$state$rendezvou","state","MSC4108SignInWithQR","checkCode","window","open","shareSecrets","deviceId","secureRandomString","tokenResponse","completeLoginOnNewDevice","secrets","accessToken","access_token","refreshToken","refresh_token","warn","reason","reset","sleep","updateMode","_this$state$rendezvou2","approveLogin","_this$state$rendezvou3","_this$state$rendezvou4","declineLoginOnExistingDevice","call","componentDidMount","componentDidUpdate","prevProps","prevState","_this$props$onPhaseCh2","_this$props2","showLoading","_this$abortController","abort","AbortController","generateAndShowCode","componentWillUnmount","_this$abortController2","finished","success","_this$abortController3","_this$abortController4","_this$state$rendezvou5"],"sourceRoot":""}