Пример #1
0
 function handler_admin($page, $liste = null)
 {
     global $globals;
     if (is_null($liste)) {
         return PL_NOT_FOUND;
     }
     $mlist = $this->prepare_list($liste);
     $this->is_group_admin($page);
     if (!$this->is_group_admin($page)) {
         $this->verify_list_owner($page, $mlist);
     }
     $page->changeTpl('lists/admin.tpl');
     if (Env::has('send_mark')) {
         S::assert_xsrf_token();
         $actions = Env::v('mk_action');
         $uids = Env::v('mk_uid');
         $mails = Env::v('mk_email');
         foreach ($actions as $key => $action) {
             switch ($action) {
                 case 'none':
                     break;
                 case 'marketu':
                 case 'markets':
                     require_once 'emails.inc.php';
                     $user = User::get($uids[$key]);
                     $mail = valide_email($mails[$key]);
                     if (isvalid_email_redirection($mail, $user)) {
                         $from = $action == 'marketu' ? 'user' : 'staff';
                         $market = Marketing::get($uids[$key], $mail);
                         if (!$market) {
                             $market = new Marketing($uids[$key], $mail, 'list', $mlist->address, $from, S::v('uid'));
                             $market->add();
                             break;
                         }
                     }
                 default:
                     XDB::execute('INSERT IGNORE INTO  register_subs (uid, type, sub, domain)
                                           VALUES  ({?}, \'list\', {?}, {?})', $uids[$key], $mlist->mbox, $mlist->domain);
             }
         }
     }
     if (Env::has('add_member') || isset($_FILES['add_member_file']) && $_FILES['add_member_file']['tmp_name']) {
         S::assert_xsrf_token();
         if (isset($_FILES['add_member_file']) && $_FILES['add_member_file']['tmp_name']) {
             $upload =& PlUpload::get($_FILES['add_member_file'], S::user()->login(), 'list.addmember', true);
             if (!$upload) {
                 $page->trigError("Une erreur s'est produite lors du téléchargement du fichier.");
             } else {
                 $logins = $upload->getContents();
             }
         } else {
             $logins = Env::v('add_member');
         }
         $logins = preg_split("/[; ,\r\n\\|]+/", $logins);
         $members = User::getBulkForlifeEmailsFromEmail($logins);
         $unfound = array_diff_key($logins, $members);
         // Make sure we send a list (array_values) of unique (array_unique)
         // emails.
         $members = array_values(array_unique($members));
         $arr = $mlist->subscribeBulk($members);
         $successes = array();
         if (is_array($arr)) {
             foreach ($arr as $addr) {
                 $successes[] = $addr[1];
                 $page->trigSuccess("{$addr[0]} inscrit.");
             }
         }
         $already = array_diff($members, $successes);
         if (is_array($already)) {
             foreach ($already as $item) {
                 $page->trigWarning($item . ' est déjà inscrit.');
             }
         }
         if (is_array($unfound)) {
             foreach ($unfound as $item) {
                 if (trim($item) != '') {
                     $page->trigError($item . " ne correspond pas à un compte existant et n'est pas une adresse email.");
                 }
             }
         }
     }
     if (Env::has('del_member')) {
         S::assert_xsrf_token();
         if (strpos(Env::v('del_member'), '@') === false) {
             if ($del_member = User::getSilent(Env::t('del_member'))) {
                 $mlist->unsubscribeBulk(array($del_member->forlifeEmail()));
             }
         } else {
             $mlist->unsubscribeBulk(array(Env::v('del_member')));
         }
         pl_redirect('lists/admin/' . $liste);
     }
     if (Env::has('add_owner')) {
         S::assert_xsrf_token();
         $owners = User::getBulkForlifeEmailsFromEmail(Env::v('add_owner'));
         if ($owners) {
             foreach ($owners as $forlife_email) {
                 if ($mlist->addOwner($forlife_email)) {
                     $page->trigSuccess($login . " ajouté aux modérateurs.");
                 }
             }
         }
     }
     if (Env::has('del_owner')) {
         S::assert_xsrf_token();
         if (strpos(Env::v('del_owner'), '@') === false) {
             if ($del_owner = User::getSilent(Env::t('del_owner'))) {
                 $mlist->removeOwner($del_owner->forlifeEmail());
             } else {
                 // Shit happens, and a non-email could be set as the owner
                 $mlist->removeOwner(Env::v('del_owner'));
             }
         } else {
             $mlist->removeOwner(Env::v('del_owner'));
         }
         pl_redirect('lists/admin/' . $liste);
     }
     if (list($det, $mem, $own) = $mlist->getMembers()) {
         global $list_unregistered;
         if ($list_unregistered) {
             $page->assign_by_ref('unregistered', $list_unregistered);
         }
         $membres = list_sort_members($mem, @$tri_promo);
         $moderos = list_sort_owners($own, @$tri_promo);
         $page->assign_by_ref('details', $det);
         $page->assign_by_ref('members', $membres);
         $page->assign_by_ref('owners', $moderos);
         $page->assign('np_m', count($mem));
     } else {
         $page->kill("La liste n'existe pas ou tu n'as pas le droit de l'administrer.<br />" . " Si tu penses qu'il s'agit d'une erreur, " . "<a href='mailto:support@polytechnique.org'>contact le support</a>.");
     }
 }
Пример #2
0
 function handler_broken_addr($page)
 {
     require_once 'emails.inc.php';
     $page->changeTpl('emails/broken_addr.tpl');
     if (Env::has('sort_broken')) {
         S::assert_xsrf_token();
         $list = trim(Env::v('list'));
         if ($list == '') {
             $page->trigError('La liste est vide.');
         } else {
             $valid_emails = array();
             $invalid_emails = array();
             $broken_list = explode("\n", $list);
             sort($broken_list);
             foreach ($broken_list as $orig_email) {
                 $orig_email = trim($orig_email);
                 if ($orig_email != '') {
                     $email = valide_email($orig_email);
                     if (empty($email) || $email == '@') {
                         $invalid_emails[] = trim($orig_email) . ': invalid email';
                     } elseif (!in_array($email, $valid_emails)) {
                         $nb = XDB::fetchOneCell('SELECT  COUNT(*)
                                                    FROM  email_redirect_account
                                                   WHERE  redirect = {?}', $email);
                         if ($nb > 0) {
                             $valid_emails[] = $email;
                         } else {
                             $invalid_emails[] = $orig_email . ': no such redirection';
                         }
                     }
                 }
             }
             $page->assign('valid_emails', $valid_emails);
             $page->assign('invalid_emails', $invalid_emails);
         }
     }
     if (Env::has('process_broken')) {
         S::assert_xsrf_token();
         $list = trim(Env::v('list'));
         if ($list == '') {
             $page->trigError('La liste est vide.');
         } else {
             require_once 'notifs.inc.php';
             $broken_user_list = array();
             $broken_user_email_count = array();
             $broken_user_profiles = array();
             $broken_list = explode("\n", $list);
             sort($broken_list);
             foreach ($broken_list as $email) {
                 $email = trim($email);
                 $userobj = null;
                 if ($user = mark_broken_email($email, true)) {
                     $userobj = User::getSilentWithUID($user['uid']);
                 }
                 if (is_null($userobj)) {
                     continue;
                 }
                 $profile = $userobj->profile();
                 if (is_null($profile)) {
                     continue;
                 }
                 if ($user['nb_mails'] > 0 && $user['notify']) {
                     $mail = new PlMailer('emails/broken.mail.tpl');
                     $mail->setTo($userobj);
                     $mail->assign('user', $user);
                     $mail->assign('email', $email);
                     $mail->send();
                 } else {
                     WatchProfileUpdate::register($profile, 'broken');
                 }
                 $pid = $profile->id();
                 if (!isset($broken_user_list[$pid])) {
                     $broken_user_list[$pid] = array($email);
                 } else {
                     $broken_user_list[$pid][] = $email;
                 }
                 $broken_user_email_count[$pid] = $user['nb_mails'];
                 $broken_user_profiles[$pid] = $profile;
             }
             XDB::execute('UPDATE  email_redirect_account
                              SET  broken_level = broken_level - 1
                            WHERE  flags = \'active\' AND broken_level > 1
                                   AND DATE_ADD(last, INTERVAL 1 MONTH) < CURDATE()');
             XDB::execute('UPDATE  email_redirect_account
                              SET  broken_level = 0
                            WHERE  flags = \'active\' AND broken_level = 1
                                   AND DATE_ADD(last, INTERVAL 1 YEAR) < CURDATE()');
             // Sort $broken_user_list with (promo, sortname, pid)
             $sortable_array = array();
             foreach ($broken_user_list as $pid => $mails) {
                 $profile = $broken_user_profiles[$pid];
                 $sortable_array[$pid] = array($profile->promo(), $profile->sortName(), $pid);
             }
             asort($sortable_array);
             // Output the list of users with recently broken addresses,
             // along with the count of valid redirections.
             pl_cached_content_headers('text/x-csv', null, 1, 'broken.csv');
             $csv = fopen('php://output', 'w');
             fputcsv($csv, array('nom', 'promo', 'bounces', 'nbmails', 'url', 'corps', 'job', 'networking'), ';');
             $corpsList = DirEnum::getOptions(DirEnum::CURRENTCORPS);
             foreach (array_keys($sortable_array) as $pid) {
                 $mails = $broken_user_list[$pid];
                 $profile = $broken_user_profiles[$pid];
                 $current_corps = $profile->getCorpsName();
                 $jobs = $profile->getJobs();
                 $companies = array();
                 foreach ($jobs as $job) {
                     $companies[] = $job->company->name;
                 }
                 $networkings = $profile->getNetworking(Profile::NETWORKING_ALL);
                 $networking_list = array();
                 foreach ($networkings as $networking) {
                     $networking_list[] = $networking['address'];
                 }
                 fputcsv($csv, array($profile->fullName(), $profile->promo(), join(',', $mails), $broken_user_email_count[$pid], 'https://www.polytechnique.org/marketing/broken/' . $profile->hrid(), $current_corps, implode(',', $companies), implode(',', $networking_list)), ';');
             }
             fclose($csv);
             exit;
         }
     }
 }
Пример #3
0
 function handler_broken($page, $uid = null)
 {
     $page->changeTpl('marketing/broken.tpl');
     if (is_null($uid)) {
         return PL_NOT_FOUND;
     }
     $user = User::get($uid);
     if (!$user) {
         return PL_NOT_FOUND;
     } elseif ($user->login() == S::user()->login()) {
         pl_redirect('emails/redirect');
     }
     $res = XDB::query('SELECT  p.deathdate IS NULL AS alive, r.last, IF(r.type = \'googleapps\', \'googleapps\', r.redirect) AS active_email
                          FROM  accounts               AS a
                     LEFT JOIN  email_redirect_account AS r  ON (a.uid = r.uid AND r.type IN (\'smtp\', \'googleapps\') AND r.flags = \'active\')
                     LEFT JOIN  account_profiles       AS ap ON (ap.uid = r.uid AND FIND_IN_SET(\'owner\', ap.perms))
                     LEFT JOIN  profiles               AS p  ON (p.pid = ap.pid)
                         WHERE  a.uid = {?}
                      ORDER BY  r.broken_level, r.last', $user->id());
     if (!$res->numRows()) {
         return PL_NOT_FOUND;
     }
     $user->addProperties($res->fetchOneAssoc());
     $page->assign('user', $user);
     $email = null;
     require_once 'emails.inc.php';
     if (Post::has('mail')) {
         $email = valide_email(Post::v('mail'));
     }
     if (Post::has('valide') && isvalid_email_redirection($email, $user)) {
         S::assert_xsrf_token();
         // security stuff
         check_email($email, "Proposition d'une adresse surveillee pour " . $user->login() . " par " . S::user()->login());
         $state = XDB::fetchOneCell('SELECT  flags
                                       FROM  email_redirect_account
                                      WHERE  redirect = {?} AND uid = {?}', $email, $user->id());
         if ($state == 'broken') {
             $page->trigWarning("L'adresse que tu as fournie est l'adresse actuelle de {$user->fullName()} et est en panne.");
         } elseif ($state == 'active') {
             $page->trigWarning("L'adresse que tu as fournie est l'adresse actuelle de {$user->fullName()}");
         } elseif ($user->email && !Post::t('comment')) {
             $page->trigError("Il faut que tu ajoutes un commentaire à ta proposition pour justifier le " . "besoin de changer la redirection de {$user->fullName()}.");
         } else {
             $valid = new BrokenReq(S::user(), $user, $email, trim(Post::v('comment')));
             $valid->submit();
             $page->assign('sent', true);
         }
     } elseif ($email) {
         $page->trigError("L'adresse proposée n'est pas une adresse acceptable pour une redirection.");
     }
 }
Пример #4
0
function mark_broken_email($email, $admin = false)
{
    $email = valide_email($email);
    if (empty($email) || $email == '@') {
        return;
    }
    $user = XDB::fetchOneAssoc('SELECT  r1.uid, a.hruid, a.full_name, r1.broken_level != 0 AS broken, COUNT(r2.uid) AS nb_mails,
                                        s.email AS alias, DATE_ADD(r1.last, INTERVAL 14 DAY) < CURDATE() as notify
                                  FROM  email_redirect_account AS r1
                            INNER JOIN  accounts               AS a  ON (a.uid = r1.uid)
                            INNER JOIN  email_source_account   AS s  ON (a.uid = s.uid AND s.flags = \'bestalias\')
                             LEFT JOIN  email_redirect_account AS r2 ON (a.uid = r2.uid AND r1.redirect != r2.redirect AND
                                                                         r2.broken_level = 0 AND r2.flags = \'active\' AND
                                                                         (r2.type = \'smtp\' OR r2.type = \'googleapps\'))
                                 WHERE  r1.redirect = {?}
                              GROUP BY  r1.uid', $email);
    if ($user) {
        // Mark address as broken.
        if (!$user['broken']) {
            XDB::execute('UPDATE  email_redirect_account
                             SET  broken_date = NOW(), last = NOW(), broken_level = 1
                           WHERE  redirect = {?}', $email);
        } elseif ($admin) {
            XDB::execute('UPDATE  email_redirect_account
                             SET  last = CURDATE(), broken_level = broken_level + 1
                           WHERE  redirect = {?} AND DATE_ADD(last, INTERVAL 14 DAY) < CURDATE()', $email);
        } else {
            XDB::execute('UPDATE  email_redirect_account
                             SET  broken_level = 1
                           WHERE  redirect = {?} AND broken_level = 0', $email);
        }
    }
    return $user;
}