stages/authenticator_validate: add ability to select multiple configuration stages which the user can choose

closes #1843

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
This commit is contained in:
Jens Langhammer
2022-02-12 16:55:50 +01:00
parent 9070df6c26
commit 2ccab75021
16 changed files with 346 additions and 102 deletions

View File

@ -67,7 +67,7 @@ export class AuthenticatorValidateStage
return this._selectedDeviceChallenge;
}
submit(payload: AuthenticatorValidationChallengeResponseRequest): Promise<void> {
submit(payload: AuthenticatorValidationChallengeResponseRequest): Promise<boolean> {
return this.host?.submit(payload) || Promise.resolve();
}
@ -140,7 +140,7 @@ export class AuthenticatorValidateStage
}
renderDevicePicker(): TemplateResult {
return html` <ul>
return html`<ul>
${this.challenge?.deviceChallenges.map((challenges) => {
return html`<li>
<button
@ -157,6 +157,30 @@ export class AuthenticatorValidateStage
</ul>`;
}
renderStagePicker(): TemplateResult {
return html`<ul>
${this.challenge?.configurationStages.map((stage) => {
return html`<li>
<button
class="pf-c-button authenticator-button"
type="button"
@click=${() => {
this.submit({
component: this.challenge.component || "",
selectedStage: stage.pk,
});
}}
>
<div class="right">
<p>${stage.name}</p>
<small>${stage.verboseName}</small>
</div>
</button>
</li>`;
})}
</ul>`;
}
renderDeviceChallenge(): TemplateResult {
if (!this.selectedDeviceChallenge) {
return html``;
@ -242,6 +266,9 @@ export class AuthenticatorValidateStage
${this.selectedDeviceChallenge
? ""
: html`<p>${t`Select an authentication method.`}</p>`}
${this.challenge.configurationStages.length > 0
? this.renderStagePicker()
: html``}
</form>
${this.renderDevicePicker()}
</div>

View File

@ -959,8 +959,12 @@ msgid "Configuration flow"
msgstr "Ablauf der Konfiguration"
#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts
msgid "Configuration stage"
msgstr "Konfiguration Stufe"
#~ msgid "Configuration stage"
#~ msgstr "Konfiguration Stufe"
#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts
msgid "Configuration stages"
msgstr ""
#~ msgid "Configure WebAuthn"
#~ msgstr "Konfiguriere WebAuthn"
@ -4410,8 +4414,8 @@ msgid "Stage type"
msgstr "Phasen Typ"
#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts
msgid "Stage used to configure Authenticator when user doesn't have any compatible devices. After this configuration Stage passes, the user is not prompted again."
msgstr "Phase zum Konfigurieren von Authenticator, wenn der Benutzer keine kompatiblen Geräte hat. Nach Ablauf dieser Konfigurationsphase wird der Benutzer nicht erneut aufgefordert."
#~ msgid "Stage used to configure Authenticator when user doesn't have any compatible devices. After this configuration Stage passes, the user is not prompted again."
#~ msgstr "Phase zum Konfigurieren von Authenticator, wenn der Benutzer keine kompatiblen Geräte hat. Nach Ablauf dieser Konfigurationsphase wird der Benutzer nicht erneut aufgefordert."
#: src/pages/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts
msgid "Stage used to configure a TOTP authenticator (i.e. Authy/Google Authenticator)."
@ -4470,6 +4474,10 @@ msgstr "Phasen"
msgid "Stages are single steps of a Flow that a user is guided through. A stage can only be executed from within a flow."
msgstr "Phasen sind einzelne Schritte eines Flows, durch die ein Benutzer geführt wird. Eine Phase kann nur innerhalb eines Flows ausgeführt werden."
#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts
msgid "Stages used to configure Authenticator when user doesn't have any compatible devices. After this configuration Stage passes, the user is not prompted again."
msgstr ""
#: src/pages/outposts/ServiceConnectionListPage.ts
msgid "State"
msgstr "Zustand"
@ -5935,6 +5943,10 @@ msgstr "Wenn diese Option aktiviert ist, wird die Einladung nach ihrer Benutzung
msgid "When enabled, user fields are matched regardless of their casing."
msgstr "Wenn diese Option aktiviert ist, werden Benutzerfelder unabhängig von ihrem Format abgeglichen."
#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts
msgid "When multiple stages are selected, the user can choose which one they want to enroll."
msgstr ""
#: src/pages/stages/identification/IdentificationStageForm.ts
msgid "When selected, a password field is shown on the same page instead of a separate page. This prevents username enumeration attacks."
msgstr "Wenn diese Option ausgewählt ist, wird ein Passwortfeld auf derselben Seite statt auf einer separaten Seite angezeigt. Dadurch werden Angriffe auf die Aufzählung von Benutzernamen verhindert."

View File

@ -950,8 +950,12 @@ msgid "Configuration flow"
msgstr "Flujo de configuración"
#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts
msgid "Configuration stage"
msgstr "Etapa de configuración"
#~ msgid "Configuration stage"
#~ msgstr "Etapa de configuración"
#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts
msgid "Configuration stages"
msgstr ""
#~ msgid "Configure WebAuthn"
#~ msgstr "Configurar WebAuthn"
@ -4403,8 +4407,8 @@ msgid "Stage type"
msgstr "Tipo de escenario"
#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts
msgid "Stage used to configure Authenticator when user doesn't have any compatible devices. After this configuration Stage passes, the user is not prompted again."
msgstr "Etapa utilizada para configurar Authenticator cuando el usuario no tiene ningún dispositivo compatible. Una vez superada esta etapa de configuración, no se volverá a preguntar al usuario."
#~ msgid "Stage used to configure Authenticator when user doesn't have any compatible devices. After this configuration Stage passes, the user is not prompted again."
#~ msgstr "Etapa utilizada para configurar Authenticator cuando el usuario no tiene ningún dispositivo compatible. Una vez superada esta etapa de configuración, no se volverá a preguntar al usuario."
#: src/pages/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts
msgid "Stage used to configure a TOTP authenticator (i.e. Authy/Google Authenticator)."
@ -4463,6 +4467,10 @@ msgstr "Etapas"
msgid "Stages are single steps of a Flow that a user is guided through. A stage can only be executed from within a flow."
msgstr "Las etapas son pasos individuales de un flujo por los que se guía al usuario. Una etapa solo se puede ejecutar desde dentro de un flujo."
#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts
msgid "Stages used to configure Authenticator when user doesn't have any compatible devices. After this configuration Stage passes, the user is not prompted again."
msgstr ""
#: src/pages/outposts/ServiceConnectionListPage.ts
msgid "State"
msgstr "Estado"
@ -5928,6 +5936,10 @@ msgstr "Cuando se habilita, la invitación se eliminará después de su uso."
msgid "When enabled, user fields are matched regardless of their casing."
msgstr "Cuando se habilita, los campos de usuario coinciden independientemente de su carcasa."
#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts
msgid "When multiple stages are selected, the user can choose which one they want to enroll."
msgstr ""
#: src/pages/stages/identification/IdentificationStageForm.ts
msgid "When selected, a password field is shown on the same page instead of a separate page. This prevents username enumeration attacks."
msgstr "Cuando se selecciona, se muestra un campo de contraseña en la misma página en lugar de en una página separada. Esto evita ataques de enumeración de nombres de usuario."

View File

@ -947,8 +947,12 @@ msgid "Configuration flow"
msgstr "Przepływ konfiguracji"
#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts
msgid "Configuration stage"
msgstr "Etap konfiguracji"
#~ msgid "Configuration stage"
#~ msgstr "Etap konfiguracji"
#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts
msgid "Configuration stages"
msgstr ""
#~ msgid "Configure WebAuthn"
#~ msgstr "Skonfiguruj WebAuthn"
@ -4400,8 +4404,8 @@ msgid "Stage type"
msgstr "Typ etapu"
#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts
msgid "Stage used to configure Authenticator when user doesn't have any compatible devices. After this configuration Stage passes, the user is not prompted again."
msgstr "Etap używany do konfiguracji uwierzytelniacza, gdy użytkownik nie ma żadnych kompatybilnych urządzeń. Po zakończeniu tego etapu konfiguracji użytkownik nie jest ponownie pytany."
#~ msgid "Stage used to configure Authenticator when user doesn't have any compatible devices. After this configuration Stage passes, the user is not prompted again."
#~ msgstr "Etap używany do konfiguracji uwierzytelniacza, gdy użytkownik nie ma żadnych kompatybilnych urządzeń. Po zakończeniu tego etapu konfiguracji użytkownik nie jest ponownie pytany."
#: src/pages/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts
msgid "Stage used to configure a TOTP authenticator (i.e. Authy/Google Authenticator)."
@ -4460,6 +4464,10 @@ msgstr "Etapy"
msgid "Stages are single steps of a Flow that a user is guided through. A stage can only be executed from within a flow."
msgstr "Etapy to pojedyncze kroki przepływu, przez które prowadzony jest użytkownik. Etap można wykonać tylko z przepływu."
#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts
msgid "Stages used to configure Authenticator when user doesn't have any compatible devices. After this configuration Stage passes, the user is not prompted again."
msgstr ""
#: src/pages/outposts/ServiceConnectionListPage.ts
msgid "State"
msgstr "Stan"
@ -5925,6 +5933,10 @@ msgstr "Po włączeniu zaproszenie zostanie usunięte po użyciu."
msgid "When enabled, user fields are matched regardless of their casing."
msgstr "Po włączeniu pola użytkownika są dopasowywane niezależnie od wielkości liter."
#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts
msgid "When multiple stages are selected, the user can choose which one they want to enroll."
msgstr ""
#: src/pages/stages/identification/IdentificationStageForm.ts
msgid "When selected, a password field is shown on the same page instead of a separate page. This prevents username enumeration attacks."
msgstr "Po wybraniu pole hasła jest wyświetlane na tej samej stronie zamiast na osobnej stronie. Zapobiega to atakom polegającym na wyliczaniu nazw użytkowników."

View File

@ -950,8 +950,12 @@ msgid "Configuration flow"
msgstr "Yapılandırma akışı"
#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts
msgid "Configuration stage"
msgstr "Yapılandırma aşamasında"
#~ msgid "Configuration stage"
#~ msgstr "Yapılandırma aşamasında"
#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts
msgid "Configuration stages"
msgstr ""
#~ msgid "Configure WebAuthn"
#~ msgstr "WebAuthn'i Yapılandır"
@ -4405,8 +4409,8 @@ msgid "Stage type"
msgstr "Aşama türü"
#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts
msgid "Stage used to configure Authenticator when user doesn't have any compatible devices. After this configuration Stage passes, the user is not prompted again."
msgstr "Kullanıcının uyumlu bir aygıtı olmadığında Kimlik Doğrulayıcısı'nı yapılandırmak için kullanılan Aşama. Bu yapılandırma Stage geçtikten sonra kullanıcıya yeniden istenmez."
#~ msgid "Stage used to configure Authenticator when user doesn't have any compatible devices. After this configuration Stage passes, the user is not prompted again."
#~ msgstr "Kullanıcının uyumlu bir aygıtı olmadığında Kimlik Doğrulayıcısı'nı yapılandırmak için kullanılan Aşama. Bu yapılandırma Stage geçtikten sonra kullanıcıya yeniden istenmez."
#: src/pages/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts
msgid "Stage used to configure a TOTP authenticator (i.e. Authy/Google Authenticator)."
@ -4465,6 +4469,10 @@ msgstr "Aşamalar"
msgid "Stages are single steps of a Flow that a user is guided through. A stage can only be executed from within a flow."
msgstr "Aşamalar, bir Akış'ın kullanıcının yönlendirildiği tek adımlardır. Bir aşama yalnızca bir akış içinden yürütülebilir."
#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts
msgid "Stages used to configure Authenticator when user doesn't have any compatible devices. After this configuration Stage passes, the user is not prompted again."
msgstr ""
#: src/pages/outposts/ServiceConnectionListPage.ts
msgid "State"
msgstr "Eyalet"
@ -5930,6 +5938,10 @@ msgstr "Etkinleştirildiğinde, davetiye kullanımdan sonra silinir."
msgid "When enabled, user fields are matched regardless of their casing."
msgstr "Etkinleştirildiğinde, kullanıcı alanları muhafazası ne olursa olsun eşleştirilir."
#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts
msgid "When multiple stages are selected, the user can choose which one they want to enroll."
msgstr ""
#: src/pages/stages/identification/IdentificationStageForm.ts
msgid "When selected, a password field is shown on the same page instead of a separate page. This prevents username enumeration attacks."
msgstr "Seçildiğinde, ayrı bir sayfa yerine aynı sayfada bir parola alanı gösterilir. Bu, kullanıcı adı numaralandırma saldırılarını engeller."

View File

@ -948,8 +948,12 @@ msgid "Configuration flow"
msgstr "配置流程"
#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts
msgid "Configuration stage"
msgstr "配置阶段"
#~ msgid "Configuration stage"
#~ msgstr "配置阶段"
#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts
msgid "Configuration stages"
msgstr ""
#~ msgid "Configure WebAuthn"
#~ msgstr "配置 WebAuthn"
@ -4401,8 +4405,8 @@ msgid "Stage type"
msgstr "阶段类型"
#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts
msgid "Stage used to configure Authenticator when user doesn't have any compatible devices. After this configuration Stage passes, the user is not prompted again."
msgstr "Stage 用于在用户没有任何兼容设备时配置身份验证器。此配置 Stage 通过后,不会再次提示用户。"
#~ msgid "Stage used to configure Authenticator when user doesn't have any compatible devices. After this configuration Stage passes, the user is not prompted again."
#~ msgstr "Stage 用于在用户没有任何兼容设备时配置身份验证器。此配置 Stage 通过后,不会再次提示用户。"
#: src/pages/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts
msgid "Stage used to configure a TOTP authenticator (i.e. Authy/Google Authenticator)."
@ -4461,6 +4465,10 @@ msgstr "阶段"
msgid "Stages are single steps of a Flow that a user is guided through. A stage can only be executed from within a flow."
msgstr "阶段是引导用户完成的流程的单个步骤。阶段只能在流程内部执行。"
#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts
msgid "Stages used to configure Authenticator when user doesn't have any compatible devices. After this configuration Stage passes, the user is not prompted again."
msgstr ""
#: src/pages/outposts/ServiceConnectionListPage.ts
msgid "State"
msgstr "状态"
@ -5926,6 +5934,10 @@ msgstr "启用后,邀请将在使用后被删除。"
msgid "When enabled, user fields are matched regardless of their casing."
msgstr "启用后,无论用户字段大小写如何,都将匹配用户字段。"
#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts
msgid "When multiple stages are selected, the user can choose which one they want to enroll."
msgstr ""
#: src/pages/stages/identification/IdentificationStageForm.ts
msgid "When selected, a password field is shown on the same page instead of a separate page. This prevents username enumeration attacks."
msgstr "选中后,密码字段将显示在同一页面上,而不是单独的页面上。这样可以防止用户名枚举攻击。"

View File

@ -948,8 +948,12 @@ msgid "Configuration flow"
msgstr "配置流程"
#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts
msgid "Configuration stage"
msgstr "配置阶段"
#~ msgid "Configuration stage"
#~ msgstr "配置阶段"
#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts
msgid "Configuration stages"
msgstr ""
#~ msgid "Configure WebAuthn"
#~ msgstr "配置 WebAuthn"
@ -4401,8 +4405,8 @@ msgid "Stage type"
msgstr "阶段类型"
#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts
msgid "Stage used to configure Authenticator when user doesn't have any compatible devices. After this configuration Stage passes, the user is not prompted again."
msgstr "Stage 用于在用户没有任何兼容设备时配置身份验证器。此配置 Stage 通过后,不会再次提示用户。"
#~ msgid "Stage used to configure Authenticator when user doesn't have any compatible devices. After this configuration Stage passes, the user is not prompted again."
#~ msgstr "Stage 用于在用户没有任何兼容设备时配置身份验证器。此配置 Stage 通过后,不会再次提示用户。"
#: src/pages/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts
msgid "Stage used to configure a TOTP authenticator (i.e. Authy/Google Authenticator)."
@ -4461,6 +4465,10 @@ msgstr "阶段"
msgid "Stages are single steps of a Flow that a user is guided through. A stage can only be executed from within a flow."
msgstr "阶段是引导用户完成的流程的单个步骤。阶段只能在流程内部执行。"
#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts
msgid "Stages used to configure Authenticator when user doesn't have any compatible devices. After this configuration Stage passes, the user is not prompted again."
msgstr ""
#: src/pages/outposts/ServiceConnectionListPage.ts
msgid "State"
msgstr "州"
@ -5926,6 +5934,10 @@ msgstr "启用后,邀请将在使用后被删除。"
msgid "When enabled, user fields are matched regardless of their casing."
msgstr "启用后,无论用户字段大小写如何,都将匹配用户字段。"
#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts
msgid "When multiple stages are selected, the user can choose which one they want to enroll."
msgstr ""
#: src/pages/stages/identification/IdentificationStageForm.ts
msgid "When selected, a password field is shown on the same page instead of a separate page. This prevents username enumeration attacks."
msgstr "选中后,密码字段将显示在同一页面上,而不是单独的页面上。这样可以防止用户名枚举攻击。"

View File

@ -948,8 +948,12 @@ msgid "Configuration flow"
msgstr "配置流程"
#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts
msgid "Configuration stage"
msgstr "配置阶段"
#~ msgid "Configuration stage"
#~ msgstr "配置阶段"
#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts
msgid "Configuration stages"
msgstr ""
#~ msgid "Configure WebAuthn"
#~ msgstr "配置 WebAuthn"
@ -4401,8 +4405,8 @@ msgid "Stage type"
msgstr "阶段类型"
#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts
msgid "Stage used to configure Authenticator when user doesn't have any compatible devices. After this configuration Stage passes, the user is not prompted again."
msgstr "Stage 用于在用户没有任何兼容设备时配置身份验证器。此配置 Stage 通过后,不会再次提示用户。"
#~ msgid "Stage used to configure Authenticator when user doesn't have any compatible devices. After this configuration Stage passes, the user is not prompted again."
#~ msgstr "Stage 用于在用户没有任何兼容设备时配置身份验证器。此配置 Stage 通过后,不会再次提示用户。"
#: src/pages/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts
msgid "Stage used to configure a TOTP authenticator (i.e. Authy/Google Authenticator)."
@ -4461,6 +4465,10 @@ msgstr "阶段"
msgid "Stages are single steps of a Flow that a user is guided through. A stage can only be executed from within a flow."
msgstr "阶段是引导用户完成的流程的单个步骤。阶段只能在流程内部执行。"
#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts
msgid "Stages used to configure Authenticator when user doesn't have any compatible devices. After this configuration Stage passes, the user is not prompted again."
msgstr ""
#: src/pages/outposts/ServiceConnectionListPage.ts
msgid "State"
msgstr "州"
@ -5926,6 +5934,10 @@ msgstr "启用后,邀请将在使用后被删除。"
msgid "When enabled, user fields are matched regardless of their casing."
msgstr "启用后,无论用户字段大小写如何,都将匹配用户字段。"
#: src/pages/stages/authenticator_validate/AuthenticatorValidateStageForm.ts
msgid "When multiple stages are selected, the user can choose which one they want to enroll."
msgstr ""
#: src/pages/stages/identification/IdentificationStageForm.ts
msgid "When selected, a password field is shown on the same page instead of a separate page. This prevents username enumeration attacks."
msgstr "选中后,密码字段将显示在同一页面上,而不是单独的页面上。这样可以防止用户名枚举攻击。"

View File

@ -25,14 +25,14 @@ export class AuthenticatorValidateStageForm extends ModelForm<AuthenticatorValid
stageUuid: pk,
})
.then((stage) => {
this.showConfigurationStage =
this.showConfigurationStages =
stage.notConfiguredAction === NotConfiguredActionEnum.Configure;
return stage;
});
}
@property({ type: Boolean })
showConfigurationStage = true;
showConfigurationStages = true;
getSuccessMessage(): string {
if (this.instance) {
@ -136,9 +136,9 @@ export class AuthenticatorValidateStageForm extends ModelForm<AuthenticatorValid
target.selectedOptions[0].value ===
NotConfiguredActionEnum.Configure
) {
this.showConfigurationStage = true;
this.showConfigurationStages = true;
} else {
this.showConfigurationStage = false;
this.showConfigurationStages = false;
}
}}
>
@ -165,21 +165,13 @@ export class AuthenticatorValidateStageForm extends ModelForm<AuthenticatorValid
</option>
</select>
</ak-form-element-horizontal>
${this.showConfigurationStage
${this.showConfigurationStages
? html`
<ak-form-element-horizontal
label=${t`Configuration stage`}
?required=${true}
name="configurationStage"
label=${t`Configuration stages`}
name="configurationStages"
>
<select class="pf-c-form-control">
<option
value=""
?selected=${this.instance?.configurationStage ===
undefined}
>
---------
</option>
<select class="pf-c-form-control" multiple>
${until(
new StagesApi(DEFAULT_CONFIG)
.stagesAllList({
@ -187,9 +179,11 @@ export class AuthenticatorValidateStageForm extends ModelForm<AuthenticatorValid
})
.then((stages) => {
return stages.results.map((stage) => {
const selected =
this.instance?.configurationStage ===
stage.pk;
const selected = Array.from(
this.instance?.configurationStages || [],
).some((su) => {
return su == stage.pk;
});
return html`<option
value=${ifDefined(stage.pk)}
?selected=${selected}
@ -202,7 +196,10 @@ export class AuthenticatorValidateStageForm extends ModelForm<AuthenticatorValid
)}
</select>
<p class="pf-c-form__helper-text">
${t`Stage used to configure Authenticator when user doesn't have any compatible devices. After this configuration Stage passes, the user is not prompted again.`}
${t`Stages used to configure Authenticator when user doesn't have any compatible devices. After this configuration Stage passes, the user is not prompted again.`}
</p>
<p class="pf-c-form__helper-text">
${t`When multiple stages are selected, the user can choose which one they want to enroll.`}
</p>
</ak-form-element-horizontal>
`

View File

@ -153,7 +153,7 @@ export class IdentificationStageForm extends ModelForm<IdentificationStage, stri
?required=${true}
name="sources"
>
<select name="users" class="pf-c-form-control" multiple>
<select class="pf-c-form-control" multiple>
${until(
new SourcesApi(DEFAULT_CONFIG)
.sourcesAllList({})