{"version":3,"file":"mfa-provider-default.element-CvQyy95R.js","sources":["../../../src/packages/user/current-user/components/mfa-provider-default.element.ts"],"sourcesContent":["import type { UmbMfaProviderConfigurationCallback, UmbMfaProviderConfigurationElementProps } from '../types.js';\r\nimport { UserService } from '@umbraco-cms/backoffice/external/backend-api';\r\nimport { css, customElement, html, property, state, query } from '@umbraco-cms/backoffice/external/lit';\r\nimport { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';\r\nimport { isApiError, tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources';\r\nimport { UMB_NOTIFICATION_CONTEXT, type UmbNotificationColor } from '@umbraco-cms/backoffice/notification';\r\nimport { UmbTextStyles } from '@umbraco-cms/backoffice/style';\r\nimport type { UUIButtonState } from '@umbraco-cms/backoffice/external/uui';\r\n\r\n/**\r\n * A default MFA provider configuration element.\r\n * @element umb-mfa-provider-default\r\n */\r\n@customElement('umb-mfa-provider-default')\r\nexport class UmbMfaProviderDefaultElement extends UmbLitElement implements UmbMfaProviderConfigurationElementProps {\r\n\t@property({ attribute: false })\r\n\tproviderName = '';\r\n\r\n\t@property({ attribute: false })\r\n\tdisplayName = '';\r\n\r\n\t@property({ attribute: false })\r\n\tcallback: (providerName: string, code: string, secret: string) => UmbMfaProviderConfigurationCallback =\r\n\t\tasync () => ({});\r\n\r\n\t@property({ attribute: false })\r\n\tclose = () => {};\r\n\r\n\t@state()\r\n\tprotected _loading = true;\r\n\r\n\t@state()\r\n\tprotected _secret = '';\r\n\r\n\t@state()\r\n\tprotected _qrCodeSetupImageUrl = '';\r\n\r\n\t@state()\r\n\tprotected _buttonState?: UUIButtonState;\r\n\r\n\tprotected notificationContext?: typeof UMB_NOTIFICATION_CONTEXT.TYPE;\r\n\r\n\t@query('#code')\r\n\tprotected codeField?: HTMLInputElement;\r\n\r\n\tconstructor() {\r\n\t\tsuper();\r\n\r\n\t\tthis.consumeContext(UMB_NOTIFICATION_CONTEXT, (context) => {\r\n\t\t\tthis.notificationContext = context;\r\n\t\t});\r\n\t}\r\n\r\n\tprotected override async firstUpdated() {\r\n\t\tawait this.#load();\r\n\t\tthis._loading = false;\r\n\t}\r\n\r\n\tasync #load() {\r\n\t\tif (!this.providerName) {\r\n\t\t\tthis.peek('Provider name is required', 'danger');\r\n\t\t\tthrow new Error('Provider name is required');\r\n\t\t}\r\n\t\tconst { data: _data } = await tryExecuteAndNotify(\r\n\t\t\tthis,\r\n\t\t\tUserService.getUserCurrent2FaByProviderName({ providerName: this.providerName }),\r\n\t\t);\r\n\t\tconst data: any = _data;\r\n\t\tif (!data) {\r\n\t\t\tthis.peek('No data returned', 'danger');\r\n\t\t\tthrow new Error('No data returned');\r\n\t\t}\r\n\r\n\t\t// Verify that there is a secret\r\n\t\tif (!data.secret) {\r\n\t\t\tthis.peek('The provider did not return a secret.', 'danger');\r\n\t\t\tthrow new Error('No secret returned');\r\n\t\t}\r\n\r\n\t\tthis._secret = data.secret;\r\n\t\tthis._qrCodeSetupImageUrl = data.qrCodeSetupImageUrl;\r\n\t}\r\n\r\n\toverride render() {\r\n\t\tif (this._loading) {\r\n\t\t\treturn html``;\r\n\t\t}\r\n\r\n\t\treturn html`\r\n\t\t\t\r\n\t\t\t\t
\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\t

\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\tScan this QR code with your authenticator app to enable two-factor authentication\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t

\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t${this.localize.term('general_close')}\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t${this.localize.term('general_submit')}\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t
\r\n\t\t`;\r\n\t}\r\n\r\n\t/**\r\n\t * Show a peek notification with a message.\r\n\t * @param message The message to show.\r\n\t * @param color\r\n\t */\r\n\tprotected peek(message: string, color?: UmbNotificationColor) {\r\n\t\tthis.notificationContext?.peek(color ?? 'positive', {\r\n\t\t\tdata: {\r\n\t\t\t\theadline: this.localize.term('member_2fa'),\r\n\t\t\t\tmessage,\r\n\t\t\t},\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Submit the form with the code and secret back to the opener.\r\n\t * @param e The submit event\r\n\t */\r\n\tprotected async submit(e: SubmitEvent) {\r\n\t\te.preventDefault();\r\n\t\tthis.codeField?.setCustomValidity('');\r\n\r\n\t\tconst form = e.target as HTMLFormElement;\r\n\r\n\t\tif (!form.checkValidity()) return;\r\n\r\n\t\tconst formData = new FormData(form);\r\n\t\tconst code = formData.get('code') as string;\r\n\r\n\t\tif (!code) return;\r\n\r\n\t\tthis._buttonState = 'waiting';\r\n\t\tconst { error } = await this.callback(this.providerName, code, this._secret);\r\n\r\n\t\tif (!error) {\r\n\t\t\tthis.peek(this.localize.term('user_2faProviderIsEnabledMsg', this.displayName ?? this.providerName));\r\n\t\t\tthis._buttonState = 'success';\r\n\t\t\tthis.close();\r\n\t\t} else {\r\n\t\t\tthis._buttonState = 'failed';\r\n\t\t\tif (isApiError(error)) {\r\n\t\t\t\tif ((error.body as any).operationStatus === 'InvalidCode') {\r\n\t\t\t\t\tthis.codeField?.setCustomValidity(this.localize.term('user_2faInvalidCode'));\r\n\t\t\t\t\tthis.codeField?.focus();\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.peek(\r\n\t\t\t\t\t\tthis.localize.term('user_2faProviderIsNotEnabledMsg', this.displayName ?? this.providerName),\r\n\t\t\t\t\t\t'warning',\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tthis.peek(error.message, 'warning');\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tstatic override styles = [\r\n\t\tUmbTextStyles,\r\n\t\tcss`\r\n\t\t\t#authForm {\r\n\t\t\t\theight: 100%;\r\n\t\t\t}\r\n\r\n\t\t\t#qrCode {\r\n\t\t\t\twidth: 100%;\r\n\t\t\t\taspect-ratio: 1;\r\n\t\t\t}\r\n\r\n\t\t\t#code {\r\n\t\t\t\twidth: 100%;\r\n\t\t\t\tmax-width: 300px;\r\n\t\t\t}\r\n\r\n\t\t\t.text-center {\r\n\t\t\t\ttext-align: center;\r\n\t\t\t}\r\n\t\t`,\r\n\t];\r\n}\r\n\r\nexport default UmbMfaProviderDefaultElement;\r\n\r\ndeclare global {\r\n\tinterface HTMLElementTagNameMap {\r\n\t\t'umb-mfa-provider-default': UmbMfaProviderDefaultElement;\r\n\t}\r\n}\r\n"],"names":["_UmbMfaProviderDefaultElement_instances","load_fn","UmbMfaProviderDefaultElement","UmbLitElement","__privateAdd","UMB_NOTIFICATION_CONTEXT","context","__privateMethod","html","message","color","e","form","code","error","isApiError","_data","tryExecuteAndNotify","UserService","data","UmbTextStyles","css","__decorateClass","property","state","query","customElement"],"mappings":"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"}