$fields[] = $key;
}
if ($current == 'valid' && Env::has('csv_valid')) {
- if (!S::has_xsrf_token()) {
- $page->kill("L'opération n'a pas pu être effectuée, merci de réessayer.");
- }
+ S::assert_xsrf_token();
$this->run($_SESSION['csv_action'], $insert, $update);
$page->assign('csv_done', true);
$this->cleanSession($sesfields);
{
$page->changeTpl('core/table-editor.tpl');
$list = true;
+ if ($action == 'delete') {
+ S::assert_xsrf_token();
- if ($action == 'delete' && S::has_xsrf_token()) {
if (!isset($this->delete_action)) {
foreach ($this->jtables as $table => $j)
XDB::execute("DELETE FROM {$table} WHERE {$j['joinid']} = {?}{$j['joinextra']}", $id);
} else {
$page->trig("Impossible de supprimer l'entrée.");
}
- } else if ($action == 'delete') {
- $page->trig("Impossible de supprimer l'entrée, merci de réessayer.");
}
if ($action == 'edit') {
$r = XDB::query("SELECT * FROM {$this->table} WHERE {$this->idfield} = {?} AND {$this->whereclause}",$id);
}
$list = false;
}
- if ($action == 'update' && S::has_xsrf_token()) {
+ if ($action == 'update') {
+ S::assert_xsrf_token();
+
$values = "";
$cancel = false;
foreach ($this->vars as $field => $descr) {
if (!$this->auto_return) {
return $this->apply($page, 'edit', $id);
}
- } else if ($action == 'update') {
- $page->trig("Impossible de mettre à jour, merci de réessayer.");
}
if ($action == 'sort') {
$this->sortfield = $id;
return Session::logged() && Session::v('perms')->hasFlag(PERMS_ADMIN);
}
- public static function has_xsrf_token()
- {
- return Session::has('xsrf_token') && Session::v('xsrf_token') == Env::v('token');
- }
-
public static function logged()
{
return Session::v('auth', AUTH_PUBLIC) >= AUTH_COOKIE;
{
return Session::v('auth', AUTH_PUBLIC) >= AUTH_MDP;
}
+
+ // Anti-XSRF protections.
+ public static function has_xsrf_token()
+ {
+ return Session::has('xsrf_token') && Session::v('xsrf_token') == Env::v('token');
+ }
+
+ public static function assert_xsrf_token()
+ {
+ if (!Session::has_xsrf_token()) {
+ global $page;
+ if ($page instanceof PlatalPage) {
+ $page->kill("L'opération n'a pas pu aboutir, merci de réessayer.");
+ }
+ }
+ }
}
// {{{ function check_perms()
// Check if there was a submission
foreach($_POST as $key => $val) {
- if (!S::has_xsrf_token()) {
- $page->kill("L'opération de modification de l'utilisateur a échouée, merci de réessayer.");
- }
+ S::assert_xsrf_token();
+
switch ($key) {
case "add_fwd":
$email = trim(Env::v('email'));
// on examine l'op a effectuer
switch ($op) {
case 'mail':
- if (S::has_xsrf_token()) {
- send_warning_homonyme($prenom, $nom, $forlife, $loginbis);
- switch_bestalias($target, $loginbis);
- } else {
- $page->assign('op', 'list');
- $page->trig("L'envoi du mail d'homonymie a échoué, merci de réessayer.");
- }
+ S::assert_xsrf_token();
+
+ send_warning_homonyme($prenom, $nom, $forlife, $loginbis);
+ switch_bestalias($target, $loginbis);
$op = 'list';
break;
case 'correct':
- if (S::has_xsrf_token()) {
- switch_bestalias($target, $loginbis);
- XDB::execute("UPDATE aliases SET type='homonyme',expire=NOW() WHERE alias={?}", $loginbis);
- XDB::execute("REPLACE INTO homonymes (homonyme_id,user_id) VALUES({?},{?})", $target, $target);
- send_robot_homonyme($prenom, $nom, $forlife, $loginbis);
- } else {
- $page->assign('op', 'list');
- $page->trig("La correction de l'homonymie a échouée, merci de réessayer.");
- }
+ S::assert_xsrf_token();
+
+ switch_bestalias($target, $loginbis);
+ XDB::execute("UPDATE aliases SET type='homonyme',expire=NOW() WHERE alias={?}", $loginbis);
+ XDB::execute("REPLACE INTO homonymes (homonyme_id,user_id) VALUES({?},{?})", $target, $target);
+ send_robot_homonyme($prenom, $nom, $forlife, $loginbis);
$op = 'list';
break;
}
$page->assign('promo',$promo);
- if ($validate && S::has_xsrf_token()) {
+ if ($validate) {
+ S::assert_xsrf_token();
+
$new_deces = array();
$res = XDB::iterRow("SELECT user_id,matricule,nom,prenom,deces FROM auth_user_md5 WHERE promo = {?}", $promo);
while (list($uid,$mat,$nom,$prenom,$deces) = $res->next()) {
}
}
$page->assign('new_deces',$new_deces);
- } else if ($validate) {
- $page->trig("La mise à jour des dates de decès à échouée, merci de réessayer.");
}
$res = XDB::iterator('SELECT matricule, nom, prenom, deces FROM auth_user_md5 WHERE promo = {?} ORDER BY nom,prenom', $promo);
}
if(Env::has('uid') && Env::has('type') && Env::has('stamp')) {
+ S::assert_xsrf_token();
+
$req = Validate::get_typed_request(Env::v('uid'), Env::v('type'), Env::v('stamp'));
- if($req && S::has_xsrf_token()) {
- $req->handle_formu();
- } else if ($req) {
- $page->trig("L'opération a échoué, merci de réessayer.");
- }
+ $req->handle_formu();
}
$r = XDB::iterator('SHOW COLUMNS FROM requests_answers');
}
// update wiki perms
- if ($action == 'update' && S::has_xsrf_token()) {
+ if ($action == 'update') {
+ S::assert_xsrf_token();
+
$perms_read = Post::v('read');
$perms_edot = Post::v('edit');
if ($perms_read || $perms_edit) {
wiki_set_perms($wiki_page, $perms0, $perms1);
}
}
- } elseif ($action == 'update') {
- $page->trig("La mise à jour des permissions wiki a échouée, merci de réessayer.");
}
- if ($action == 'delete' && $wikipage != '' && S::has_xsrf_token()) {
+ if ($action == 'delete' && $wikipage != '') {
+ S::assert_xsrf_token();
+
if (wiki_delete_page($wikipage)) {
$page->trig("La page ".$wikipage." a été supprimée.");
} else {
$page->trig("Impossible de supprimer la page ".$wikipage.".");
}
- } elseif ($action == 'delete' && $wikipage != '') {
- $page->trig("La suppression de la page wiki a échouée, merci de réessayer.");
}
- if ($action == 'rename' && $wikipage != '' && $wikipage2 != '' && $wikipage != $wikipage2 && S::has_xsrf_token()) {
+ if ($action == 'rename' && $wikipage != '' && $wikipage2 != '' && $wikipage != $wikipage2) {
+ S::assert_xsrf_token();
+
if ($changedLinks = wiki_rename_page($wikipage, $wikipage2)) {
$s = 'La page <em>'.$wikipage.'</em> a été déplacée en <em>'.$wikipage2.'</em>.';
if (is_numeric($changedLinks)) {
} else {
$page->trig("Impossible de déplacer la page ".$wikipage);
}
- } elseif ($action == 'rename' && $wikipage != '' && $wikipage2 != '' && $wikipage != $wikipage2) {
- $page->trig("Le renommage de la page wiki a échoué, merci de réessayer.");
}
$perms = wiki_perms_options();
switch (Post::v('action')) {
case 'create':
if (trim(Post::v('ipN')) != '') {
- if (!S::has_xsrf_token()) {
- $page->trig("L'ajout d'une IP à surveiller a échoué, merci de réessayer.");
- break;
- }
+ S::assert_xsrf_token();
Xdb::execute('INSERT IGNORE INTO ip_watch (ip, mask, state, detection, last, uid, description)
VALUES ({?}, {?}, {?}, CURDATE(), NOW(), {?}, {?})',
ip_to_uint(trim(Post::v('ipN'))), ip_to_uint(trim(Post::v('maskN'))),
break;
case 'edit':
- if (!S::has_xsrf_token()) {
- $page->trig("L'édition de l'IP a échoué, merci de réessayer.");
- break;
- }
+ S::assert_xsrf_token();
Xdb::execute('UPDATE ip_watch
SET state = {?}, last = NOW(), uid = {?}, description = {?}, mask = {?}
WHERE ip = {?}', Post::v('stateN'), S::i('uid'), Post::v('descriptionN'),
default:
if ($action == 'delete' && !is_null($ip)) {
- if (S::has_xsrf_token()) {
- Xdb::execute('DELETE FROM ip_watch WHERE ip = {?}', ip_to_uint($ip));
- } else {
- $page->trig("La suppression de l'adresse IP a échouée, merci de réessayer.");
- }
+ S::assert_xsrf_token();
+ Xdb::execute('DELETE FROM ip_watch WHERE ip = {?}', ip_to_uint($ip));
}
}
if ($action != 'create' && $action != 'edit') {
$saved = false;
$new = true;
}
- } elseif (Post::has('valid') && S::has_xsrf_token()) {
+ } elseif (Post::has('valid')) {
+ S::assert_xsrf_token();
+
if (!$subject && $title) {
$subject = $title;
}
pl_redirect('ax');
break;
}
- } elseif (Post::has('valid')) {
- $page->trig("L'opération a échouée, merci de réessayer.");
}
$page->assign('id', $id);
$page->assign('short_name', $short_name);
$action = Post::v('action');
$uid = Post::v('uid');
}
- if ($uid && S::has_xsrf_token()) {
+ if ($uid) {
+ S::assert_xsrf_token();
+
$uids = preg_split('/ *[,;\: ] */', $uid);
foreach ($uids as $uid) {
switch ($action) {
$page->trig("Personne ne correspond à l'identifiant '$uid'");
}
}
- } elseif ($uid) {
- $page->trig("L'opération sur la liste des administrateurs AX a échouée, merci de réessayer.");
}
$page->changeTpl('axletter/admin.tpl');
$promo_sortie = $res->fetchOneCell();
$page->assign('promo_sortie', $promo_sortie);
- if ($action && !S::has_xsrf_token()) {
- $page->trig("La mise à jour des notifications a échouée, merci de réessayer.");
- $action = false;
+ if ($action) {
+ S::assert_xsrf_token();
}
switch ($action) {
case 'add_promo':
break;
}
- if (Env::has('subs') && S::has_xsrf_token()) {
+ if (Env::has('subs')) {
+ S::assert_xsrf_token();
$watch->_subs->update('sub');
- } elseif (Env::has('subs')) {
- $page->trig("La mise à jour des notifications a échouée, merci de réessayer.");
}
- if (Env::has('flags_contacts') && S::has_xsrf_token()) {
+ if (Env::has('flags_contacts')) {
+ S::assert_xsrf_token();
$watch->watch_contacts = Env::b('contacts');
$watch->saveFlags();
- } elseif (Env::has('flags_contacts')) {
- $page->trig("La mise à jour des notifications a échouée, merci de réessayer.");
}
- if (Env::has('flags_mail') && S::has_xsrf_token()) {
+ if (Env::has('flags_mail')) {
+ S::assert_xsrf_token();
$watch->watch_mail = Env::b('mail');
$watch->saveFlags();
- } elseif (Env::has('flags_mail')) {
- $page->trig("La mise à jour des notifications a échouée, merci de réessayer.");
}
$page->assign_by_ref('watch', $watch);
// For XSRF protection, checks both the normal xsrf token, and the special RSS token.
// It allows direct linking to contact adding in the RSS feed.
- if (Env::v('action') && (S::has_xsrf_token() || Env::v('token') === S::v('core_rss_hash'))) {
- switch (Env::v('action')) {
- case 'retirer':
+ if (Env::v('action') && Env::v('token') !== S::v('core_rss_hash')) {
+ S::assert_xsrf_token();
+ }
+ switch (Env::v('action')) {
+ case 'retirer':
if (is_numeric($user)) {
if (XDB::execute('DELETE FROM contacts
WHERE uid = {?} AND contact = {?}',
}
break;
- case 'ajouter':
+ case 'ajouter':
require_once('user.func.inc.php');
if (($login = get_user_login($user)) !== false) {
if (XDB::execute(
$page->trig('Contact déjà dans la liste !');
}
}
- }
- } elseif (Env::v('action')) {
- $page->trig("La modification du contact a échouée, merci de réessayer.");
}
$search = false;
function handler_purge_cache(&$page)
{
- if (S::has_xsrf_token()) {
- require_once 'wiki.inc.php';
+ require_once 'wiki.inc.php';
+ S::assert_xsrf_token();
- $page->clear_compiled_tpl();
- wiki_clear_all_cache();
+ $page->clear_compiled_tpl();
+ wiki_clear_all_cache();
- http_redirect(empty($_SERVER['HTTP_REFERER']) ? './' : $_SERVER['HTTP_REFERER']);
- } else {
- $page->kill("La purge du cache a échouée, merci de réessayer.");
- }
+ http_redirect(empty($_SERVER['HTTP_REFERER']) ? './' : $_SERVER['HTTP_REFERER']);
}
function handler_kill_sessions(&$page)
global $globals;
$page->changeTpl('core/bug.tpl', SIMPLE);
$page->addJsLink('close_on_esc.js');
- if (Env::has('send') && trim(Env::v('detailed_desc')) && S::has_xsrf_token()) {
+ if (Env::has('send') && trim(Env::v('detailed_desc'))) {
+ S::assert_xsrf_token();
+
$body = wordwrap(Env::v('detailed_desc'), 78) . "\n\n"
. "----------------------------\n"
. "Page : " . Env::v('page') . "\n\n"
$mymail->setSubject('Plat/al '.Env::v('task_type').' : '.Env::v('item_summary'));
$mymail->setTxtBody($body);
$mymail->send();
- } elseif (Env::has('send') && S::has_xsrf_token()) {
- $page->trig("Merci de remplir une explication du problème rencontré");
} elseif (Env::has('send')) {
- $page->trig("L'envoi du bug a échoué, merci de réessayer.");
+ $page->trig("Merci de remplir une explication du problème rencontré");
}
}
$page->assign('demande', AliasReq::get_request($uid));
- if ($action == 'delete' && $value && S::has_xsrf_token()) {
+ if ($action == 'delete' && $value) {
+ S::assert_xsrf_token();
+
//Suppression d'un alias
XDB::execute(
'DELETE virtual, virtual_redirect
INNER JOIN virtual_redirect USING (vid)
WHERE alias = {?} AND (redirect = {?} OR redirect = {?})', $value,
$forlife.'@'.$globals->mail->domain, $forlife.'@'.$globals->mail->domain2);
- } elseif ($action == 'delete' && $value) {
- $page->trig("La suppression de ton alias a échouée, merci de réessayer.");
}
//Récupération des alias éventuellement existants
list($alias, $visibility) = $res->fetchOneRow();
$page->assign('actuel', $alias);
- if ($action == 'ask' && Env::has('alias') && Env::has('raison') && S::has_xsrf_token()) {
- //Si l'utilisateur vient de faire une damande
+ if ($action == 'ask' && Env::has('alias') && Env::has('raison')) {
+ S::assert_xsrf_token();
+ //Si l'utilisateur vient de faire une damande
$alias = Env::v('alias');
$raison = Env::v('raison');
$public = (Env::v('public', 'off') == 'on')?"public":"private";
$page->assign('success',$alias);
return;
}
- } elseif ($action == 'ask' && Env::has('alias') && Env::has('raison')) {
- $page->trig("Ta demande d'alias n'a pas pu être enregistrée, merci de réessayer.");
} elseif ($action == 'set' && ($value == 'public' || $value == 'private')) {
if (!S::has_xsrf_token()) {
return PL_FORBIDDEN;
$redirect->modify_one_email_redirect($email, $rewrite);
}
- if (Env::has('emailop') && S::has_xsrf_token()) {
+ if (Env::has('emailop')) {
+ S::assert_xsrf_token();
+
$actifs = Env::v('emails_actifs', Array());
print_r(Env::v('emails_rewrite'));
if (Env::v('emailop') == "ajouter" && Env::has('email')) {
$page->assign('retour', $redirect->modify_email($actifs,
Env::v('emails_rewrite',Array())));
}
- } else if (Env::has('emailop')) {
- $page->trig('L\'ajout d\'une nouvelle redirection a échoué, merci de réessayer.');
}
$res = XDB::query(
wiki_require_page('Xorg.Mails');
$page->changeTpl('emails/submit_spam.tpl');
- if (Post::has('send_email') && S::has_xsrf_token()) {
+ if (Post::has('send_email')) {
+ S::assert_xsrf_token();
+
$upload = PlUpload::get($_FILES['mail'], S::v('forlife'), 'spam.submit', true);
if (!$upload) {
$page->trig('Une erreur a été rencontrée lors du transfert du fichier');
$mailer->send();
$page->trig('Le message a été transmis à ' . $box);
$upload->clear();
- } elseif (Post::has('send_email')) {
- $page->trig("La soumission du spam a échouée, merci de réessayer.");
}
}
VALUES ({?}, {?})", S::i('uid'), $data);
}
exit;
- } else if (Env::v('submit') == 'Envoyer' && S::has_xsrf_token()) {
+ } else if (Env::v('submit') == 'Envoyer') {
+ S::assert_xsrf_token();
+
function getEmails($aliases)
{
if (!is_array($aliases)) {
}
}
}
- } else if (Env::v('submit') == 'Envoyer') {
- $page->trig("L'envoi de l'email a échoué, merci de réessayer.");
} else {
$res = XDB::query("SELECT data
FROM email_send_save
$page->changeTpl('emails/broken.tpl');
- if ($warn == 'warn' && $email && S::has_xsrf_token()) {
+ if ($warn == 'warn' && $email) {
+ S::assert_xsrf_token();
+
$email = valide_email($email);
// vérifications d'usage
$sel = XDB::query(
$mail->send();
$page->trig("Mail envoyé ! :o)");
}
- } elseif ($warn == 'warn' && $email) {
- $page->trig("Nous n'avons pas pu prévenir ton correspondant, merci de réessayer.");
- } elseif (Post::has('email') && S::has_xsrf_token()) {
+ } elseif (Post::has('email')) {
+ S::assert_xsrf_token();
+
$email = valide_email(Post::v('email'));
list(,$fqdn) = explode('@', $email);
$fqdn = strtolower($fqdn);
- if ($fqdn == 'polytechnique.org' || $fqdn == 'melix.org'
- || $fqdn == 'm4x.org' || $fqdn == 'melix.net')
- {
+ if ($fqdn == 'polytechnique.org' || $fqdn == 'melix.org' || $fqdn == 'm4x.org' || $fqdn == 'melix.net') {
$page->assign('neuneu', true);
} else {
$page->assign('email',$email);
$page->assign_by_ref('x', $x);
}
}
- } elseif (Post::has('email')) {
- $page->trig("Nous n'avons pas réussi à satisfaire ta demande, merci de réessayer.");
}
}
'dangerous' => 'Usurpations par cette adresse');
$page->assign('states', $states);
- if (Post::has('action') && !S::has_xsrf_token()) {
- $page->kill("L'action n'a pas pu être réalisée, merci de réessayer.");
+ if (Post::has('action')) {
+ S::assert_xsrf_token();
}
switch (Post::v('action')) {
case 'create':
} else if ($subaction == 'nosync') {
$account->set_password_sync(false);
} else if (Post::has('response2') && !$account->sync_password) {
- if (S::has_xsrf_token()) {
- $account->set_password(Post::v('response2'));
- } else {
- $page->trig("Le changement de ton mot de passe Google Apps a échoué, merci de réessayer.");
- }
+ S::assert_xsrf_token();
+ $account->set_password(Post::v('response2'));
}
}
if ($action == 'suspend' && Post::has('suspend') && $account->active()) {
- if (!S::has_xsrf_token()) {
- $page->trig("La demande de suspension de ton compte a échouée, merci de réessayer.");
- } else if ($account->pending_update_suspension) {
+ S::assert_xsrf_token();
+
+ if ($account->pending_update_suspension) {
$page->trig("Ton compte est déjà en cours de désactivation.");
} else {
if ($redirect->modify_one_email('googleapps', false) == SUCCESS) {
$page->assign('password_sync', Get::b('password_sync', true));
}
if ($action == 'create' && Post::has('password_sync') && Post::has('redirect_mails')) {
+ S::assert_xsrf_token();
+
$password_sync = Post::b('password_sync');
$redirect_mails = Post::b('redirect_mails');
if ($password_sync) {
$password = Post::v('response2');
}
- if (S::has_xsrf_token()) {
- $account->create($password_sync, $password, $redirect_mails);
- $page->trig("La demande de création de ton compte Google Apps a bien été enregistrée.");
- } else {
- $page->trig("La demande de création de ton compte Google Apps a échouée, merci de réessayer.");
- }
+ $account->create($password_sync, $password, $redirect_mails);
+ $page->trig("La demande de création de ton compte Google Apps a bien été enregistrée.");
}
}
{
global $globals;
- if (Post::has('response2') && S::has_xsrf_token()) {
+ if (Post::has('response2')) {
require_once 'secure_hash.inc.php';
+ S::assert_xsrf_token();
$_SESSION['password'] = $password = Post::v('response2');
$page->changeTpl('platal/motdepasse.success.tpl');
$page->run();
- } else if (Post::has('response2')) {
- $page->trig('Le changement de ton mot de passe a échoué, merci de réessayer.');
}
$page->changeTpl('platal/motdepasse.tpl');
Get::v('del'));
list($id, $nom, $domain) = $res->fetchOneRow();
$page->assign('nom', $nom);
- if ($id && Post::has('del') && S::has_xsrf_token()) {
+ if ($id && Post::has('del')) {
+ S::assert_xsrf_token();
+
XDB::query('DELETE FROM groupex.membres WHERE asso_id={?}', $id);
$page->trig('membres supprimés');
XDB::query('DELETE FROM groupex.asso WHERE id={?}', $id);
$page->trig("Groupe $nom supprimé");
Get::kill('del');
- } else if ($id && Post::has('del')) {
- $page->trig("La suppression du groupe X a échouée, merci de réssayer.");
}
if (!$id) {
Get::kill('del');
}
}
- if (Post::has('diminutif') && S::has_xsrf_token()) {
+ if (Post::has('diminutif')) {
+ S::assert_xsrf_token();
+
XDB::query('INSERT INTO groupex.asso (id,diminutif)
VALUES(NULL,{?})', Post::v('diminutif'));
pl_redirect('../'.Post::v('diminutif').'/edit');
- } else if (Post::has('diminutif')) {
- $page->trig("L'ajout du groupe X a échoué, merci de réssayer.");
}
$res = XDB::query('SELECT nom,diminutif FROM groupex.asso ORDER by NOM');
global $globals;
$page->changeTpl('xnetgrp/edit.tpl');
- if (Post::has('submit') && S::has_xsrf_token()) {
+ if (Post::has('submit')) {
+ S::assert_xsrf_token();
+
if (S::has_perms()) {
if (Post::v('mail_domain') && (strstr(Post::v('mail_domain'), '.') === false)) {
$page->trig("le domaine doit être un FQDN (aucune modif effectuée) !!!");
}
pl_redirect('../'.Post::v('diminutif', $globals->asso('diminutif')).'/edit');
- } else if (Post::has('submit')) {
- $page->trig("La mise à jour des paramètres du groupe a échouée, merci de réssayer.");
}
if (S::has_perms()) {