diff --git a/core/modules/user/config/schema/user.schema.yml b/core/modules/user/config/schema/user.schema.yml index 23a688a..82cd45c 100644 --- a/core/modules/user/config/schema/user.schema.yml +++ b/core/modules/user/config/schema/user.schema.yml @@ -13,6 +13,9 @@ user.settings: verify_mail: type: boolean label: 'Require e-mail verification when a visitor creates an account.' + verify_email_match: + type: boolean + label: 'Require e-mail and username match when e-mail is used as username.' notify: type: mapping label: 'Notify user' diff --git a/core/modules/user/config/user.settings.yml b/core/modules/user/config/user.settings.yml index fbb0d98..742a6b3 100644 --- a/core/modules/user/config/user.settings.yml +++ b/core/modules/user/config/user.settings.yml @@ -1,6 +1,7 @@ admin_role: '' anonymous: Anonymous verify_mail: true +verify_email_match: true notify: cancel_confirm: true password_reset: true diff --git a/core/modules/user/lib/Drupal/user/AccountFormController.php b/core/modules/user/lib/Drupal/user/AccountFormController.php index fa8635c..a1d43bf 100644 --- a/core/modules/user/lib/Drupal/user/AccountFormController.php +++ b/core/modules/user/lib/Drupal/user/AccountFormController.php @@ -341,7 +341,7 @@ public function validate(array $form, array &$form_state) { // Check whether the user name provided is an email address, if so, make // sure it matches the mail value. - if (filter_var($name, FILTER_VALIDATE_EMAIL) && ($name !== $mail)) { + if (\Drupal::config('user.settings')->get('verify_email_match') && (filter_var($name, FILTER_VALIDATE_EMAIL) && ($name !== $mail))) { $this->setFormError('name', $form_state, $this->t('If your username is an email address, it must match your email.')); } } diff --git a/core/modules/user/lib/Drupal/user/AccountSettingsForm.php b/core/modules/user/lib/Drupal/user/AccountSettingsForm.php index cc4e255..374ae6b 100644 --- a/core/modules/user/lib/Drupal/user/AccountSettingsForm.php +++ b/core/modules/user/lib/Drupal/user/AccountSettingsForm.php @@ -129,6 +129,12 @@ public function buildForm(array $form, array &$form_state) { '#default_value' => $config->get('verify_mail'), '#description' => $this->t('New users will be required to validate their e-mail address prior to logging into the site, and will be assigned a system-generated password. With this setting disabled, users will be logged in immediately upon registering, and may select their own passwords during registration.') ); + $form['registration_cancellation']['user_email_match_verification'] = array( + '#type' => 'checkbox', + '#title' => $this->t('Require e-mail and username match when e-mail is used as username.'), + '#default_value' => $config->get('verify_email_match'), + '#description' => $this->t('Users will be required to have matching e-mail address and username if an email address is used as username.') + ); $form['registration_cancellation']['user_password_strength'] = array( '#type' => 'checkbox', '#title' => $this->t('Enable password strength indicator'), @@ -415,6 +421,7 @@ public function submitForm(array &$form, array &$form_state) { ->set('register', $form_state['values']['user_register']) ->set('password_strength', $form_state['values']['user_password_strength']) ->set('verify_mail', $form_state['values']['user_email_verification']) + ->set('verify_email_match', $form_state['values']['user_email_match_verification']) ->set('signatures', $form_state['values']['user_signatures']) ->set('cancel_method', $form_state['values']['user_cancel_method']) ->set('notify.status_activated', $form_state['values']['user_mail_status_activated_notify']) diff --git a/core/modules/user/lib/Drupal/user/Tests/UserEditedOwnAccountTest.php b/core/modules/user/lib/Drupal/user/Tests/UserEditedOwnAccountTest.php index 7726168..d5d30ea 100644 --- a/core/modules/user/lib/Drupal/user/Tests/UserEditedOwnAccountTest.php +++ b/core/modules/user/lib/Drupal/user/Tests/UserEditedOwnAccountTest.php @@ -57,5 +57,13 @@ function testUserEditedOwnAccount() { $edit['name'] = $account->getEmail(); $this->drupalPostForm('user/' . $account->id() . '/edit', $edit, t('Save')); $this->assertText(t('The changes have been saved.'), 'The user account was saved.'); + + // Test that 'verify_email_match' turned off allows emails that don't match. + \Drupal::config('user.settings')->set('verify_email_match', FALSE)->save(); + + // Change username to my email address. + $edit['name'] = $this->randomName() . '@example.com'; + $this->drupalPostForm('user/' . $account->id() . '/edit', $edit, t('Save')); + $this->assertText(t('The changes have been saved.'), 'The user account was saved.'); } } diff --git a/core/modules/user/lib/Drupal/user/Tests/UserRegistrationTest.php b/core/modules/user/lib/Drupal/user/Tests/UserRegistrationTest.php index 4c2761e..1de9afa 100644 --- a/core/modules/user/lib/Drupal/user/Tests/UserRegistrationTest.php +++ b/core/modules/user/lib/Drupal/user/Tests/UserRegistrationTest.php @@ -185,7 +185,32 @@ function testRegistrationEmailAsUsername() { $accounts = \Drupal::entityManager()->getStorageController('user')->loadByProperties(array('name' => $edit['name'])); $new_user = reset($accounts); $this->assertTrue(($new_user->getUsername() === $edit['name']) && ($new_user->getEmail() === $edit['mail']), 'Created user with matching username and email address.'); + } + + /** + * Tests new users username not matching their email if username is an email. + */ + function testRegistrationEmailAsUsernameDisabled() { + // Test that 'verify_email_match' turned off allows emails that don't match. + \Drupal::config('user.settings') + ->set('verify_email_match', FALSE) + ->set('verify_mail', FALSE) + ->set('register', USER_REGISTER_VISITORS) + ->save(); + + $mail = $this->randomName() . '@example.com'; + $different = $this->randomName() . $mail; + $edit = array(); + $edit['mail'] = $mail; + $edit['name'] = $different; + $edit['pass[pass1]'] = $edit['pass[pass2]'] = $this->randomName(); + + // Attempt to create an account using an email that doesn't match the name. + // This should be OK, as 'verify_email_match' is disabled. + $this->drupalPostForm('user/register', $edit, t('Create new account')); + $this->assertNoText(t('If your username is an email address, it must match your email.'), 'Email username does not match user email error message found.'); + $this->assertText(t('Registration successful. You are now logged in.'), 'The user was not created and logged in.'); } function testRegistrationDefaultValues() {