/** * http://code.spip.net/@action_copier_local_post * * @param $id_document * @return bool|mixed|string */ function action_copier_local_post($id_document) { // Il faut la source du document pour le copier $row = sql_fetsel("mode,fichier, descriptif, credits", "spip_documents", "id_document={$id_document}"); $source = $row['fichier']; // si la source est bien un fichier distant // sinon c'est une donnee moisie, on ne fait rien if (tester_url_absolue($source)) { include_spip('inc/distant'); // pour 'copie_locale' $fichier = copie_locale($source); if ($fichier and tester_url_absolue($source)) { $fichier = _DIR_RACINE . $fichier; $files[] = array('tmp_name' => $fichier, 'name' => basename($fichier)); $ajouter_documents = charger_fonction('ajouter_documents', 'action'); spip_log("convertit doc {$id_document} en local: {$source} => {$fichier}", "medias"); $liste = array(); $ajouter_documents($id_document, $files, '', 0, $row['mode'], $liste); spip_unlink($fichier); // ajouter l'origine du document aux credits include_spip('action/editer_document'); document_modifier($id_document, array('credits' => ($row['credits'] ? $row['credits'] . ', ' : '') . $source)); return true; } else { spip_log("echec copie locale {$source}", "medias" . _LOG_ERREUR); } } else { spip_log("echec copie locale {$source} n'est pas une URL distante", "medias" . _LOG_ERREUR); } return _T('medias:erreur_copie_fichier', array('nom' => $source)); }
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; }
/** * Donne le chemin complet du fichier * * @uses _DIR_IMG * * @param string $fichier * @return bool|string */ function get_spip_doc($fichier) { // fichier distant if (tester_url_absolue($fichier)) { return $fichier; } // gestion d'erreurs, fichier='' if (!strlen($fichier)) { return false; } $fichier = strncmp($fichier, _DIR_IMG, strlen(_DIR_IMG)) != 0 ? _DIR_IMG . $fichier : $fichier; // fichier normal return $fichier; }
/** * Lit un fichier xml donné et renvoie son arbre. * * @example * ``` * include_spip('inc/xml'); * $arbre = spip_xml_load(_DIR_PLUGINS . "$plug/plugin.xml"); * ``` * * @uses spip_xml_parse() * * @param string $fichier * Chemin local ou URL distante du fichier XML * @param bool $strict * true pour râler si une balise n'est pas correctement fermée, false sinon. * @param bool $clean ? * @param int $taille_max * Taille maximale si fichier distant * @param string|array $datas * Données à envoyer pour récupérer le fichier distant * @param int $profondeur ? * @return array|bool * - array : l'arbre XML, * - false si l'arbre xml ne peut être créé ou est vide **/ function spip_xml_load($fichier, $strict = true, $clean = true, $taille_max = 1048576, $datas = '', $profondeur = -1) { $contenu = ""; if (tester_url_absolue($fichier)) { include_spip('inc/distant'); $contenu = recuperer_page($fichier, false, false, $taille_max, $datas); } else { lire_fichier($fichier, $contenu); } $arbre = array(); if ($contenu) { $arbre = spip_xml_parse($contenu, $strict, $clean, $profondeur); } return count($arbre) ? $arbre : false; }
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 formulaires_configurer_relayeur_verifier_dist() { $erreurs = array(); $http_proxy = relayeur_saisie_ou_config(_request('http_proxy'), lire_config('http_proxy', '')); $http_noproxy = _request('http_noproxy'); if ($http_proxy and !tester_url_absolue($http_proxy)) { $erreurs['http_proxy'] = _T('info_url_proxy_pas_conforme'); } if (!isset($erreurs['http_proxy']) and _request('tester_proxy')) { if (!$http_proxy) { $erreurs['http_proxy'] = _T('info_obligatoire'); } else { include_spip('inc/distant'); $test_proxy = _request('test_proxy'); $t = parse_url($test_proxy); if (!@$t['host']) { $erreurs['test_proxy'] = _T('info_adresse_non_indiquee'); } else { include_spip('inc/texte'); // pour aide, couper, lang $info = ""; if (!need_proxy($t['host'], $http_proxy, $http_noproxy)) { $info = "<strong>" . _T('page_pas_proxy') . "</strong><br />"; } // il faut fausser le proxy actuel pour faire le test ! $cur_http_proxy = $GLOBALS['meta']['http_proxy']; $cur_http_noproxy = $GLOBALS['meta']['http_noproxy']; $GLOBALS['meta']['http_proxy'] = $http_proxy; $GLOBALS['meta']['http_noproxy'] = $http_noproxy; $page = recuperer_page($test_proxy, true); $GLOBALS['meta']['http_proxy'] = $cur_http_proxy; $GLOBALS['meta']['http_noproxy'] = $cur_http_noproxy; if ($page) { $erreurs['message_ok'] = _T('info_proxy_ok') . "<br />{$info}\n<tt>" . couper(entites_html($page), 300) . "</tt>"; $erreurs['message_erreur'] = ''; } else { $erreurs['message_erreur'] = $info . _T('info_impossible_lire_page', array('test_proxy' => "<tt>{$test_proxy}</tt>")) . " <b><tt>" . no_password_proxy_url($http_proxy) . "</tt></b>." . aide('confhttpproxy'); } } } } return $erreurs; }
/** * Vérifications du formulaire de configuration du compresseur * * @return array * Tableau des erreurs **/ function formulaires_configurer_compresseur_verifier_dist() { $erreurs = array(); // les checkbox foreach (array('auto_compress_js', 'auto_compress_css', 'auto_compress_closure') as $champ) { if (_request($champ) != 'oui') { set_request($champ, 'non'); } } if ($url = _request('url_statique_ressources')) { $url = preg_replace(",/?\\s*\$,", "", $url); if (!tester_url_absolue($url)) { $protocole = explode('://', $GLOBALS['meta']['adresse_site']); $protocole = reset($protocole); $url = $protocole . "://{$url}"; } set_request('url_statique_ressources', $url); } return $erreurs; }
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; } }
/** * 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) { $a = recuperer_infos_distantes($source, _INC_DISTANT_MAX_SIZE); } else { if ($a['body']) { $a['fichier'] = _DIR_RACINE . nom_fichier_copie_locale($source, $a['extension']); ecrire_fichier($a['fichier'], $a['body']); $size_image = @getimagesize($a['fichier']); $a['largeur'] = intval($size_image[0]); $a['hauteur'] = intval($size_image[1]); $a['type_image'] = true; } } } // Fichier swf, si on n'a pas la taille, on va mettre 425x350 par defaut // ce sera mieux que 0x0 if ($a and isset($a['extension']) and $a['extension'] == 'swf' and empty($a['largeur'])) { $a['largeur'] = 425; $a['hauteur'] = 350; } if ($mime_type == 'text/html') { include_spip('inc/filtres'); $page = recuperer_page($source, true, false, _INC_DISTANT_MAX_SIZE); if (preg_match(',<title>(.*?)</title>,ims', $page, $regs)) { $a['titre'] = corriger_caracteres(trim($regs[1])); } if (!isset($a['taille']) or !$a['taille']) { $a['taille'] = strlen($page); # a peu pres } } $a['mime_type'] = $mime_type; return $a; }
/** * 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; }
/** * Retourne les tailles d'une image * * Pour les filtres `largeur` et `hauteur` * * @param string $img * Balise HTML `<img ... />` ou chemin de l'image (qui peut être une URL distante). * @return array * Liste (hauteur, largeur) en pixels **/ function taille_image($img) { static $largeur_img = array(), $hauteur_img = array(); $srcWidth = 0; $srcHeight = 0; $logo = extraire_attribut($img, 'src'); if (!$logo) { $logo = $img; } else { $srcWidth = extraire_attribut($img, 'width'); $srcHeight = extraire_attribut($img, 'height'); } // ne jamais operer directement sur une image distante pour des raisons de perfo // la copie locale a toutes les chances d'etre la ou de resservir if (tester_url_absolue($logo)) { include_spip('inc/distant'); $fichier = copie_locale($logo); $logo = $fichier ? _DIR_RACINE . $fichier : $logo; } if (($p = strpos($logo, '?')) !== FALSE) { $logo = substr($logo, 0, $p); } $srcsize = false; if (isset($largeur_img[$logo])) { $srcWidth = $largeur_img[$logo]; } if (isset($hauteur_img[$logo])) { $srcHeight = $hauteur_img[$logo]; } if (!$srcWidth or !$srcHeight) { if (file_exists($logo) and $srcsize = @getimagesize($logo)) { if (!$srcWidth) { $largeur_img[$logo] = $srcWidth = $srcsize[0]; } if (!$srcHeight) { $hauteur_img[$logo] = $srcHeight = $srcsize[1]; } } elseif (@file_exists($f = "{$logo}.src") and lire_fichier($f, $valeurs) and $valeurs = unserialize($valeurs)) { if (!$srcWidth) { $largeur_img[$logo] = $srcWidth = $valeurs["largeur_dest"]; } if (!$srcHeight) { $hauteur_img[$logo] = $srcHeight = $valeurs["hauteur_dest"]; } } } return array($srcHeight, $srcWidth); }
/** * enclosures * ajout d'un rel="enclosure" sur les liens mp3 absolus * appele en pipeline apres propre pour traiter les [mon son->http://monsite/mon_son.mp3] * peut etre appele dans un squelette apres |liens_absolus * * @param $texte * @return mixed */ function player_post_propre($texte) { $reg_formats = "mp3"; // plus vite if (stripos($texte, ".{$reg_formats}") !== false and stripos($texte, "<a") !== false) { $cfg = unserialize($GLOBALS['meta']['player']); // insertion du mini-player inline if (isset($cfg['insertion_auto']) and in_array('inline_mini', $cfg['insertion_auto'])) { $texte = preg_replace_callback(",<a(\\s[^>]*href=['\"]?(http://[a-zA-Z0-9\\s()\\/\\:\\._%\\?+'=~-]*\\.({$reg_formats}))['\"]?[^>]*)>,Uims", 'player_enclose_link', $texte); } if (isset($cfg['insertion_auto']) and in_array('player_end', $cfg['insertion_auto'])) { preg_match_all(",<a(\\s[^>]*href=['\"]?(http://[a-zA-Z0-9\\s()\\/\\:\\._%\\?+'=~-]*\\.({$reg_formats}))['\"]?[^>]*)>(.*)</a>,Uims", $texte, $matches, PREG_SET_ORDER); if (count($matches)) { foreach ($matches as $m) { $url = $m[2]; $titre = $m[4]; $titre = (!strlen(textebrut($titre)) or tester_url_absolue($titre)) ? player_joli_titre($url) : $titre; $emb = recuperer_fond("modeles/player", array('url_document' => $url, 'titre' => $titre)); if ($wrap_embed_html = charger_fonction("wrap_embed_html", "inc", true)) { $emb = $wrap_embed_html(' ', $emb); } $texte .= $emb; } } } } return $texte; }
/** * 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; }
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; }
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; }
function plugins_infos_plugin($desc, $plug = '', $dir_plugins = _DIR_PLUGINS) { include_spip('inc/xml'); $arbre = spip_xml_parse($desc); $verifie_conformite = charger_fonction('verifie_conformite', 'plugins'); $verifie_conformite($plug, $arbre, $dir_plugins); include_spip('inc/charsets'); // On renvoie la DTD utilisee $ret['dtd'] = "plugin"; if (isset($arbre['categorie'])) { $ret['categorie'] = trim(spip_xml_aplatit($arbre['categorie'])); } if (isset($arbre['nom'])) { $ret['nom'] = charset2unicode(spip_xml_aplatit($arbre['nom'])); } if (isset($arbre['icon'])) { $ret['logo'] = trim(spip_xml_aplatit($arbre['icon'])); } if (isset($arbre['auteur'])) { $ret['auteur'][] = trim(spip_xml_aplatit($arbre['auteur'])); } // garder le 1er niveau en tableau mais traiter le multi possible if (isset($arbre['licence'])) { $ret['licence'][] = trim(spip_xml_aplatit($arbre['licence'])); } if (isset($arbre['version'])) { $ret['version'] = trim(spip_xml_aplatit($arbre['version'])); } if (isset($arbre['version_base'])) { $ret['schema'] = trim(spip_xml_aplatit($arbre['version_base'])); } if (isset($arbre['etat'])) { $ret['etat'] = trim(spip_xml_aplatit($arbre['etat'])); } $ret['description'] = $ret['slogan'] = ""; if (isset($arbre['slogan'])) { $ret['slogan'] = trim(spip_xml_aplatit($arbre['slogan'])); } if (isset($arbre['description'])) { $ret['description'] = trim(spip_xml_aplatit($arbre['description'])); } if (isset($arbre['lien'])) { $ret['documentation'] = trim(join(' ', $arbre['lien'])); if ($ret['documentation']) { // le lien de doc doit etre une url et c'est tout if (!tester_url_absolue($ret['documentation'])) { $ret['documentation'] = ""; } } } if (isset($arbre['options'])) { $ret['options'] = $arbre['options']; } if (isset($arbre['fonctions'])) { $ret['fonctions'] = $arbre['fonctions']; } if (isset($arbre['prefix'][0])) { $ret['prefix'] = trim(array_pop($arbre['prefix'])); } if (isset($arbre['install'])) { $ret['install'] = $arbre['install']; } if (isset($arbre['meta'])) { $ret['meta'] = trim(spip_xml_aplatit($arbre['meta'])); } $necessite = info_plugin_normalise_necessite(isset($arbre['necessite']) ? $arbre['necessite'] : ''); $ret['compatibilite'] = isset($necessite['compatible']) ? $necessite['compatible'] : ''; $ret['necessite'] = $necessite['necessite']; $ret['lib'] = $necessite['lib']; $ret['utilise'] = info_plugin_normalise_utilise(isset($arbre['utilise']) ? $arbre['utilise'] : ''); $ret['procure'] = info_plugin_normalise_procure(isset($arbre['procure']) ? $arbre['procure'] : ''); $ret['chemin'] = info_plugin_normalise_chemin(isset($arbre['path']) ? $arbre['path'] : ''); if (isset($arbre['pipeline'])) { $ret['pipeline'] = $arbre['pipeline']; } $extraire_boutons = charger_fonction('extraire_boutons', 'plugins'); $les_boutons = $extraire_boutons($arbre); $ret['menu'] = $les_boutons['bouton']; $ret['onglet'] = $les_boutons['onglet']; $ret['traduire'] = isset($arbre['traduire']) ? $arbre['traduire'] : ''; if (isset($arbre['config'])) { $ret['config'] = spip_xml_aplatit($arbre['config']); } if (isset($arbre['noisette'])) { $ret['noisette'] = $arbre['noisette']; } if (isset($arbre['erreur'])) { $ret['erreur'] = $arbre['erreur']; if ($plug) { spip_log("infos_plugin {$plug} " . @join(' ', $arbre['erreur'])); } } return $ret; }
/** * Donne le nom de la copie locale de la source * * Soit obtient l'extension du fichier directement de l'URL de la source, * soit tente de le calculer. * * @uses nom_fichier_copie_locale() * @uses recuperer_infos_distantes() * * @param string $source * URL de la source distante * @return string * Nom du fichier calculé **/ function fichier_copie_locale($source) { // Si c'est deja local pas de souci if (!tester_url_absolue($source)) { if (_DIR_RACINE) { $source = preg_replace(',^' . preg_quote(_DIR_RACINE) . ',', '', $source); } return $source; } // optimisation : on regarde si on peut deviner l'extension dans l'url et si le fichier // a deja ete copie en local avec cette extension // dans ce cas elle est fiable, pas la peine de requeter en base $path_parts = pathinfo($source); if (!isset($path_parts['extension'])) { $path_parts['extension'] = ''; } $ext = $path_parts ? $path_parts['extension'] : ''; if ($ext and preg_match(',^\\w+$,', $ext) and $f = nom_fichier_copie_locale($source, $ext) and file_exists(_DIR_RACINE . $f)) { return $f; } // Si c'est deja dans la table des documents, // ramener le nom de sa copie potentielle $ext = sql_getfetsel("extension", "spip_documents", "fichier=" . sql_quote($source) . " AND distant='oui' AND extension <> ''"); if ($ext) { return nom_fichier_copie_locale($source, $ext); } // voir si l'extension indiquee dans le nom du fichier est ok // et si il n'aurait pas deja ete rapatrie $ext = $path_parts ? $path_parts['extension'] : ''; if ($ext and sql_getfetsel("extension", "spip_types_documents", "extension=" . sql_quote($ext))) { $f = nom_fichier_copie_locale($source, $ext); if (file_exists(_DIR_RACINE . $f)) { return $f; } } // Ping pour voir si son extension est connue et autorisee // avec mise en cache du resultat du ping $cache = sous_repertoire(_DIR_CACHE, 'rid') . md5($source); if (!@file_exists($cache) or !($path_parts = @unserialize(spip_file_get_contents($cache))) or _request('var_mode') == 'recalcul') { $path_parts = recuperer_infos_distantes($source, 0, false); ecrire_fichier($cache, serialize($path_parts)); } $ext = !empty($path_parts['extension']) ? $path_parts['extension'] : ''; if ($ext and sql_getfetsel("extension", "spip_types_documents", "extension=" . sql_quote($ext))) { return nom_fichier_copie_locale($source, $ext); } spip_log("pas de copie locale pour {$source}"); }
/** * Ajouter un document (au format $_FILES) * * @param int $id_document * Document à remplacer, ou pour une vignette, l'id_document de maman * 0 ou 'new' pour une insertion * @param array $file * Propriétes au format $_FILE étendu : * * - string tmp_name : source sur le serveur * - string name : nom du fichier envoye * - bool titrer : donner ou non un titre a partir du nom du fichier * - bool distant : pour utiliser une source distante sur internet * - string mode : vignette|image|documents|choix * @param string $objet * Objet auquel associer le document * @param int $id_objet * id_objet * @param string $mode * Mode par défaut si pas precisé pour le document * @return array|bool|int|mixed|string|unknown * * - int : l'id_document ajouté (opération réussie) * - string : une erreur s'est produit, la chaine est le message d'erreur * */ function action_ajouter_un_document_dist($id_document, $file, $objet, $id_objet, $mode) { $source = $file['tmp_name']; $nom_envoye = $file['name']; // passer en minuscules le nom du fichier, pour eviter les collisions // si le file system fait la difference entre les deux il ne detectera // pas que Toto.pdf et toto.pdf // et on aura une collision en cas de changement de file system $file['name'] = strtolower(translitteration($file['name'])); // Pouvoir definir dans mes_options.php que l'on veut titrer tous les documents par d?faut if (!defined('_TITRER_DOCUMENTS')) { define('_TITRER_DOCUMENTS', false); } $titrer = isset($file['titrer']) ? $file['titrer'] : _TITRER_DOCUMENTS; $mode = (isset($file['mode']) and $file['mode']) ? $file['mode'] : $mode; include_spip('inc/modifier'); if (isset($file['distant']) and $file['distant'] and !in_array($mode, array('choix', 'auto', 'image', 'document'))) { spip_log("document distant {$source} accepte sans verification, mode={$mode}", "medias" . _LOG_INFO_IMPORTANTE); include_spip('inc/distant'); $file['tmp_name'] = _DIR_RACINE . copie_locale($source); $source = $file['tmp_name']; unset($file['distant']); } // Documents distants : pas trop de verifications bloquantes, mais un test // via une requete HEAD pour savoir si la ressource existe (non 404), si le // content-type est connu, et si possible recuperer la taille, voire plus. if (isset($file['distant']) and $file['distant']) { if (!tester_url_absolue($source)) { return _T('medias:erreur_chemin_distant', array('nom' => $source)); } include_spip('inc/distant'); if (is_array($a = renseigner_source_distante($source))) { $champs = $a; # NB: dans les bonnes conditions (fichier autorise et pas trop gros) # $a['fichier'] est une copie locale du fichier $infos = renseigner_taille_dimension_image($champs['fichier'], $champs['extension'], true); // on ignore erreur eventuelle sur $infos car on est distant, ca ne marche pas forcement if (is_array($infos)) { $champs = array_merge($champs, $infos); } unset($champs['type_image']); } else { spip_log("Echec du lien vers le document {$source}, abandon"); return $a; // message d'erreur } } else { // pas distant $champs = array('distant' => 'non'); $type_image = ''; // au pire $champs['titre'] = ''; if ($titrer) { $titre = substr($nom_envoye, 0, strrpos($nom_envoye, ".")); // Enlever l'extension du nom du fichier $titre = preg_replace(',[[:punct:][:space:]]+,u', ' ', $titre); $champs['titre'] = preg_replace(',\\.([^.]+)$,', '', $titre); } if (!is_array($fichier = fixer_fichier_upload($file, $mode))) { return is_string($fichier) ? $fichier : _T("medias:erreur_upload_type_interdit", array('nom' => $file['name'])); } $champs['inclus'] = $fichier['inclus']; $champs['extension'] = $fichier['extension']; $champs['fichier'] = $fichier['fichier']; /** * Récupère les informations du fichier * -* largeur * -* hauteur * -* type_image * -* taille * -* ses metadonnées si une fonction de metadatas/ est présente */ $infos = renseigner_taille_dimension_image($champs['fichier'], $champs['extension']); if (is_string($infos)) { return $infos; } // c'est un message d'erreur ! $champs = array_merge($champs, $infos); // Si mode == 'choix', fixer le mode image/document if (in_array($mode, array('choix', 'auto'))) { $choisir_mode_document = charger_fonction('choisir_mode_document', 'inc'); $mode = $choisir_mode_document($champs, $champs['inclus'] == 'image', $objet); } $champs['mode'] = $mode; if (($test = verifier_taille_document_acceptable($champs)) !== true) { spip_unlink($champs['fichier']); return $test; // erreur sur les dimensions du fichier } unset($champs['type_image']); unset($champs['inclus']); $champs['fichier'] = set_spip_doc($champs['fichier']); } // si le media est pas renseigne, le faire, en fonction de l'extension if (!isset($champs['media'])) { $champs['media'] = sql_getfetsel('media_defaut', 'spip_types_documents', 'extension=' . sql_quote($champs['extension'])); } // lier le parent si necessaire if ($id_objet = intval($id_objet) and $objet) { $champs['parents'][] = "{$objet}|{$id_objet}"; } // "mettre a jour un document" si on lui // passe un id_document if ($id_document = intval($id_document)) { unset($champs['titre']); // garder le titre d'origine unset($champs['date']); // garder la date d'origine unset($champs['descriptif']); // garder la desc d'origine // unset($a['distant']); # on peut remplacer un doc statique par un doc distant // unset($a['mode']); # on peut remplacer une image par un document ? } include_spip('action/editer_document'); // Installer le document dans la base if (!$id_document) { if ($id_document = document_inserer()) { spip_log("ajout du document " . $file['tmp_name'] . " " . $file['name'] . " (M '{$mode}' T '{$objet}' L '{$id_objet}' D '{$id_document}')", 'medias'); } else { spip_log("Echec insert_document() du document " . $file['tmp_name'] . " " . $file['name'] . " (M '{$mode}' T '{$objet}' L '{$id_objet}' D '{$id_document}')", 'medias' . _LOG_ERREUR); } } if (!$id_document) { return _T('medias:erreur_insertion_document_base', array('fichier' => "<em>" . $file['name'] . "</em>")); } document_modifier($id_document, $champs); // permettre aux plugins de faire des modifs a l'ajout initial // ex EXIF qui tourne les images si necessaire // Ce plugin ferait quand même mieux de se placer dans metadata/jpg.php pipeline('post_edition', array('args' => array('table' => 'spip_documents', 'table_objet' => 'documents', 'spip_table_objet' => 'spip_documents', 'type' => 'document', 'id_objet' => $id_document, 'champs' => array_keys($champs), 'serveur' => '', 'action' => 'ajouter_document', 'operation' => 'ajouter_document'), 'data' => $champs)); return $id_document; }
/** * Fonctions de traitement d'image * * Uniquement pour GD2. * * @pipeline_appel image_preparer_filtre * @uses extraire_attribut() * @uses inserer_attribut() * @uses tester_url_absolue() * @uses copie_locale() Si l'image est distante * @uses taille_image() * @uses _image_ratio() * @uses reconstruire_image_intermediaire() * * @param string $img * Chemin de l'image ou balise html `<img src=... />`. * @param string $effet * Les nom et paramètres de l'effet à apporter sur l'image * (par exemple : reduire-300-200). * @param bool|string $forcer_format * Un nom d'extension spécifique demandé (par exemple : jpg, png, txt...). * Par défaut false : GD se débrouille seule). * @param array $fonction_creation * Un tableau à 2 éléments : * 1) string : indique le nom du filtre de traitement demandé (par exemple : `image_reduire`) ; * 2) array : tableau reprenant la valeur de `$img` et chacun des arguments passés au filtre utilisé. * @param bool $find_in_path * false (par défaut) indique que l'on travaille sur un fichier * temporaire (.src) ; true, sur un fichier définitif déjà existant. * @return bool|string|array * * - false si pas de tag `<img`, * - si l'extension n'existe pas, * - si le fichier source n'existe pas, * - si les dimensions de la source ne sont pas accessibles, * - si le fichier temporaire n'existe pas, * - si la fonction `_imagecreatefrom{extension}` n'existe pas ; * - "" (chaîne vide) si le fichier source est distant et n'a pas * réussi à être copié sur le serveur ; * - array : tableau décrivant de l'image */ function _image_valeurs_trans($img, $effet, $forcer_format = false, $fonction_creation = null, $find_in_path = false) { static $images_recalcul = array(); if (strlen($img) == 0) { return false; } $source = trim(extraire_attribut($img, 'src')); if (strlen($source) < 1) { $source = $img; $img = "<img src='{$source}' />"; } elseif (preg_match('@^data:image/(jpe?g|png|gif);base64,(.*)$@isS', $source, $regs)) { $local = sous_repertoire(_DIR_VAR, 'image-data') . md5($regs[2]) . '.' . str_replace('jpeg', 'jpg', $regs[1]); if (!file_exists($local)) { ecrire_fichier($local, base64_decode($regs[2])); } $source = $local; $img = inserer_attribut($img, 'src', $source); # eviter les mauvaises surprises lors de conversions de format $img = inserer_attribut($img, 'width', ''); $img = inserer_attribut($img, 'height', ''); } // les protocoles web prennent au moins 3 lettres if (tester_url_absolue($source)) { include_spip('inc/distant'); $fichier = _DIR_RACINE . copie_locale($source); if (!$fichier) { return ""; } } else { // enlever le timestamp eventuel if (strpos($source, "?") !== false) { $source = preg_replace(',[?][0-9]+$,', '', $source); } if (strpos($source, "?") !== false and strncmp($source, _DIR_IMG, strlen(_DIR_IMG)) == 0 and file_exists($f = preg_replace(',[?].*$,', '', $source))) { $source = $f; } $fichier = $source; } $terminaison = $terminaison_dest = ""; if (preg_match(",\\.(gif|jpe?g|png)(\$|[?]),i", $fichier, $regs)) { $terminaison = strtolower($regs[1]); $terminaison_dest = $terminaison; if ($terminaison == "gif") { $terminaison_dest = "png"; } } if ($forcer_format !== false) { $terminaison_dest = $forcer_format; } if (!$terminaison_dest) { return false; } $term_fonction = $terminaison; if ($term_fonction == "jpg") { $term_fonction = "jpeg"; } $nom_fichier = substr($fichier, 0, strlen($fichier) - (strlen($terminaison) + 1)); $fichier_dest = $nom_fichier; if ($find_in_path and $f = find_in_path($fichier) and $fichier = $f or @file_exists($f = $fichier)) { // on passe la balise img a taille image qui exraira les attributs si possible // au lieu de faire un acces disque sur le fichier list($ret["hauteur"], $ret["largeur"]) = taille_image($find_in_path ? $f : $img); $date_src = @filemtime($f); } elseif (@file_exists($f = "{$fichier}.src") and lire_fichier($f, $valeurs) and $valeurs = unserialize($valeurs) and isset($valeurs["hauteur_dest"]) and isset($valeurs["largeur_dest"])) { $ret["hauteur"] = $valeurs["hauteur_dest"]; $ret["largeur"] = $valeurs["largeur_dest"]; $date_src = $valeurs["date"]; } else { return false; } // pas de taille mesurable if (!($ret["hauteur"] or $ret["largeur"])) { return false; } // cas general : // on a un dossier cache commun et un nom de fichier qui varie avec l'effet // cas particulier de reduire : // un cache par dimension, et le nom de fichier est conserve, suffixe par la dimension aussi $cache = "cache-gd2"; if (substr($effet, 0, 7) == 'reduire') { list(, $maxWidth, $maxHeight) = explode('-', $effet); list($destWidth, $destHeight) = _image_ratio($ret['largeur'], $ret['hauteur'], $maxWidth, $maxHeight); $ret['largeur_dest'] = $destWidth; $ret['hauteur_dest'] = $destHeight; $effet = "L{$destWidth}xH{$destHeight}"; $cache = "cache-vignettes"; $fichier_dest = basename($fichier_dest); if ($ret['largeur'] <= $maxWidth && $ret['hauteur'] <= $maxHeight) { // on garde la terminaison initiale car image simplement copiee // et on postfixe son nom avec un md5 du path $terminaison_dest = $terminaison; $fichier_dest .= '-' . substr(md5("{$fichier}"), 0, 5); } else { $fichier_dest .= '-' . substr(md5("{$fichier}-{$effet}"), 0, 5); } $cache = sous_repertoire(_DIR_VAR, $cache); $cache = sous_repertoire($cache, $effet); # cherche un cache existant /*foreach (array('gif','jpg','png') as $fmt) if (@file_exists($cache . $fichier_dest . '.' . $fmt)) { $terminaison_dest = $fmt; }*/ } else { $fichier_dest = md5("{$fichier}-{$effet}"); $cache = sous_repertoire(_DIR_VAR, $cache); $cache = sous_repertoire($cache, substr($fichier_dest, 0, 2)); $fichier_dest = substr($fichier_dest, 2); } $fichier_dest = $cache . $fichier_dest . "." . $terminaison_dest; $GLOBALS["images_calculees"][] = $fichier_dest; $creer = true; // si recalcul des images demande, recalculer chaque image une fois if (defined('_VAR_IMAGES') and _VAR_IMAGES and !isset($images_recalcul[$fichier_dest])) { $images_recalcul[$fichier_dest] = true; } else { if (@file_exists($f = $fichier_dest)) { if (filemtime($f) >= $date_src) { $creer = false; } } else { if (@file_exists($f = "{$fichier_dest}.src") and lire_fichier($f, $valeurs) and $valeurs = unserialize($valeurs) and $valeurs["date"] >= $date_src) { $creer = false; } } } if ($creer) { if (!@file_exists($fichier)) { if (!@file_exists("{$fichier}.src")) { spip_log("Image absente : {$fichier}"); return false; } # on reconstruit l'image source absente a partir de la chaine des .src reconstruire_image_intermediaire($fichier); } } if ($creer) { spip_log("filtre image " . ($fonction_creation ? reset($fonction_creation) : '') . "[{$effet}] sur {$fichier}", "images" . _LOG_DEBUG); } // TODO: si une image png est nommee .jpg, le reconnaitre avec le bon $f $ret["fonction_imagecreatefrom"] = "_imagecreatefrom" . $term_fonction; $ret["fichier"] = $fichier; $ret["fonction_image"] = "_image_image" . $terminaison_dest; $ret["fichier_dest"] = $fichier_dest; $ret["format_source"] = $terminaison != 'jpeg' ? $terminaison : 'jpg'; $ret["format_dest"] = $terminaison_dest; $ret["date_src"] = $date_src; $ret["creer"] = $creer; $ret["class"] = extraire_attribut($img, 'class'); $ret["alt"] = extraire_attribut($img, 'alt'); $ret["style"] = extraire_attribut($img, 'style'); $ret["tag"] = $img; if ($fonction_creation) { $ret["reconstruction"] = $fonction_creation; # ecrire ici comment creer le fichier, car il est pas sur qu'on l'ecrira reelement # cas de image_reduire qui finalement ne reduit pas l'image source # ca evite d'essayer de le creer au prochain hit si il n'est pas la #ecrire_fichier($ret['fichier_dest'].'.src',serialize($ret),true); } $ret = pipeline('image_preparer_filtre', array('args' => array('img' => $img, 'effet' => $effet, 'forcer_format' => $forcer_format, 'fonction_creation' => $fonction_creation, 'find_in_path' => $find_in_path), 'data' => $ret)); // une globale pour le debug en cas de crash memoire $GLOBALS["derniere_image_calculee"] = $ret; if (!function_exists($ret["fonction_imagecreatefrom"])) { return false; } return $ret; }
/** * Script : plusieurs declarations possibles. * Traitement de l'attribut source pour générer en remplacement les attributs url et path * * @param object $phraseur * @param array $attrs * @param string $texte */ function info_paquet_script($phraseur, $attrs, $texte) { $lien = $chemin = $type = $media = ''; include_spip('inc/utils'); if (tester_url_absolue($attrs['source'])) { $lien = $attrs['source']; } else { $chemin = $attrs['source']; } if (isset($attrs['type'])) { $type = $attrs['type']; } $n = $phraseur->contenu['compatible']; $phraseur->versions[$n]['script'][] = array('url' => $lien, 'path' => $chemin, 'type' => $type); }
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)); } elseif (tester_url_absolue($cible) and !defined('_AUTORISER_LOGIN_ABS_REDIRECT')) { $cible = ""; } } // 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; }
/** * Enregistre une revision de document. * $set est un contenu (par defaut on prend le contenu via _request()) * * @param int $id_document * @param array|null $set * @return string|null */ function document_modifier($id_document, $set = null) { include_spip('inc/modifier'); include_spip('inc/filtres'); // champs normaux $champs = collecter_requests(objet_info('document', 'champs_editables'), array('parents', 'ajout_parents'), $set); $invalideur = ""; $indexation = false; // Si le document est publie, invalider les caches et demander sa reindexation $t = sql_getfetsel("statut", "spip_documents", 'id_document=' . intval($id_document)); if ($t == 'publie') { $invalideur = "id='id_document/{$id_document}'"; $indexation = true; } $ancien_fichier = ""; // si le fichier est modifie, noter le nom de l'ancien pour faire le menage if (isset($champs['fichier'])) { $ancien_fichier = sql_getfetsel('fichier', 'spip_documents', 'id_document=' . intval($id_document)); } if ($err = objet_modifier_champs('document', $id_document, array('data' => $set, 'invalideur' => $invalideur, 'indexation' => $indexation), $champs)) { return $err; } // nettoyer l'ancien fichier si necessaire if (isset($champs['fichier']) and $champs['fichier'] and $ancien_fichier and $ancien_fichier !== $champs['fichier'] and !tester_url_absolue($ancien_fichier) and @file_exists($f = get_spip_doc($ancien_fichier))) { spip_unlink($f); } // Changer le statut du document ? // le statut n'est jamais fixe manuellement mais decoule de celui des objets lies $champs = collecter_requests(array('parents', 'ajouts_parents'), array(), $set); if (document_instituer($id_document, $champs)) { // // Post-modifications // // Invalider les caches include_spip('inc/invalideur'); suivre_invalideur("id='id_document/{$id_document}'"); } }