From: Florent Bruneau Date: Sun, 8 Feb 2009 18:12:12 +0000 (+0100) Subject: Improves email handling, add support for query on a list of emails. X-Git-Tag: xorg/1.0.0~332^2~383 X-Git-Url: http://git.polytechnique.org/?a=commitdiff_plain;h=21401768d4d66d81d5a5a71f2660c27a5104445d;p=platal.git Improves email handling, add support for query on a list of emails. Signed-off-by: Florent Bruneau --- diff --git a/classes/userfilter.php b/classes/userfilter.php index 1a88da7..0940faa 100644 --- a/classes/userfilter.php +++ b/classes/userfilter.php @@ -344,18 +344,58 @@ class UFC_Email implements UserFilterCondition if (User::isForeignEmailAddress($this->email)) { $sub = $uf->addEmailRedirectFilter($this->email); return XDB::format('e' . $sub . '.email IS NOT NULL OR a.email = {?}', $this->email); + } else if (User::isVirtualEmailAddress($this->email)) { + $sub = $uf->addVirtualEmailFilter($this->email); + return 'vr' . $sub . '.redirect IS NOT NULL'; } else { - if (User::isVirtualEmailAddress($this->email)) { - $sub = $uf->addVirtualEmailFilter($this->email); - } else { - list($user, $domain) = explode('@', $this->email); - $sub = $uf->addAliasFilter($user); - } + @list($user, $domain) = explode('@', $this->email); + $sub = $uf->addAliasFilter($user); return 'al' . $sub . '.alias IS NOT NULL'; } } } +class UFC_EmailList implements UserFilterCondition +{ + private $emails; + public function __construct($emails) + { + $this->emails = $emails; + } + + public function buildCondition(UserFilter &$uf) + { + $email = null; + $virtual = null; + $alias = null; + $cond = array(); + + if (count($this->emails) == 0) { + return UserFilterCondition::COND_TRUE; + } + + foreach ($this->emails as $entry) { + if (User::isForeignEmailAddress($entry)) { + if (is_null($email)) { + $email = $uf->addEmailRedirectFilter(); + } + $cond[] = XDB::format('e' . $email . '.email = {?} OR a.email = {?}', $entry, $entry); + } else if (User::isVirtualEmailAddress($entry)) { + if (is_null($virtual)) { + $virtual = $uf->addVirtualEmailFilter(); + } + $cond[] = XDB::format('vr' . $virtual . '.redirect IS NOT NULL AND v' . $virtual . '.alias = {?}', $entry); + } else { + if (is_null($alias)) { + $alias = $uf->addAliasFilter(); + } + @list($user, $domain) = explode('@', $entry); + $cond[] = XDB::format('al' . $alias . '.alias = {?}', $user); + } + } + return '(' . implode(') OR (', $cond) . ')'; + } +} /****************** * ORDERS @@ -870,9 +910,12 @@ class UserFilter 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) { @@ -890,23 +933,28 @@ class UserFilter $joins['e' . $sub] = array('left', 'emails', XDB::format('$ME.uid = $UID AND $ME.flags != \'filter\' AND $ME.email = {?}', $key)); } } - foreach ($this->ve as $sub=>$key) { + foreach ($this->al as $sub=>$key) { if (is_null($key)) { - $joins['v' . $sub] = array('left', 'virtual', '$ME.type = \'user\''); + $joins['al' . $sub] = array('left', 'aliases', '$ME.id = $UID AND $ME.type IN (\'alias\', \'a_vie\')'); + } else if ($key == self::ALIAS_BEST) { + $joins['al' . $sub] = array('left', 'aliases', '$ME.id = $UID AND $ME.type IN (\'alias\', \'a_vie\') AND FIND_IN_SET(\'bestalias\', $ME.flags)'); + } else if ($key == self::ALIAS_FORLIFE) { + $joins['al' . $sub] = array('left', 'aliases', '$ME.id = $UID AND $ME.type = \'a_vie\''); } else { - $joins['v' . $sub] = array('left', 'virtual', XDB::format('$ME.type = \'user\' AND $ME.alias = {?}', $key)); + $joins['al' . $sub] = array('left', 'aliases', XDB::format('$ME.id = $UID AND $ME.type IN (\'alias\', \'a_vie\') AND $ME.alias = {?}', $key)); } - $joins['vr' . $sub] = array('inner', 'virtual_redirect', '$ME.vid = v' . $sub . '.vid'); - $joins['al' . $sub] = array('left', 'aliases', XDB::format('$ME.id = $UID AND (CONCAT($ME.alias, \'@\', {?}) = vr'. $sub . '.redirect - OR CONCAT($ME.alias, \'@\', {?}) = vr'. $sub . '.redirect)', - $globals->mail->domain, $globals->mail->domain2)); } - foreach ($this->al as $sub=>$key) { + foreach ($this->ve as $sub=>$key) { if (is_null($key)) { - $joins['al' . $sub] = array('left', 'aliases', '$ME.id = $UID'); + $joins['v' . $sub] = array('left', 'virtual', '$ME.type = \'user\''); } else { - $joins['al' . $sub] = array('left', 'aliases', XDB::format('$ME.id = $UID AND $ME.alias = {?}', $key)); + $joins['v' . $sub] = array('left', 'virtual', XDB::format('$ME.type = \'user\' AND $ME.alias = {?}', $key)); } + $joins['vr' . $sub] = array('left', 'virtual_redirect', XDB::format('$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)); } return $joins; }