From 3e53a496dd11e5082bfefc22fc9322d80152edd6 Mon Sep 17 00:00:00 2001 From: Florent Bruneau Date: Tue, 30 Dec 2008 11:09:23 +0100 Subject: [PATCH] Email alias form. Signed-off-by: Florent Bruneau --- classes/profile.php | 29 ++++++++++++++++++++++- classes/user.php | 43 +++++++++++++++++++++++++++++++++- modules/email.php | 57 +++++++++++++++++++--------------------------- templates/emails/alias.tpl | 5 +++- 4 files changed, 98 insertions(+), 36 deletions(-) diff --git a/classes/profile.php b/classes/profile.php index 9b30115..130cd35 100644 --- a/classes/profile.php +++ b/classes/profile.php @@ -25,6 +25,8 @@ class Profile private $hrpid; private $promo; + private $data = array(); + private function __construct($login) { if ($login instanceof PlUser) { @@ -68,6 +70,31 @@ class Profile return $this->promo; } + public function __get($name) + { + if (property_exists($this, $name)) { + return $this->$name; + } + + if (empty($this->data)) { + $this->data = XDB::fetchOneAssoc('SELECT * + FROM profiles + WHERE pid = {?}', + $this->id()); + } + if (isset($this->data[$name])) { + return $this->data[$name]; + } + + return null; + } + + public function __isset($name) + { + return property_exists($this, $name) || isset($this->data[$name]); + } + + public function owner() { return User::getSilent($this); @@ -79,7 +106,7 @@ class Profile try { return new Profile($login); } catch (UserNotFoundException $e) { - return false; + return null; } } } diff --git a/classes/user.php b/classes/user.php index b3ed15f..a26a75e 100644 --- a/classes/user.php +++ b/classes/user.php @@ -21,12 +21,17 @@ class User extends PlUser { + private $_profile_fetched = false; + private $_profile = null; + // Implementation of the login to uid method. protected function getLogin($login) { global $globals; if ($login instanceof Profile) { + $this->_profile = $login; + $this->_profile_fetched = true; $res = XDB::query('SELECT ap.uid FROM account_profiles AS ap WHERE ap.pid = {?} AND FIND_IN_SET(\'owner\', perms)', @@ -205,7 +210,43 @@ class User extends PlUser */ public function profile() { - return Profile::get($this); + if (!$this->_profile_fetched) { + $this->_profile_fetched = true; + $this->_profile = Profile::get($this); + } + return $this->_profile; + } + + /** Return true if the user has an associated profile. + */ + public function hasProfile() + { + return !is_null($this->profile()); + } + + /** Get the email alias of the user. + */ + public function emailAlias() + { + global $globals; + return XDB::fetchOneCell("SELECT v.alias + FROM virtual AS v + INNER JOIN virtual_redirect AS vr ON (v.vid = vr.vid) + WHERE (vr.redirect = {?} OR vr.redirect = {?}) + AND alias LIKE '%@{$globals->mail->alias_dom}'", + $this->forlifeEmail(), $this->m4xForlifeEmail(), $this->id()); + } + + /** Get the alternative forlife email + * TODO: remove this uber-ugly hack. The issue is that you need to remove + * all @m4x.org addresses in virtual_redirect first. + * XXX: This is juste to make code more readable, to be remove as soon as possible + */ + public function m4xForlifeEmail() + { + global $globals; + trigger_error('USING M4X FORLIFE', E_USER_NOTICE); + return $this->login() . '@' . $globals->mail->domain2; } // Return permission flags for a given permission level. diff --git a/modules/email.php b/modules/email.php index 796d40b..bfc5c06 100644 --- a/modules/email.php +++ b/modules/email.php @@ -129,25 +129,12 @@ class EmailModule extends PLModule FROM virtual INNER JOIN virtual_redirect USING (vid) WHERE alias = {?} AND (redirect = {?} OR redirect = {?})", - $value, $user->forlifeEmail(), - // TODO: remove this über-ugly hack. The issue is that you need - // to remove all @m4x.org addresses in virtual_redirect first. - $user->login() . '@' . $globals->mail->domain2); + $value, $user->forlifeEmail(), $user->m4xForlifeEmail()); } // Fetch existing @alias_dom aliases. - $res = XDB::query( - "SELECT alias, emails_alias_pub - FROM auth_user_quick, virtual - INNER JOIN virtual_redirect USING(vid) - WHERE (redirect = {?} OR redirect = {?}) - AND alias LIKE '%@{$globals->mail->alias_dom}' AND user_id = {?}", - $user->forlifeEmail(), - // TODO: remove this über-ugly hack. The issue is that you need - // to remove all @m4x.org addresses in virtual_redirect first. - $user->login() . '@' . $globals->mail->domain2, $user->id()); - list($alias, $visibility) = $res->fetchOneRow(); - $page->assign('actuel', $alias); + $alias = $user->emailAlias(); + $visibility = $user->hasProfile() && $user->profile()->alias_pub; if ($action == 'ask' && Env::has('alias') && Env::has('raison')) { S::assert_xsrf_token(); @@ -164,27 +151,31 @@ class EmailModule extends PLModule } //Quelques vérifications sur l'alias (caractères spéciaux) - if (!preg_match( "/^[a-zA-Z0-9\-.]{3,20}$/", $alias)) { + if (!preg_match("/^[a-zA-Z0-9\-.]{3,20}$/", $alias)) { $page->trigError("L'adresse demandée n'est pas valide." . " Vérifie qu'elle comporte entre 3 et 20 caractères" . " et qu'elle ne contient que des lettres non accentuées," . " des chiffres ou les caractères - et ."); return; } else { + $alias_mail = $alias.'@'.$globals->mail->alias_dom; + //vérifier que l'alias n'est pas déja pris - $res = XDB::query('SELECT COUNT(*) FROM virtual WHERE alias={?}', - $alias.'@'.$globals->mail->alias_dom); + $res = XDB::query('SELECT COUNT(*) + FROM virtual + WHERE alias={?}', + $alias_mail); if ($res->fetchOneCell() > 0) { - $page->trigError("L'alias $alias@{$globals->mail->alias_dom} a déja été attribué. - Tu ne peux donc pas l'obtenir."); + $page->trigError("L'alias $alias_mail a déja été attribué. + Tu ne peux donc pas l'obtenir."); return; } //vérifier que l'alias n'est pas déja en demande - $it = new ValidateIterator (); + $it = new ValidateIterator(); while($req = $it->next()) { - if ($req->type == "alias" and $req->alias == $alias . '@' . $globals->mail->alias_dom) { - $page->trigError("L'alias $alias@{$globals->mail->alias_dom} a déja été demandé. + if ($req->type == 'alias' and $req->alias == $alias_mail) { + $page->trigError("L'alias $alias_mail a déja été demandé. Tu ne peux donc pas l'obtenir pour l'instant."); return ; } @@ -201,18 +192,18 @@ class EmailModule extends PLModule return PL_FORBIDDEN; } - if ($value == 'public') { - XDB::execute("UPDATE auth_user_quick SET emails_alias_pub = 'public' - WHERE user_id = {?}", $user->id()); - } else { - XDB::execute("UPDATE auth_user_quick SET emails_alias_pub = 'private' - WHERE user_id = {?}", $user->id()); + if ($user->hasProfile()) { + XDB::execute("UPDATE profiles + SET alias_pub = {?} + WHERE pid = {?}", + $value, $user->profile()->id()); } - - $visibility = $value; + $visibility = ($value == 'public'); } - $page->assign('mail_public', ($visibility == 'public')); + $page->assign('actuel', $alias); + $page->assign('user', $user); + $page->assign('mail_public', $visibility); } function handler_redirect(&$page, $action = null, $email = null) diff --git a/templates/emails/alias.tpl b/templates/emails/alias.tpl index ec7ed66..380b854 100644 --- a/templates/emails/alias.tpl +++ b/templates/emails/alias.tpl @@ -37,6 +37,7 @@ {if $actuel} {javascript name=ajax} + {if $user->hasProfile()}
@@ -52,7 +53,7 @@
- + {/if} {else}

Pour plus de convivialité dans l'utilisation de tes emails, tu peux choisir une adresse @@ -93,6 +94,7 @@ @{#globals.mail.alias_dom#} et @{#globals.mail.alias_dom2#} + {if $user->hasProfile()} @@ -107,6 +109,7 @@
+ {/if} Brève explication : -- 2.1.4