function securiser_redirect_action($redirect){
if (tester_url_absolue($redirect) AND !defined('_AUTORISER_ACTION_ABS_REDIRECT')){
$base = $GLOBALS['meta']['adresse_site']."/";
// si l'url est une url du site, on la laisse passer sans rien faire
// c'est encore le plus simple
if (strlen($base) AND strncmp($redirect,$base,strlen($base))==0)
return $redirect;
else
return "";
}
return $redirect;
}
function securiser_redirect_action($redirect)
{
if ((tester_url_absolue($redirect) or preg_match(',^\\w+:,', trim($redirect))) and !defined('_AUTORISER_ACTION_ABS_REDIRECT')) {
// si l'url est une url du site, on la laisse passer sans rien faire
// c'est encore le plus simple
$base = $GLOBALS['meta']['adresse_site'] . "/";
if (strlen($base) and strncmp($redirect, $base, strlen($base)) == 0) {
return $redirect;
}
$base = url_de_base();
if (strlen($base) and strncmp($redirect, $base, strlen($base)) == 0) {
return $redirect;
}
return "";
}
return $redirect;
}
function analyser_dtd_lexeme($dtd, &$dtc, $grammaire)
{
if (!preg_match(_REGEXP_ENTITY_DEF, $dtd, $m)) {
return -9;
}
list(, $s) = $m;
$n = $dtc->macros[$s];
if (is_array($n)) {
// en cas d'inclusion, l'espace de nom est le meme
// mais gaffe aux DTD dont l'URL est relative a l'engloblante
if ($n[0] == 'PUBLIC' and !tester_url_absolue($n[1])) {
$n[1] = substr($grammaire, 0, strrpos($grammaire, '/') + 1) . $n[1];
}
analyser_dtd($n[1], $n[0], $dtc);
}
return ltrim(substr($dtd, strlen($m[0])));
}
/**
* Aller chercher les donnees de la boucle DATA
* depuis une source
* {source format, [URL], [arg2]...}
*/
protected function select_source()
{
# un peu crado : avant de charger le cache il faut charger
# les class indispensables, sinon PHP ne saura pas gerer
# l'objet en cache ; cf plugins/icalendar
# perf : pas de fonction table_to_array ! (table est deja un array)
if (isset($this->command['sourcemode']) and !in_array($this->command['sourcemode'], array('table', 'array', 'tableau'))) {
charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true);
}
# le premier argument peut etre un array, une URL etc.
$src = $this->command['source'][0];
# avons-nous un cache dispo ?
$cle = null;
if (is_string($src)) {
$cle = 'datasource_' . md5($this->command['sourcemode'] . ':' . var_export($this->command['source'], true));
}
$cache = $this->cache_get($cle);
if (isset($this->command['datacache'])) {
$ttl = intval($this->command['datacache']);
}
if ($cache and $cache['time'] + (isset($ttl) ? $ttl : $cache['ttl']) > time() and !(_request('var_mode') === 'recalcul' and include_spip('inc/autoriser') and autoriser('recalcul'))) {
$this->tableau = $cache['data'];
} else {
try {
# dommage que ca ne soit pas une option de yql_to_array...
if ($this->command['sourcemode'] == 'yql') {
if (!isset($ttl)) {
$ttl = 3600;
}
}
if (isset($this->command['sourcemode']) and in_array($this->command['sourcemode'], array('table', 'array', 'tableau'))) {
if (is_array($a = $src) or is_string($a) and $a = str_replace('"', '"', $a) and is_array($a = @unserialize($a))) {
$this->tableau = $a;
}
} else {
if (tester_url_absolue($src)) {
include_spip('inc/distant');
$u = recuperer_page($src, false, false, _DATA_SOURCE_MAX_SIZE);
if (!$u) {
throw new Exception("404");
}
if (!isset($ttl)) {
$ttl = 24 * 3600;
}
} else {
if (@is_dir($src)) {
$u = $src;
if (!isset($ttl)) {
$ttl = 10;
}
} else {
if (@is_readable($src) && @is_file($src)) {
$u = spip_file_get_contents($src);
if (!isset($ttl)) {
$ttl = 10;
}
} else {
$u = $src;
if (!isset($ttl)) {
$ttl = 10;
}
}
}
}
if (!$this->err and $g = charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true)) {
$args = $this->command['source'];
$args[0] = $u;
if (is_array($a = call_user_func_array($g, $args))) {
$this->tableau = $a;
}
}
}
if (!is_array($this->tableau)) {
$this->err = true;
}
if (!$this->err and isset($ttl) and $ttl > 0) {
$this->cache_set($cle, $ttl);
}
} catch (Exception $e) {
$e = $e->getMessage();
$err = sprintf("[%s, %s] {$e}", $src, $this->command['sourcemode']);
erreur_squelette(array($err, array()));
$this->err = true;
}
}
# en cas d'erreur, utiliser le cache si encore dispo
if ($this->err and $cache) {
$this->tableau = $cache['data'];
$this->err = false;
}
}
开发者ID:JLuc,项目名称:SPIP,代码行数:96,代码来源:data.php
示例10: recuperer_infos_distantes
/**
* Récupérer les infos d'un document distant, sans trop le télécharger
*
* @param string $source
* URL de la source
* @param int $max
* Taille maximum du fichier à télécharger
* @param bool $charger_si_petite_image
* Pour télécharger le document s'il est petit
* @return array
* Couples des informations obtenues parmis :
*
* - 'body' = chaine
* - 'type_image' = booleen
* - 'titre' = chaine
* - 'largeur' = intval
* - 'hauteur' = intval
* - 'taille' = intval
* - 'extension' = chaine
* - 'fichier' = chaine
* - 'mime_type' = chaine
**/
function recuperer_infos_distantes($source, $max = 0, $charger_si_petite_image = true)
{
// pas la peine de perdre son temps
if (!tester_url_absolue($source)) {
return false;
}
# charger les alias des types mime
include_spip('base/typedoc');
$a = array();
$mime_type = '';
// On va directement charger le debut des images et des fichiers html,
// de maniere a attrapper le maximum d'infos (titre, taille, etc). Si
// ca echoue l'utilisateur devra les entrer...
if ($headers = recuperer_page($source, false, true, $max, '', '', true)) {
list($headers, $a['body']) = preg_split(',\\n\\n,', $headers, 2);
if (preg_match(",\nContent-Type: *([^[:space:];]*),i", "\n{$headers}", $regs)) {
$mime_type = trim($regs[1]);
} else {
$mime_type = '';
}
// inconnu
// Appliquer les alias
while (isset($GLOBALS['mime_alias'][$mime_type])) {
$mime_type = $GLOBALS['mime_alias'][$mime_type];
}
// Si on a un mime-type insignifiant
// text/plain,application/octet-stream ou vide
// c'est peut-etre que le serveur ne sait pas
// ce qu'il sert ; on va tenter de detecter via l'extension de l'url
// ou le Content-Disposition: attachment; filename=...
$t = null;
if (in_array($mime_type, array('text/plain', '', 'application/octet-stream'))) {
if (!$t and preg_match(',\\.([a-z0-9]+)(\\?.*)?$,i', $source, $rext)) {
$t = sql_fetsel("extension", "spip_types_documents", "extension=" . sql_quote($rext[1], '', 'text'));
}
if (!$t and preg_match(",^Content-Disposition:\\s*attachment;\\s*filename=(.*)\$,Uims", $headers, $m) and preg_match(',\\.([a-z0-9]+)(\\?.*)?$,i', $m[1], $rext)) {
$t = sql_fetsel("extension", "spip_types_documents", "extension=" . sql_quote($rext[1], '', 'text'));
}
}
// Autre mime/type (ou text/plain avec fichier d'extension inconnue)
if (!$t) {
$t = sql_fetsel("extension", "spip_types_documents", "mime_type=" . sql_quote($mime_type));
}
// Toujours rien ? (ex: audio/x-ogg au lieu de application/ogg)
// On essaie de nouveau avec l'extension
if (!$t and $mime_type != 'text/plain' and preg_match(',\\.([a-z0-9]+)(\\?.*)?$,i', $source, $rext)) {
$t = sql_fetsel("extension", "spip_types_documents", "extension=" . sql_quote($rext[1], '', 'text'));
# eviter xxx.3 => 3gp (> SPIP 3)
}
if ($t) {
spip_log("mime-type {$mime_type} ok, extension " . $t['extension']);
$a['extension'] = $t['extension'];
} else {
# par defaut on retombe sur '.bin' si c'est autorise
spip_log("mime-type {$mime_type} inconnu");
$t = sql_fetsel("extension", "spip_types_documents", "extension='bin'");
if (!$t) {
return false;
}
$a['extension'] = $t['extension'];
}
if (preg_match(",\nContent-Length: *([^[:space:]]*),i", "\n{$headers}", $regs)) {
$a['taille'] = intval($regs[1]);
}
}
// Echec avec HEAD, on tente avec GET
if (!$a and !$max) {
spip_log("tenter GET {$source}");
$a = recuperer_infos_distantes($source, _INC_DISTANT_MAX_SIZE);
}
// si on a rien trouve pas la peine d'insister
if (!$a) {
return false;
}
// S'il s'agit d'une image pas trop grosse ou d'un fichier html, on va aller
// recharger le document en GET et recuperer des donnees supplementaires...
if (preg_match(',^image/(jpeg|gif|png|swf),', $mime_type)) {
if ($max == 0 and (empty($a['taille']) or $a['taille'] < _INC_DISTANT_MAX_SIZE) and isset($GLOBALS['meta']['formats_graphiques']) and strpos($GLOBALS['meta']['formats_graphiques'], $a['extension']) !== false and $charger_si_petite_image) {
//.........这里部分代码省略.........
/**
* Vérifications du formulaire d'édition d'un auteur
*
* Vérifie en plus des vérifications prévues :
* - qu'un rédacteur ne peut pas supprimer son adresse mail,
* - que le mot de passe choisi n'est pas trop court et identique à sa
* deuxième saisie
*
* @see formulaires_editer_objet_verifier()
*
* @param int|string $id_auteur
* Identifiant de l'auteur. 'new' pour une nouvel auteur.
* @param string $retour
* URL de redirection après le traitement
* @param string $associer_objet
* Éventuel 'objet|x' indiquant de lier le mot créé à cet objet,
* tel que 'article|3'
* @param string $config_fonc
* Nom de la fonction ajoutant des configurations particulières au formulaire
* @param array $row
* Valeurs de la ligne SQL de l'auteur, si connu
* @param string $hidden
* Contenu HTML ajouté en même temps que les champs cachés du formulaire.
* @return array
* Erreurs des saisies
**/
function formulaires_editer_auteur_verifier_dist($id_auteur = 'new', $retour = '', $associer_objet = '', $config_fonc = 'auteurs_edit_config', $row = array(), $hidden = '')
{
// auto-renseigner le nom si il n'existe pas, sans couper
titre_automatique('nom', array('email', 'login'), 255);
// mais il reste obligatoire si on a rien trouve
$erreurs = formulaires_editer_objet_verifier('auteur', $id_auteur, array('nom'));
$auth_methode = sql_getfetsel('source', 'spip_auteurs', 'id_auteur=' . intval($id_auteur));
$auth_methode = $auth_methode ? $auth_methode : 'spip';
include_spip('inc/auth');
if (!nom_acceptable(_request('nom'))) {
$erreurs['nom'] = _T("info_nom_pas_conforme");
}
if ($email = _request('email')) {
include_spip('inc/filtres');
include_spip('inc/autoriser');
// un redacteur qui modifie son email n'a pas le droit de le vider si il y en avait un
if (!autoriser('modifier', 'auteur', $id_auteur, null, array('email' => '?')) and $GLOBALS['visiteur_session']['id_auteur'] == $id_auteur and !strlen(trim($email)) and $email != ($email_ancien = sql_getfetsel('email', 'spip_auteurs', 'id_auteur=' . intval($id_auteur)))) {
$erreurs['email'] = $id_auteur == $GLOBALS['visiteur_session']['id_auteur'] ? _T('form_email_non_valide') : _T('form_prop_indiquer_email');
} else {
if (!email_valide($email)) {
$erreurs['email'] = $id_auteur == $GLOBALS['visiteur_session']['id_auteur'] ? _T('form_email_non_valide') : _T('form_prop_indiquer_email');
}
}
# Ne pas autoriser d'avoir deux auteurs avec le même email
# cette fonctionalité nécessite que la base soit clean à l'activation : pas de
# doublon sur la requête select email,count(*) from spip_auteurs group by email ;
if (defined('_INTERDIRE_AUTEUR_MEME_EMAIL')) {
#Nouvel auteur
if (intval($id_auteur) == 0) {
#Un auteur existe deja avec cette adresse ?
if (sql_countsel("spip_auteurs", "email=" . sql_quote($email)) > 0) {
$erreurs['email'] = _T('erreur_email_deja_existant');
}
} else {
#Un auteur existe deja avec cette adresse ? et n'est pas le user courant.
if (sql_countsel("spip_auteurs", "email=" . sql_quote($email)) > 0 and $id_auteur != ($id_auteur_ancien = sql_getfetsel('id_auteur', 'spip_auteurs', "email=" . sql_quote($email)))) {
$erreurs['email'] = _T('erreur_email_deja_existant');
}
}
}
}
if ($url = _request('url_site') and !tester_url_absolue($url)) {
$erreurs['url_site'] = _T('info_url_site_pas_conforme');
}
$erreurs['message_erreur'] = '';
if ($err = auth_verifier_login($auth_methode, _request('new_login'), $id_auteur)) {
$erreurs['new_login'] = $err;
$erreurs['message_erreur'] .= $err;
} else {
// pass trop court ou confirmation non identique
if ($p = _request('new_pass')) {
if ($p != _request('new_pass2')) {
$erreurs['new_pass'] = _T('info_passes_identiques');
$erreurs['message_erreur'] .= _T('info_passes_identiques');
} elseif ($err = auth_verifier_pass($auth_methode, _request('new_login'), $p, $id_auteur)) {
$erreurs['new_pass'] = $err;
$erreurs['message_erreur'] .= $err;
}
}
}
if (!$erreurs['message_erreur']) {
unset($erreurs['message_erreur']);
}
return $erreurs;
}
/**
* Mettre à jour l'adresse du site à partir d'une valeur saisie
* (ou auto détection si vide)
*
* @param string $adresse_site
* @return string
*/
function appliquer_adresse_site($adresse_site)
{
if ($adresse_site !== NULL) {
if (!strlen($adresse_site)) {
$GLOBALS['profondeur_url'] = _DIR_RESTREINT ? 0 : 1;
$adresse_site = url_de_base();
}
$adresse_site = preg_replace(",/?\\s*\$,", "", $adresse_site);
if (!tester_url_absolue($adresse_site)) {
$adresse_site = "http://{$adresse_site}";
}
ecrire_meta('adresse_site', $adresse_site);
}
return $adresse_site;
}
开发者ID:JLuc,项目名称:SPIP,代码行数:22,代码来源:config.php
示例15: formulaires_login_traiter_dist
function formulaires_login_traiter_dist($cible="",$login="",$prive=null){
$res = array();
// Si on se connecte dans l'espace prive,
// ajouter "bonjour" (repere a peu pres les cookies desactives)
if (is_null($prive) ? is_url_prive($cible) : $prive) {
$cible = parametre_url($cible, 'bonjour', 'oui', '&');
}
if ($cible=='@page_auteur')
$cible = generer_url_entite($GLOBALS['auteur_session']['id_auteur'],'auteur');
if ($cible) {
$cible = parametre_url($cible, 'var_login', '', '&');
// transformer la cible absolue en cible relative
// pour pas echouer quand la meta adresse_site est foireuse
if (strncmp($cible,$u = url_de_base(),strlen($u))==0){
$cible = "./".substr($cible,strlen($u));
}
// si c'est une url absolue, refuser la redirection
// sauf si cette securite est levee volontairement par le webmestre
elseif (tester_url_absolue($cible) AND !defined('_AUTORISER_LOGIN_ABS_REDIRECT')) {
$cible = "";
}
}
// Si on est admin, poser le cookie de correspondance
if ($GLOBALS['auteur_session']['statut'] == '0minirezo') {
include_spip('inc/cookie');
spip_setcookie('spip_admin', '@'.$GLOBALS['auteur_session']['login'],
time() + 7 * 24 * 3600);
}
// Si on est connecte, envoyer vers la destination
if ($cible AND ($cible!=self())) {
if (!headers_sent() AND !$_GET['var_mode']) {
include_spip('inc/headers');
$res['redirect'] = $cible;
} else {
$res['message_ok'] .= inserer_attribut(
"<a>" . _T('login_par_ici') . "</a>",
'href', $cible
);
}
}
return $res;
}
开发者ID:rhertzog,项目名称:lcs,代码行数:48,代码来源:login.php
示例16: formulaires_forum_prive_verifier_dist
function formulaires_forum_prive_verifier_dist($objet, $id_objet, $id_forum, $forcer_previsu, $statut, $retour = '')
{
include_spip('inc/acces');
include_spip('inc/texte');
include_spip('inc/forum');
include_spip('inc/session');
include_spip('base/abstract_sql');
$erreurs = array();
$min_length = defined('_FORUM_LONGUEUR_MINI') ? _FORUM_LONGUEUR_MINI : 10;
if (strlen($texte = _request('texte')) < $min_length and !_request('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));
} else {
if (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 (strlen($titre = _request('titre')) < 3 and $GLOBALS['meta']['forums_titre'] == 'oui') {
$erreurs['titre'] = _T('forum:forum_attention_trois_caracteres');
}
if (array_reduce($_POST, 'reduce_strlen', 20 * 1024) < 0) {
$erreurs['erreur_message'] = _T('forum:forum_message_trop_long');
}
if ($url = _request('url_site') and !tester_url_absolue($url)) {
$erreurs['url_site'] = _T('info_url_site_pas_conforme');
}
if (!count($erreurs) and !_request('envoyer_message') and !_request('confirmer_previsu_forum')) {
$previsu = inclure_forum_prive_previsu($texte, $titre, _request('url_site'), _request('nom_site'), _request('ajouter_mot'));
$erreurs['previsu'] = $previsu;
$erreurs['message_erreur'] = '';
// on ne veut pas du message_erreur automatique
}
return $erreurs;
}
function formulaires_editer_document_traiter_dist($id_document = 'new', $id_parent = '', $retour = '', $lier_trad = 0, $config_fonc = 'documents_edit_config', $row = array(), $hidden = '')
{
if (is_null(_request('parents'))) {
set_request('parents', array());
}
// verifier les infos de taille et dimensions sur les fichiers locaux
// cas des maj de fichier directes par ftp
foreach (array('taille', 'largeur', 'hauteur') as $c) {
if ($v = _request("_{$c}_modif") and !_request($c)) {
set_request($c, $v);
}
}
$res = formulaires_editer_objet_traiter('document', $id_document, $id_parent, $lier_trad, $retour, $config_fonc, $row, $hidden);
set_request('parents');
$autoclose = "<script type='text/javascript'>if (window.jQuery) jQuery.modalboxclose();</script>";
if (_request('copier_local') or _request('joindre_upload') or _request('joindre_ftp') or _request('joindre_distant') or _request('joindre_zip')) {
$autoclose = "";
if (_request('copier_local')) {
$copier_local = charger_fonction('copier_local', 'action');
$res = array('editable' => true);
if (($err = $copier_local($id_document)) === true) {
$res['message_ok'] = (isset($res['message_ok']) ? $res['message_ok'] . '<br />' : '') . _T('medias:document_copie_locale_succes');
} else {
$res['message_erreur'] = (isset($res['message_erreur']) ? $res['message_erreur'] . '<br />' : '') . $err;
}
set_request('credits');
// modifie par la copie locale
} else {
// liberer le nom de l'ancien fichier pour permettre le remplacement par un fichier du meme nom
if ($ancien_fichier = sql_getfetsel('fichier', 'spip_documents', 'id_document=' . intval($id_document)) and !tester_url_absolue($ancien_fichier) and @file_exists($rename = get_spip_doc($ancien_fichier))) {
@rename($rename, "{$rename}--.old");
}
$traiter = charger_fonction('traiter', 'formulaires/joindre_document');
$res2 = $traiter($id_document);
if (isset($res2['message_erreur'])) {
$res['message_erreur'] = $res2['message_erreur'];
// retablir le fichier !
if ($rename) {
@rename("{$rename}--.old", $rename);
}
} else {
spip_unlink("{$rename}--.old");
}
}
// on annule les saisies largeur/hauteur : l'upload a pu charger les siens
set_request('largeur');
set_request('hauteur');
} else {
// regarder si une demande de rotation a eu lieu
// c'est un bouton image, dont on a pas toujours le name en request, on fait avec
$angle = 0;
if (_request('tournerL90') or _request('tournerL90_x')) {
$angle = -90;
}
if (_request('tournerR90') or _request('tournerR90_x')) {
$angle = 90;
}
if (_request('tourner180') or _request('tourner180_x')) {
$angle = 180;
}
if ($angle) {
$autoclose = "";
$tourner = charger_fonction('tourner', 'action');
action_tourner_post($id_document, $angle);
}
}
if (!isset($res['redirect'])) {
$res['editable'] = true;
}
if (!isset($res['message_erreur'])) {
$res['message_ok'] = _T('info_modification_enregistree') . $autoclose;
}
if ($res['message_ok']) {
$res['message_ok'] .= '<script type="text/javascript">if (window.jQuery) ajaxReload("document_infos");</script>';
}
return $res;
}
请发表评论