$low_sec), 'id_auteur = '.intval($id_auteur));
}
}
return $low_sec;
}
/**
* Inclure les arguments significatifs pour le hachage
*
* Cas particulier du statut pour compatibilité ancien rss/suivi_revisions
*
* @param string $op
* @param array $args
* @param string $lang
* @param string $mime
* Par défaut 'rss'.
* @return string
*/
function param_low_sec($op, $args = array(), $lang = '', $mime = 'rss') {
$a = $b = '';
foreach ($args as $val => $var) {
if ($var) {
if ($val <> 'statut') {
$a .= ':' . $val . '-' . $var;
}
$b .= $val . '=' . $var . '&';
}
}
$a = substr($a, 1);
$id = intval(@$GLOBALS['connect_id_auteur']);
return $b
. 'op='
. $op
. '&id='
. $id
. '&cle='
. afficher_low_sec($id, "$mime $op $a")
. (!$a ? '' : "&args=$a")
. (!$lang ? '' : "&lang=$lang");
}
/**
* Retourne une clé basée sur le low_sec de l'auteur et l'action demandé
*
* @uses low_sec()
*
* @param int $id_auteur
* Identifiant de l'auteur
* @param string $action
* Action désirée
* @return string
* Clé
**/
function afficher_low_sec($id_auteur, $action = '') {
return substr(md5($action . low_sec($id_auteur)), 0, 8);
}
/**
* Vérifie une clé basée sur le low_sec de l'auteur et l'action demandé
*
* @uses afficher_low_sec()
*
* @param int $id_auteur
* Identifiant de l'auteur
* @param string $cle
* Clé à comparer
* @param string $action
* Action désirée
* @return bool
* true si les clés corresponde, false sinon
**/
function verifier_low_sec($id_auteur, $cle, $action = '') {
return ($cle == afficher_low_sec($id_auteur, $action));
}
/**
* Efface la clé de sécurité faible (low_sec) d'un auteur
*
* @param int $id_auteur
* Identifiant de l'auteur
**/
function effacer_low_sec($id_auteur) {
if (!$id_auteur = intval($id_auteur)) {
return;
} // jamais trop prudent ;)
sql_updateq('spip_auteurs', array('low_sec' => ''), 'id_auteur = '.intval($id_auteur));
}
/**
* Initialiser la globale htsalt si cela n'a pas déjà été fait.
*
* @return void|bool
*/
function initialiser_sel() {
if (CRYPT_MD5) {
$GLOBALS['htsalt'] = '$1$' . creer_pass_aleatoire();
} else {
return '';
}
}
/**
* Créer un fichier htpasswd
*
* Cette fonction ne sert qu'à la connexion en mode http_auth.non LDAP.
* Voir le plugin «Accès Restreint»
*
* S'appuie sur la meta `creer_htpasswd` pour savoir s'il faut créer
* le `.htpasswd`.
*
* @return null|void
* - null si pas de htpasswd à créer, ou si LDAP
* - void sinon.
**/
function ecrire_acces() {
$htaccess = _DIR_RESTREINT . _ACCESS_FILE_NAME;
$htpasswd = _DIR_TMP . _AUTH_USER_FILE;
// Cette variable de configuration peut etre posee par un plugin
// par exemple acces_restreint ;
// si .htaccess existe, outrepasser spip_meta
if ((!isset($GLOBALS['meta']['creer_htpasswd'])
or ($GLOBALS['meta']['creer_htpasswd'] != 'oui'))
and !@file_exists($htaccess)
) {
spip_unlink($htpasswd);
spip_unlink($htpasswd . '-admin');
return;
}
# remarque : ici on laisse passer les "nouveau" de maniere a leur permettre
# de devenir redacteur le cas echeant (auth http)... a nettoyer
// attention, il faut au prealable se connecter a la base (necessaire car utilise par install)
// TODO: factoriser avec auth/spip qui fait deja ce job et generaliser le test spip_connect_ldap()
if (spip_connect_ldap()) {
return;
}
$p1 = ''; // login:htpass pour tous
$p2 = ''; // login:htpass pour les admins
$s = sql_select('login, htpass, statut', 'spip_auteurs', sql_in('statut', array('1comite', '0minirezo', 'nouveau')));
while ($t = sql_fetch($s)) {
if (strlen($t['login']) and strlen($t['htpass'])) {
$p1 .= $t['login'] . ':' . $t['htpass'] . "\n";
if ($t['statut'] == '0minirezo') {
$p2 .= $t['login'] . ':' . $t['htpass'] . "\n";
}
}
}
if ($p1) {
ecrire_fichier($htpasswd, $p1);
ecrire_fichier($htpasswd . '-admin', $p2);
spip_log("Ecriture de $htpasswd et $htpasswd-admin");
}
}
/**
* Créer un password htaccess
*
* @link http://docs.php.net/manual/fr/function.crypt.php Documentation de `crypt()`
*
* @global string $htsalt
* Une chaîne de sel sur laquelle sera fondée le hachage.
* @param string $pass
* Le mot de passe
* @return void|string
* La chaîne hachée si fonction crypt présente, rien sinon.
*/
function generer_htpass($pass) {
if (function_exists('crypt')) {
return crypt($pass, $GLOBALS['htsalt']);
}
}
/**
* Installe ou vérifie un fichier .htaccess, y compris sa prise en compte par Apache
*
* @uses recuperer_lapage()
* @param string $rep
* Nom du répertoire où SPIP doit vérifier l'existence d'un fichier .htaccess
* @param bool $force
* @return boolean
*/
function verifier_htaccess($rep, $force = false) {
$htaccess = rtrim($rep, '/') . '/' . _ACCESS_FILE_NAME;
if (((@file_exists($htaccess)) or defined('_TEST_DIRS')) and !$force) {
return true;
}
// directive deny compatible Apache 2.0+
$deny =
'# Deny all requests from Apache 2.4+.
Require all denied
# Deny all requests from Apache 2.0-2.2.
Deny from all
';
// support des vieilles versions Apache 1.x mais uniquement si elles l'annoncent (pas en mode PROD)
if (function_exists('apache_get_version')
and $v = apache_get_version()
and strncmp($v, 'Apache/1.', 9) == 0) {
$deny = "deny from all\n";
}
if ($ht = @fopen($htaccess, 'w')) {
fputs($ht, $deny);
fclose($ht);
@chmod($htaccess, _SPIP_CHMOD & 0666);
$t = rtrim($rep, '/') . '/.ok';
if ($ht = @fopen($t, 'w')) {
@fclose($ht);
include_spip('inc/distant');
$t = substr($t, strlen(_DIR_RACINE));
$t = url_de_base() . $t;
$ht = recuperer_lapage($t, false, 'HEAD', 0);
// htaccess inoperant si on a recupere des entetes HTTP
// (ignorer la reussite si connexion par fopen)
$ht = !(isset($ht[0]) and $ht[0]);
}
}
spip_log("Creation de $htaccess " . ($ht ? ' reussie' : ' manquee'));
return $ht;
}
/**
* Créer un fichier .htaccess pour chaque répertoire d'extension
* dans `_DIR_IMG` si la configuration le demande
*
* @note
* La variable de configuration `creer_htaccess` peut être posée
* par un plugin tel acces_restreint.
*
* @uses _DIR_IMG
* @uses verifier_htaccess()
*
* @return string
* Valeur de la configuration `creer_htaccess`
*/
function gerer_htaccess() {
// Cette variable de configuration peut etre posee par un plugin
// par exemple acces_restreint
$f = (isset($GLOBALS['meta']['creer_htaccess']) and ($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 isset($GLOBALS['meta']['creer_htaccess']) ? $GLOBALS['meta']['creer_htaccess'] : '';
}
initialiser_sel();