예제 #1
0
/**
 * Generer l'url d'un document dans l'espace public,
 * fonction du statut du document
 *
 * @param int $id
 * @param string $args
 * @param string $ancre
 * @param string $public
 * @param string $connect
 * @return string
 *
 * http://doc.spip.org/@generer_url_ecrire_document
 */
function urls_generer_url_document_dist($id, $args = '', $ancre = '', $public = null, $connect = '')
{
    include_spip('inc/autoriser');
    include_spip('inc/documents');
    if (!autoriser('voir', 'document', $id)) {
        return '';
    }
    $r = sql_fetsel("fichier,distant", "spip_documents", "id_document=" . intval($id));
    if (!$r) {
        return '';
    }
    $f = $r['fichier'];
    if ($r['distant'] == 'oui') {
        return $f;
    }
    // Si droit de voir tous les docs, pas seulement celui-ci
    // il est inutilement couteux de rajouter une protection
    $r = autoriser('voir', 'document');
    if ($r and $r !== 'htaccess') {
        return get_spip_doc($f);
    }
    include_spip('inc/securiser_action');
    // cette url doit etre publique !
    $cle = calculer_cle_action($id . ',' . $f);
    // renvoyer une url plus ou moins jolie
    if ($GLOBALS['meta']['creer_htaccess']) {
        return _DIR_RACINE . "docrestreint.api/{$id}/{$cle}/{$f}";
    } else {
        return get_spip_doc($f) . "?{$id}/{$cle}";
    }
}
예제 #2
0
/**
 * Calcule une cle de jeton pour un formulaire
 *
 * @param string $form
 *   nom du formulaire
 * @param string $qui
 *   identifiant du visiteur a qui est attribue le jeton
 * @return string
 *   cle calculee
 */
function creer_jeton($form, $qui = NULL)
{
    $time = date('Y-m-d-H');
    if (is_null($qui)) {
        if (isset($GLOBALS['visiteur_session']['id_auteur']) and intval($GLOBALS['visiteur_session']['id_auteur'])) {
            $qui = ":" . $GLOBALS['visiteur_session']['id_auteur'] . ":" . $GLOBALS['visiteur_session']['nom'];
        } elseif (!defined('_IS_BOT') or !_IS_BOT) {
            // pas de jeton pour les bots qui n'ont rien d'interessant a poster
            $qui = nospam_hash_env();
        }
    }
    include_spip('inc/securiser_action');
    // le jeton prend en compte l'heure et l'identite de l'internaute
    return calculer_cle_action("jeton{$form}{$time}{$qui}");
}
예제 #3
0
function generer_url_document_dist($id_document, $args = '', $ancre = '')
{
    include_spip('inc/autoriser');
    if (!autoriser('voir', 'document', $id_document)) {
        return '';
    }
    $r = sql_fetsel("fichier,distant", "spip_documents", "id_document=" . intval($id_document));
    if (!$r) {
        return '';
    }
    $f = $r['fichier'];
    if ($r['distant'] == 'oui') {
        return $f;
    }
    // Si droit de voir tous les docs, pas seulement celui-ci
    // il est inutilement couteux de rajouter une protection
    $r = autoriser('voir', 'document');
    if ($r and $r !== 'htaccess') {
        return get_spip_doc($f);
    }
    include_spip('inc/securiser_action');
    // cette action doit etre publique !
    return generer_url_action('acceder_document', $args . ($args ? "&" : '') . 'arg=' . $id_document . ($ancre ? "&ancre={$ancre}" : '') . '&cle=' . calculer_cle_action($id_document . ',' . $f) . '&file=' . rawurlencode($f), true, true);
}
예제 #4
0
function _xor($message, $key = null)
{
    if (is_null($key)) {
        if (!function_exists('calculer_cle_action')) {
            include_spip("inc/securiser_action");
        }
        $key = pack("H*", calculer_cle_action('_xor'));
    }
    $keylen = strlen($key);
    $messagelen = strlen($message);
    for ($i = 0; $i < $messagelen; $i++) {
        $message[$i] = ~($message[$i] ^ $key[$i % $keylen]);
    }
    return $message;
}
예제 #5
0
파일: forum.php 프로젝트: genma/spip_ynh
/**
 * Verifier la saisie de #FORMULAIRE_FORUM
 * @param string $objet
 * @param int $id_objet
 * @param int $id_forum
 * @param int|array $ajouter_mot
 *   mots ajout�s coch�s par defaut
 * @param $ajouter_groupe
 *   groupes ajoutables
 * @param $afficher_previsu
 *   previsu oui ou non
 * @param $retour
 *   url de retour
 * @return array|bool
 */
function formulaires_forum_verifier_dist($objet, $id_objet, $id_forum, $ajouter_mot, $ajouter_groupe, $afficher_previsu, $retour)
{
    include_spip('inc/acces');
    include_spip('inc/texte');
    include_spip('inc/session');
    include_spip('base/abstract_sql');
    $erreurs = array();
    $doc = array();
    // desactiver id_rubrique si un id_article ou autre existe dans le contexte
    // if ($id_article OR $id_breve OR $id_forum OR $id_syndic)
    //	$id_rubrique = 0;
    // stocker un eventuel document dans un espace temporaire
    // portant la cle du formulaire ; et ses metadonnees avec
    if (isset($_FILES['ajouter_document']) and $_FILES['ajouter_document']['tmp_name']) {
        $acceptes = forum_documents_acceptes();
        if (!count($acceptes) or _request('cle_ajouter_document') != calculer_cle_action($a = "ajouter-document-{$objet}-{$id_objet}")) {
            $erreurs['document_forum'] = _T('forum:documents_interdits_forum');
            unset($_FILES['ajouter_document']);
        } else {
            if (!isset($GLOBALS['visiteur_session']['tmp_forum_document'])) {
                session_set('tmp_forum_document', sous_repertoire(_DIR_TMP, 'documents_forum') . md5(uniqid(rand())));
            }
            $tmp = $GLOBALS['visiteur_session']['tmp_forum_document'];
            $doc =& $_FILES['ajouter_document'];
            include_spip('inc/joindre_document');
            include_spip('action/ajouter_documents');
            list($extension, $doc['name']) = fixer_extension_document($doc);
            if (!in_array($extension, $acceptes)) {
                $erreurs['document_forum'] = _T('public:formats_acceptes', array('formats' => join(', ', $acceptes)));
            } else {
                include_spip('inc/getdocument');
                if (!deplacer_fichier_upload($doc['tmp_name'], $tmp . '.bin')) {
                    $erreurs['document_forum'] = _T('copie_document_impossible');
                }
                #		else if (...)
                #		verifier le type_document autorise
                #		retailler eventuellement les photos
            }
            // si ok on stocke les meta donnees, sinon on efface
            if (isset($erreurs['document_forum'])) {
                spip_unlink($tmp . '.bin');
                unset($_FILES['ajouter_document']);
            } else {
                $doc['tmp_name'] = $tmp . '.bin';
                ecrire_fichier($tmp . '.txt', serialize($doc));
            }
        }
    } elseif (isset($GLOBALS['visiteur_session']['tmp_forum_document']) and $tmp = $GLOBALS['visiteur_session']['tmp_forum_document'] and file_exists($tmp . '.bin')) {
        if (_request('supprimer_document_ajoute')) {
            spip_unlink($tmp . '.bin');
            spip_unlink($tmp . '.txt');
        } elseif (lire_fichier($tmp . '.txt', $meta)) {
            $doc =& $_FILES['ajouter_document'];
            $doc = @unserialize($meta);
        }
    }
    $min_length = defined('_FORUM_LONGUEUR_MINI') ? _FORUM_LONGUEUR_MINI : 10;
    if (strlen($texte = _request('texte')) < $min_length and !$ajouter_mot and $GLOBALS['meta']['forums_texte'] == 'oui') {
        $erreurs['texte'] = _T($min_length == 10 ? 'forum:forum_attention_dix_caracteres' : 'forum:forum_attention_nb_caracteres_mini', array('min' => $min_length));
    } elseif (defined('_FORUM_LONGUEUR_MAXI') and _FORUM_LONGUEUR_MAXI > 0 and strlen($texte) > _FORUM_LONGUEUR_MAXI) {
        $erreurs['texte'] = _T('forum:forum_attention_trop_caracteres', array('compte' => strlen($texte), 'max' => _FORUM_LONGUEUR_MAXI));
    }
    if (array_reduce($_POST, 'reduce_strlen', 20 * 1024) < 0) {
        $erreurs['erreur_message'] = _T('forum:forum_message_trop_long');
    } else {
        // Ne pas autoriser d'envoi hacke si forum sur abonnement
        if (controler_forum($objet, $id_objet) == 'abo' and !test_espace_prive()) {
            if (!isset($GLOBALS['visiteur_session']) or !isset($GLOBALS['visiteur_session']['statut'])) {
                $erreurs['erreur_message'] = _T('forum_non_inscrit');
            } elseif ($GLOBALS['visiteur_session']['statut'] == '5poubelle') {
                $erreurs['erreur_message'] = _T('forum:forum_acces_refuse');
            }
        }
    }
    if (strlen($titre = _request('titre')) < 3 and $GLOBALS['meta']['forums_titre'] == 'oui') {
        $erreurs['titre'] = _T('forum:forum_attention_trois_caracteres');
    }
    if (!count($erreurs) and !_request('confirmer_previsu_forum')) {
        if ($afficher_previsu != 'non') {
            $previsu = inclure_previsu($texte, $titre, _request('url_site'), _request('nom_site'), _request('ajouter_mot'), $doc, $objet, $id_objet, $id_forum);
            $erreurs['previsu'] = $previsu;
        }
    }
    //  Si forum avec previsu sans bon hash de securite, echec
    if (!count($erreurs)) {
        if (!test_espace_prive() and $afficher_previsu != 'non' and forum_insert_noprevisu()) {
            $erreurs['erreur_message'] = _T('forum:forum_acces_refuse');
        }
    }
    return $erreurs;
}
예제 #6
0
/**
 *
 * Vérifie la conformité du xml, élément par élément.
 *
 * @param array $res
 * @param string $mode
 * @return array
 **/
function valider_resultats($res, $mode)
{
    include_spip('inc/securiser_action');
    $i = $j = 0;
    $table = '';
    rsort($res);
    foreach ($res as $l) {
        $i++;
        $class = 'row_' . alterner($i, 'even', 'odd');
        list($nb, $texte, $erreurs, $script, $appel, $temps) = $l;
        if ($texte < 0) {
            $texte = 0 - $texte;
            $color = ";color: red";
        } else {
            $color = '';
        }
        $err = !intval($nb) ? '' : $erreurs[0][0] . ' ' . _T('ligne') . ' ' . $erreurs[0][1] . ($nb == 1 ? '' : '  ...');
        if ($err) {
            $j++;
        }
        if ($mode) {
            $h = $appel . '&var_mode=debug&var_mode_affiche=validation';
        } else {
            $h = generer_url_ecrire('valider_xml', "var_url=" . urlencode($appel));
            $h = parametre_url($h, 'var_token', calculer_cle_action("valider_xml&var_url={$appel}"));
        }
        $table .= "<tr class='{$class}'>" . "<td style='text-align: right'>{$nb}</td>" . "<td style='text-align: right{$color}'>{$texte}</td>" . "<td style='text-align: right'>{$temps}</td>" . "<td style='text-align: left'>{$err}</td>" . "<td>{$script}</td>" . "<td><a href='{$h}'>{$appel}</a></td>";
    }
    return array($j, "<table class='spip'>" . "<tr><th>" . _T('erreur_texte') . "</th><th>" . _T('taille_octets', array('taille' => ' ')) . "</th><th>" . _T('zbug_profile', array('time' => '')) . "</th><th>" . _T('message') . "</th><th>Page</th><th>args" . "</th></tr>" . $table . "</table>");
}
예제 #7
0
파일: forum.php 프로젝트: rhertzog/lcs
function formulaires_forum_verifier_dist(
	$titre, $table, $type, $script,
	$id_rubrique, $id_forum, $id_article, $id_breve, $id_syndic,
	$ajouter_mot, $ajouter_groupe, $afficher_texte, $url_param_retour)
{
	include_spip('inc/acces');
	include_spip('inc/texte');
	include_spip('inc/forum');
	include_spip('inc/session');
	include_spip('base/abstract_sql');

	$erreurs = array();

	// desactiver id_rubrique si un id_article ou autre existe dans le contexte
	if ($id_article OR $id_breve OR $id_forum OR $id_syndic)
		$id_rubrique = 0;

	// stocker un eventuel document dans un espace temporaire
	// portant la cle du formulaire ; et ses metadonnees avec

	if (!isset($GLOBALS['visiteur_session']['tmp_forum_document']))
		session_set('tmp_forum_document',
		sous_repertoire(_DIR_TMP,'documents_forum').md5(uniqid(rand())));
	$tmp = $GLOBALS['visiteur_session']['tmp_forum_document'];
	$doc = &$_FILES['ajouter_document'];
	if (isset($_FILES['ajouter_document'])
	AND $_FILES['ajouter_document']['tmp_name']) {
		// securite :
		// verifier si on possede la cle (ie on est autorise a poster)
		// (sinon tant pis) ; cf. charger.php pour la definition de la cle
		if (_request('cle_ajouter_document') != calculer_cle_action($a = "ajouter-document-$id_article-$id_breve-$id_forum-$id_rubrique-$id_syndic")) {
			$erreurs['document_forum'] = _T('public:documents_interdits_forum')
				. "ajouter-document-$id_article-$id_breve-$id_forum-$id_rubrique-$id_syndic"
				.", "
				._request('cle_ajouter_document')
			
			;
			unset($_FILES['ajouter_document']);
		} else {
			include_spip('inc/ajouter_documents');
			list($extension,$doc['name']) = fixer_extension_document($doc);
			$acceptes = forum_documents_acceptes();

			if (!in_array($extension, $acceptes)) {
				# normalement on n'arrive pas ici : pas d'upload si aucun format
				if (!$formats = join(', ',$acceptes))
					$formats = '-'; //_L('aucun');
				$erreurs['document_forum'] = _T('public:formats_acceptes', array('formats' => $formats));
			}
			else {
				include_spip('inc/getdocument');
				if (!deplacer_fichier_upload($doc['tmp_name'], $tmp.'.bin'))
					$erreurs['document_forum'] = _T('copie_document_impossible');

#		else if (...)
#		verifier le type_document autorise
#		retailler eventuellement les photos
			}

			// si ok on stocke les meta donnees, sinon on efface
			if (isset($erreurs['document_forum'])) {
				spip_unlink($tmp.'.bin');
				unset ($_FILES['ajouter_document']);
			} else {
				$doc['tmp_name'] = $tmp.'.bin';
				ecrire_fichier($tmp.'.txt', serialize($doc));
			}
		}
	}
	// restaurer le document uploade au tour precedent
	else if (file_exists($tmp.'.bin')) {
		if (_request('supprimer_document_ajoute')) {
			spip_unlink($tmp.'.bin');
			spip_unlink($tmp.'.txt');
		} else if (lire_fichier($tmp.'.txt', $meta))
			$doc = @unserialize($meta);
	}

	if (strlen($texte = _request('texte')) < 10
	AND !$ajouter_mot AND $GLOBALS['meta']['forums_texte'] == 'oui')
		$erreurs['texte'] = _T('forum_attention_dix_caracteres');
	else if (defined('_FORUM_LONGUEUR_MAXI')
	AND _FORUM_LONGUEUR_MAXI > 0
	AND strlen($texte) > _FORUM_LONGUEUR_MAXI)
		$erreurs['texte'] = _T('forum_attention_trop_caracteres',
			array(
				'compte' => strlen($texte),
				'max' => _FORUM_LONGUEUR_MAXI
			));

	if (strlen($titre=_request('titre')) < 3
	AND $GLOBALS['meta']['forums_titre'] == 'oui')
		$erreurs['titre'] = _T('forum_attention_trois_caracteres');

	if (!count($erreurs) AND !_request('confirmer_previsu_forum')){
		if ($afficher_texte != 'non') {
			$previsu = inclure_previsu($texte, $titre, _request('url_site'), _request('nom_site'), _request('ajouter_mot'), $doc,
				$id_rubrique, $id_forum, $id_article, $id_breve, $id_syndic);
			$erreurs['previsu'] = $previsu;
		}
	}

	return $erreurs;
}
예제 #8
0
/**
 * Verifier la cle de signature d'une action valable pour le site
 * http://doc.spip.org/@verifier_cle_action
 *
 * @param string $action
 * @param string $cle
 * @return bool
 */
function verifier_cle_action($action, $cle)
{
    return $cle == calculer_cle_action($action);
}
예제 #9
0
파일: bank.php 프로젝트: nursit/bank
/**
 * Calculer une signature de la reponse (securite)
 * @param string $mode
 * @param array $response
 * @return string
 */
function bank_sign_response_simple($mode, $response = array())
{
    ksort($response);
    foreach ($response as $k => $v) {
        if (is_numeric($v)) {
            $response[$k] = (string) $v;
        }
    }
    $s = serialize($response);
    include_spip("inc/securiser_action");
    $sign = calculer_cle_action("bank-{$mode}-{$s}");
    return $sign;
}
예제 #10
0
파일: documents.php 프로젝트: rhertzog/lcs
function generer_acceder_document($file, $id_document, $args='', $ancre='')
{
	include_spip('inc/securiser_action');

	return generer_url_action('acceder_document',
		$args . ($args ? "&" : '')
			. 'arg='.$id_document
			. ($ancre ? "&ancre=$ancre" : '')
			. '&cle=' . calculer_cle_action($id_document.','.$file)
			. '&file=' . rawurlencode($file)
			,false,true);
}