Quellcode durchsuchen

Fix validator for email

Visman vor 5 Jahren
Ursprung
Commit
5908ecc403
1 geänderte Dateien mit 26 neuen und 16 gelöschten Zeilen
  1. 26 16
      app/Models/Validators/Email.php

+ 26 - 16
app/Models/Validators/Email.php

@@ -25,7 +25,7 @@ class Email extends Validators
         // поле отсутствует
         if (null === $email) {
             return null;
-        // проверка длины email в одном месте
+        // проверка длины email
         } elseif (\mb_strlen($email, 'UTF-8') > $this->c->MAX_EMAIL_LENGTH) {
             $v->addError('Long email');
             return $email;
@@ -41,42 +41,47 @@ class Email extends Validators
         $email = $result;
         $attrs = \array_flip(\explode(',', $attrs));
         $ok    = true;
-        $user  = true;
+        $user  = $this->c->users->create();
+        $user->__email = $email; // + вычисление email_normal
 
-        // email забанен
-        if ($ok && isset($attrs['noban']) && $this->c->bans->isBanned($this->c->users->create(['email' => $email])) > 0) {
+        // провеерка бана email
+        if ($ok && isset($attrs['noban']) && $this->c->bans->isBanned($user) > 0) {
             $v->addError('Banned email');
             $ok = false;
         }
-        // отсутствует пользователь с таким email (или их больше одного O_o)
+        // проверка наличия 1 пользователя с этим email
         if ($ok && isset($attrs['exists'])) {
-            $user = $this->c->users->load($this->c->users->create(['email_normal' => $this->c->NormEmail->normalize($email)]));
+            $user = $this->c->users->load($user);
 
             if (! $user instanceof User) {
                 $v->addError('Invalid email');
                 $ok = false;
             }
         }
-        // email не уникален
+        // проверка уникальности email
         if ($ok && isset($attrs['unique']) && (! $originalUser instanceof User || ! $originalUser->isGuest)) {
-            if (true === $user) {
-                $user = $this->c->users->load($this->c->users->create(['email_normal' => $this->c->NormEmail->normalize($email)]));
+            if ($user->isGuest) {
+                $user = $this->c->users->load($user);
             }
 
-            $id = $originalUser instanceof User ? $originalUser->id : true;
-
-            if (($user instanceof User && $id !== $user->id)
-                || (\is_array($user) && \count($user) > 1) // ???? эта ветка не реальна? поле email_normal уникально
+            if (\is_array($user) && \count($user) > 1) {
+                $ok = false;
+            } elseif ($user instanceof User
+                && $originalUser instanceof User
+                && $user->id !== $originalUser->id
             ) {
-                $v->addError('Dupe email');
                 $ok = false;
             }
+
+            if (false === $ok) {
+                $v->addError('Dupe email');
+            }
         }
         // проверка на флуд интервал
         if ($ok && isset($attrs['flood'])) {
             if ($originalUser instanceof User && ! $originalUser->isGuest) {
                 $flood = \time() - $originalUser->last_email_sent;
-            } elseif ($user instanceof User) {
+            } elseif ($user instanceof User && ! $user->isGuest) {
                 $flood = \time() - $user->last_email_sent;
             } else {
                 $flood = $this->c->FLOOD_INTERVAL;
@@ -87,7 +92,12 @@ class Email extends Validators
             }
         }
         // возврат данных пользователя через 4-ый параметр
-        if ($ok && $originalUser instanceof User && $originalUser->id < 1 && $user instanceof User) {
+        if ($ok
+            && $originalUser instanceof User
+            && $originalUser->id < 1
+            && $user instanceof User
+            && ! $user->isGuest
+        ) {
             $originalUser->setAttrs($user->getAttrs());
         }