$this->make_hook('register', AUTH_PUBLIC), 'register/end' => $this->make_hook('end', AUTH_PUBLIC), ); } function handler_register(&$page, $hash = null) { $alert = null; $sub_state = S::v('sub_state', array()); if (!isset($sub_state['step'])) { $sub_state['step'] = 0; } if (!isset($sub_state['backs'])) { $sub_state['backs'] = array(); } if (Get::has('back') && Get::i('back') < $sub_state['step']) { $sub_state['step'] = max(0, Get::i('back')); $state = $sub_state; unset($state['backs']); $sub_state['backs'][] = $state; if (count($sub_state['backs']) == 3) { $alert .= "Tentative d'inscription très hésitante - "; } } if ($hash) { require_once 'directory.enums.inc.php'; $nameTypes = DirEnum::getOptionsArray(DirEnum::NAMETYPES); $nameTypes = array_flip($nameTypes); $res = XDB::query("SELECT a.uid, pd.promo, pnl.name AS lastname, pnf.name AS firstname, p.xorg_id, p.birthdate_ref, FIND_IN_SET('watch', a.flags) FROM register_marketing AS m INNER JOIN accounts AS a ON (m.uid = a.uid) INNER JOIN account_profiles AS ap ON (a.uid = ap.id AND FIND_IN_SET('owner', ap.perms)) INNER JOIN profiles AS p ON (p.pid = ap.id) INNER JOIN profile_display AS pd ON (p.pid = pd.pid) INNER JOIN profile_name AS pnl ON (p.pid = pnl.pid AND pnl.typeid = {?}) INNER JOIN profile_name AS pnf ON (p.pid = pnf.pid AND pnf.typeid = {?}) WHERE m.hash = {?}", $nameTypes['name_ini'], $nameTypes['firstname_ini'], $hash); if (list($uid, $promo, $lastname, $firstname, $xorgid, $birthdate, $watch) = $res->fetchOneRow()) { $sub_state['uid'] = $uid; $sub_state['hash'] = $hash; $sub_state['yearpromo'] = substr($promo, 1, 4); $sub_state['promo'] = $promo; $sub_state['lastname'] = $lastname; $sub_state['firstname'] = $firstname; $sub_state['xorgid'] = $xorgid; $sub_state['birthdate_ref'] = $birthdate; $sub_state['watch'] = $watch; XDB::execute('REPLACE INTO register_mstats (uid,sender,success) SELECT m.uid, m.sender, 0 FROM register_marketing AS m WHERE m.hash', $sub_state['hash']); } } switch ($sub_state['step']) { case 0: $wp = new PlWikiPage('Reference.Charte'); $wp->buildCache(); if (Post::has('step1')) { $sub_state['step'] = 1; if (isset($sub_state['hash'])) { $sub_state['step'] = 3; $this->load('register.inc.php'); create_aliases($sub_state); } } break; case 1: if (Post::has('promo')) { $promo = Post::t('edu_type') . Post::t('promo'); $yearpromo = Post::i('promo'); $res = XDB::query("SELECT COUNT(*) FROM accounts AS a INNER JOIN account_profile AS pa ON (a.uid = pa.uid AND FIND_IN_SET('owner', ap.perms)) INNER JOIN profile AS p ON (p.pid = pa.pid) INNER JOIN profile_display AS pd ON (p.pid = pd.pid) WHERE a.state = 'pending' AND p.deathdate IS NULL AND pd.promo = {?}", $promo); if (!$res->fetchOneCell()) { $error = 'La promotion saisie est incorrecte ou tous les camarades de cette promotion sont inscrits !'; } else { $sub_state['step'] = 2; $sub_state['promo'] = $promo; $sub_state['yearpromo'] = $yearpromo; if ($yearpromo >= 1996 && $yearpromo < 2000) { $sub_state['schoolid'] = ($yearpromo % 100) * 10 . '???'; } elseif($yearpromo >= 2000) { $sub_state['schoolid'] = 100 + ($yearpromo % 100) . '???'; } } } break; case 2: if (count($_POST)) { $this->load('register.inc.php'); $sub_state['firstname'] = Post::v('firstname'); $sub_state['lastname'] = Post::v('lastname'); $sub_state['schoolid'] = Post::v('schoolid'); $error = check_new_user($sub_state); if ($error !== true) { break; } $error = create_aliases($sub_state); if ($error === true) { unset($error); $sub_state['step'] = 3; } } break; case 3: if (count($_POST)) { $this->load('register.inc.php'); // Validate the email address format and domain. require_once 'emails.inc.php'; if (!isvalid_email(Post::v('email'))) { $error[] = "Le champ 'Email' n'est pas valide."; } elseif (!isvalid_email_redirection(Post::v('email'))) { $error[] = $sub_state['forlife'] . ' doit renvoyer vers un email existant ' . 'valide, en particulier, il ne peut pas être renvoyé vers lui-même.'; } // Validate the birthday format and range. $birth = trim(Env::v('birthdate')); if (!preg_match('@^[0-3]?\d/[01]?\d/(19|20)?\d{2}$@', $birth)) { $error[] = "La 'Date de naissance' n'est pas correcte."; } else { $birth = explode('/', $birth, 3); for ($i = 0; $i < 3; ++$i) $birth[$i] = intval($birth[$i]); if ($birth[2] < 100) { $birth[2] += 1900; } $year = $birth[2]; $promo = (int) $sub_state['promo']; if ($year > $promo - 15 || $year < $promo - 30) { $error[] = "La 'Date de naissance' n'est pas correcte."; $alert = "Date de naissance incorrecte à l'inscription - "; $sub_state['wrong_naissance'] = $birth; } } // Register the optional services requested by the user. $services = array(); foreach (array('ax_letter', 'imap', 'ml_promo', 'nl') as $service) { if (Post::b($service)) { $services[] = $service; } } $sub_state['services'] = $services; // Validate the password. if (!Post::v('response2', false)) { $error[] = "Le mot de passe n'est pas valide."; } // Check if the given email is known as dangerous. $res = XDB::query("SELECT w.state, w.description FROM email_watch AS w WHERE w.email = {?} AND w.state != 'safe'", Post::v('email')); $email_banned = false; if ($res->numRows()) { list($state, $description) = $res->fetchOneRow(); $alert .= "Email surveillé proposé à l'inscription - "; $sub_state['email_desc'] = $description; if ($state == 'dangerous') { $email_banned = true; } } if ($sub_state['watch']) { $alert .= "Inscription d'un utilisateur surveillé - "; } if (($ip_banned = check_ip('unsafe'))) { unset($error); } if (isset($error)) { $error = join('
', $error); } else { $sub_state['birthdate'] = sprintf("%04d-%02d-%02d", intval($birth[2]), intval($birth[1]), intval($birth[0])); $sub_state['email'] = Post::v('email'); $sub_state['password'] = Post::v('response2'); // Update the current alert if the birthdate is incorrect, // or if the IP address of the user has been banned. if ($sub_state['birthdate_ref'] != '0000-00-00' && $sub_state['birthdate_ref'] != $sub_state['birthdate']) { $alert .= "Date de naissance incorrecte à l'inscription - "; } if ($ip_banned) { $alert .= "Tentative d'inscription depuis une IP surveillée"; } // Prevent banned user from actually registering; save the current state for others. if ($email_banned || $ip_banned) { global $globals; $error = "Une erreur s'est produite lors de l'inscription." . " Merci de contacter = 3) { $alert .= "Fin d'une inscription hésitante."; } finish_ins($sub_state); } } } break; } $_SESSION['sub_state'] = $sub_state; if (!empty($alert)) { send_warning_mail($alert); } $page->changeTpl('register/step'.intval($sub_state['step']).'.tpl'); $page->addJsLink('motdepasse.js'); if (isset($error)) { $page->trigError($error); } } function handler_end(&$page, $hash = null) { global $globals; $_SESSION['sub_state'] = 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 WHERE hash = {?} AND hash != 'INSCRIT'", $hash); return PL_FORBIDDEN; } // /* TODO */ // Retrieve the pre-registration information using the url-provided // authentication token. if ($hash) { $res = XDB::query( "SELECT r.uid, r.forlife, r.bestalias, r.mailorg2, r.password, r.email, r.services, r.naissance, u.nom, u.prenom, u.promo, FIND_IN_SET('femme', u.flags), u.naissance_ini FROM register_pending AS r INNER JOIN auth_user_md5 AS u ON r.uid = u.user_id WHERE hash = {?} AND hash != 'INSCRIT'", $hash); } if (!$hash || $res->numRows() == 0) { $page->kill("

Cette adresse n'existe pas, ou plus, sur le serveur.

Causes probables :

  1. Vérifie que tu visites l'adresse du dernier email reçu s'il y en a eu plusieurs.
  2. Tu as peut-être mal copié l'adresse reçue par email, vérifie-la à la main.
  3. Tu as peut-être attendu trop longtemps pour confirmer. Les pré-inscriptions sont annulées tous les 30 jours.
  4. Tu es en fait déjà inscrit.
"); } list($uid, $forlife, $bestalias, $mailorg2, $password, $email, $services, $naissance, $nom, $prenom, $promo, $femme, $naiss_ini) = $res->fetchOneRow(); // Prepare the template for display. $page->changeTpl('register/end.tpl'); $page->addJsLink('do_challenge_response_logged.js'); $page->assign('forlife', $forlife); $page->assign('prenom', $prenom); $page->assign('femme', $femme); // Check if the user did enter a valid password; if not (or if none is found), // get her an information page. if (Env::has('response')) { require_once 'secure_hash.inc.php'; $expected_response = hash_encrypt("$forlife:$password:" . S::v('challenge')); if (Env::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::execute("UPDATE auth_user_md5 SET password = {?}, perms = 'user', date = NOW(), naissance = {?}, date_ins = NOW() WHERE user_id = {?}", $password, $naissance, $uid); XDB::execute("REPLACE INTO auth_user_quick (user_id) VALUES ({?})", $uid); XDB::execute("INSERT INTO aliases (uid, alias, type) VALUES ({?}, {?}, 'a_vie')", $uid, $forlife); XDB::execute("INSERT INTO aliases (uid, alias, type, flags) VALUES ({?}, {?}, 'alias', 'bestalias')", $uid, $bestalias); if ($mailorg2) { XDB::execute("INSERT INTO aliases (uid, alias, type) VALUES ({?}, {?}, 'alias')", $uid, $mailorg2); } // Add the registration email address as first and only redirection. require_once 'emails.inc.php'; $user = User::getSilent($uid); $redirect = new Redirect($user); $redirect->add_email($email); // 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_MDP); // Subscribe the user to the services she did request at registration time. foreach (explode(',', $services) as $service) { switch ($service) { case 'ax_letter': Platal::load('axletter', 'axletter.inc.php'); AXLetter::subscribe(S::user()->id()); break; case 'imap': $user = S::user(); $storage = new EmailStorage($user, 'imap'); $storage->activate(); break; case 'ml_promo': $r = XDB::query('SELECT id FROM groups WHERE diminutif = {?}', S::user()->promo()); if ($r->numRows()) { $asso_id = $r->fetchOneCell(); XDB::execute('REPLACE INTO group_members (uid, asso_id) VALUES ({?}, {?})', S::user()->id(), $asso_id); $mmlist = new MMList(S::user()->id(), S::v('password')); $mmlist->subscribe("promo" . S::v('promo')); } break; case 'nl': require_once 'newsletter.inc.php'; NewsLetter::subscribe(); break; } } // Log the registration in the user session. S::logger($uid)->log('inscription', $email); XDB::execute("UPDATE register_pending SET hash = 'INSCRIT' WHERE uid = {?}", $uid); // Congratulate our newly registered user by email. $mymail = new PlMailer('register/inscription.reussie.tpl'); $mymail->assign('forlife', $forlife); $mymail->assign('prenom', $prenom); $mymail->send(); // Index the user, to allow her to appear in searches. Profile::rebuildSearchTokens($uid); // Notify other users which were watching for her arrival. require_once 'notifs.inc.php'; register_watch_op($uid, WATCH_INSCR); inscription_notifs_base($uid); // Forcibly register the new user on default forums. $promo_forum = 'xorg.promo.x' . $promo; $registered_forums = array('xorg.general', 'xorg.pa.divers', 'xorg.pa.logements', $promo_forum); foreach ($registered_forums as $forum) { XDB::execute("INSERT INTO #forums#.abos (fid,uid) SELECT fid, {?} FROM #forums#.list WHERE nom = {?}", $uid, $val); // Notify the newsgroup admin of the promotion forum needs be created. if (XDB::affectedRows() == 0 && $forum == $promo_forum) { $res = XDB::query("SELECT SUM(perms IN ('admin','user') AND deces = 0), COUNT(*) FROM auth_user_md5 WHERE promo = {?}", $promo); list($promo_registered_count, $promo_count) = $res->fetchOneRow(); if ($promo_registered_count > 0.2 * $promo_count) { $mymail = new PlMailer('admin/forums-promo.mail.tpl'); $mymail->assign('promo', $promo); $mymail->send(); } } } // 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 sa.alias, IF(s.nom_usage,s.nom_usage,s.nom) AS nom, s.prenom, FIND_IN_SET('femme', s.flags) AS femme, GROUP_CONCAT(m.email SEPARATOR ', ') AS mails, MAX(m.last) AS dateDernier FROM register_marketing AS m INNER JOIN auth_user_md5 AS s ON (m.sender = s.user_id) INNER JOIN aliases AS sa ON (sa.uid = m.sender AND FIND_IN_SET('bestalias', sa.flags)) WHERE m.uid = {?} GROUP BY m.sender ORDER BY dateDernier DESC", $uid); XDB::execute("UPDATE register_mstats SET success = NOW() WHERE uid = {?}", $uid); $market = array(); while (list($salias, $snom, $sprenom, $sfemme, $mails, $dateDernier) = $res->next()) { $market[] = " - par $snom $sprenom sur $mails (le plus récemment le $dateDernier)"; $mymail = new PlMailer(); $mymail->setSubject("$prenom $nom s'est inscrit à Polytechnique.org !"); $mymail->setFrom('"Marketing Polytechnique.org" mail->domain . '>'); $mymail->addTo("\"$sprenom $snom\" <$salias@{$globals->mail->domain}>"); $msg = ($sfemme?'Chère':'Cher')." $sprenom,\n\n" . "Nous t'écrivons pour t'informer que $prenom $nom (X$promo), " . "que tu avais incité".($femme?'e':'')." à s'inscrire à Polytechnique.org, " . "vient à l'instant de terminer son inscription.\n\n" . "Merci de ta participation active à la reconnaissance de ce site !!!\n\n" . "Bien cordialement,\n" . "-- \n" . "L'équipe Polytechnique.org"; $mymail->setTxtBody(wordwrap($msg, 72)); $mymail->send(); } // Email the plat/al administrators about the registration. if ($globals->register->notif) { $mymail = new PlMailer(); $mymail->setSubject("Inscription de $prenom $nom (X$promo)"); $mymail->setFrom('"Webmaster Polytechnique.org" mail->domain . '>'); $mymail->addTo($globals->register->notif); $mymail->addHeader('Reply-To', $globals->register->notif); $msg = "$prenom $nom (X$promo) a terminé son inscription avec les données suivantes :\n" . " - nom : $nom\n" . " - prenom : $prenom\n" . " - promo : $promo\n" . " - naissance : $naissance (date connue : $naiss_ini)\n" . " - forlife : $forlife\n" . " - email : $email\n" . " - sexe : $femme\n" . " - ip : " . S::logger()->ip . " (" . S::logger()->host . ")\n" . (S::logger()->proxy_ip ? " - proxy : " . S::logger()->proxy_ip . " (" . S::logger()->proxy_host . ")\n" : "") . "\n\n"; if (count($market) > 0) { $msg .= "Les marketings suivants avaient été effectués :\n" . implode("\n", $market); } else { $msg .= "$prenom $nom n'a jamais reçu d'email de marketing."; } $mymail->setTxtBody($msg); $mymail->send(); } // Remove old pending marketing requests for the new user. Marketing::clear($uid); pl_redirect('profile/edit'); } } // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: ?>