diff --git a/.eslintrc b/.eslintrc index 6a472bfd8b0..9a047b4141e 100644 --- a/.eslintrc +++ b/.eslintrc @@ -25,6 +25,7 @@ "indent": "off", "max-classes-per-file": "off", "newline-per-chained-call": "off", + "no-empty": ["error", { "allowEmptyCatch": true }], "no-param-reassign": ["off", "never"], "no-confusing-arrow": "off", "no-plusplus": "off", diff --git a/app/controllers/event_disavowal_controller.rb b/app/controllers/event_disavowal_controller.rb index 9cb4432ba43..4b1d494d27d 100644 --- a/app/controllers/event_disavowal_controller.rb +++ b/app/controllers/event_disavowal_controller.rb @@ -12,6 +12,7 @@ def new extra: EventDisavowal::BuildDisavowedEventAnalyticsAttributes.call(disavowed_event), ).to_h, ) + @forbidden_passwords = forbidden_passwords end def create @@ -20,12 +21,19 @@ def create if result.success? handle_successful_password_reset else + @forbidden_passwords = forbidden_passwords render :new end end private + def forbidden_passwords + disavowed_event.user.email_addresses.flat_map do |email_address| + ForbiddenPasswords.new(email_address.email).call + end + end + def password_reset_from_disavowal_form @password_reset_from_disavowal_form ||= EventDisavowal::PasswordResetFromDisavowalForm.new( disavowed_event, diff --git a/app/controllers/users/reset_passwords_controller.rb b/app/controllers/users/reset_passwords_controller.rb index c92e8421f19..ea0b920e147 100644 --- a/app/controllers/users/reset_passwords_controller.rb +++ b/app/controllers/users/reset_passwords_controller.rb @@ -121,6 +121,7 @@ def handle_unsuccessful_password_reset(result) return end + @forbidden_passwords = forbidden_passwords(resource.email_addresses) render :edit end diff --git a/app/javascript/packs/pw-strength.js b/app/javascript/packs/pw-strength.js index b4a1ee5f99c..61e53b406a0 100644 --- a/app/javascript/packs/pw-strength.js +++ b/app/javascript/packs/pw-strength.js @@ -96,17 +96,35 @@ function disableSubmit(submitEl, length = 0, score = 0) { } } +/** + * @param {HTMLElement?} element + * + * @return {string[]} + */ +export function getForbiddenPasswords(element) { + try { + return JSON.parse(element.dataset.forbidden); + } catch { + return []; + } +} + function analyzePw() { const { userAgent } = window.navigator; const input = document.querySelector( - '#password_form_password, #reset_password_form_password, #update_user_password_form_password', + [ + '#password_form_password', + '#event_disavowal_password_reset_from_disavowal_form_password', + '#reset_password_form_password', + '#update_user_password_form_password', + ].join(','), ); const pwCntnr = document.getElementById('pw-strength-cntnr'); const pwStrength = document.getElementById('pw-strength-txt'); const pwFeedback = document.getElementById('pw-strength-feedback'); const submit = document.querySelector('input[type="submit"]'); - const forbiddenPasswordsElement = document.querySelector('[data-forbidden-passwords]'); - const { forbiddenPasswords } = forbiddenPasswordsElement.dataset; + const forbiddenPasswordsElement = document.querySelector('[data-forbidden]'); + const forbiddenPasswords = getForbiddenPasswords(forbiddenPasswordsElement); disableSubmit(submit); @@ -116,7 +134,7 @@ function analyzePw() { pwCntnr.className = ''; function checkPasswordStrength(e) { - const z = zxcvbn(e.target.value, JSON.parse(forbiddenPasswords)); + const z = zxcvbn(e.target.value, forbiddenPasswords); const [cls, strength] = getStrength(z); const feedback = getFeedback(z); pwCntnr.className = cls; diff --git a/app/views/devise/passwords/edit.html.erb b/app/views/devise/passwords/edit.html.erb index 8512503efb2..a2819ddf810 100644 --- a/app/views/devise/passwords/edit.html.erb +++ b/app/views/devise/passwords/edit.html.erb @@ -13,7 +13,7 @@ <%= f.full_error :reset_password_token %> <%= f.input :password, label: t('forms.passwords.edit.labels.password'), required: true, input_html: { class: 'password-toggle' } %> - <%= render 'devise/shared/password_strength' %> + <%= render 'devise/shared/password_strength', forbidden_passwords: @forbidden_passwords %> <%= f.button :submit, t('forms.passwords.edit.buttons.submit'), class: 'mb3' %> <% end %> diff --git a/app/views/devise/shared/_password_strength.html.erb b/app/views/devise/shared/_password_strength.html.erb index 495bf668a96..5ab53260b4e 100644 --- a/app/views/devise/shared/_password_strength.html.erb +++ b/app/views/devise/shared/_password_strength.html.erb @@ -10,9 +10,9 @@ <%= t('instructions.password.strength.intro') %> - - ... - + <%= tag.span '...', id: 'pw-strength-txt', class: 'bold', data: { + forbidden: local_assigns[:forbidden_passwords], + } %>