function auth_spip_dist ($login, $pass, $serveur='') { // retrouver le login $login = auth_spip_retrouver_login($login); // login inconnu, n'allons pas plus loin if (!$login) return array(); $md5pass = $md5next = ""; $shapass = $shanext = ""; if (preg_match(",^\{([0-9a-f]{64});([0-9a-f]{64})\}$,i",$pass,$regs)){ $shapass = $regs[1]; $shanext = $regs[2]; $pass=""; } // compat avec une base mixte md5/sha256 : le js a envoye les 2 hash elseif (preg_match(",^\{([0-9a-f]{64});([0-9a-f]{64});([0-9a-f]{32});([0-9a-f]{32})\}$,i",$pass,$regs)){ $shapass = $regs[1]; $shanext = $regs[2]; $md5pass = $regs[3]; $md5next = $regs[4]; $pass=""; } // si envoi non crypte, crypter maintenant elseif ($pass) { $row = sql_fetsel("alea_actuel, alea_futur", "spip_auteurs", "login="******"*", "spip_auteurs", "login="******" AND pass="******" AND statut<>'5poubelle'",'','','','',$serveur); // compat avec les anciennes bases en md5 if (!$row AND $md5pass) $row = sql_fetsel("*", "spip_auteurs", "login="******" AND pass="******" AND statut<>'5poubelle'",'','','','',$serveur); // login/mot de passe incorrect if (!$row) return array(); // fait tourner le codage du pass dans la base if ($shanext) { include_spip('inc/acces'); // pour creer_uniqid @sql_update('spip_auteurs', array('alea_actuel' => 'alea_futur', 'pass' => sql_quote($shanext), 'alea_futur' => sql_quote(creer_uniqid())), "id_auteur=" . $row['id_auteur'].' AND pass IN ('.sql_quote($shapass).', '.sql_quote($md5pass).')','',$serveur); // En profiter pour verifier la securite de tmp/ // Si elle ne fonctionne pas a l'installation, prevenir if (!verifier_htaccess(_DIR_TMP) AND defined('_ECRIRE_INSTALL')) return false; } return $row; }
function install_verifier_htaccess() { if (verifier_htaccess(_DIR_TMP, true) and verifier_htaccess(_DIR_CONNECT, true)) { return ''; } $titre = _T('htaccess_inoperant'); $averti = _T('htaccess_a_simuler', array('htaccess' => '<tt>' . _ACCESS_FILE_NAME . '</tt>', 'constantes' => '<tt>_DIR_TMP & _DIR_CONNECT</tt>', 'document_root' => '<tt>' . $_SERVER['DOCUMENT_ROOT'] . '</tt>')); return "<div class='error'><h3>{$titre}</h3><p>{$averti}</p></div>"; }
/** * Authentifie et si ok retourne le tableau de la ligne SQL de l'utilisateur * Si risque de secu repere a l'installation retourne False * * @param string $login * @param string $pass * @param string $serveur * @param bool $phpauth * @return array|bool */ function auth_spip_dist($login, $pass, $serveur = '', $phpauth = false) { // retrouver le login $login = auth_spip_retrouver_login($login); // login inconnu, n'allons pas plus loin if (!$login) { return array(); } $md5pass = ""; $shapass = $shanext = ""; if (preg_match(",^\\{([0-9a-f]{64});([0-9a-f]{64})\\}\$,i", $pass, $regs)) { $shapass = $regs[1]; $shanext = $regs[2]; } elseif (preg_match(",^\\{([0-9a-f]{64});([0-9a-f]{64});([0-9a-f]{32});([0-9a-f]{32})\\}\$,i", $pass, $regs)) { $shapass = $regs[1]; $shanext = $regs[2]; $md5pass = $regs[3]; //$md5next = $regs[4]; } elseif ($pass) { $row = sql_fetsel("alea_actuel, alea_futur", "spip_auteurs", "login="******"*", "spip_auteurs", "login="******" AND pass="******" AND statut<>'5poubelle'", '', '', '', '', $serveur); // compat avec les anciennes bases en md5 if (!$row and $md5pass) { $row = sql_fetsel("*", "spip_auteurs", "login="******" AND pass="******" AND statut<>'5poubelle'", '', '', '', '', $serveur); } // login/mot de passe incorrect if (!$row) { return array(); } // fait tourner le codage du pass dans la base // sauf si phpauth : cela reviendrait a changer l'alea a chaque hit, et aucune action verifiable par securiser_action() if ($shanext and !$phpauth) { include_spip('inc/acces'); // pour creer_uniqid @sql_update('spip_auteurs', array('alea_actuel' => 'alea_futur', 'pass' => sql_quote($shanext, $serveur, 'text'), 'alea_futur' => sql_quote(creer_uniqid(), $serveur, 'text')), "id_auteur=" . $row['id_auteur'] . ' AND pass IN (' . sql_quote($shapass, $serveur, 'text') . ', ' . sql_quote($md5pass, $serveur, 'text') . ')', '', $serveur); // En profiter pour verifier la securite de tmp/ // Si elle ne fonctionne pas a l'installation, prevenir if (!verifier_htaccess(_DIR_TMP) and defined('_ECRIRE_INSTALL')) { return false; } } return $row; }
/** * Diverses tâches de maintenance * * - (re)mettre .htaccess avec 'Deny from all' * dans les deux répertoires dits inaccessibles par http * - Vérifier qu'aucune table ne s'est crashée * * @uses verifier_htaccess() * @uses verifier_crash_tables() * * @param object $t * @return bool Toujours à true. */ function genie_maintenance_dist($t) { // (re)mettre .htaccess avec deny from all // dans les deux repertoires dits inaccessibles par http include_spip('inc/acces'); verifier_htaccess(_DIR_ETC); verifier_htaccess(_DIR_TMP); // Verifier qu'aucune table n'est crashee if (!_request('reinstall')) { verifier_crash_tables(); } return 1; }
/** * Créer un sous-répertoire IMG/$ext/ tel que IMG/pdf * * @uses sous_repertoire() * @uses _DIR_IMG * @uses verifier_htaccess() * * @param string $ext * @return string */ function creer_repertoire_documents($ext) { $rep = sous_repertoire(_DIR_IMG, $ext); if (!$ext or !$rep) { spip_log("creer_repertoire_documents '{$rep}' interdit"); exit; } // Cette variable de configuration peut etre posee par un plugin // par exemple acces_restreint if (isset($GLOBALS['meta']["creer_htaccess"]) and $GLOBALS['meta']["creer_htaccess"] == 'oui') { include_spip('inc/acces'); verifier_htaccess($rep); } return $rep; }
function install_verifier_htaccess() { if (verifier_htaccess(_DIR_TMP, true) AND verifier_htaccess(_DIR_CONNECT, true)) return ''; $titre = _T('htaccess_inoperant'); $averti = _T('htaccess_a_simuler', array('htaccess' => '<tt>' . _ACCESS_FILE_NAME . '</tt>', 'constantes' => '<tt>_DIR_TMP & _DIR_CONNECT</tt>', 'document_root' => '<tt>' . $_SERVER['DOCUMENT_ROOT'] . '</tt>')); return "<p class='resultat echec'>$titre</p><p>$averti</p>"; }
/** * Creer IMG/config/vue * comme "creer_repertoire_documents" mais avec 2 profondeurs * * @param string $ext * @return string */ function cfg_creer_repertoire_cfg($ext) { list($racine, $vue) = explode('/',$ext,2); if ($rep = sous_repertoire(_DIR_IMG, $racine)){ $rep = sous_repertoire(_DIR_IMG.$racine, $vue); } if (!$ext OR !$rep) { spip_log("creer_repertoire_cfg interdit"); exit; } // Cette variable de configuration peut etre posee par un plugin // par exemple acces_restreint if ($GLOBALS['meta']["creer_htaccess"] == 'oui') { include_spip('inc/acces'); verifier_htaccess($rep); } return $rep; }
function gerer_htaccess() { // Cette variable de configuration peut etre posee par un plugin // par exemple acces_restreint $f = ($GLOBALS['meta']['creer_htaccess'] === 'oui'); $dirs = sql_allfetsel('extension', 'spip_types_documents'); $dirs[] = array('extension' => 'distant'); foreach($dirs as $e) { if (is_dir($dir = _DIR_IMG . $e['extension'])) { if ($f) verifier_htaccess($dir); else spip_unlink($dir . '/' . _ACCESS_FILE_NAME); } } return $GLOBALS['meta']['creer_htaccess']; }