/** * Clears a user. * *always deletes in: account_lost_passwords, register_marketing, * register_pending, register_subs, watch_nonins, watch, watch_promo, watch_group, * *always keeps in: account_types, accounts, email_virtual, carvas, * group_members, homonyms_list, newsletter_ins, register_mstats, email_source_account * *deletes if $clearAll: account_auth_openid, announce_read, contacts, * email_redirect_account, email_redirect_account, email_send_save, forum_innd, forum_profiles, * forum_subs, gapps_accounts, gapps_nicknames, group_announces_read, * group_member_sub_requests, reminder, requests, requests_hidden, * email_virtual, ML * *modifies if $clearAll: accounts * * Use cases: * *$clearAll == false: when a user dies, her family still needs to keep in * touch with the community. * *$clearAll == true: in every other case we want the account to be fully * deleted so that it can not be used anymore. */ public function clear($clearAll = true) { $tables = array('account_lost_passwords', 'register_marketing', 'register_pending', 'register_subs', 'watch_nonins', 'watch', 'watch_promo', 'watch_group'); foreach ($tables as $t) { XDB::execute('DELETE FROM ' . $t . ' WHERE uid = {?}', $this->id()); } if ($clearAll) { global $globals; $groupIds = XDB::iterator('SELECT asso_id FROM group_members WHERE uid = {?}', $this->id()); while ($groupId = $groupIds->next()) { $group = Group::get($groupId); if (!empty($group) && $group->notif_unsub) { $mailer = new PlMailer('xnetgrp/unsubscription-notif.mail.tpl'); $admins = $group->iterAdmins(); while ($admin = $admins->next()) { $mailer->addTo($admin); } $mailer->assign('group', $group->shortname); $mailer->assign('user', $this); $mailer->assign('selfdone', false); $mailer->send(); } } $tables = array('account_auth_openid', 'announce_read', 'contacts', 'email_send_save', 'forum_innd', 'forum_profiles', 'forum_subs', 'group_announces_read', 'group_members', 'group_member_sub_requests', 'reminder', 'requests', 'requests_hidden'); foreach ($tables as $t) { XDB::execute('DELETE FROM ' . $t . ' WHERE uid = {?}', $this->id()); } 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 . ' WHERE l_userid = {?}', $this->id()); } XDB::execute("UPDATE accounts\n SET registration_date = 0, state = 'pending', password = NULL,\n weak_password = NULL, token = NULL, is_admin = 0\n WHERE uid = {?}", $this->id()); if ($globals->mailstorage->googleapps_domain) { require_once 'googleapps.inc.php'; if (GoogleAppsAccount::account_status($this->id())) { $account = new GoogleAppsAccount($this); $account->suspend(); } } } $mmlist = new MMList(S::user()); $mmlist->kill($this->forlife, $this->promo(), $clearAll); }
function handler_recovery($page) { global $globals; $page->changeTpl('platal/recovery.tpl'); if (!Env::has('login') || !Env::has('birth')) { return; } if (!preg_match('/^[0-3][0-9][0-1][0-9][1][9]([0-9]{2})$/', Env::v('birth'))) { $page->trigError('Date de naissance incorrecte ou incohérente'); return; } $birth = sprintf('%s-%s-%s', substr(Env::v('birth'), 4, 4), substr(Env::v('birth'), 2, 2), substr(Env::v('birth'), 0, 2)); $mailorg = strtok(Env::v('login'), '@'); $profile = Profile::get(Env::t('login')); if (is_null($profile) || $profile->birthdate != $birth) { $page->trigError('Les informations que tu as rentrées ne permettent pas de récupérer ton mot de passe.<br />' . 'Si tu as un homonyme, utilise prenom.nom.promo comme login'); return; } $user = $profile->owner(); if ($user->state != 'active') { $page->trigError('Ton compte n\'est pas activé.'); return; } if ($user->lost) { $page->assign('no_addr', true); return; } $page->assign('ok', true); $url = rand_url_id(); XDB::execute('INSERT INTO account_lost_passwords (certificat,uid,created) VALUES ({?},{?},NOW())', $url, $user->id()); $to = XDB::fetchOneCell('SELECT redirect FROM email_redirect_account WHERE uid = {?} AND redirect = {?}', $user->id(), Post::t('email')); if (is_null($to)) { $emails = XDB::fetchColumn('SELECT redirect FROM email_redirect_account WHERE uid = {?} AND flags = \'inactive\' AND type = \'smtp\'', $user->id()); $inactives_to = implode(', ', $emails); } $mymail = new PlMailer(); $mymail->setFrom('"Gestion des mots de passe" <support+password@' . $globals->mail->domain . '>'); if (is_null($to)) { $mymail->addTo($user); $log_to = $user->bestEmail(); if (!is_null($inactives_to)) { $log_to = $inactives_to . ', ' . $log_to; $mymail->addTo($inactives_to); } } else { $mymail->addTo($to); $log_to = $to; } $mymail->setSubject("Ton certificat d'authentification"); $mymail->setTxtBody("Visite la page suivante qui expire dans six heures :\n{$globals->baseurl}/tmpPWD/{$url}\n\nSi en cliquant dessus tu n'y arrives pas, copie intégralement l'adresse dans la barre de ton navigateur. Si tu n'as pas utilisé ce lien dans six heures, tu peux tout simplement recommencer cette procédure.\n\n--\nPolytechnique.org\n\"Le portail des élèves & anciens élèves de l'École polytechnique\"\n\nEmail envoyé à " . Env::v('login') . (is_null($to) ? '' : ' Adresse de secours : ' . $to)); $mymail->send(); S::logger($user->id())->log('recovery', $log_to); }
function handler_rewrite_out($page, $mail, $hash) { $page->changeTpl('emails/rewrite.tpl'); $page->assign('option', 'out'); if (empty($mail) || empty($hash)) { return PL_NOT_FOUND; } $pos = strrpos($mail, '_'); if ($pos === false) { return PL_NOT_FOUND; } $mail[$pos] = '@'; $res = XDB::query('SELECT COUNT(*) FROM email_redirect_account WHERE redirect = {?} AND hash = {?} AND type = \'smtp\'', $mail, $hash); $count = intval($res->fetchOneCell()); if ($count > 0) { global $globals; $res = XDB::query('SELECT e.redirect, e.rewrite, a.hruid FROM email_redirect_account AS e INNER JOIN accounts AS a ON (e.uid = a.uid) WHERE e.redirect = {?} AND e.hash = {?}', $mail, $hash); XDB::query('UPDATE email_redirect_account SET allow_rewrite = false, hash = NULL WHERE redirect = {?} AND hash = {?}', $mail, $hash); list($mail, $rewrite, $hruid) = $res->fetchOneRow(); $mail = new PlMailer(); $mail->setFrom("webmaster@" . $globals->mail->domain); $mail->addTo("support@" . $globals->mail->domain); $mail->setSubject("Tentative de détournement de correspondance via le rewrite"); $mail->setTxtBody("{$hruid} a tenté un rewrite de {$mail} vers {$rewrite}. Cette demande a été rejetée via le web"); $mail->send(); $page->trigWarning("Un mail d'alerte a été envoyé à l'équipe de " . $globals->core->sitename); return; } return PL_NOT_FOUND; }
public function commit() { global $globals; $email = $this->m_user->bestEmail(); XDB::execute('UPDATE email_redirect_account SET flags = \'active\', broken_level = 2 WHERE uid = {?} AND redirect = {?}', $this->m_user->id(), $this->m_email); if (XDB::affectedRows() > 0) { $this->m_reactive = true; $mailer = new PlMailer(); $mailer->setFrom('"Association Polytechnique.org" <register@' . $globals->mail->domain . '>'); $mailer->addTo($email); $mailer->setSubject("Mise à jour de ton adresse {$email}"); $mailer->setTxtBody(wordwrap("Cher Camarade,\n\n" . "Ton adresse {$email} étant en panne et ayant été informés que ta redirection {$this->m_email}, jusqu'à présent inactive, " . "est fonctionnelle, nous venons de réactiver cette adresse.\n\n" . "N'hésite pas à aller gérer toi-même tes redirections en te rendant à la page :\n" . "https://www.polytechnique.org/emails/redirect\n" . "Si tu as perdu ton mot de passe d'accès au site, tu peux également effectuer la procédure de récupération à l'adresse :\n" . "https://www.polytechnique.org/recovery\n\n" . "-- \nTrès Cordialement,\nL'Équipe de Polytechnique.org\n")); $mailer->send(); return true; } if ($this->m_user->email) { $subject = "Ton adresse {$email} semble ne plus fonctionner"; $reason = "Nous avons été informés que ton adresse {$email} ne fonctionne plus correctement par un camarade"; } else { $res = XDB::iterRow('SELECT redirect FROM email_redirect_account WHERE uid = {?} AND flags = \'broken\'', $this->m_user->id()); $redirect = array(); while (list($red) = $res->next()) { list(, $redirect[]) = explode('@', $red); } $subject = "Ton adresse {$email} ne fonctionne plus"; $reason = "Ton adresse {$email} ne fonctionne plus"; if (!count($redirect)) { $reason .= '.'; } elseif (count($redirect) == 1) { $reason .= ' car sa redirection vers ' . $redirect[0] . ' est hors-service depuis plusieurs mois.'; } else { $reason .= ' car ses redirections vers ' . implode(', ', $redirect) . ' sont hors-services depuis plusieurs mois.'; } } $body = ($this->m_user->isFemale() ? 'Chère ' : 'Cher ') . $this->m_user->displayName() . ",\n\n" . $reason . "\n\n" . "L'adresse {$this->m_email} nous a été communiquée, veux-tu que cette adresse devienne ta nouvelle " . "adresse de redirection ? Si oui, envoie nous des informations qui " . "nous permettront de nous assurer de ton identité (par exemple ta date de naissance et ta promotion).\n\n" . "-- \nTrès Cordialement,\nL'Équipe de Polytechnique.org\n"; $body = wordwrap($body, 78); $mailer = new PlMailer(); $mailer->setFrom('"Association Polytechnique.org" <register@' . $globals->mail->domain . '>'); $mailer->addTo($this->m_email); $mailer->setSubject($subject); $mailer->setTxtBody($body); return $mailer->send(); }
function handler_sub($page, $eid = null) { $this->load('xnetevents.inc.php'); $page->changeTpl('xnetevents/subscribe.tpl'); $evt = get_event($eid); if (is_null($evt)) { return PL_NOT_FOUND; } global $globals; if (!$evt['inscr_open']) { $page->kill('Les inscriptions pour cet événement sont closes'); } if (!$evt['accept_nonmembre'] && !is_member() && !may_update()) { $url = $globals->asso('sub_url'); if (empty($url)) { $url = $platal->ns . $globals->asso('diminutif') . "/" . 'subscribe'; } $page->kill('Cet événement est réservé aux membres du groupe ' . $globals->asso('nom') . '. Pour devenir membre, rends-toi sur la page de <a href="' . $url . '">demande d\'inscripton</a>.'); } $res = XDB::query("SELECT stamp\n FROM requests\n WHERE type = 'paiements' AND data LIKE {?}", PayReq::same_event($eid, $globals->asso('id'))); $page->assign('validation', $res->numRows()); $page->assign('eid', $eid); $page->assign('event', $evt); $items = get_event_items($eid); $subs = get_event_subscription($eid, S::v('uid')); if (Post::has('submit')) { S::assert_xsrf_token(); $moments = Post::v('moment', array()); $pers = Post::v('personnes', array()); $old_subs = $subs; $subs = array(); foreach ($moments as $j => $v) { $subs[$j] = intval($v); // retrieve other field when more than one person if ($subs[$j] == 2) { if (!isset($pers[$j]) || !is_numeric($pers[$j]) || $pers[$j] < 0) { $page->trigError("Tu dois choisir un nombre d'invités correct !"); return; } $subs[$j] = $pers[$j]; } } // count what the user must pay, and what he manually paid $manual_paid = 0; foreach ($items as $item_id => $item) { if (array_key_exists($item_id, $old_subs)) { $manual_paid += $old_subs[$item_id]['paid']; } } // impossible to unsubscribe if you already paid sthing if (!array_sum($subs) && $manual_paid != 0) { $page->trigError("Impossible de te désinscrire complètement " . "parce que tu as fait un paiement par " . "chèque ou par liquide. Contacte un " . "administrateur du groupe si tu es sûr de " . "ne pas venir."); $updated = false; } else { // update actual inscriptions $updated = subscribe(S::v('uid'), $eid, $subs); } if ($updated) { $evt = get_event_detail($eid); if ($evt['topay'] > 0) { $page->trigSuccess('Ton inscription à l\'événement a été mise à jour avec succès, tu peux payer ta participation en cliquant ci-dessous'); } else { $page->trigSuccess('Ton inscription à l\'événement a été mise à jour avec succès.'); } if ($evt['subscription_notification'] != 'nobody') { $mailer = new PlMailer('xnetevents/subscription-notif.mail.tpl'); if ($evt['subscription_notification'] != 'creator') { $admins = $globals->asso()->iterAdmins(); while ($admin = $admins->next()) { $mailer->addTo($admin); } } if ($evt['subscription_notification'] != 'animator') { $mailer->addTo($evt['organizer']); } $mailer->assign('group', $globals->asso('nom')); $mailer->assign('event', $evt['intitule']); $mailer->assign('subs', $subs); $mailer->assign('moments', $evt['moments']); $mailer->assign('name', S::user()->fullName('promo')); $mailer->send(); } } } $subs = get_event_subscription($eid, S::v('uid')); // count what the user must pay $topay = 0; $manually_paid = 0; foreach ($items as $item_id => $item) { if (array_key_exists($item_id, $subs)) { $topay += $item['montant'] * $subs[$item_id]['nb']; $manually_paid += $subs[$item_id]['paid']; } } $paid = $manually_paid + get_event_telepaid($eid, S::v('uid')); $page->assign('moments', $items); $page->assign('subs', $subs); $page->assign('topay', $topay); $page->assign('paid', $paid); }
} elseif ($age > 7) { $head = "[Armageddon imminent] "; } elseif ($age > 5) { $head = "[Guerre nucléaire] "; } elseif ($age > 3) { $head = "[ET Téléphone maison] "; } elseif ($age > 1) { $head = "[Réveil !] "; } elseif (!empty($nbveryold)) { $head = "[Urgent] "; } if (empty($nb)) { exit; } $plural = $nb == 1 ? '' : 's'; $mymail = new PlMailer(); $mymail->setFrom('validation@' . $globals->mail->domain); $mymail->addTo('validation@' . $globals->mail->domain); $mymail->setSubject($head . "Il y a {$nb} validation{$plural} non effectuée{$plural}"); $message = "Il y a {$nb} validation{$plural} à effectuer\n" . (empty($nbold) ? '' : "dont {$nbold} depuis le dernier mail !!!\n") . (empty($nbveryold) ? '' : "et dont *{$nbveryold}* " . ($nbveryold == 1 ? 'est' : 'sont') . ' en retard de plus de 6h !!!') . "\n" . "https://www.polytechnique.org/admin/validate\n\n" . "Par catégorie :\n"; $res = XDB::iterRow('SELECT type, count(*) FROM requests GROUP BY type ORDER BY type'); while (list($type, $nb) = $res->next()) { $message .= "- {$type} : {$nb}\n"; } $message = wordwrap($message, 78); $mymail->setTxtBody($message); $mymail->send(); // vim:set et sw=4 sts=4 sws=4 foldmethod=marker fenc=utf-8:
public function send($title = null, $text = null) { $this->hash = rand_url_id(12); if (!$title) { $title = $this->engine->getTitle(); } if (!$text) { $text = $this->engine->getText($this->user); } $sender = substr($this->sender_mail, 1, strpos($this->sender_mail, '"', 2) - 1); $text = str_replace(array('%%hash%%', '%%sender%%', '%%personal_notes%%'), array($this->hash, "Cordialement,\n-- \n" . $this->sender_mail, ''), $text); $mailer = new PlMailer(); $mailer->setFrom($this->sender_mail); $mailer->addTo($this->user['mail']); $mailer->setSubject($title); $mailer->setTxtBody($text); $mailer->send(); $this->incr(); }
while ($values = $res->next()) { if ($values['pid'] != $pid) { $mailer = new PlMailer('profile/notification.mail.tpl'); $mailer->addTo($user); $mailer->assign('modifications', $modifications); $mailer->assign('yourself', $yourself); $mailer->assign('hrpid', $hrpid); $mailer->assign('sex', $sex); $mailer->assign('date', $date); $mailer->send(); $modifications = array(); } $pid = $values['pid']; $sex = $values['sex'] == 'female' ? 1 : 0; $yourself = $values['yourself']; $user = User::getSilentWithUID($values['uid']); $hrpid = $values['hrpid']; $modifications[] = array('full_name' => $values['full_name'], 'field' => $values['field'], 'oldText' => $values['oldText'], 'newText' => $values['newText']); } $mailer = new PlMailer('profile/notification.mail.tpl'); $mailer->addTo($user); $mailer->assign('modifications', $modifications); $mailer->assign('yourself', $yourself); $mailer->assign('hrpid', $hrpid); $mailer->assign('sex', $sex); $mailer->assign('date', $date); $mailer->send(); XDB::execute('DELETE FROM profile_modifications WHERE type = \'third_party\''); } // vim:set et sw=4 sts=4 sws=4 foldmethod=marker fenc=utf-8:
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * ***************************************************************************/ require 'connect.db.inc.php'; $message = ''; $res = XDB::iterRow("SELECT DATE(a.registration_date), a.hruid, GROUP_CONCAT(DISTINCT r.redirect SEPARATOR ', ')\n FROM accounts AS a\n INNER JOIN account_profiles AS ap ON (ap.uid = a.uid AND FIND_IN_SET('owner', ap.perms))\n INNER JOIN profile_display AS pd ON (ap.pid = pd.pid)\n LEFT JOIN email_source_account AS s ON (a.uid = s.uid)\n LEFT JOIN email_redirect_account AS r ON (a.uid = r.uid)\n WHERE a.registration_date > {?}\n GROUP BY a.hruid\n ORDER BY pd.promo", date("Ymd000000", strtotime('last Monday'))); if ($count = $res->total()) { $message .= "{$count} INSCRIPTIONS CONFIRMÉES CETTE SEMAINE :\n"; while (list($date, $hruid, $email, $redirect) = $res->next()) { $message .= "{$date}, {$hruid}, {$email}, {$redirect}\n"; } } $res = XDB::iterRow("SELECT r.date, a.hruid, r.email\n FROM register_pending AS r\n INNER JOIN accounts AS a ON (a.uid = r.uid)\n INNER JOIN account_profiles AS ap ON (ap.uid = a.uid AND FIND_IN_SET('owner', ap.perms))\n INNER JOIN profile_display AS pd ON (ap.pid = pd.pid)\n WHERE r.hash != 'INSCRIT'\n GROUP BY a.hruid\n ORDER BY pd.promo"); if ($count = $res->total()) { $message .= "\n{$count} INSCRIPTIONS NON CONFIRMÉES :\n"; while (list($date, $hruid, $email) = $res->next()) { $message .= "{$date}, {$hruid}, {$email}\n"; } } $res = XDB::query('SELECT COUNT(DISTINCT uid), COUNT(*) FROM register_marketing'); list($a, $b) = $res->fetchOneRow(); $message .= "\nINSCRIPTIONS SOLLICITÉES :\n"; $message .= " {$a} utilisateurs\n {$b} adresses email\n"; $message .= "\n\n"; $mailer = new PlMailer(); $mailer->setSubject('Rapport des inscriptions de la semaine'); $mailer->setFrom($globals->register->notif); $mailer->addTo($globals->register->notif); $mailer->setTxtBody($message); $mailer->send(); // vim:set et sw=4 sts=4 sws=4 foldmethod=marker fenc=utf-8:
} if ($profile->mainEducation() == 'X' && $data['cat'] == Group::CAT_PROMOTIONS) { $promoGroup = $promoGroup || $data['diminutif'] == $profile->yearpromo(); } } $group = ''; if (count($groupx)) { $group = $groupx[array_rand($groupx)]; } elseif (count($binets)) { $group = $binets[array_rand($binets)]; } $mailer->assign('group', $group); $mailer->assign('promoGroup', $promoGroup); //In testing phase, only send to Polytechnique.org members if ($user->inGroup(Group::get('Polytechnique.org')->id)) { $mailer->sendTo($user); // We want to keep trace of the emails sent $liste .= $user->fullName(true) . "\n"; $count_mail += 1; } unset($mailer); unset($user); } $texte = "L'email anniversaire a bien été envoyé à {$count_mail} destinataires.\n\n" . "La liste des destinataires pour le " . date("d/m/Y") . " est la suivante :\n" . $liste; $mailer = new PlMailer(); $mailer->addTo("*****@*****.**"); $mailer->setFrom('"Webmaster Polytechnique.org" <*****@*****.**>'); $mailer->setSubject("Envoi de l'email anniversaire"); $mailer->setTxtBody($texte); $mailer->send(); // vim:set et sw=4 sts=4 sws=4 foldmethod=marker fenc=utf-8:
function unsubscribe(PlUser $user, $remember = false) { global $globals; Group::unsubscribe($globals->asso('id'), $user->id(), $remember); if ($globals->asso('notif_unsub')) { $mailer = new PlMailer('xnetgrp/unsubscription-notif.mail.tpl'); $admins = $globals->asso()->iterToNotify(); while ($admin = $admins->next()) { $mailer->addTo($admin); } $mailer->assign('group', $globals->asso('nom')); $mailer->assign('user', $user); $mailer->assign('selfdone', $user->id() == S::i('uid')); $mailer->send(); } $nl = Newsletter::forGroup($globals->asso('shortname')); if (!is_null($nl)) { $nl->unsubscribe(null, S::i('uid')); } $domain = $globals->asso('mail_domain'); if (!$domain) { return true; } $mmlist = new MMList(S::user(), $domain); $listes = $mmlist->get_lists($user->forlifeEmail()); $may_update = may_update(); $warning = false; if (is_array($listes)) { foreach ($listes as $liste) { if ($liste['sub'] == 2) { if ($may_update) { $mmlist->mass_unsubscribe($liste['list'], array($user->forlifeEmail())); } else { $mmlist->unsubscribe($liste['list']); } } elseif ($liste['sub']) { Platal::page()->trigWarning($user->fullName() . " a une" . " demande d'inscription en cours sur la" . " liste {$liste['list']}@ !"); $warning = true; } } } XDB::execute('DELETE v FROM email_virtual AS v INNER JOIN email_virtual_domains AS d ON (v.domain = d.id) WHERE v.redirect = {?} AND d.name = {?}', $user->forlifeEmail(), $domain); return !$warning; }
function handler_paypal_return($page, $uid = null) { $page->changeTpl('payment/retour_paypal.tpl'); /* reference banque (numero de transaction) */ $no_transaction = Env::s('tx'); /* token a renvoyer pour avoir plus d'information */ $clef = Env::s('sig'); /* code retour */ $status = Env::s('st'); /* raison */ $reason = $status == 'Pending' ? Env::s('pending_reason') : Env::s('reason_code'); /* reference complete de la commande */ $fullref = str_replace('%2d', '-', Env::s('cm')); /* montant de la transaction */ $montant = Env::s('amt'); /* devise */ if (Env::s('cc') != 'EUR') { cb_erreur("monnaie autre que l'euro"); } /* on extrait le code de retour */ if ($status != "Completed") { if ($status) { paypal_erreur("erreur lors du paiement : {$status} - {$reason}"); } else { paypal_erreur("Paiement annulé", false); } } /* on extrait les informations sur l'utilisateur */ $user = User::get($uid); if (!$user) { paypal_erreur("uid invalide"); } /* on extrait la reference de la commande */ if (!preg_match('/-xorg-([0-9]+)$/', $fullref, $matches)) { paypal_erreur("référence de commande invalide"); } $ref = $matches[1]; $res = XDB::query('SELECT mail, text, confirmation FROM payments WHERE id = {?}', $ref); if (!(list($conf_mail, $conf_title, $conf_text) = $res->fetchOneRow())) { paypal_erreur('référence de commande inconnue'); } /* on fait l'insertion en base de donnees */ XDB::execute("INSERT INTO payment_transactions (id, method_id, uid, ref, fullref, ts_confirmed, amount, pkey, comment, status, display)\n VALUES ({?}, 1, {?}, {?}, {?}, NOW(), {?}, {?}, {?}, 'confirmed', {?})", $no_transaction, $user->id(), $ref, $fullref, $montant, $clef, Env::v('comment'), Get::i('display')); // We check if it is an Xnet payment and then update the related ML. $res = XDB::query('SELECT eid, asso_id FROM group_events WHERE paiement_id = {?}', $ref); if ($res->numRows() == 1) { list($eid, $asso_id) = $res->fetchOneRow(); require_once dirname(__FILE__) . '/xnetevents/xnetevents.inc.php'; $evt = get_event_detail($eid, false, $asso_id); subscribe_lists_event($user->id(), $evt['short_name'], 1, $montant, true); } /* on genere le mail de confirmation */ $conf_text = str_replace(array('<prenom>', '<nom>', '<promo>', '<montant>', '<salutation>', '<cher>', '<comment>'), array($user->firstName(), $user->lastName(), $user->promo(), $montant, $user->isFemale() ? 'Chère' : 'Cher', $user->isFemale() ? 'Chère' : 'Cher', Env::v('comment')), $conf_text); global $globals; $mymail = new PlMailer(); $mymail->setFrom($conf_mail); $mymail->addCc($conf_mail); $mymail->setSubject($conf_title); $mymail->setWikiBody($conf_text); $mymail->sendTo($user); /* on envoie les details de la transaction à telepaiement@ */ $mymail = new PlMailer(); $mymail->setFrom("webmaster@" . $globals->mail->domain); $mymail->addTo($globals->money->email); $mymail->setSubject($conf_title); $msg = 'utilisateur : ' . $user->login() . ' (' . $user->id() . ')' . "\n" . 'mail : ' . $user->forlifeEmail() . "\n\n" . "paiement : {$conf_title} ({$conf_mail})\n" . "reference : {$champ200}\n" . "montant : {$montant}\n\n" . "dump de REQUEST:\n" . var_export($_REQUEST, true); $mymail->setTxtBody($msg); $mymail->send(); $page->assign('texte', $conf_text); $page->assign('erreur', $erreur); }
public function commit() { $res = XDB::query("SELECT MAX(id) FROM payments"); $id = $res->fetchOneCell() + 1; $ret = XDB::execute('INSERT INTO payments (id, text, url, amount_def, amount_min, amount_max, mail, confirmation, asso_id, flags, rib_id) VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})', $id, $this->titre, $this->site, $this->montant, $this->montant_min, $this->montant_max, $this->user->bestEmail(), $this->msg_reponse, $this->asso_id, $this->public ? 'public' : '', $this->rib_id); if ($this->asso_id && $this->evt) { XDB::execute("UPDATE group_events\n SET paiement_id = {?}\n WHERE asso_id = {?} AND eid = {?}", $id, $this->asso_id, $this->evt); $res = XDB::query("SELECT a.nom, a.diminutif, e.intitule\n FROM groups AS a\n INNER JOIN group_events AS e ON (a.id = e.asso_id)\n WHERE e.eid = {?}", $this->evt); list($nom, $diminutif, $evt) = $res->fetchOneRow(); require_once dirname(__FILE__) . '/../../modules/xnetevents/xnetevents.inc.php'; $participants = get_event_participants(get_event_detail($this->evt, false, $this->asso_id), null); foreach ($participants as $u) { if (!$u['notify_payment']) { continue; } $topay = $u['montant'] - $u['paid']; if ($topay > 0) { $mailer = new PlMailer('xnetevents/newpayment.mail.tpl'); $mailer->addTo($u['user']); $mailer->assign('asso', $nom); $mailer->assign('diminutif', $diminutif); $mailer->assign('evt', $evt); $mailer->assign('eid', $this->evt); $mailer->assign('prenom', $u['user']->firstName()); $mailer->send(); } } } return $ret; }
function handler_moderate($page, $liste = null) { if (is_null($liste)) { return PL_NOT_FOUND; } $mlist = $this->prepare_list($liste); if (!$this->is_group_admin($page)) { $this->verify_list_owner($page, $mlist); } $page->changeTpl('lists/moderate.tpl'); $page->register_modifier('hdc', 'list_header_decode'); if (Env::has('sadd') || Env::has('sdel')) { S::assert_xsrf_token(); if (Env::has('sadd')) { // Ensure the moderated request is still active $sub = $mlist->getPendingSubscription(Env::v('sadd')); $mlist->handleRequest(MailingList::REQ_SUBSCRIBE, Env::v('sadd')); $info = "validée"; } if (Post::has('sdel')) { // Ensure the moderated request is still active $sub = $mlist->getPendingSubscription(Env::v('sdel')); $mlist->handleRequest(MailingList::REQ_REJECT, Post::v('sdel'), Post::v('reason')); $info = "refusée"; } if ($sub) { $mailer = new PlMailer(); $mailer->setFrom($mlist->getAddress(MailingList::KIND_BOUNCE)); $mailer->addTo($mlist->getAddress(MailingList::KIND_OWNER)); $mailer->addHeader('Reply-To', $mlist->getAddress(MailingList::KIND_OWNER)); $mailer->setSubject("L'inscription de {$sub['name']} a été {$info}"); $text = "L'inscription de {$sub['name']} à la liste " . $mlist->address . " a été {$info} par " . S::user()->fullName(true) . ".\n"; if (trim(Post::v('reason'))) { $text .= "\nLa raison invoquée est :\n" . Post::v('reason'); } $mailer->setTxtBody(wordwrap($text, 72)); $mailer->send(); } if (Env::has('sadd')) { pl_redirect('lists/moderate/' . $liste); } } if (Post::has('moderate_mails') && Post::has('select_mails')) { S::assert_xsrf_token(); $mails = array_keys(Post::v('select_mails')); foreach ($mails as $mail) { $this->moderate_mail($mlist, $mail); } } elseif (Env::has('mid')) { if (Get::has('mid') && !Env::has('mok') && !Env::has('mdel')) { require_once 'banana/moderate.inc.php'; $page->changeTpl('lists/moderate_mail.tpl'); $params = array('listname' => $mlist->mbox, 'domain' => $mlist->domain, 'artid' => Get::i('mid'), 'part' => Get::v('part'), 'action' => Get::v('action')); $params['client'] = $this->prepare_client(); run_banana($page, 'ModerationBanana', $params); $msg = file_get_contents('/etc/mailman/fr/refuse.txt'); $msg = str_replace("%(adminaddr)s", $mlist->getAddress(MailingList::KIND_OWNER), $msg); $msg = str_replace("%(request)s", "<< SUJET DU MAIL >>", $msg); $msg = str_replace("%(reason)s", "<< TON EXPLICATION >>", $msg); $msg = str_replace("%(listname)s", $liste, $msg); $page->assign('msg', $msg); return; } $this->moderate_mail($mlist, Env::i('mid')); } elseif (Env::has('sid')) { if (list($subs, $mails) = $this->get_pending_ops($mlist)) { foreach ($subs as $user) { if ($user['id'] == Env::v('sid')) { $page->changeTpl('lists/moderate_sub.tpl'); $page->assign('del_user', $user); return; } } } } if (list($subs, $mails) = $this->get_pending_ops($mlist)) { foreach ($mails as $key => $mail) { $mails[$key]['stamp'] = strftime("%Y%m%d%H%M%S", $mail['stamp']); if ($mail['fromx']) { $page->assign('with_fromx', true); } else { $page->assign('with_nonfromx', true); } } $page->assign_by_ref('subs', $subs); $page->assign_by_ref('mails', $mails); } else { $page->kill("La liste n'existe pas ou tu n'as pas le droit de la modérer."); } }
function handler_end($page, $hash = null) { global $globals; $_SESSION['subState'] = array('step' => 5); // Reject registration requests from unsafe IP addresses (and remove the // registration information from the database, to prevent IP changes). if (check_ip('unsafe')) { send_warning_mail('Une IP surveillée a tenté de finaliser son inscription.'); XDB::execute("DELETE FROM register_pending\n WHERE hash = {?} AND hash != 'INSCRIT'", $hash); return PL_FORBIDDEN; } // Retrieve the pre-registration information using the url-provided // authentication token. $res = XDB::query("SELECT r.uid, p.pid, r.forlife, r.bestalias, r.mailorg2,\n r.password, r.email, r.services, r.naissance,\n ppn.lastname_initial, ppn.firstname_initial, pe.promo_year,\n pd.promo, p.sex, p.birthdate_ref, a.type, a.email AS old_account_email\n FROM register_pending AS r\n INNER JOIN accounts AS a ON (r.uid = a.uid)\n INNER JOIN account_profiles AS ap ON (a.uid = ap.uid AND FIND_IN_SET('owner', ap.perms))\n INNER JOIN profiles AS p ON (p.pid = ap.pid)\n INNER JOIN profile_public_names AS ppn ON (ppn.pid = p.pid)\n INNER JOIN profile_display AS pd ON (p.pid = pd.pid)\n INNER JOIN profile_education AS pe ON (pe.pid = p.pid AND FIND_IN_SET('primary', pe.flags))\n WHERE hash = {?} AND hash != 'INSCRIT' AND a.state = 'pending'", $hash); if (!$hash || $res->numRows() == 0) { $page->kill("<p>Cette adresse n'existe pas, ou plus, sur le serveur.</p>\n <p>Causes probables :</p>\n <ol>\n <li>Vérifie que tu visites l'adresse du dernier\n email reçu s'il y en a eu plusieurs.</li>\n <li>Tu as peut-être mal copié l'adresse reçue par\n email, vérifie-la à la main.</li>\n <li>Tu as peut-être attendu trop longtemps pour\n confirmer. Les pré-inscriptions sont annulées\n tous les 30 jours.</li>\n <li>Tu es en fait déjà inscrit.</li>\n </ol>"); } list($uid, $pid, $forlife, $bestalias, $emailXorg2, $password, $email, $services, $birthdate, $lastname, $firstname, $yearpromo, $promo, $sex, $birthdate_ref, $type, $old_account_email) = $res->fetchOneRow(); $isX = $type == 'x'; $mail_domain = User::$sub_mail_domains[$type] . $globals->mail->domain; // Prepare the template for display. $page->changeTpl('register/end.tpl'); $page->assign('forlife', $forlife); $page->assign('firstname', $firstname); // Check if the user did enter a valid password; if not (or if none is found), // get her an information page. if (Post::has('response')) { $expected_response = sha1("{$forlife}:{$password}:" . S::v('challenge')); if (Post::v('response') != $expected_response) { $page->trigError("Mot de passe invalide."); S::logger($uid)->log('auth_fail', 'bad password (register/end)'); return; } } else { return; } // // Create the user account. // XDB::startTransaction(); XDB::execute("UPDATE accounts\n SET password = {?}, state = 'active',\n registration_date = NOW(), email = NULL\n WHERE uid = {?}", $password, $uid); XDB::execute("UPDATE profiles\n SET birthdate = {?}, last_change = NOW()\n WHERE pid = {?}", $birthdate, $pid); XDB::execute('INSERT INTO email_source_account (email, uid, type, flags, domain) SELECT {?}, {?}, \'forlife\', \'\', id FROM email_virtual_domains WHERE name = {?}', $forlife, $uid, $mail_domain); XDB::execute('INSERT INTO email_source_account (email, uid, type, flags, domain) SELECT {?}, {?}, \'alias\', \'bestalias\', id FROM email_virtual_domains WHERE name = {?}', $bestalias, $uid, $mail_domain); if ($emailXorg2) { XDB::execute('INSERT INTO email_source_account (email, uid, type, flags, domain) SELECT {?}, {?}, \'alias\', \'\', id FROM email_virtual_domains WHERE name = {?}', $emailXorg2, $uid, $mail_domain); } XDB::commit(); // Try to start a session (so the user don't have to log in); we will use // the password available in Post:: to authenticate the user. Platal::session()->start(AUTH_PASSWD); // Add the registration email address as first and only redirection. require_once 'emails.inc.php'; $user = User::getSilentWithUID($uid); $redirect = new Redirect($user); $redirect->add_email($email); fix_bestalias($user); // If the user was registered to some aliases and MLs, we must change // the subscription to her forlife email. if ($old_account_email) { $listClient = new MMList($user); $listClient->change_user_email($old_account_email, $user->forlifeEmail()); update_alias_user($old_account_email, $user->forlifeEmail()); } // Subscribe the user to the services she did request at registration time. require_once 'newsletter.inc.php'; foreach (explode(',', $services) as $service) { switch ($service) { case 'ax_letter': /* This option is deprecated by 'com_letters' */ NewsLetter::forGroup(NewsLetter::GROUP_AX)->subscribe($user); break; case 'com_letters': NewsLetter::forGroup(NewsLetter::GROUP_AX)->subscribe($user); NewsLetter::forGroup(NewsLetter::GROUP_EP)->subscribe($user); NewsLetter::forGroup(NewsLetter::GROUP_FX)->subscribe($user); break; case 'nl': NewsLetter::forGroup(NewsLetter::GROUP_XORG)->subscribe($user); break; case 'imap': Email::activate_storage($user, 'imap', Bogo::IMAP_DEFAULT); break; case 'ml_promo': if ($isX) { $r = XDB::query('SELECT id FROM groups WHERE diminutif = {?}', $yearpromo); if ($r->numRows()) { $asso_id = $r->fetchOneCell(); XDB::execute('INSERT IGNORE INTO group_members (uid, asso_id) VALUES ({?}, {?})', $uid, $asso_id); try { MailingList::subscribePromo($yearpromo, $user); } catch (Exception $e) { PlErrorReport::report($e); $page->trigError("L'inscription à la liste promo" . $yearpromo . " a échouée."); } } } break; } } // Log the registration in the user session. S::logger($uid)->log('inscription', $email); XDB::execute("UPDATE register_pending\n SET hash = 'INSCRIT'\n WHERE uid = {?}", $uid); // Congratulate our newly registered user by email. $mymail = new PlMailer('register/success.mail.tpl'); $mymail->addTo("\"{$user->fullName()}\" <{$user->forlifeEmail()}>"); if ($isX) { $mymail->setSubject('Bienvenue parmi les X sur le web !'); } else { $mymail->setSubject('Bienvenue sur Polytechnique.org !'); } $mymail->assign('forlife', $forlife); $mymail->assign('firstname', $firstname); $mymail->send(); // Index the user, to allow her to appear in searches. Profile::rebuildSearchTokens($pid); // Notify other users which were watching for her arrival. XDB::execute('INSERT INTO contacts (uid, contact) SELECT uid, {?} FROM watch_nonins WHERE ni_id = {?}', $pid, $uid); XDB::execute('DELETE FROM watch_nonins WHERE ni_id = {?}', $uid); Platal::session()->updateNbNotifs(); // Forcibly register the new user on default forums. $registeredForums = array('xorg.general', 'xorg.pa.divers', 'xorg.pa.logements'); if ($isX) { $promoForum = 'xorg.promo.' . strtolower($promo); $exists = XDB::fetchOneCell('SELECT COUNT(*) FROM forums WHERE name = {?}', $promoForum); if ($exists == 0) { // Notify the newsgroup admin of the promotion forum needs be created. $promoFull = new UserFilter(new UFC_Promo('=', UserFilter::DISPLAY, $promo)); $promoRegistered = new UserFilter(new PFC_And(new UFC_Promo('=', UserFilter::DISPLAY, $promo), new UFC_Registered(true), new PFC_Not(new UFC_Dead()))); if ($promoRegistered->getTotalCount() > 0.2 * $promoFull->getTotalCount()) { $mymail = new PlMailer('admin/forums-promo.mail.tpl'); $mymail->assign('promo', $promo); $mymail->send(); } } else { $registeredForums[] = $promoForum; } } foreach ($registeredForums as $forum) { XDB::execute("INSERT INTO forum_subs (fid, uid)\n SELECT fid, {?}\n FROM forums\n WHERE name = {?}", $uid, $val); } // Update the global registration count stats. $globals->updateNbIns(); // // Update collateral data sources, and inform watchers by email. // // Email the referrer(s) of this new user. $res = XDB::iterRow("SELECT sender, GROUP_CONCAT(email SEPARATOR ', ') AS mails, MAX(last) AS lastDate\n FROM register_marketing\n WHERE uid = {?}\n GROUP BY sender\n ORDER BY lastDate DESC", $uid); XDB::execute("UPDATE register_mstats\n SET success = NOW()\n WHERE uid = {?}", $uid); $market = array(); while (list($senderid, $maketingEmails, $lastDate) = $res->next()) { $sender = User::getWithUID($senderid); $market[] = " - par {$sender->fullName()} sur {$maketingEmails} (le plus récemment le {$lastDate})"; $mymail = new PlMailer('register/marketer.mail.tpl'); $mymail->setSubject("{$firstname} {$lastname} s'est inscrit à Polytechnique.org !"); $mymail->setTo($sender); $mymail->assign('sender', $sender); $mymail->assign('firstname', $firstname); $mymail->assign('lastname', $lastname); $mymail->assign('promo', $promo); $mymail->assign('sex', $sex); $mymail->setTxtBody(wordwrap($msg, 72)); $mymail->send(); } // Email the plat/al administrators about the registration. if ($globals->register->notif) { $mymail = new PlMailer('register/registration.mail.tpl'); $mymail->setSubject("Inscription de {$firstname} {$lastname} ({$promo})"); $mymail->assign('firstname', $firstname); $mymail->assign('lastname', $lastname); $mymail->assign('promo', $promo); $mymail->assign('sex', $sex); $mymail->assign('birthdate', $birthdate); $mymail->assign('birthdate_ref', $birthdate_ref); $mymail->assign('forlife', $forlife); $mymail->assign('email', $email); $mymail->assign('logger', S::logger()); if (count($market) > 0) { $mymail->assign('market', implode("\n", $market)); } $mymail->setTxtBody($msg); $mymail->send(); } // Remove old pending marketing requests for the new user. Marketing::clear($uid); pl_redirect('profile/edit'); }
function createAliases($subState) { global $globals; $res = XDB::query("SELECT hruid, state, type\n FROM accounts\n WHERE uid = {?} AND hruid != ''", $subState->i('uid')); if ($res->numRows() == 0) { return "Tu n'as pas d'adresse à vie pré-attribuée.<br />" . "Envoie un mail à <a href=\"mailto:support@{$globals->mail->domain}\">" . "support@{$globals->mail->domain}</a> en expliquant ta situation."; } else { list($forlife, $state, $type) = $res->fetchOneRow(); } if ($state == 'active') { return "Tu es déjà inscrit, si tu ne te souviens plus de ton mot de passe d'accès au site, " . "tu peux suivre <a href=\"recovery\">la procédure de récupération de mot de passe</a>."; } else { if ($state == 'disabled') { return "Ton compte a été désactivé par les administrateurs du site suite à des abus. " . "Pour plus d'information ou pour demander la réactivation du compte, tu peux t'adresser à " . "<a href=\"mailto:support@{$globals->mail->domain}\">support@{$globals->mail->domain}</a>."; } } $emailXorg = PlUser::makeUserName($subState->t('firstname'), $subState->t('lastname')); $suffix = (User::$sub_mail_domains[$type] ? substr(User::$sub_mail_domains[$type], 0, 1) : '') . substr($subState->v('yearpromo'), -2); $emailXorg2 = $emailXorg . '.' . $suffix; // Search for homonyms: // * first case: only one homonym already registered. $res = XDB::query('SELECT uid, expire FROM email_source_account WHERE email = {?} AND type != \'alias_aux\'', $emailXorg); // * second case: at least two homonyms registerd. $result = XDB::query("SELECT hrmid\n FROM email_source_other\n WHERE type = 'homonym' AND email = {?}", $emailXorg); if ($res->numRows() || $result->numRows()) { if ($res->numRows()) { list($h_id, $expire) = $res->fetchOneRow(); if (empty($expire)) { XDB::execute('UPDATE email_source_account SET expire = ADDDATE(NOW(), INTERVAL 1 MONTH) WHERE email = {?} AND type != \'alias_aux\'', $emailXorg); $hrmid = User::makeHomonymHrmid($emailXorg); XDB::execute('INSERT IGNORE INTO homonyms_list (hrmid, uid) VALUES ({?}, {?}), ({?}, {?})', $hrmid, $h_id, $hrmid, $subState->i('uid')); $als = XDB::fetchColumn('SELECT email FROM email_source_account WHERE uid = {?} AND type != \'alias_aux\' AND expire IS NULL', $h_id); $homonym = User::getSilentWithUID($h_id); $mailer = new PlMailer('register/lostalias.mail.tpl'); $mailer->addTo($homonym); $mailer->setSubject("Perte de ton alias {$emailXorg} dans un mois !"); $mailer->assign('emailXorg', $emailXorg); $mailer->assign('als', join(', ', $als)); $mailer->SetTxtBody(wordwrap($msg, 72)); $mailer->send(); } } else { $hrmid = $result->fetchOneCell(); XDB::execute('INSERT IGNORE INTO homonyms_list (hrmid, uid) VALUES ({?}, {?})', $hrmid, $subState->i('uid')); // TODO: insert into source_other if new domain } $subState->set('forlife', $forlife); $subState->set('bestalias', $emailXorg2); $subState->set('emailXorg2', null); } else { $subState->set('forlife', $forlife); $subState->set('bestalias', $emailXorg); $subState->set('emailXorg2', $emailXorg2); } $subState->set('main_mail_domain', User::$sub_mail_domains[$type] . Platal::globals()->mail->domain); return true; }
} $x_spam_flag = ''; if (preg_match('/^X-Spam-Flag: ([a-zA-Z]+), tests=bogofilter/m', substr($raw_mail, 0, $end_of_headers + 1), $matches)) { $x_spam_flag = $matches[1]; } if ($x_spam_flag == 'Unsure') { $mailer = new PlMailer(); $mailer->addTo($type . '@' . $globals->mail->domain); $mailer->setFrom('"' . $fullname . '" <web@' . $globals->mail->domain . '>'); $mailer->setTxtBody($type . ' soumis par ' . $fullname . ' via la modération de la liste ' . $list . '@' . $domain); $mailer->addAttachment($raw_mail, 'message/rfc822', $type . '.mail', false); $mailer->send(); } // send feedback to the mailing list owners if ($mlist->handleRequest($action, $mid, $reason)) { $sent_mails += $count; $texte = "Le message suivant :\n\n" . " Auteur: {$mail['sender']}\n" . " Sujet : « {$mail['subj']} »\n" . " Date : " . strftime("le %d %b %Y à %H:%M:%S", (int) $mail['stamp']) . "\n\n" . $append; $mailer = new PlMailer(); $mailer->addTo("{$list}-owner@{$domain}"); $mailer->setFrom("{$list}-bounces@{$domain}"); $mailer->addHeader('Reply-To', "{$list}-owner@{$domain}"); $mailer->setSubject($subject); $mailer->setTxtBody($texte); $mailer->send(); } // release the lock XDB::execute('DELETE FROM email_list_moderate WHERE handler = {?}', $handler); sleep(60 * $count / $globals->lists->max_mail_per_min); } // vim:set et sw=4 sts=4 sws=4 foldmethod=marker fenc=utf-8:
protected function sendmail($isok) { // Only sends email if the profile's owner exists and is registered. if ($this->ownerIsRegistered) { global $globals; $mailer = new PlMailer(); $mailer->setSubject($this->_mail_subj()); $mailer->setFrom("validation+{$this->type}@{$globals->mail->domain}"); $mailer->addTo("\"{$this->profile->fullName()}\" <{$this->profileOwner->bestEmail()}>"); $mailer->addCc("validation+{$this->type}@{$globals->mail->domain}"); $body = ($this->profile->isFemale() ? "Chère camarade,\n\n" : "Cher camarade,\n\n") . $this->_mail_body($isok) . (Env::has('comm') ? "\n\n" . Env::v('comm') : '') . "\n\nCordialement,\n-- \nL'équipe de Polytechnique.org\n" . $this->_mail_ps($isok); $mailer->setTxtBody(wordwrap($body)); $mailer->send(); } }
function send_warning_mail($title, $body = '') { global $globals; $mailer = new PlMailer(); $mailer->setFrom("webmaster@" . $globals->mail->domain); $mailer->addTo($globals->core->admin_email); $mailer->setSubject("[Plat/al Security Alert] {$title}"); // Note: we can't do $session = var_export($_SESSION, true) as var_export // doesn't handle circular dependency correctly. ob_start(); var_dump($_SESSION); $session = ob_get_clean(); $mailer->setTxtBody($body . "Identifiants de session :\n" . $session . "\n\n" . "Identifiants de connexion :\n" . var_export($_SERVER, true)); $mailer->send(); }