/** 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;
}
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\'';
}
}
// }}}
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;
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) . ')';
}