Adapts UserFilter to new mail chain.
authorStéphane Jacob <sj@m4x.org>
Fri, 4 Mar 2011 12:55:53 +0000 (13:55 +0100)
committerStéphane Jacob <sj@m4x.org>
Fri, 4 Mar 2011 13:32:47 +0000 (14:32 +0100)
Signed-off-by: Stéphane Jacob <sj@m4x.org>
classes/userfilter.php
classes/userfilter/conditions.inc.php

index bef41c4..2e8af86 100644 (file)
@@ -914,85 +914,65 @@ class UserFilter extends PlFilter
 
     /** EMAILS
      */
-    private $e = array();
+    private $ra = array();
+    /** Allows filtering by redirection.
+     * @param $email If null, enable a left join on the email redirection table
+     *  (email_redirect_account); otherwise, perform a left join on users having
+     *  that email as a redirection.
+     * @return Suffix to use to access the adequate table.
+     */
     public function addEmailRedirectFilter($email = null)
     {
         $this->requireAccounts();
-        return $this->register_optional($this->e, $email);
-    }
-
-    private $with_eo = false;
-    public function addEmailOptionsFilter()
-    {
-        $this->requireAccounts();
-        $this->with_eo = true;
-        return 'eo';
-    }
-
-    private $ve = array();
-    public function addVirtualEmailFilter($email = null)
-    {
-        $this->addAliasFilter(self::ALIAS_FORLIFE);
-        return $this->register_optional($this->ve, $email);
-    }
-
-    const ALIAS_BEST    = 'bestalias';
-    const ALIAS_FORLIFE = 'forlife';
-    private $al = array();
-    public function addAliasFilter($alias = null)
+        return $this->register_optional($this->ra, $email);
+    }
+
+    const ALIAS_BEST      = 'bestalias';
+    const ALIAS_FORLIFE   = 'forlife';
+    const ALIAS_AUXILIARY = 'alias_aux';
+    private $sa = array();
+    /** Allows filtering by source email.
+     * @param $email If null, enable a left join on the email source table
+     *  (email_source_account); otherwise, perform a left join on users having
+     *  that email as a source email.
+     * @return Suffix to use to access the adequate table.
+     */
+     public function addAliasFilter($email = null)
     {
         $this->requireAccounts();
-        return $this->register_optional($this->al, $alias);
+        return $this->register_optional($this->sa, $email);
     }
 
     protected function emailJoins()
     {
         global $globals;
         $joins = array();
-        foreach ($this->e as $sub=>$key) {
-            if (is_null($key)) {
-                $joins['e' . $sub] = PlSqlJoin::left('emails', '$ME.uid = $UID AND $ME.flags != \'filter\'');
+        foreach ($this->ra as $sub => $redirections) {
+            if (is_null($redirections)) {
+                $joins['ra' . $sub] = PlSqlJoin::left('email_redirect_account', '$ME.uid = $UID AND $ME.type != \'imap\'');
             } else {
-                if (!is_array($key)) {
-                    $key = array($key);
+                if (!is_array($redirections)) {
+                    $key = array($redirections);
                 }
-                $joins['e' . $sub] = PlSqlJoin::left('emails', '$ME.uid = $UID AND $ME.flags != \'filter\'
-                                                               AND $ME.email IN {?}', $key);
+                $joins['ra' . $sub] = PlSqlJoin::left('email_redriect_account', '$ME.uid = $UID AND $ME.type != \'imap\'
+                                                                                 AND $ME.redirect IN {?}', $redirections);
             }
         }
-        foreach ($this->al as $sub=>$key) {
-            if (is_null($key)) {
-                $joins['al' . $sub] = PlSqlJoin::left('aliases', '$ME.uid = $UID AND $ME.type IN (\'alias\', \'a_vie\')');
+        foreach ($this->sa as $sub => $emails) {
+            if (is_null($emails)) {
+                $joins['sa' . $sub] = PlSqlJoin::left('email_source_account', '$ME.uid = $UID');
             } else if ($key == self::ALIAS_BEST) {
-                $joins['al' . $sub] = PlSqlJoin::left('aliases', '$ME.uid = $UID AND $ME.type IN (\'alias\', \'a_vie\') AND  FIND_IN_SET(\'bestalias\', $ME.flags)');
+                $joins['sa' . $sub] = PlSqlJoin::left('email_source_account', '$ME.uid = $UID AND FIND_IN_SET(\'bestalias\', $ME.flags)');
             } else if ($key == self::ALIAS_FORLIFE) {
-                $joins['al' . $sub] = PlSqlJoin::left('aliases', '$ME.uid = $UID AND $ME.type = \'a_vie\'');
-            } else {
-                if (!is_array($key)) {
-                    $key = array($key);
-                }
-                $joins['al' . $sub] = PlSqlJoin::left('aliases', '$ME.uid = $UID AND $ME.type IN (\'alias\', \'a_vie\')
-                                                                  AND $ME.alias IN {?}', $key);
-            }
-        }
-        foreach ($this->ve as $sub=>$key) {
-            if (is_null($key)) {
-                $joins['v' . $sub] = PlSqlJoin::left('virtual', '$ME.type = \'user\'');
+                $joins['sa' . $sub] = PlSqlJoin::left('email_source_account', '$ME.uid = $UID AND $ME.type = \'forlife\'');
+            } else if ($key == self::ALIAS_AUXILiIARY) {
+                $joins['sa' . $sub] = PlSqlJoin::left('email_source_account', '$ME.uid = $UID AND $ME.type = \'alias_aux\'');
             } else {
-                if (!is_array($key)) {
-                    $key = array($key);
+                if (!is_array($emails)) {
+                    $key = array($emails);
                 }
-                $joins['v' . $sub] = PlSqlJoin::left('virtual', '$ME.type = \'user\' AND $ME.alias IN {?}', $key);
+                $joins['sa' . $sub] = PlSqlJoin::left('email_source_account', '$ME.uid = $UID AND $ME.email IN {?}', $emails);
             }
-            $joins['vr' . $sub] = PlSqlJoin::left('virtual_redirect',
-                                                  '$ME.vid = v' . $sub . '.vid
-                                                   AND ($ME.redirect IN (CONCAT(al_forlife.alias, \'@\', {?}),
-                                                                         CONCAT(al_forlife.alias, \'@\', {?}),
-                                                                         a.email))',
-                                                  $globals->mail->domain, $globals->mail->domain2);
-        }
-        if ($this->with_eo) {
-            $joins['eo'] = PlSqlJoin::left('email_options', '$ME.uid = $UID');
         }
         return $joins;
     }
index b782311..ed9c898 100644 (file)
@@ -338,8 +338,7 @@ class UFC_HasEmailRedirect extends UserFilterCondition
     public function buildCondition(PlFilter $uf)
     {
         $sub_redirect = $uf->addEmailRedirectFilter();
-        $sub_options = $uf->addEmailOptionsFilter();
-        return 'e' . $sub_redirect . '.flags = \'active\' OR FIND_IN_SET(\'googleapps\', ' . $sub_options . '.storage)';
+        return 'ra' . $sub_redirect . '.flags = \'active\'';
     }
 }
 // }}}
@@ -944,9 +943,8 @@ class UFC_Email extends UserFilterCondition
     public function buildCondition(PlFilter $uf)
     {
         $foreign = array();
-        $virtual = array();
-        $aliases = array();
-        $cond = array();
+        $local   = array();
+        $cond    = array();
 
         if (count($this->emails) == 0) {
             return PlFilterCondition::COND_TRUE;
@@ -955,25 +953,19 @@ class UFC_Email extends UserFilterCondition
         foreach ($this->emails as $entry) {
             if (User::isForeignEmailAddress($entry)) {
                 $foreign[] = $entry;
-            } else if (User::isVirtualEmailAddress($entry)) {
-                $virtual[] = $entry;
             } else {
-                @list($user, $domain) = explode('@', $entry);
-                $aliases[] = $user;
+                list($local_part, ) = explode('@', $entry);
+                $local[] = $local_part;
             }
         }
 
         if (count($foreign) > 0) {
             $sub = $uf->addEmailRedirectFilter($foreign);
-            $cond[] = XDB::format('e' . $sub . '.email IS NOT NULL OR a.email IN {?}', $foreign);
+            $cond[] = XDB::format('ra' . $sub . '.redirect IS NOT NULL OR ra.redirect IN {?}', $foreign);
         }
-        if (count($virtual) > 0) {
-            $sub = $uf->addVirtualEmailFilter($virtual);
-            $cond[] = 'vr' . $sub . '.redirect IS NOT NULL';
-        }
-        if (count($aliases) > 0) {
-            $sub = $uf->addAliasFilter($aliases);
-            $cond[] = 'al' . $sub . '.alias IS NOT NULL';
+        if (count($local) > 0) {
+            $sub = $uf->addAliasFilter($local);
+            $cond[] = 'sa' . $sub . '.email IS NOT NULL';
         }
         return '(' . implode(') OR (', $cond) . ')';
     }