From e338c7e86a56ec417a7014b186d9a126084b7010 Mon Sep 17 00:00:00 2001 From: =?utf8?q?St=C3=A9phane=20Jacob?= Date: Fri, 4 Mar 2011 13:55:53 +0100 Subject: [PATCH] Adapts UserFilter to new mail chain. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Jacob --- classes/userfilter.php | 98 ++++++++++++++--------------------- classes/userfilter/conditions.inc.php | 26 ++++------ 2 files changed, 48 insertions(+), 76 deletions(-) diff --git a/classes/userfilter.php b/classes/userfilter.php index bef41c4..2e8af86 100644 --- a/classes/userfilter.php +++ b/classes/userfilter.php @@ -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; } diff --git a/classes/userfilter/conditions.inc.php b/classes/userfilter/conditions.inc.php index b782311..ed9c898 100644 --- a/classes/userfilter/conditions.inc.php +++ b/classes/userfilter/conditions.inc.php @@ -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) . ')'; } -- 2.1.4