Check email when creating a user in drupal 8
authorWouter H <wouter.hechtermans@calibrate.be>
Fri, 4 Oct 2019 13:06:29 +0000 (15:06 +0200)
committerGitHub <noreply@github.com>
Fri, 4 Oct 2019 13:06:29 +0000 (15:06 +0200)
When visiting a contribution page as an anonymous user & it is possible to create a new Drupal 8 user, there is currently no correct validation on email address within the profile form.

So when using an email address of an existing Drupal 8 user in the profile form and you continue on the confirmation page you will be redirected to the home page instead of for example the online payment page.

I noticed that in the function "checkUserNameEmailExists" the variable "$emailName" does not match the key in the "$params" array.

CRM/Utils/System/Drupal8.php

index 38ed2933c671bca40bbd577285f79714c08ba2a1..e52bcb31a6e6b47e394cb73365a2bb257648ed27 100644 (file)
@@ -153,27 +153,27 @@ class CRM_Utils_System_Drupal8 extends CRM_Utils_System_DrupalBase {
       // This checks for both username uniqueness and validity.
       $violations = iterator_to_array($user->validate());
       // We only care about violations on the username field; discard the rest.
-      $violations = array_filter($violations, function ($v) {
+      $violations = array_values(array_filter($violations, function ($v) {
         return $v->getPropertyPath() == 'name';
-      });
+      }));
       if (count($violations) > 0) {
         $errors['cms_name'] = (string) $violations[0]->getMessage();
       }
     }
 
     // And if we are given an email address, let's check to see if it already exists.
-    if (!empty($params[$emailName])) {
-      $mail = $params[$emailName];
+    if (!empty($params[$emailName]) || !empty($params['mail'])) {
+      $key = (!empty($params[$emailName])) ? $emailName : 'mail';
 
       $user = entity_create('user');
-      $user->setEmail($mail);
+      $user->setEmail($params[$key]);
 
       // This checks for both email uniqueness.
       $violations = iterator_to_array($user->validate());
       // We only care about violations on the email field; discard the rest.
-      $violations = array_filter($violations, function ($v) {
+      $violations = array_values(array_filter($violations, function ($v) {
         return $v->getPropertyPath() == 'mail';
-      });
+      }));
       if (count($violations) > 0) {
         $errors[$emailName] = (string) $violations[0]->getMessage();
       }