Skip to content
Extraits de code Groupes Projets
Valider 11d02727 rédigé par esj's avatar esj
Parcourir les fichiers

#209: L'identifiant de session d'importation introduit par [9903] est étendu...

#209: L'identifiant de session d'importation introduit par [9903] est étendu dans la fonction '''inc_admin''' à un identifiant de session d'administration, afin d'empêcher plus généralement deux connexions dans l'espace privé lorsqu'une opération lourde a lieu (actuellement: mise à jour de SPIP,  importation/fusion d'archives, conversion de caractères par SQL ou par PHP, destruction des statistiques ou de la base). Grace à ça, les deux verrous MySQL pour les conversions de caractères passent à la trappe. Plus que 3 verrous MySQL à éliminer.
parent 220ae1f1
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -16,12 +16,6 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
// http://doc.spip.org/@base_convert_sql_utf8_dist
function base_convert_sql_utf8_dist($titre, $reprise=false)
{
// poser un verrou (et abandonner si l'action est en cours)
if (!spip_get_lock('conversion_charset_sql')) {
echo minipres(_T('utf8_convert_attendez'));
exit;
}
include_spip('inc/meta');
ecrire_meta('convert_sql_utf8','oui','non');
......@@ -135,6 +129,5 @@ function convert_sql_utf8(){
ecrire_meta('charset_sql_base',$sql_charset,'non');
ecrire_meta('charset_sql_connexion',$sql_charset,'non');
ecrire_metas();
spip_release_lock('conversion_charset_sql');
}
?>
......@@ -38,12 +38,6 @@ function convert_utf8_init($tables_a_convertir)
// http://doc.spip.org/@base_convert_utf8_dist
function base_convert_utf8_dist($titre, $reprise=false)
{
// poser un verrou (et abandonner si l'action est en cours)
if (!spip_get_lock('conversion_charset')) {
echo minipres(_T('utf8_convert_attendez'));
exit;
}
// une liste des tables a convertir, avec le champ dans lequel on
// indique '<CONVERT charset>' ; on commence par les rubriques sinon
// ca fait desordre dans l'interface privee
......
......@@ -115,7 +115,6 @@ function import_all_fin($request) {
effacer_meta("date_optimisation");
effacer_meta('version_archive_restauration');
effacer_meta('tag_archive_restauration');
effacer_meta('restauration_session_id');
effacer_meta('restauration_charset_sql_connexion');
ecrire_metas();
if ($request['insertion'] == 'passe2')
......
......@@ -29,17 +29,39 @@ function inc_admin_dist($script, $titre, $comment='', $retour='')
spip_log("meta: $script " . join(',', $_POST));
ecrire_meta($script, serialize($_POST));
ecrire_metas();
} else spip_log("reprise de $script");
} else admin_verifie_session($script);
$base = charger_fonction($script, 'base');
$base($titre,$reprise);
effacer_meta($script);
ecrire_metas();
spip_unlink(_FILE_META);
fin_admin($script);
spip_log("efface meta: $script " . ($retour ? $retour : ''));
spip_log("efface les meta admin et $script " . ($retour ? $retour : ''));
if ($retour) redirige_par_entete($retour);
}
// Gestion dans la meta "admin" du script d'administation demande,
// pour eviter des executions en parallele, notamment apres Time-Out.
// Cette meta contient le nom du script et, a un codage pres, du demandeur.
// Le code de ecrire/index.php devie toute demande d'execution d'un script
// vers le script d'administration indique par cette meta si elle est là.
// Au niveau de la fonction inc_admin, on controle la meta 'admin'.
// Si la meta n'est pas la, c'est le debut on la cree
// Sinon, on verifie que le connecte est bien celui ayant entame
// l'operation d'administration,
// Si le connecte n'est pas le bon, on refuse la connexion.
// http://doc.spip.org/@import_verifie_session
function admin_verifie_session($script) {
$signal = $script . ' ' . fichier_admin($action);
$row = sql_fetsel('valeur', 'spip_meta', "nom='admin'");
if (!$row) {
ecrire_meta('admin', $signal,'non');
ecrire_metas();
} elseif ($row['valeur'] != $signal)
die(_T('info_travaux_texte'));
else spip_log("reprise de $script");
}
// http://doc.spip.org/@dir_admin
function dir_admin()
{
......@@ -123,8 +145,12 @@ function debut_admin($script, $action='', $commentaire='') {
// http://doc.spip.org/@fin_admin
function fin_admin($action) {
$signal = dir_admin() . fichier_admin($action);
@rmdir($signal); // par precaution
spip_unlink($signal);
@rmdir($signal);
spip_unlink(_FILE_META);
effacer_meta($action);
effacer_meta('admin');
ecrire_metas();
}
// http://doc.spip.org/@copy_request
......
......@@ -180,17 +180,6 @@ function detruit_restaurateur()
}
}
// verifier que l'id de session restauration place dans une meta correspond toujours a la session en cours
// sinon cela signifie que la page a ete rechargee, et qu'une autre session a repris depuis le dernier abs_pos
// il faut absolument ne plus rien faire et mourir ...
// http://doc.spip.org/@import_verifie_session
function import_verifie_session() {
$row = sql_fetsel(array('valeur'),array('spip_meta'),array("nom='restauration_session_id'"));
if ($row['valeur']!=_RESTAURATION_SESSION_ID)
die('la place est prise');
}
// http://doc.spip.org/@import_tables
function import_tables($request, $dir) {
global $import_ok, $abs_pos, $affiche_progression_pourcent;
......@@ -228,12 +217,6 @@ function import_tables($request, $dir) {
$gz = 'fread';
}
// creer un id de la session d'import qui sera utilise pour verifier qu'on a toujours la main
// avant chaque insert/update
// permet d'eviter les process concourants qui realisent le meme insert/update
include_spip('inc/acces');
@define('_RESTAURATION_SESSION_ID',creer_uniqid());
ecrire_meta('restauration_session_id',_RESTAURATION_SESSION_ID,'non');
if ($abs_pos==0) {
list($tag, $atts, $charset) = import_debut($file, $gz);
......
......@@ -69,7 +69,6 @@ function inc_import_1_3_dist($lecteur, $request, $gz='fread', $atts=array()) {
if ($values === false) return ($import_ok = false);
import_verifie_session(); // verifier qu'on a toujours la main pour faire des insertions en base
if ($values) $boucle($values, $new, $desc, $request, $atts);
return $import_ok = $new;
......
......@@ -128,13 +128,18 @@ AND (!isset($var_ajaxcharset))
AND ($GLOBALS['spip_version'] != (str_replace(',','.',$GLOBALS['meta']['version_installee']))))
$exec = 'demande_mise_a_jour';
// Si interruption d'une longue restauration
// detourner le script demande pour qu'il reprenne le boulot, et
// refuser Ajax et non-admin pour eviter des restaurations paralleles
elseif (isset($GLOBALS['meta']["import_all"])) {
// Quand une action d'administration est en cours (meta "admin"),
// refuser les connexions non-admin ou Ajax pour laisser la base intacte.
// Si c'est une admin, detourner le script demande vers cette action:
// si l'action est vraiment en cours, inc_admin refusera cette 2e demande,
// sinon c'est qu'elle a ete interrompue et il faut la reprendre
elseif (isset($GLOBALS['meta']["admin"])) {
if (isset($var_ajaxcharset) OR !isset($_COOKIE['spip_admin']))
die('Importation en cours, revenez plus tard.');
$exec = 'import_all';
die(_T('info_travaux_texte'));
$l = $GLOBALS['meta']["admin"];
spip_log("Le script $l, en cours, se substitue a $exec");
$exec = substr($l, 0, strpos($l, ' '));
}
// si nom pas plausible, prendre le script par defaut
elseif (!preg_match(',^[a-z_][0-9a-z_]*$,i', $exec)) $exec = "accueil";
......
......@@ -97,7 +97,9 @@ function install_bases(){
$finsert('spip_meta', '(nom, valeur,impt)', "('version_installee', '$spip_version','non')");
} else {
creer_base($server_db); // pour recrer les tables disparues au besoin
// pour recreer les tables disparues au besoin
creer_base($server_db);
$r = $fquery ("SELECT valeur FROM spip_meta WHERE nom='version_installee'");
if ($r) $r = $ffetch($r);
if ($r) $version_installee = (double) $r['valeur'];
......@@ -138,8 +140,9 @@ function install_bases(){
$result_ok = $finsert("spip_meta", "(nom, valeur)", "('nouvelle_install', '1')");
} else {
// en cas de reinstall sur mise a jour mal passee
@$fquery("DELETE FROM spip_meta WHERE nom='import_all'");
// eliminer la derniere operation d'admin mal terminee
// notamment la mise a jour
@$fquery("DELETE FROM spip_meta WHERE nom='import_all' OR nom='admin'");
$result_ok = @$fquery("SELECT COUNT(*) FROM spip_meta");
}
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter