/** * 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}"; } }
/** * 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}"); }
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); }
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; }
/** * 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; }
/** * * 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>"); }
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; }
/** * 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); }
/** * 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; }
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); }