From bb88d138d64cbab3b4a1859a531df0c4479d051b Mon Sep 17 00:00:00 2001 From: Pascal Corpet Date: Sun, 13 Jun 2010 22:51:49 +0200 Subject: [PATCH] Fixes non-x members of groups. Closes #1087 --- classes/user.php | 4 +- modules/xnetgrp.php | 224 ++++++++++++++++++------------------- templates/xnetgrp/membres-edit.tpl | 34 +++--- upgrade/account/30_xnet_groups.sql | 21 +++- 4 files changed, 142 insertions(+), 141 deletions(-) diff --git a/classes/user.php b/classes/user.php index 92d8d6e..9d95fa4 100644 --- a/classes/user.php +++ b/classes/user.php @@ -171,9 +171,9 @@ class User extends PlUser $uids = array_map(array('XDB', 'escape'), $uids); return XDB::iterator('SELECT a.uid, a.hruid, a.registration_date, ah.alias AS homonym, - CONCAT(af.alias, \'@' . $globals->mail->domain . '\') AS forlife, + IF (af.alias IS NULL, a.email, CONCAT(af.alias, \'@' . $globals->mail->domain . '\')) AS forlife, CONCAT(af.alias, \'@' . $globals->mail->domain2 . '\') AS forlife_alternate, - CONCAT(ab.alias, \'@' . $globals->mail->domain . '\') AS bestalias, + IF (ab.alias IS NULL, a.email, CONCAT(ab.alias, \'@' . $globals->mail->domain . '\')) AS bestalias, CONCAT(ab.alias, \'@' . $globals->mail->domain2 . '\') AS bestalias_alternate, a.full_name, a.display_name, a.sex = \'female\' AS gender, IF(a.state = \'active\', at.perms, \'\') AS perms, diff --git a/modules/xnetgrp.php b/modules/xnetgrp.php index 215f45b..35f589e 100644 --- a/modules/xnetgrp.php +++ b/modules/xnetgrp.php @@ -622,50 +622,59 @@ class XnetGrpModule extends PLModule if (is_null($email)) { return; - } else { - S::assert_xsrf_token(); } + S::assert_xsrf_token(); + + // Finds or creates account if (!User::isForeignEmailAddress($email)) { + // standard x account $user = User::get($email); - if ($user) { - XDB::execute("REPLACE INTO group_members (uid, asso_id, origine) - VALUES ({?}, {?}, 'X')", - $user->id(), $globals->asso('id')); - pl_redirect("member/" . $user->login()); + } else if (!isvalid_email($email)) { + // email might not be a regular email but an alias or a hruid + $user = User::get($email); + if (!$user) { + // need a valid email address + $page->trigError("« $email Â» n'est pas une adresse email valide."); + return; } - } else { - if (isvalid_email($email)) { - if (Env::v('x') && Env::i('userid')) { - $uid = Env::i('userid'); - $user = User::getWithUID($uid); - if ($user && $user->state == 'pending') { - if (Env::v('market')) { - $market = Marketing::get($uid, $email); - if (!$market) { - $market = new Marketing($uid, $email, 'group', $globals->asso('nom'), - Env::v('market_from'), S::v('uid')); - $market->add(); - } - } - XDB::execute('REPLACE INTO group_members (uid, asso_id, origine, email) - VALUES ({?}, {?}, "X", {?})', - $uid, $globals->asso('id'), $email); - $this->removeSubscriptionRequest($uid); - pl_redirect("member/$email"); - } - $page->trigError("Utilisateur invalide"); - } else { - $res = XDB::query('SELECT MAX(uid) + 1 FROM group_members'); - $uid = max(intval($res->fetchOneCell()), 50001); - XDB::execute('REPLACE INTO group_members (uid, asso_id, origine, email) - VALUES ({?}, {?}, "ext", {?})', - $uid, $globals->asso('id'), $email); - pl_redirect("member/$email"); + } else if (Env::v('x') && Env::i('userid')) { + // user is an x but might not yet be registered + $user = User::getWithUID(Env::i('userid')); + if (!$user) { + $page->trigError("Utilisateur invalide"); + return; + } + // add email for marketing if unknown + if ($user->state == 'pending' && Env::v('market')) { + $market = Marketing::get($user->uid, $email); + if (!$market) { + $market = new Marketing($user->uid, $email, 'group', $globals->asso('nom'), + Env::v('market_from'), S::v('uid')); + $market->add(); } - } else { - $page->trigError("« $email Â» n'est pas une adresse email valide."); } + } else { + // user is not an x + $hruid = strtolower(str_replace('@','.',$email).'.ext'); + // might already exists (in another group for example) + $user = User::get($hruid); + if (empty($user)) { + // creates new account: build names from email address + $display_name = ucwords(strtolower(substr($hruid, strpos('.', $hruid)))); + $full_name = ucwords(strtolower(str_replace('.', ' ',substr($email, strpos('@', $email))))); + XDB::execute("INSERT INTO accounts (hruid, display_name, full_name, email, type) + VALUES({?}, {?}, {?}, {?}, 'xnet')", + $hruid, $display_name, $full_name, $email); + $user = User::get($hruid); + } + } + if ($user) { + XDB::execute("REPLACE INTO group_members (uid, asso_id) + VALUES ({?}, {?})", + $user->id(), $globals->asso('id')); + $this->removeSubscriptionRequest($user->id()); + pl_redirect("member/" . $user->login()); } } @@ -805,12 +814,8 @@ class XnetGrpModule extends PLModule private function changeLogin(PlPage &$page, PlUser &$user, MMList &$mmlist, $login) { // Search the uid of the user... - $res = XDB::query("SELECT f.uid, f.alias - FROM aliases AS a - INNER JOIN aliases AS f ON (f.uid = a.uid AND f.type = 'a_vie') - WHERE a.alias = {?}", - $login); - if ($res->numRows() == 0) { + $xuser = User::getSilent($login); + if (!$xuser) { $accounts = User::getPendingAccounts($login); if (!$accounts) { $page->trigError("L'identifiant $login ne correspond à aucun X."); @@ -819,55 +824,34 @@ class XnetGrpModule extends PLModule $page->trigError("L'identifiant $login correspond à plusieurs camarades."); return false; } - $uid = $accounts[0]['uid']; + $xuser = User::getSilent($accounts[0]['uid']); $sub = false; - } else { - list($uid, $login) = $res->fetchOneRow(); - $sub = true; } - // Check if the user is already in the group - global $globals; - $res = XDB::query("SELECT uid, email - FROM group_members - WHERE uid = {?} AND asso_id = {?}", - $uid, $globals->asso('id')); - if ($res->numRows()) { - list($uid, $email) = $res->fetchOneRow(); - XDB::execute("DELETE FROM group_members - WHERE uid = {?}", - $user['uid']); - } else { - $email = $user['email']; - XDB::execute("UPDATE group_members - SET uid = {?}, origine = 'X' - WHERE uid = {?} AND asso_id = {?}", - $uid, $user['uid'], $globals->asso('id')); - } - if ($sub) { - $email = $login . '@' . $globals->mail->domain; + if (!$xuser) { + return false; } + // Check if the user is in some groups as an X and as an ext + XDB::execute("DELETE g1 FROM group_members AS g1, group_members AS g2 + WHERE g1.uid = {?} AND g2.uid = {?} AND g1.asso_id = g2.asso_id", + $user->id(), $xuser->id()); + XDB::execute("UPDATE group_members + SET uid = {?} + WHERE uid = {?}", + $xuser->id(), $user->id()); + // Update subscription to aliases - if ($email != $user['email']) { + if ($sub && $user->forlifeEmail() != $xuser->forlifeEmail()) { XDB::execute("UPDATE IGNORE virtual_redirect AS vr - INNER JOIN virtual AS v ON(vr.vid = v.vid AND SUBSTRING_INDEX(alias, '@', -1) = {?}) SET vr.redirect = {?} WHERE vr.redirect = {?}", - $globals->asso('mail_domain'), $email, $user['email']); - XDB::execute("DELETE vr.* - FROM virtual_redirect AS vr - INNER JOIN virtual AS v ON(vr.vid = v.vid AND SUBSTRING_INDEX(alias, '@', -1) = {?}) - WHERE vr.redirect = {?}", - $globals->asso('mail_domain'), $user['email']); + $xuser->forlifeEmail(), $user->forlifeEmail()); foreach (Env::v('ml1', array()) as $ml => $state) { - $mmlist->replace_email($ml, $user['email'], $email); + $mmlist->replace_email($ml, $user->forlifeEmail(), $xuser->forlifeEmail()); } } - if ($sub) { - return $login; - } - return $user['email']; + return $xuser->login(); } function handler_admin_member(&$page, $user) @@ -887,7 +871,7 @@ class XnetGrpModule extends PLModule S::assert_xsrf_token(); // Convert user status to X - if (Post::blank('login_X')) { + if (!Post::blank('login_X')) { // TODO: Rewrite changeLogin!!! $forlife = $this->changeLogin($page, $user, $mmlist, Post::t('login_X')); if ($forlife) { @@ -896,85 +880,89 @@ class XnetGrpModule extends PLModule } // Update user info - $email_changed = ($user['origine'] != 'X' && strtolower($user['email']) != strtolower(Post::v('email'))); - $from_email = $user['email']; - if ($user['origine'] != 'X') { - $user['nom'] = Post::v('nom'); - $user['prenom'] = (Post::v('origine') == 'ext') ? Post::v('prenom') : ''; - $user['sexe'] = (Post::v('origine') == 'ext') ? Post::v('sexe') : 0; - $user['origine'] = Post::v('origine'); - XDB::query('UPDATE group_members - SET prenom = {?}, nom = {?}, email = {?}, sexe = {?}, origine = {?} - WHERE uid = {?} AND asso_id = {?}', - $user['prenom'], $user['nom'], Post::v('email'), - $user['sexe'], $user['origine'], - $user['uid'], $globals->asso('id')); - $user['email'] = Post::v('email'); - $user['email2'] = Post::v('email'); - $page->trigSuccess('Données de l\'utilisateur mise à jour.'); + $email_changed = (!$user->profile() && strtolower($user->forlifeEmail()) != strtolower(Post::v('email'))); + $from_email = $user->forlifeEmail(); + if (!$user->profile()) { + XDB::query('UPDATE accounts + SET full_name = {?}, display_name = {?}, sex = {?}, email = {?}, type = {?} + WHERE uid = {?}', + Post::v('full_name'), Post::v('display_name'), (Post::v('sex') == 'male')?'male':'female', Post::v('email'), (Post::v('type') == 'xnet')?'xnet':'virtual', + $user->id()); + if (XDB::affectedRows()) { + $page->trigSuccess('Données de l\'utilisateur mise à jour.'); + } } - $perms = Post::i('is_admin'); + // Update group params for user + $perms = Post::v('group_perms'); $comm = Post::t('comm'); - if ($user['perms'] != $perms || $user['comm'] != $comm) { + if ($user->group_perms != $perms || $user->group_comm != $comm) { XDB::query('UPDATE group_members SET perms = {?}, comm = {?} WHERE uid = {?} AND asso_id = {?}', - $perms ? 'admin' : 'membre', $comm, - $user['uid'], $globals->asso('id')); - if ($perms != $user['perms']) { + ($perms == 'admin') ? 'admin' : 'membre', $comm, + $user->id(), $globals->asso('id')); + if ($perms != $user->group_perms) { $page->trigSuccess('Permissions modifiées !'); } - if ($comm != $user['comm']) { + if ($comm != $user->group_comm) { $page->trigSuccess('Commentaire mis à jour.'); } - $user['perms'] = $perms; - $user['comm'] = $comm; } + // Gets user info again as they might have change + $user = User::getSilent($user->id()); + // Update ML subscriptions foreach (Env::v('ml1', array()) as $ml => $state) { $ask = empty($_REQUEST['ml2'][$ml]) ? 0 : 2; if ($ask == $state) { if ($state && $email_changed) { - $mmlist->replace_email($ml, $from_email, $user['email2']); - $page->trigSuccess("L'abonnement de {$user['prenom']} {$user['nom']} à $ml@ a été mis à jour."); + $mmlist->replace_email($ml, $from_email, $user->forlifeEmail()); + $page->trigSuccess("L'abonnement de {$user->fullName()} à $ml@ a été mis à jour."); } continue; } if ($state == '1') { - $page->trigWarning("{$user['prenom']} {$user['nom']} a " + $page->trigWarning("{$user->fullName()} a " ."actuellement une demande d'inscription en " ."cours sur $ml@ !!!"); } elseif ($ask) { - $mmlist->mass_subscribe($ml, Array($user['email2'])); - $page->trigSuccess("{$user['prenom']} {$user['nom']} a été abonné à $ml@."); + $mmlist->mass_subscribe($ml, Array($user->forlifeEmail())); + $page->trigSuccess("{$user->fullName()} a été abonné à $ml@."); } else { if ($email_changed) { $mmlist->mass_unsubscribe($ml, Array($from_email)); } else { - $mmlist->mass_unsubscribe($ml, Array($user['email2'])); + $mmlist->mass_unsubscribe($ml, Array($user->forlifeEmail())); } - $page->trigSuccess("{$user['prenom']} {$user['nom']} a été désabonné de $ml@."); + $page->trigSuccess("{$user->fullName()} a été désabonné de $ml@."); } } // Change subscriptioin to aliases foreach (Env::v('ml3', array()) as $ml => $state) { $ask = !empty($_REQUEST['ml4'][$ml]); - if($state == $ask) continue; - if($ask) { + if($state == $ask) { + if ($state && $email_changed) { + XDB::query("UPDATE virtual_redirect AS vr, virtual AS v + SET vr.redirect = {?} + WHERE vr.vid = v.vid AND v.alias = {?} AND vr.redirect = {?}", + $user->forlifeEmail(), $ml, $from_email); + $page->trigSuccess("L'abonnement de {$user->fullName()} à $ml a été mis à jour."); + } + } else if($ask) { XDB::query("INSERT INTO virtual_redirect (vid,redirect) SELECT vid,{?} FROM virtual WHERE alias={?}", - $user['email'], $ml); - $page->trigSuccess("{$user['prenom']} {$user['nom']} a été abonné à $ml."); + $user->forlifeEmail(), $ml); + $page->trigSuccess("{$user->fullName()} a été abonné à $ml."); } else { XDB::query("DELETE FROM virtual_redirect USING virtual_redirect INNER JOIN virtual USING(vid) WHERE redirect={?} AND alias={?}", - $user['email'], $ml); - $page->trigSuccess("{$user['prenom']} {$user['nom']} a été désabonné de $ml."); + $from_email, $ml); + $page->trigSuccess("{$user->fullName()} a été désabonné de $ml."); } } } diff --git a/templates/xnetgrp/membres-edit.tpl b/templates/xnetgrp/membres-edit.tpl index 48fb5f9..1b506c6 100644 --- a/templates/xnetgrp/membres-edit.tpl +++ b/templates/xnetgrp/membres-edit.tpl @@ -24,7 +24,7 @@ {literal} function showInformations(box) { - var state = (box.value == 'ext') ? '' : 'none'; + var state = (box.value != 'virtual') ? '' : 'none'; document.getElementById('prenom').style.display = state; document.getElementById('sexe').style.display = state; document.getElementById('make_X').style.display = state; @@ -59,37 +59,38 @@ Permissions : - + + + {if !$user->profile()} Type d'utilisateur : - profile()} disabled="disabled"{/if}> + + type eq "virtual"}style="display: none"{/if}> - Prénom : + Nom affiché : - + profile()} disabled="disabled"{/if} /> - Nom : + Nom complet : - + profile()} disabled="disabled"{/if} /> type eq "virtual"}style="display: none"{/if}> @@ -97,9 +98,9 @@ Sexe : - profile()} disabled="disabled"{/if}> + + @@ -108,9 +109,10 @@ Email : - + profile()} disabled="disabled"{/if} /> + {/if} Commentaire : @@ -120,7 +122,7 @@ Poste, origine… (accessible à toutes les personnes autorisées à consulter l'annuaire) - {if $user->type eq 'ext'} + {if $user->type eq 'xnet'} diff --git a/upgrade/account/30_xnet_groups.sql b/upgrade/account/30_xnet_groups.sql index 8f21ab6..85ef767 100644 --- a/upgrade/account/30_xnet_groups.sql +++ b/upgrade/account/30_xnet_groups.sql @@ -6,7 +6,7 @@ UPDATE group_members SET nom = NULL WHERE LENGTH(TRIM(nom)) = 0; INSERT INTO accounts ( SELECT NULL AS uid, CONCAT(LOWER(REPLACE(email,'@','.')),'.ext') AS hruid, - 'xnet' AS type, + IF(origine = 'ext','xnet','virtual') AS type, 0 as is_admin, 'disabled' AS state, NULL as password, @@ -26,7 +26,7 @@ INSERT INTO accounts ( 'html' AS email_format, 1 AS skin, NULL as last_version - FROM group_members WHERE origine = 'ext' GROUP BY hruid); + FROM group_members WHERE origine != 'x' GROUP BY hruid); # Make Upper case for first letters in fake full_names and display_names UPDATE accounts AS a, group_members AS g @@ -38,18 +38,29 @@ UPDATE accounts AS a, group_members AS g LEFT(a.full_name, POSITION(' ' IN a.full_name)), UPPER(MID(a.full_name, POSITION(' ' IN a.full_name) + 1, 1)), MID(a.full_name, POSITION(' ' IN a.full_name) + 2)) - WHERE a.hruid = CONCAT(LOWER(REPLACE(g.email,'@','.')),'.ext') AND POSITION(' ' IN a.full_name); + WHERE a.hruid = CONCAT(LOWER(REPLACE(g.email,'@','.')),'.ext') AND g.prenom IS NULL AND POSITION(' ' IN a.full_name); # Delete person that are several time in same asso DELETE g2 FROM group_members AS g1 INNER JOIN group_members AS g2 ON (g1.asso_id = g2.asso_id AND g1.email = g2.email AND g1.uid < g2.uid) - WHERE g1.origine = 'ext' AND g2.origine = 'ext'; + WHERE g1.origine != 'x' AND g2.origine != 'x'; # Update uids UPDATE group_members AS g, accounts AS a SET g.uid = a.uid - WHERE g.origine = 'ext' AND + WHERE g.origine != 'x' AND a.hruid = CONCAT(LOWER(REPLACE(g.email,'@','.')),'.ext'); +# Enable virtual accounts (for groups) with no rights +INSERT IGNORE INTO account_types VALUES('virtual', ''); + +# Drop now unused columns +ALTER TABLE group_members + DROP COLUMN sexe, + DROP COLUMN prenom, + DROP COLUMN nom, + DROP COLUMN origine, + DROP COLUMN email; + # vim:set syntax=mysql: -- 2.1.4