Skip to content

Commit b5e5242

Browse files
committed
Allow configuring required password restore input fields
1 parent cd4aa60 commit b5e5242

File tree

3 files changed

+35
-6
lines changed

3 files changed

+35
-6
lines changed

schemas/qwc-db-auth.json

+7
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,13 @@
135135
"force_password_change_first_login": {
136136
"description": "Whether to force users to change the password on first login (regardless of user force_password_change setting). Default: `false`",
137137
"type": "boolean"
138+
},
139+
"required_restore_input": {
140+
"description": "Input required in password restore form. Can be one or both of `username` and `email`. Default: `['username', 'email']`",
141+
"type": "array",
142+
"items": {
143+
"type": "string"
144+
}
138145
}
139146
},
140147
"required": [

src/db_auth.py

+24-6
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ def __init__(self, tenant, mail, app):
9898
self.ip_blacklist_duration = config.get('ip_blacklist_duration', 300)
9999
self.ip_blacklist_max_attempt_count = config.get('ip_blacklist_max_attempt_count', 10)
100100
self.force_password_change_first_login = config.get('force_password_change_first_login', False)
101+
self.required_restore_input = config.get('required_restore_input', ['username', 'email'])
101102

102103
db_engine = DatabaseEngine()
103104
self.config_models = ConfigModels(
@@ -462,8 +463,12 @@ def new_password(self):
462463
'new_password_contact_admin.html', form=form, i18n=i18n,
463464
title=i18n.t("auth.new_password_page_title")
464465
)
465-
466466
form = NewPasswordForm(meta=wft_locales())
467+
if 'username' not in self.required_restore_input:
468+
form.user.validators = []
469+
if 'email' not in self.required_restore_input:
470+
form.email.validators = []
471+
467472
form.logo = self.login_logo
468473
form.background = self.login_background
469474
form.customstylesheet = self.customstylesheet
@@ -472,9 +477,18 @@ def new_password(self):
472477
# create session for ConfigDB
473478
with self.db_session() as db_session, db_session.begin():
474479

475-
entered_user = form.user.data
476-
user = self.find_user(db_session, email=form.email.data)
477-
if user and user.name == entered_user:
480+
user_valid = False
481+
if 'username' in self.required_restore_input and 'email' in self.required_restore_input:
482+
user = self.find_user(db_session, email=form.email.data)
483+
user_valid = user and user.name == form.user.data
484+
elif 'username' in self.required_restore_input:
485+
user = self.find_user(db_session, name=form.user.data)
486+
user_valid = bool(user)
487+
elif 'email' in self.required_restore_input:
488+
user = self.find_user(db_session, email=form.email.data)
489+
user_valid = bool(user)
490+
491+
if user_valid:
478492
# generate and save reset token
479493
user.reset_password_token = self.generate_token()
480494

@@ -489,7 +503,9 @@ def new_password(self):
489503
flash(i18n.t("auth.reset_mail_failed"))
490504
return render_template(
491505
'new_password.html', form=form, i18n=i18n,
492-
title=i18n.t("auth.new_password_page_title")
506+
title=i18n.t("auth.new_password_page_title"),
507+
show_username='username' in self.required_restore_input,
508+
show_email='email' in self.required_restore_input
493509
)
494510
else:
495511
self.logger.info("User lookup failed")
@@ -500,7 +516,9 @@ def new_password(self):
500516

501517
return render_template(
502518
'new_password.html', form=form, i18n=i18n,
503-
title=i18n.t("auth.new_password_page_title")
519+
title=i18n.t("auth.new_password_page_title"),
520+
show_username='username' in self.required_restore_input,
521+
show_email='email' in self.required_restore_input
504522
)
505523

506524
def edit_password(self, token, identity=None):

src/templates/new_password.html

+4
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,19 @@ <h1>{{ i18n.t('auth.new_password_form_title') }}</h1>
88
</div>
99

1010
<div class="login-form-fields">
11+
{% if show_username %}
1112
<div class="control-group">
1213
{{ form.user(placeholder=i18n.t('auth.username_placeholder'), type='text', autofocus=True, class_='login-field') }}
1314
</div>
15+
{% endif %}
16+
{% if show_email %}
1417
<div class="control-group">
1518
{{ form.email(placeholder=i18n.t('auth.email_placeholder'), type='email', autofocus=False, class_='login-field') }}
1619
{% for error in form.email.errors %}
1720
<span style="color: red;">[{{ error }}]</span>
1821
{% endfor %}
1922
</div>
23+
{% endif %}
2024

2125
<button class="button" type="submit">{{ i18n.t('auth.new_password_button') }}</button>
2226
</div>

0 commit comments

Comments
 (0)