Adds a second factor landing page that centralizes a user's second factor configuration. This contains both TOTP and Backup, and also allows multiple TOTP tokens to be registered and organized by a name. Access to this page is authenticated via password, and cached for 30 minutes via a secure session.
131 lines
4.0 KiB
Handlebars
131 lines
4.0 KiB
Handlebars
<section class='user-preferences solo-preference second-factor'>
|
|
{{#conditional-loading-spinner condition=loading}}
|
|
<form class="form-horizontal">
|
|
|
|
{{#if showEnforcedNotice}}
|
|
<div class="control-group">
|
|
<div class="controls">
|
|
<div class='alert alert-error'>{{i18n 'user.second_factor.enforced_notice'}}</div>
|
|
</div>
|
|
</div>
|
|
{{/if}}
|
|
|
|
{{#if displayOAuthWarning}}
|
|
<div class="control-group">
|
|
<div class="controls">
|
|
{{i18n 'user.second_factor.oauth_enabled_warning'}}
|
|
</div>
|
|
</div>
|
|
{{/if}}
|
|
|
|
{{#if errorMessage}}
|
|
<div class="control-group">
|
|
<div class="controls">
|
|
<div class='alert alert-error'>{{errorMessage}}</div>
|
|
</div>
|
|
</div>
|
|
{{/if}}
|
|
|
|
{{#if loaded}}
|
|
<div class="control-group">
|
|
<div class="controls">
|
|
<h2>{{i18n "user.second_factor.totp.title"}}</h2>
|
|
{{d-button action=(action "createTotp")
|
|
class="btn-primary new-totp"
|
|
disabled=loading
|
|
label="user.second_factor.totp.add"}}
|
|
{{#each totps as |totp|}}
|
|
<div class="second-factor-item">
|
|
{{totp.name}}
|
|
|
|
{{#if isCurrentUser}}
|
|
{{d-button action=(action "editSecondFactor" totp)
|
|
class="btn-default btn-small btn-icon pad-left no-text edit"
|
|
disabled=loading
|
|
icon="pencil-alt"
|
|
}}
|
|
{{/if}}
|
|
</div>
|
|
{{/each}}
|
|
</div>
|
|
</div>
|
|
|
|
<div class="control-group">
|
|
<div class="controls pref-second-factor-backup">
|
|
<h2>{{i18n "user.second_factor_backup.title"}}</h2>
|
|
{{#if model.second_factor_enabled}}
|
|
{{#if model.second_factor_backup_enabled}}
|
|
{{{i18n 'user.second_factor_backup.manage' count=model.second_factor_remaining_backup_codes}}}
|
|
{{else}}
|
|
{{i18n 'user.second_factor_backup.enable_long'}}
|
|
{{/if}}
|
|
|
|
{{#if isCurrentUser}}
|
|
{{d-button action=(action "editSecondFactorBackup")
|
|
class="btn-default btn-small btn-icon pad-left no-text edit edit-2fa-backup"
|
|
disabled=loading
|
|
icon="pencil-alt"
|
|
}}
|
|
{{/if}}
|
|
{{else}}
|
|
{{i18n "user.second_factor_backup.enable_prerequisites"}}
|
|
{{/if}}
|
|
</div>
|
|
</div>
|
|
|
|
{{#if model.second_factor_enabled}}
|
|
{{#unless showEnforcedNotice}}
|
|
<div class="control-group">
|
|
<div class="controls">
|
|
<h2>{{i18n "user.second_factor.disable_title"}}</h2>
|
|
{{d-button action=(action "disableAllSecondFactors")
|
|
class="btn btn-danger"
|
|
disabled=loading
|
|
label="disable"}}
|
|
</div>
|
|
</div>
|
|
{{/unless}}
|
|
{{/if}}
|
|
{{else}}
|
|
<div class="control-group">
|
|
<label class='control-label'>{{i18n 'user.password.title'}}</label>
|
|
|
|
<div class="controls">
|
|
<div>
|
|
{{text-field value=password
|
|
id="password"
|
|
type="password"
|
|
classNames="input-xxlarge"
|
|
autofocus="autofocus"}}
|
|
</div>
|
|
<div class='instructions'>
|
|
{{i18n 'user.second_factor.confirm_password_description'}}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="control-group">
|
|
<div class="controls">
|
|
{{d-button action=(action "confirmPassword")
|
|
class="btn-primary"
|
|
disabled=loading
|
|
label="continue"}}
|
|
|
|
{{d-button action=(action "resetPassword")
|
|
class="btn"
|
|
disabled=resetPasswordLoading
|
|
icon="envelope"
|
|
label='user.change_password.action'}}
|
|
|
|
{{resetPasswordProgress}}
|
|
|
|
{{#unless showEnforcedNotice}}
|
|
{{cancel-link route="preferences.account" args= model.username}}
|
|
{{/unless}}
|
|
</div>
|
|
</div>
|
|
{{/if}}
|
|
</form>
|
|
{{/conditional-loading-spinner}}
|
|
</section>
|