Merge remote branch 'origin/xorg/maint' into xorg/master
authorStéphane Jacob <sj@m4x.org>
Sat, 2 Apr 2011 15:52:51 +0000 (17:52 +0200)
committerStéphane Jacob <sj@m4x.org>
Sat, 2 Apr 2011 15:52:51 +0000 (17:52 +0200)
classes/user.php
include/emails.inc.php
include/validations/listes.inc.php
modules/xnetevents/xnetevents.inc.php
modules/xnetgrp.php
modules/xnetlists.php
templates/xnetlists/alias-admin.tpl

index 976da55..304c1fa 100644 (file)
@@ -701,7 +701,7 @@ class User extends PlUser
             }
 
             $tables = array('account_auth_openid', 'announce_read', 'contacts',
-                            'email_send_save', 'email_virtual',
+                            'email_send_save',
                             'forum_innd', 'forum_profiles', 'forum_subs',
                             'group_announces_read', 'group_members',
                             'group_member_sub_requests', 'reminder', 'requests',
@@ -714,6 +714,9 @@ class User extends PlUser
             XDB::execute('DELETE FROM  email_redirect_account
                                 WHERE  uid = {?} AND type != \'homonym\'',
                          $this->id());
+            XDB::execute('DELETE FROM  email_virtual
+                                WHERE  redirect = {?}',
+                         $this->forlifeEmail());
 
             foreach (array('gapps_accounts', 'gapps_nicknames') as $t) {
                 XDB::execute('DELETE FROM  ' . $t . '
index 1e8a323..74eb015 100644 (file)
@@ -24,38 +24,61 @@ define('ERROR_INACTIVE_REDIRECTION', 2);
 define('ERROR_INVALID_EMAIL', 3);
 define('ERROR_LOOP_EMAIL', 4);
 
-function add_to_list_alias(User $user, $local_part, $domain, $type = 'alias')
+function format_email_alias($email)
 {
-    Platal::assert($user !== null, 'User should not be null.');
+    if ($user = User::getSilent($email)) {
+        return $user->forlifeEmail();
+    }
+    if (isvalid_email($email)) {
+        return $email;
+    }
+    return null;
+}
+
+function add_to_list_alias($email, $local_part, $domain, $type = 'alias')
+{
+    $email = format_email_alias($email);
+    if (is_null($email)) {
+        return false;
+    }
 
     XDB::execute('INSERT IGNORE INTO  email_virtual (email, domain, redirect, type)
                               SELECT  {?}, id, {?}, {?}
                                 FROM  email_virtual_domains
                                WHERE  name = {?}',
-                 $local_part, $user->forlifeEmail(), $type, $domain);
+                 $local_part, $email, $type, $domain);
+    return true;
 }
 
-function delete_from_list_alias(User $user, $local_part, $domain, $type = 'alias')
+function delete_from_list_alias($email, $local_part, $domain, $type = 'alias')
 {
-    Platal::assert($user !== null, 'User should not be null.');
+    $email = format_email_alias($email);
+    if (is_null($email)) {
+        return false;
+    }
 
     XDB::execute('DELETE  v
                     FROM  email_virtual         AS v
               INNER JOIN  email_virtual_domains AS m ON (v.domain = m.id)
               INNER JOIN  email_virtual_domains AS d ON (d.aliasing = m.id)
                    WHERE  v.email = {?} AND d.name = {?} AND v.redirect = {?} AND type = {?}',
-                 $local_part, $domain, $user->forlifeEmail(), $type);
+                 $local_part, $domain, $email, $type);
+    return true;
 }
 
-function update_list_alias(User $user, $former_email, $local_part, $domain, $type = 'alias')
+function update_list_alias($email, $former_email, $local_part, $domain, $type = 'alias')
 {
-    Platal::assert($user !== null, 'User should not be null.');
+    $email = format_email_alias($email);
+    if (is_null($email)) {
+        return false;
+    }
 
     XDB::execute('UPDATE  email_virtual         AS v
               INNER JOIN  email_virtual_domains AS d ON (v.domain = d.id)
                      SET  v.redirect = {?}
                    WHERE  v.redirect = {?} AND d.name = {?} AND v.email = {?} AND v.type = {?}',
-                 $user->forlifeEmail(), $former_email, $domain, $local_part, $type);
+                 $email, $former_email, $domain, $local_part, $type);
+    return true;
 }
 
 function list_alias_members($local_part, $domain)
@@ -67,12 +90,20 @@ function list_alias_members($local_part, $domain)
                                  WHERE  v.email = {?} AND d.name = {?} AND type = \'alias\'',
                                $local_part, $domain);
 
-    $members = array();
+    $users = array();
+    $nonusers = array();
     foreach ($emails as $email) {
-        $members[] = User::getSilent($email);
+        if ($user = User::getSilent($email)) {
+            $users[] = $user;
+        } else {
+            $nonusers[] = $email;
+        }
     }
 
-    return $members;
+    return array(
+        'users'    => $users,
+        'nonusers' => $nonusers
+    );
 }
 
 function delete_list_alias($local_part, $domain)
index 197d187..b5bcd15 100644 (file)
@@ -131,8 +131,7 @@ class ListeReq extends Validate
 
         if ($this->asso == 'alias') {
             foreach ($this->members as $member) {
-                $user = User::get($member);
-                add_to_list_alias($user, $this->liste, $this->domain);
+                add_to_list_alias($member, $this->liste, $this->domain);
             }
         } else {
             $list = new MMList(S::user(), $this->domain);
index dc17ac3..baeeb2b 100644 (file)
@@ -184,39 +184,37 @@ function subscribe_lists_event($uid, $short_name, $participate, $paid, $payment
         return;
     }
 
-    $user = User::getSilentWithUID($uid);
-
     /** If $payment is not null, we do not retrieve the value of $participate,
      * thus we do not alter participant and absent lists.
      */
     if ($payment === true) {
         if ($paid > 0) {
-            delete_from_list_alias($user, $short_name . $globals->xnet->unpayed_list, $globals->xnet->evts_domain, 'event');
-            add_to_list_alias($user, $short_name . $globals->xnet->payed_list, $globals->xnet->evts_domain, 'event');
+            delete_from_list_alias($uid, $short_name . $globals->xnet->unpayed_list, $globals->xnet->evts_domain, 'event');
+            add_to_list_alias($uid, $short_name . $globals->xnet->payed_list, $globals->xnet->evts_domain, 'event');
         }
     } else {
         switch ($participate) {
           case -1:
-            delete_from_list_alias($user, $short_name . $globals->xnet->participant_list, $globals->xnet->evts_domain, 'event');
-            delete_from_list_alias($user, $short_name . $globals->xnet->unpayed_list, $globals->xnet->evts_domain, 'event');
-            delete_from_list_alias($user, $short_name . $globals->xnet->payed_list, $globals->xnet->evts_domain, 'event');
-            add_to_list_alias($user, $short_name . $globals->xnet->absent_list, $globals->xnet->evts_domain, 'event');
+            delete_from_list_alias($uid, $short_name . $globals->xnet->participant_list, $globals->xnet->evts_domain, 'event');
+            delete_from_list_alias($uid, $short_name . $globals->xnet->unpayed_list, $globals->xnet->evts_domain, 'event');
+            delete_from_list_alias($uid, $short_name . $globals->xnet->payed_list, $globals->xnet->evts_domain, 'event');
+            add_to_list_alias($uid, $short_name . $globals->xnet->absent_list, $globals->xnet->evts_domain, 'event');
             break;
           case 0:
-            delete_from_list_alias($user, $short_name . $globals->xnet->participant_list, $globals->xnet->evts_domain, 'event');
-            delete_from_list_alias($user, $short_name . $globals->xnet->absent_list, $globals->xnet->evts_domain, 'event');
-            delete_from_list_alias($user, $short_name . $globals->xnet->unpayed_list, $globals->xnet->evts_domain, 'event');
-            delete_from_list_alias($user, $short_name . $globals->xnet->payed_list, $globals->xnet->evts_domain, 'event');
+            delete_from_list_alias($uid, $short_name . $globals->xnet->participant_list, $globals->xnet->evts_domain, 'event');
+            delete_from_list_alias($uid, $short_name . $globals->xnet->absent_list, $globals->xnet->evts_domain, 'event');
+            delete_from_list_alias($uid, $short_name . $globals->xnet->unpayed_list, $globals->xnet->evts_domain, 'event');
+            delete_from_list_alias($uid, $short_name . $globals->xnet->payed_list, $globals->xnet->evts_domain, 'event');
             break;
           case 1:
-            add_to_list_alias($user, $short_name . $globals->xnet->participant_list, $globals->xnet->evts_domain, 'event');
-            delete_from_list_alias($user, $short_name . $globals->xnet->absent_list, $globals->xnet->evts_domain, 'event');
+            add_to_list_alias($uid, $short_name . $globals->xnet->participant_list, $globals->xnet->evts_domain, 'event');
+            delete_from_list_alias($uid, $short_name . $globals->xnet->absent_list, $globals->xnet->evts_domain, 'event');
             if ($paid > 0) {
-                delete_from_list_alias($user, $short_name . $globals->xnet->unpayed_list, $globals->xnet->evts_domain, 'event');
-                add_to_list_alias($user, $short_name . $globals->xnet->payed_list, $globals->xnet->evts_domain, 'event');
+                delete_from_list_alias($uid, $short_name . $globals->xnet->unpayed_list, $globals->xnet->evts_domain, 'event');
+                add_to_list_alias($uid, $short_name . $globals->xnet->payed_list, $globals->xnet->evts_domain, 'event');
             } else {
-                add_to_list_alias($user, $short_name . $globals->xnet->unpayed_list, $globals->xnet->evts_domain, 'event');
-                delete_from_list_alias($user, $short_name . $globals->xnet->payed_list, $globals->xnet->evts_domain, 'event');
+                add_to_list_alias($uid, $short_name . $globals->xnet->unpayed_list, $globals->xnet->evts_domain, 'event');
+                delete_from_list_alias($uid, $short_name . $globals->xnet->payed_list, $globals->xnet->evts_domain, 'event');
             }
             break;
         }
@@ -289,9 +287,8 @@ function event_change_shortname($page, $eid, $old, $new)
                                         FROM  group_event_participants
                                        WHERE  eid = {?} AND ' . $where[$suffix],
                                      $eid);
-            $users = User::getBulkUsersWithUIDs($uids, null, null, false);
-            foreach ($users as $user) {
-                add_to_list_alias($user, $new . $suffix, $globals->xnet->evts_domain, 'event');
+            foreach ($uids as $uid) {
+                add_to_list_alias($uid, $new . $suffix, $globals->xnet->evts_domain, 'event');
             }
         }
         $uids = XDB::fetchColumn('SELECT  m.uid
@@ -299,9 +296,8 @@ function event_change_shortname($page, $eid, $old, $new)
                                LEFT JOIN  group_event_participants AS e ON (e.uid = m.uid AND e.eid = {?})
                                    WHERE  m.asso_id = {?} AND e.uid IS NULL',
                                  $eid, $globals->asso('id'));
-        $users = User::getBulkUsersWithUIDs($uids, null, null, false);
-        foreach ($users as $user) {
-            add_to_list_alias($user, $new . $globals->xnet->absent_list, $globals->xnet->evts_domain, 'event');
+        foreach ($uids as $uid) {
+            add_to_list_alias($uid, $new . $globals->xnet->absent_list, $globals->xnet->evts_domain, 'event');
         }
 
         return $new;
index 51917e8..90a905f 100644 (file)
@@ -1087,16 +1087,17 @@ class XnetGrpModule extends PLModule
             foreach (Env::v('ml3', array()) as $ml => $state) {
                 require_once 'emails.inc.php';
                 $ask = !empty($_REQUEST['ml4'][$ml]);
+                list($local_part, ) = explode('@', $ml);
                 if($state == $ask) {
                     if ($state && $email_changed) {
-                        update_list_alias($user, $from_email, $ml, $globals->asso('mail_domain'));
+                        update_list_alias($user->id(), $from_email, $local_part, $globals->asso('mail_domain'));
                         $page->trigSuccess("L'abonnement de {$user->fullName()} à $ml a été mis à jour.");
                     }
                 } else if($ask) {
-                    add_to_list_alias($user, $ml, $globals->asso('mail_domain'));
+                    add_to_list_alias($user->id(), $local_part, $globals->asso('mail_domain'));
                     $page->trigSuccess("{$user->fullName()} a été abonné à $ml.");
                 } else {
-                    delete_from_list_alias($user, $ml, $globals->asso('mail_domain'));
+                    delete_from_list_alias($user->id(), $local_part, $globals->asso('mail_domain'));
                     $page->trigSuccess("{$user->fullName()} a été désabonné de $ml.");
                 }
             }
index 3f0e792..c7bbf25 100644 (file)
@@ -215,25 +215,29 @@ class XnetListsModule extends ListsModule
 
         require_once 'emails.inc.php';
         list($local_part, $domain) = explode('@', $lfull);
+        if ($globals->asso('mail_domain') != $domain || !preg_match("/^[a-zA-Z0-9\-\.]*$/", $local_part)) {
+            $page->trigErrorRedirect('Le nom de l\'alias est erroné.', $globals->asso('diminutif') . '/lists');
+        }
+
+
         if (Env::has('add_member')) {
             S::assert_xsrf_token();
 
-            $email = Env::t('add_member');
-            $user = User::getSilent($email);
-            if ($user) {
-                add_to_list_alias($user, $local_part, $domain);
-                $page->trigSuccess($email . ' ajouté.');
+            if (add_to_list_alias(Env::t('add_member'), $local_part, $domain)) {
+                $page->trigSuccess('Ajout réussit.');
             } else {
-                $page->trigError($email . " n'existe pas.");
+                $page->trigError('Ajout infructueux.');
             }
         }
 
         if (Env::has('del_member')) {
             S::assert_xsrf_token();
 
-            $user = User::getSilent(Env::t('del_member'));
-            delete_from_list_alias($user, $local_part, $domain);
-            $page->trigSuccess($user->fullName() . ' supprimé.');
+            if (delete_from_list_alias(Env::t('del_member'), $local_part, $domain)) {
+                $page->trigSuccess('Suppression réussie.');
+            } else {
+                $page->trigError('Suppression infructueuse.');
+            }
         }
 
         $page->assign('members', list_alias_members($local_part, $domain));
@@ -271,7 +275,7 @@ class XnetListsModule extends ListsModule
             return;
         }
 
-        add_to_list_alias(S::user(), $list, $globals->asso('mail_domain'));
+        add_to_list_alias(S::uid(), $list, $globals->asso('mail_domain'));
         pl_redirect('alias/admin/' . $list . '@' . $globals->asso('mail_domain'));
     }
 
index 3a8680a..f2c15b1 100644 (file)
 
 <h1>Membres de {$platal->argv[1]}</h1>
 <table class='tinybicol'>
-  {if $members|@count}
-  {foreach from=$members item=member}
+  {if $members.users|@count}
+  {foreach from=$members.users item=member}
   <tr>
     <td>
-      <a href="https://www.polytechnique.org/profile/{$member->profile()->hrpid}" class="popup2">{$member->fullName()}</a>
+      {if $member->hasProfile()}
+      <a href="https://www.polytechnique.org/profile/{$member->hruid}" class="popup2">{$member->fullName()}</a>
+      {else}
+      {$member->fullName()}
+      {/if}
     </td>
     <td class="right">{$member->promo()}</td>
     <td class="center">
     </td>
   </tr>
   {/foreach}
-  {else}
+  {/if}
+  {if $members.nonusers|@count}
+  {foreach from=$members.nonusers item=member}
+  <tr>
+    <td>{$member}</td>
+    <td></td>
+    <td class="center">
+      <a href='{$platal->ns}alias/admin/{$platal->argv[1]}?del_member={$member}&amp;token={xsrf_token}'>
+      {icon name=delete title='retirer membre'}
+      </a>
+    </td>
+  </tr>
+  {/foreach}
+  {/if}
+  {if $members.users|@count eq 0 && $members.nonusers|@count eq 0}
   <tr>
     <td colspan="3">
       <em>aucun membre&hellip;</em>