/** * Action non securisee: c'est une porte ouverte par un webmestre * et seule la clé partagée migration_key permet de se proteger. * La clé s'invalide automatiquement apres un delai d'inactivité * * @return void */ function action_migration_reception_dist(){ if (!$s = lire_migration_depuis_status()){ migration_reponse_fail('pas de migration en cours ou migration echouee par timeout'); } if (!$data = _request('data')){ migration_reponse_fail('pas de "data" dans la requete'); } if (!$data = migration_decoder_data($data,$s['key'])){ migration_reponse_fail('signature data invalide'); } /* * data est un tableau * 'action' => action demandee * 'data' => donnees passees a l'action */ if (!isset($data['action'])){ migration_reponse_fail('aucune action demandee'); } if ($s['status']=='init' AND $data['action']!=='connect'){ migration_reponse_fail('action demandee '.$data['action'].' avant action connect reussie'); } if (!$action = charger_fonction($data['action'],'migration/reception',true)) { migration_reponse_fail("action inconnue : ".$data['action']); } $res = $action($s, $data['data']); // toujours serializer le retour $res = serialize($res); spip_log("action ".$data['action'].' resultat:'.$res,'migration'); echo $res; exit; }
function action_migration_depuis_status_dist(){ #$securiser_action = charger_fonction('securiser_action','inc'); #$securiser_action(); $s = lire_migration_depuis_status(); // verifier qu'un verrou n'etait pas sur le fichier // et qu'on arrive pas a le lire en attendant un peu if (!$s){ usleep(333); $s = lire_migration_depuis_status(); } // verifier qu'un verrou n'etait pas sur le fichier // et qu'on arrive pas a le lire en attendant un peu if (!$s){ usleep(333); $s = lire_migration_depuis_status(); } // peut etre on a fini ? if (!$s){ $s = lire_migration_depuis_status(true); } if (!$s) ajax_retour("Echec : le site distant n'a pas réussi à se connecter, la migration a été abandonnée."); else{ if ($s['key']!=_request('key')){ ajax_retour("La clé de migration n'est plus valable, recommmencez la migration"); } else { ajax_retour(migration_afficher_status($s)); } } exit; }
function formulaires_assistant_migration_verifier_3_dist(){ $erreurs = array(); if (_request('direction')=='depuis'){ // en cas d'abandon sur une migration "depuis", annuler if (_request('canceldepuis')){ include_spip('inc/migration'); $status = abandonner_migration_depuis(); finir_migration_status_depuis(); include_spip('inc/headers'); $erreurs['message_erreur'] = _T('migration:titre_abandon_migration') . redirige_formulaire(generer_url_ecrire('migrer_depuis_fin')); } else { $s = lire_migration_depuis_status(); if ($s AND $s['status']!=='ended') $erreurs['waiting'] = ' '; } } else { foreach(array('url_cible') as $obli) if (!_request($obli)) $erreurs[$obli] = _T('info_obligatoire'); if (strpos(_request('url_cible'),'+')===false) $erreurs['url_cible'] = _T('migration:erreur_url_incorrecte'); if (!count($erreurs)){ $url_cible = _request('url_cible'); $url_cible = explode('+',$url_cible); $migration_key = array_pop($url_cible); $url_cible = implode('+',$url_cible); initialiser_migration_vers($url_cible,$migration_key,_request('quoi')); $connect = charger_fonction('connect','migration/envoi'); $res = $connect($GLOBALS['meta']['adresse_site']); if ($res!==true){ $erreurs['message_erreur'] = _T(is_string($res)?$res:'migration:erreur_echec_connexion_init'); } } } return $erreurs; }
/** * Si la migration a echouee, peut on revenir a une base que l'on avait sauvegarde ? * (cas sqlite uniquement) * * @return bool */ function migration_restore_base_si_possible(){ $res = false; spip_log("tentative de restauration de la base",'migration'); // si jamais la base est sqlite, et qu'on a un backup // le restaurer include_spip('base/abstract_sql'); sql_version(); if (strncmp($GLOBALS['connexions'][0]['type'],'sqlite',6)==0){ if ($db =$GLOBALS['connexions'][0]['db'] AND is_file($f = _DIR_DB . $db . '.sqlite')) { $s = lire_migration_depuis_status(); spip_log("base SQLITE, le status indique backup=".$s['backup'],'migration'); if ($g = $s['backup'] AND @file_exists(_DIR_DB.$g)){ spip_log("base $g restauree dans $f suite a l'echec de la migration",'migration'); @copy(_DIR_DB.$g,$f); $res = true; } } } // securite, dans tous les cas sql_update('spip_auteurs', array('id_auteur'=>'-id_auteur'), "id_auteur<0"); if ($GLOBALS['visiteur_session']['id_auteur']<0){ $id_old = $GLOBALS['visiteur_session']['id_auteur']; $auteur = sql_fetsel('*','spip_auteurs','id_auteur='.intval(-$id_old)); $session = charger_fonction('session','inc'); $session($auteur); // creer la nouvelle session avec -id_auteur $session(); // la charger dans $GLOBALS['visiteur_session'] $session($id_old); // supprimer l'ancienne session } return $res; }