function generer_generer_url_arg($type, $p, $_id) { $s = $p->id_boucle; if ($s !== '' AND $s = $p->boucles[$s]->sql_serveur) { // si une fonction de generation des url a ete definie pour ce connect l'utiliser if (function_exists($f = 'generer_generer_url_'.$s)){ return $f($type, $_id, $s); } if (!$GLOBALS['connexions'][strtolower($s)]['spip_connect_version']) { return NULL; } $s = _q($s); if ($type == 'document') { return "quete_meta('adresse_site', $s) . '/' .\n\t" . "quete_meta('dir_img', $s) . \n\t" . "quete_fichier($_id,$s)"; } $s = ", '', '', $s, quete_meta('type_urls', $s)"; } else $s = ", '', '', true"; return "urlencode_1738(generer_url_entite($_id, '$type'$s))"; }
function inserer_document_syndic_article($liens, $id_syndic_article, $date, $titre_parent) { include_spip("base/abstract_sql"); $id_article_syndic = sql_getfetsel("id_syndic_article", "spip_syndic_articles", "id_syndic_article=" . _q($id_syndic_article), "", "date desc", "0,1"); if (!$date) { $date = date("Y-m-d h:i:s"); } foreach ($liens as $link) { $id3 = recuperer_id3($link); $champs = array('titre' => $titre_parent, 'fichier' => $link, 'tag_auteur' => $id3['artiste'], 'tag_titre' => $id3['titre'], 'date' => date("Y-m-d H:i:s", $date), 'distant' => 'oui', 'statut' => 'publie', 'date' => $date, 'extension' => 'mp3'); $s = sql_getfetsel("id_document", "spip_documents", "fichier=" . _q($champs['fichier']), "", "date desc", "0,1"); if ($s) { // maj le document distant sql_updateq('spip_documents', $champs, 'id_document=' . intval($s)); // a t'on un lien entre ce doc et cet article ? $l = sql_getfetsel("id_document", "spip_documents_liens", "id_document=" . _q($s) . " and id_objet=" . _q($id_article_syndic)); if (!$l) { $champs_liens = array('id_document' => $s, 'id_objet' => $id_article_syndic, 'objet' => 'syndic_article'); sql_insertq('spip_documents_liens', $champs_liens); } } else { // enregistrer le document distant $id_document = sql_insertq('spip_documents', $champs); // le lier a son syndic article $champs_liens = array('id_document' => $id_document, 'id_objet' => $id_article_syndic, 'objet' => 'syndic_article'); sql_insertq('spip_documents_liens', $champs_liens); } } }
function maj_v016_dist($version_installee, $version_cible) { if (upgrade_vers(1.6, $version_installee, $version_cible)) { #8/08/07 plus d'indexation dans le core # include_spip('inc/indexation'); # purger_index(); # creer_liste_indexation(); maj_version(1.6); } if (upgrade_vers(1.601, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_forum ADD INDEX id_syndic (id_syndic)"); maj_version(1.601); } if (upgrade_vers(1.603, $version_installee, $version_cible)) { // supprimer les fichiers deplaces spip_unlink('inc_meta_cache.php'); spip_unlink('inc_meta_cache.php3'); spip_unlink('data/engines-list.ini'); maj_version(1.603); } if (upgrade_vers(1.604, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_auteurs ADD lang VARCHAR(10) DEFAULT '' NOT NULL"); $u = spip_query("SELECT * FROM spip_auteurs WHERE prefs LIKE '%spip_lang%'"); while ($row = sql_fetch($u)) { $prefs = unserialize($row['prefs']); $l = $prefs['spip_lang']; unset($prefs['spip_lang']); spip_query("UPDATE spip_auteurs SET lang=" . _q($l) . ", prefs='" . addslashes(serialize($prefs)) . "' WHERE id_auteur=" . $row['id_auteur']); } $u = spip_query("SELECT lang FROM spip_auteurs"); maj_version(1.604, $u); } }
function affiche_auteur_diff($auteur) { // Si c'est un nombre, c'est un auteur de la table spip_auteurs if ($auteur == intval($auteur) and $s = sql_query("SELECT * FROM spip_auteurs WHERE id_auteur=" . _q($auteur)) and $t = sql_fetch($s)) { return typo($t['nom']); } else { return $auteur; } }
function glossaire_groupes() { $groupes = trim($GLOBALS['glossaire_groupes']); if(!strlen($groupes)) return _q('Glossaire'); else { $groupes = explode(':', $groupes); foreach($groupes as $i=>$g) $groupes[$i] = _q(trim($g)); return join(" OR type=", $groupes); } }
/** * Generer n'importe quel info pour un objet : #INFO_TITRE{article, #ENV{id_article}} * Utilise la fonction generer_info_entite() de inc/filtres * se reporter a sa documentation * */ function balise_INFO__dist($p) { $info = $p->nom_champ; $type_objet = interprete_argument_balise(1, $p); $id_objet = interprete_argument_balise(2, $p); if ($info === 'INFO_' or !$type_objet or !$id_objet) { $msg = _T('zbug_balise_sans_argument', array('balise' => ' INFO_')); erreur_squelette($msg, $p); $p->interdire_scripts = true; return $p; } else { $info_sql = strtolower(substr($info, 5)); $code = "generer_info_entite({$id_objet}, {$type_objet}, '{$info_sql}'" . ($p->etoile ? "," . _q($p->etoile) : "") . ")"; $p->code = champ_sql($info, $p, $code); $p->interdire_scripts = true; return $p; } }
function socialtags_json($cfg) { if (!is_array($cfg)) { return '[]'; } $json = array(); include_spip('socialtags_fonctions'); foreach (socialtags_liste() as $service) { if (in_array($a = $service['lesauteurs'], $cfg)) { $t = _q($service['titre']); $u = _q($service['url']); $d = isset($service['descriptif']) ? _q($service['descriptif']) : $t; $u_site = _q($GLOBALS['meta']['adresse_site']); $i = _q('data:image/png;base64,' . base64_encode(file_get_contents(find_in_path('images/' . $a . '.png')))); $json[] = "{ a: '{$a}', n: {$t}, i: {$i}, u: {$u}, u_site: {$u_site}}"; } } return "[\n" . join(",\n", $json) . "\n]"; }
function generer_generer_url_arg($type, $p, $_id) { if ($s = trouver_nom_serveur_distant($p)) { // si une fonction de generation des url a ete definie pour ce connect l'utiliser if (function_exists($f = 'generer_generer_url_' . $s)) { return $f($type, $_id, $s); } if (!$GLOBALS['connexions'][strtolower($s)]['spip_connect_version']) { return NULL; } $s = _q($s); # exception des urls de documents sur un serveur distant... if ($type == 'document') { return "quete_meta('adresse_site', {$s}) . '/' .\n\t" . "quete_meta('dir_img', {$s}) . \n\t" . "quete_fichier({$_id},{$s})"; } $s = ", '', '', {$s}, quete_meta('type_urls', {$s})"; } else { $s = ", '', '', true"; } return "urlencode_1738(generer_url_entite({$_id}, '{$type}'{$s}))"; }
function etape_ldap5_save() { if (!@file_exists(_FILE_CONNECT_TMP)) { redirige_url_ecrire('install'); } ecrire_meta('ldap_statut_import', _request('statut_ldap')); lire_fichier(_FILE_CONNECT_TMP, $conn); if ($p = strpos($conn, "'');")) { ecrire_fichier(_FILE_CONNECT_TMP, substr($conn, 0, $p + 1) . _FILE_LDAP . substr($conn, $p + 1)); } $adresse_ldap = addcslashes(_request('adresse_ldap'), "'\\"); $login_ldap = addcslashes(_request('login_ldap'), "'\\"); $pass_ldap = addcslashes(_request('pass_ldap'), "'\\"); $port_ldap = addcslashes(_request('port_ldap'), "'\\"); $tls_ldap = addcslashes(_request('tls_ldap'), "'\\"); $protocole_ldap = addcslashes(_request('protocole_ldap'), "'\\"); $base_ldap = addcslashes(_request('base_ldap'), "'\\"); $base_ldap_text = addcslashes(_request('base_ldap_text'), "'\\"); $conn = "\$GLOBALS['ldap_base'] = '{$base_ldap}';\n" . "\$GLOBALS['ldap_link'] = @ldap_connect('{$adresse_ldap}','{$port_ldap}');\n" . "@ldap_set_option(\$GLOBALS['ldap_link'],LDAP_OPT_PROTOCOL_VERSION,'{$protocole_ldap}');\n" . ($tls_ldap != 'oui' ? '' : "@ldap_start_tls(\$GLOBALS['ldap_link']);\n") . "@ldap_bind(\$GLOBALS['ldap_link'],'{$login_ldap}','{$pass_ldap}');\n"; $champs = is_array($GLOBALS['ldap_attributes']) ? $GLOBALS['ldap_attributes'] : array(); $res = ''; foreach ($champs as $champ => $v) { $nom = 'ldap_' . $champ; $val = trim(_request($nom)); if (preg_match('/^\\w*$/', $val)) { if ($val) { $val = _q($val); } } else { $val = "array(" . _q(preg_split('/\\W+/', $val)) . ')'; } if ($val) { $res .= "'{$champ}' => " . $val . ","; } } $conn .= "\$GLOBALS['ldap_champs'] = array({$res});\n"; install_fichier_connexion(_DIR_CONNECT . _FILE_LDAP, $conn); }
function v019_pre193($version_installee, $version_cible) { // Syndication : ajout de l'option resume=oui/non et de la langue if (upgrade_vers(1.901, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_syndic ADD `resume` VARCHAR(3) DEFAULT 'oui'"); spip_query("ALTER TABLE spip_syndic_articles ADD `lang` VARCHAR(10) DEFAULT '' NOT NULL"); maj_version(1.901); } // Syndication : ajout de source, url_source, tags if (upgrade_vers(1.902, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_syndic_articles ADD `url_source` TINYTEXT DEFAULT '' NOT NULL"); spip_query("ALTER TABLE spip_syndic_articles ADD `source` TINYTEXT DEFAULT '' NOT NULL"); spip_query("ALTER TABLE spip_syndic_articles ADD `tags` TEXT DEFAULT '' NOT NULL"); maj_version(1.902); } // URLs propres des sites (sait-on jamais) // + oubli des KEY url_propre sur les auteurs si installation neuve if (upgrade_vers(1.903, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_syndic ADD `url_propre` VARCHAR(255) NOT NULL"); spip_query("ALTER TABLE spip_syndic ADD INDEX `url_propre` (`url_propre`)"); spip_query("ALTER TABLE spip_auteurs ADD INDEX `url_propre` (`url_propre`)"); maj_version(1.903); } // suppression des anciennes tables temporaires des visites // (maintenant stockees sous forme de fichiers) if (upgrade_vers(1.904, $version_installee, $version_cible)) { spip_query("DROP TABLE IF EXISTS spip_visites_temp"); spip_query("DROP TABLE IF EXISTS spip_referers_temp"); maj_version(1.904); } // fusion des 10 tables index en une seule // pour fonctions futures evoluees du moteur de recherche if (upgrade_vers(1.905, $version_installee, $version_cible)) { // agrandir le champ "valeur" de spip_meta pour pouvoir y stocker // des choses plus sympa spip_query("ALTER TABLE spip_meta DROP INDEX `valeur`"); spip_query("ALTER TABLE spip_meta CHANGE `valeur` `valeur` TEXT"); // table des correspondances table->id_table $liste_tables = array(); $liste_tables[1] = 'spip_articles'; $liste_tables[2] = 'spip_auteurs'; $liste_tables[3] = 'spip_breves'; $liste_tables[4] = 'spip_documents'; $liste_tables[5] = 'spip_forum'; $liste_tables[6] = 'spip_mots'; $liste_tables[7] = 'spip_rubriques'; $liste_tables[8] = 'spip_signatures'; $liste_tables[9] = 'spip_syndic'; ecrire_meta('index_table', serialize($liste_tables)); ## devenu inutile car suppression totale de l'indexation /* spip_query("INSERT INTO spip_index (`hash`,`points`,`id_objet`,`id_table`) SELECT `hash`,`points`,`id_article` as id_objet,'1' as id_table FROM spip_index_articles"); spip_query("DROP TABLE IF EXISTS spip_index_articles"); spip_query("INSERT INTO spip_index (`hash`,`points`,`id_objet`,`id_table`) SELECT `hash`,`points`,`id_auteur` as id_objet,'2' as id_table FROM spip_index_auteurs"); spip_query("DROP TABLE IF EXISTS spip_index_auteurs"); spip_query("INSERT INTO spip_index (`hash`,`points`,`id_objet`,`id_table`) SELECT `hash`,`points`,`id_breve` as id_objet,'3' as id_table FROM spip_index_breves"); spip_query("DROP TABLE IF EXISTS spip_index_breves"); spip_query("INSERT INTO spip_index (`hash`,`points`,`id_objet`,`id_table`) SELECT `hash`,`points`,`id_document` as id_objet,'4' as id_table FROM spip_index_documents"); spip_query("DROP TABLE IF EXISTS spip_index_documents"); spip_query("INSERT INTO spip_index (`hash`,`points`,`id_objet`,`id_table`) SELECT `hash`,`points`,`id_forum` as id_objet,'5' as id_table FROM spip_index_forum"); spip_query("DROP TABLE IF EXISTS spip_index_forum"); spip_query("INSERT INTO spip_index (`hash`,`points`,`id_objet`,`id_table`) SELECT `hash`,`points`,`id_mot` as id_objet,'6' as id_table FROM spip_index_mots"); spip_query("DROP TABLE IF EXISTS spip_index_mots"); spip_query("INSERT INTO spip_index (`hash`,`points`,`id_objet`,`id_table`) SELECT `hash`,`points`,`id_rubrique` as id_objet,'7' as id_table FROM spip_index_rubriques"); spip_query("DROP TABLE IF EXISTS spip_index_rubriques"); spip_query("INSERT INTO spip_index (`hash`,`points`,`id_objet`,`id_table`) SELECT `hash`,`points`,`id_signature` as id_objet,'8' as id_table FROM spip_index_signatures"); spip_query("DROP TABLE IF EXISTS spip_index_signatures"); spip_query("INSERT INTO spip_index (`hash`,`points`,`id_objet`,`id_table`) SELECT `hash`,`points`,`id_syndic` as id_objet,'9' as `id_table FROM spip_index_syndic"); spip_query("DROP TABLE IF EXISTS spip_index_syndic"); */ maj_version(1.905); } // cette table est desormais geree par le plugin "podcast_client", on la // supprime si le plugin n'est pas active ; risque inherent a l'utilisation // de versions alpha :-) if (upgrade_vers(1.906, $version_installee, $version_cible)) { if (!@in_array('podcast_client', $GLOBALS['plugins'])) { spip_query("DROP TABLE spip_documents_syndic"); } maj_version(1.906); } if (upgrade_vers(1.907, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_forum ADD INDEX `idx` (`idx`)"); maj_version(1.907); } // Oups ! on stockait les tags de syndication sous la forme rel="category" // au lieu de rel="directory" - http://microformats.org/wiki/rel-directory if (upgrade_vers(1.908, $version_installee, $version_cible)) { spip_query("UPDATE spip_syndic_articles SET `tags` = REPLACE(`tags`, 'rel=\"category\">', 'rel=\"directory\">') WHERE `tags` like '%category%'"); maj_version(1.908); } if (upgrade_vers(1.909, $version_installee, $version_cible)) { spip_query("ALTER IGNORE TABLE spip_mots_articles ADD PRIMARY KEY (`id_article`, `id_mot`)"); spip_query("ALTER IGNORE TABLE spip_mots_breves ADD PRIMARY KEY (`id_breve`, `id_mot`)"); spip_query("ALTER IGNORE TABLE spip_mots_rubriques ADD PRIMARY KEY (`id_rubrique`, `id_mot`)"); spip_query("ALTER IGNORE TABLE spip_mots_syndic ADD PRIMARY KEY (`id_syndic`, `id_mot`)"); spip_query("ALTER IGNORE TABLE spip_mots_documents ADD PRIMARY KEY (`id_document`, `id_mot`)"); spip_query("ALTER IGNORE TABLE spip_mots_forum ADD PRIMARY KEY (`id_forum`, `id_mot`)"); maj_version(1.909); } if (upgrade_vers(1.91, $version_installee, $version_cible)) { spip_query("ALTER IGNORE TABLE spip_auteurs_articles ADD PRIMARY KEY (`id_auteur`, `id_article`)"); spip_query("ALTER IGNORE TABLE spip_auteurs_rubriques ADD PRIMARY KEY (`id_auteur`, `id_rubrique`)"); spip_query("ALTER IGNORE TABLE spip_auteurs_messages ADD PRIMARY KEY (`id_auteur`, `id_message`)"); maj_version(1.91); } if (upgrade_vers(1.911, $version_installee, $version_cible)) { spip_query("ALTER IGNORE TABLE spip_auteurs_articles DROP INDEX `id_auteur`"); spip_query("ALTER IGNORE TABLE spip_auteurs_rubriques DROP INDEX `id_auteur`"); spip_query("ALTER IGNORE TABLE spip_auteurs_messages DROP INDEX `id_auteur`"); spip_query("ALTER IGNORE TABLE spip_mots_articles DROP INDEX `id_article`"); spip_query("ALTER IGNORE TABLE spip_mots_breves DROP INDEX `id_breve`"); spip_query("ALTER IGNORE TABLE spip_mots_rubriques DROP INDEX `id_rubrique`"); spip_query("ALTER IGNORE TABLE spip_mots_syndic DROP INDEX `id_syndic`"); spip_query("ALTER IGNORE TABLE spip_mots_forum DROP INDEX `id_forum`"); spip_query("ALTER IGNORE TABLE spip_mots_documents DROP INDEX `id_document`"); # 18 juillet 2007: table depreciee # spip_query("ALTER IGNORE TABLE spip_caches DROP INDEX fichier"); maj_version(1.911); } // Le logo du site n'est plus le logo par defaut des rubriques // mais pour assurer la compatibilite ascendante, on le duplique if (upgrade_vers(1.912, $version_installee, $version_cible)) { @copy(_DIR_LOGOS . 'rubon0.gif', _DIR_LOGOS . 'siteon0.gif'); @copy(_DIR_LOGOS . 'ruboff0.gif', _DIR_LOGOS . 'siteoff0.gif'); @copy(_DIR_LOGOS . 'rubon0.jpg', _DIR_LOGOS . 'siteon0.jpg'); @copy(_DIR_LOGOS . 'ruboff0.jpg', _DIR_LOGOS . 'siteoff0.jpg'); @copy(_DIR_LOGOS . 'rubon0.png', _DIR_LOGOS . 'siteon0.png'); @copy(_DIR_LOGOS . 'ruboff0.png', _DIR_LOGOS . 'siteoff0.png'); maj_version(1.912); } // suppression de auteur_modif qui n'est plus utilise nulle part if (upgrade_vers(1.913, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_articles DROP `auteur_modif`"); maj_version(1.913); } // Ajout de SVG if (upgrade_vers(1.914, $version_installee, $version_cible)) { spip_query("INSERT IGNORE INTO spip_types_documents (`extension`, `titre`, `inclus`) VALUES ('svg', 'Scalable Vector Graphics', 'embed')"); spip_query("UPDATE spip_types_documents SET `mime_type`='image/svg+xml' WHERE `extension`='svg'"); maj_version(1.914); } // Ajout de plein de type mime if (upgrade_vers(1.915, $version_installee, $version_cible)) { maj_version(1.915); } // refaire l'upgrade 1.905 qui a pu foirer en partie a cause de la requete ALTER sur spip_meta if (upgrade_vers(1.916, $version_installee, $version_cible)) { // agrandir le champ "valeur" de spip_meta pour pouvoir y stocker // des choses plus sympa spip_query("ALTER TABLE spip_meta DROP INDEX `valeur`"); spip_query("ALTER TABLE spip_meta CHANGE `valeur` `valeur` TEXT"); #8/08/07 plus d'indexation dans le core //include_spip('inc/indexation'); //update_index_tables(); maj_version(1.916); } if (upgrade_vers(1.917, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_documents DROP `inclus`"); maj_version(1.917); } // Permettre d'enregistrer un numero IP dans les revisions d'articles // a la place de l'id_auteur if (upgrade_vers(1.918, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_versions CHANGE `id_auteur` `id_auteur` VARCHAR(23)"); maj_version(1.918); } if (upgrade_vers(1.919, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_ajax_fonc DROP `id_auteur`"); maj_version('1.919'); } if (upgrade_vers(1.92, $version_installee, $version_cible)) { spip_query("ALTER IGNORE TABLE spip_documents_articles ADD PRIMARY KEY (`id_article`, `id_document`)"); spip_query("ALTER IGNORE TABLE spip_documents_breves ADD PRIMARY KEY (`id_breve`, `id_document`)"); spip_query("ALTER IGNORE TABLE spip_documents_rubriques ADD PRIMARY KEY (`id_rubrique`, `id_document`)"); spip_query("ALTER IGNORE TABLE spip_documents_articles DROP INDEX `id_article`"); spip_query("ALTER IGNORE TABLE spip_documents_breves DROP INDEX `id_breve`"); spip_query("ALTER IGNORE TABLE spip_documents_rubriques DROP INDEX `id_rubrique`"); maj_version('1.920'); } if (upgrade_vers(1.922, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_meta ADD `impt` ENUM('non', 'oui') DEFAULT 'oui' NOT NULL AFTER `valeur`"); $meta_serveur = array('version_installee', 'adresse_site', 'alea_ephemere_ancien', 'alea_ephemere', 'alea_ephemere_date', 'langue_site', 'langues_proposees', 'date_calcul_rubriques', 'derniere_modif', 'optimiser_table', 'drapeau_edition', 'creer_preview', 'taille_preview', 'creer_htpasswd', 'creer_htaccess', 'gd_formats_read', 'gd_formats', 'netpbm_formats', 'formats_graphiques', 'image_process', 'plugin_header', 'plugin'); foreach ($meta_serveur as $nom) { spip_query("UPDATE spip_meta SET `impt`='non' WHERE `nom`=" . _q($nom)); } maj_version('1.922'); } if (upgrade_vers(1.923, $version_installee, $version_cible)) { if (isset($GLOBALS['meta']['IMPORT_tables_noimport'])) { $IMPORT_tables_noimport = unserialize($GLOBALS['meta']['IMPORT_tables_noimport']); foreach ($IMPORT_tables_noimport as $key => $table) { if ($table == 'spip_meta') { unset($IMPORT_tables_noimport[$key]); } } ecrire_meta('IMPORT_tables_noimport', serialize($IMPORT_tables_noimport), 'non'); } maj_version('1.923'); } if (upgrade_vers(1.924, $version_installee, $version_cible)) { spip_query('DROP TABLE spip_ajax_fonc'); maj_version('1.924'); } if (upgrade_vers(1.925, $version_installee, $version_cible)) { include_spip('inc/flock'); /* deplacement des sessions */ $f_session = preg_files('data', 'session_'); $repertoire = _DIR_SESSIONS; if (!@file_exists($repertoire)) { $repertoire = preg_replace(',' . _DIR_TMP . ',', '', $repertoire); $repertoire = sous_repertoire(_DIR_TMP, $repertoire); } foreach ($f_session as $f) { $d = basename($f); @copy($f, $repertoire . $d); } /* deplacement des visites */ $f_visites = preg_files('data/visites'); $repertoire = sous_repertoire(_DIR_TMP, 'visites'); foreach ($f_visites as $f) { $d = basename($f); @copy($f, $repertoire . $d); } /* deplacement des upload */ $auteurs = array(); $req = spip_query("SELECT `login` FROM spip_auteurs WHERE `statut` = '0minirezo'"); while ($row = sql_fetch($req)) { $auteurs[] = $row['login']; } $f_upload = preg_files('upload', -1, 10000, $auteurs); $repertoire = _DIR_TRANSFERT; if (!@file_exists($repertoire)) { $repertoire = preg_replace(',' . _DIR_TMP . ',', '', $repertoire); $repertoire = sous_repertoire(_DIR_TMP, $repertoire); } foreach ($auteurs as $login) { if (is_dir('upload/' . $login)) { $sous_repertoire = sous_repertoire(_DIR_TRANSFERT, $login); } } foreach ($f_upload as $f) { @copy($f, _DIR_TMP . $f); } /* deplacement des dumps */ $f_session = preg_files('data', 'dump'); $repertoire = _DIR_DUMP; if (!@file_exists($repertoire)) { $repertoire = preg_replace(',' . _DIR_TMP . ',', '', $repertoire); $repertoire = sous_repertoire(_DIR_TMP, $repertoire); } foreach ($f_session as $f) { $d = basename($f); @copy($f, $repertoire . $d); } maj_version('1.925'); } // Ajout de MP4 if (upgrade_vers(1.926, $version_installee, $version_cible)) { spip_query("INSERT IGNORE INTO spip_types_documents (`extension`, `titre`, `inclus`) VALUES ('mp4', 'MPEG4', 'embed')"); spip_query("UPDATE spip_types_documents SET `mime_type`='application/mp4' WHERE `extension`='mp4'"); maj_version('1.926'); } }
function maj_1_938() { $res = sql_select('extension', 'spip_documents', "extension='' OR extension is NULL"); if ($n = sql_count($res)) { $repli = false; // verifier que la colonne id_type est toujours la (update post 1.938) $desc = sql_showtable('spip_documents'); if (!$desc or !isset($desc['field']['id_type'])) { $repli = true; } $s = sql_select('extension' . ($repli ? '' : ',id_type'), 'spip_types_documents'); while ($t = sql_fetch($s)) { if (isset($t['id_type'])) { spip_query("UPDATE spip_documents\tSET `extension`=" . _q($t['extension']) . " WHERE `id_type`=" . _q($t['id_type'])); } else { spip_query("UPDATE spip_documents\tSET `extension`=" . _q($t['extension']) . " WHERE fichier LIKE " . _q("%." . $t['extension'])); } } $res = sql_select('extension', 'spip_documents', "extension='' OR extension is NULL"); if ($n = sql_count($res)) { spip_log("Table spip_documents : Colonne extension incomplete : {$n} lignes vides"); } } }
function autoriser_forum_modifier($faire, $type, $id, $qui, $opt) { // Le webmestre if ($GLOBALS['autorite']['editer_forums'] >= 1 AND autoriser('webmestre', $type, $id, $qui, $opt)) return true; // Les admins if ( $GLOBALS['autorite']['editer_forums'] >= 2 AND $qui['statut'] == '0minirezo' AND !$qui['restreint'] ) return true; // L'auteur du message (enregistre') // 2 = avec une periode de grace d'une heure // 3 = ad vitam if ($GLOBALS['autorite']['editer_forums'] >= 3 AND isset($qui['id_auteur'])) { $q = "SELECT id_forum FROM spip_forum WHERE id_forum="._q($id)." AND id_auteur="._q($qui['id_auteur']); if ($GLOBALS['autorite']['editer_forums'] == 3) $q .= " AND date_heure > DATE_SUB(NOW(), INTERVAL 1 HOUR)"; $s = spip_query($q); if (sql_count($s)) return true; } // par defaut return autoriser_forum_modifier_dist($faire, $type, $id, $qui, $opt); }
function balise_LOGO__dist($p) { preg_match(",^LOGO_([A-Z_]+?)(|_NORMAL|_SURVOL|_RUBRIQUE)\$,i", $p->nom_champ, $regs); $type = strtolower($regs[1]); $suite_logo = $regs[2]; // cas de #LOGO_SITE_SPIP if ($type == 'site_spip') { $type = 'site'; $_id_objet = "\"'0'\""; } $id_objet = id_table_objet($type); if (!isset($_id_objet) or !$_id_objet) { $_id_objet = champ_sql($id_objet, $p); } $fichier = $p->etoile === '**' ? -1 : 0; $coord = array(); $align = $lien = ''; $mode_logo = ''; if ($p->param and !$p->param[0][0]) { $params = $p->param[0]; array_shift($params); foreach ($params as $a) { if ($a[0]->type === 'texte') { $n = $a[0]->texte; if (is_numeric($n)) { $coord[] = $n; } elseif (in_array($n, array('top', 'left', 'right', 'center', 'bottom'))) { $align = $n; } elseif (in_array($n, array('auto', 'icone', 'apercu', 'vignette'))) { $mode_logo = $n; } } else { $lien = calculer_liste($a, $p->descr, $p->boucles, $p->id_boucle); } } } $coord_x = !$coord ? 0 : intval(array_shift($coord)); $coord_y = !$coord ? 0 : intval(array_shift($coord)); if ($p->etoile === '*') { include_spip('balise/url_'); $lien = generer_generer_url_arg($type, $p, $_id_objet); } $connect = $p->id_boucle ? $p->boucles[$p->id_boucle]->sql_serveur : ''; if ($type == 'document') { $qconnect = _q($connect); $doc = "quete_document({$_id_objet}, {$qconnect})"; if ($fichier) { $code = "quete_logo_file({$doc}, {$qconnect})"; } else { $code = "quete_logo_document({$doc}, " . ($lien ? $lien : "''") . ", '{$align}', '{$mode_logo}', {$coord_x}, {$coord_y}, {$qconnect})"; } // (x=non-faux ? y : '') pour affecter x en retournant y if ($p->descr['documents']) { $code = '(($doublons["documents"] .= ",". ' . $_id_objet . ") ? {$code} : '')"; } } elseif ($connect) { $code = "''"; spip_log("Les logos distants ne sont pas prevus"); } else { $code = logo_survol($id_objet, $_id_objet, $type, $align, $fichier, $lien, $p, $suite_logo); } // demande de reduction sur logo avec ecriture spip 2.1 : #LOGO_xxx{200, 0} if ($coord_x or $coord_y) { $code = "filtrer('image_graver',filtrer('image_reduire'," . $code . ", '{$coord_x}', '{$coord_y}'))"; } $p->code = $code; $p->interdire_scripts = false; return $p; }
function compiler_squelette($squelette, $boucles, $nom, $descr, $sourcefile, $connect = ''){ global $tables_jointures; static $trouver_table; spip_timer('calcul_skel'); if (isset($GLOBALS['var_mode']) AND $GLOBALS['var_mode']=='debug'){ $GLOBALS['debug_objets']['squelette'][$nom] = $descr['squelette']; $GLOBALS['debug_objets']['sourcefile'][$nom] = $sourcefile; if (!isset($GLOBALS['debug_objets']['principal'])) $GLOBALS['debug_objets']['principal'] = $nom; } foreach ($boucles as $id => $boucle){ $GLOBALS['debug_objets']['boucle'][$nom . $id] = $boucle; } $descr['documents'] = compile_inclure_doublons($squelette); // Demander la description des tables une fois pour toutes // et reperer si les doublons sont demandes // pour un inclure ou une boucle document // c'est utile a la fonction champs_traitements if (!$trouver_table) $trouver_table = charger_fonction('trouver_table', 'base'); foreach ($boucles as $id => $boucle){ if (!($type = $boucle->type_requete)) continue; if (!$descr['documents'] AND ( (($type=='documents') AND $boucle->doublons) OR compile_inclure_doublons($boucle->avant) OR compile_inclure_doublons($boucle->apres) OR compile_inclure_doublons($boucle->milieu) OR compile_inclure_doublons($boucle->altern)) ) $descr['documents'] = true; if ($type!='boucle'){ if (!$boucles[$id]->sql_serveur AND $connect) $boucles[$id]->sql_serveur = $connect; $show = $trouver_table($type, $boucles[$id]->sql_serveur); // si la table n'existe pas avec le connecteur par defaut, // c'est peut etre une table qui necessite son connecteur dedie fourni // permet une ecriture allegee (GEO) -> (geo:GEO) if (!$show AND $show = $trouver_table($type, strtolower($type))) $boucles[$id]->sql_serveur = strtolower($type); if ($show){ $boucles[$id]->show = $show; // recopie les infos les plus importantes $boucles[$id]->primary = $show['key']["PRIMARY KEY"]; $boucles[$id]->id_table = $x = $show['id_table']; $boucles[$id]->from[$x] = $nom_table = $show['table']; $boucles[$id]->descr = &$descr; if ((!$boucles[$id]->jointures) AND (isset($tables_jointures[$nom_table])) AND is_array($x = $tables_jointures[$nom_table]) ) $boucles[$id]->jointures = $x; if ($boucles[$id]->jointures_explicites){ $jointures = preg_split("/\s+/", $boucles[$id]->jointures_explicites); while ($j = array_pop($jointures)) array_unshift($boucles[$id]->jointures, $j); } } else { // Pas une erreur si la table est optionnelle if ($boucles[$id]->table_optionnelle) $boucles[$id]->type_requete = ''; else { $boucles[$id]->type_requete = false; $boucle = $boucles[$id]; $x = (!$boucle->sql_serveur ? '' : ($boucle->sql_serveur . ":")) . $type; $msg = array('zbug_table_inconnue', array('table' => $x)); erreur_squelette($msg, $boucle); } } } } // Commencer par reperer les boucles appelees explicitement // car elles indexent les arguments de maniere derogatoire foreach ($boucles as $id => $boucle){ if ($boucle->type_requete=='boucle' AND $boucle->param){ $boucles[$id]->descr = &$descr; $rec = &$boucles[$boucle->param[0]]; if (!$rec){ $msg = array('zbug_boucle_recursive_undef', array('nom' => $boucle->param[0])); erreur_squelette($msg, $boucle); $boucles[$id]->type_requete = false; } else { $rec->externe = $id; $descr['id_mere'] = $id; $boucles[$id]->return = calculer_liste(array($rec), $descr, $boucles, $boucle->param); } } } foreach ($boucles as $id => $boucle){ $id = strval($id); // attention au type dans index_pile $type = $boucle->type_requete; if ($type AND $type!='boucle'){ $crit = !$boucle->param ? true : calculer_criteres($id, $boucles); $descr['id_mere'] = $id; $boucles[$id]->return = calculer_liste($boucle->milieu, $descr, $boucles, $id); // Si les criteres se sont mal compiles // ne pas tenter d'assembler le code final // (mais compiler le corps pour detection d'erreurs) if (is_array($crit)) $boucles[$id]->type_requete = false; } } // idem pour la racine $descr['id_mere'] = ''; $corps = calculer_liste($squelette, $descr, $boucles); $debug = (isset($GLOBALS['var_mode']) AND $GLOBALS['var_mode']=='debug'); if ($debug){ include_spip('public/decompiler'); include_spip('public/format_' . _EXTENSION_SQUELETTES); } // Calcul du corps de toutes les fonctions PHP, // en particulier les requetes SQL et TOTAL_BOUCLE // de'terminables seulement maintenant foreach ($boucles as $id => $boucle){ $boucle = $boucles[$id] = pipeline('pre_boucle', $boucle); if ($boucle->return===false) continue; // appeler la fonction de definition de la boucle if ($req = $boucle->type_requete){ $f = 'boucle_' . strtoupper($req); // si pas de definition perso, definition spip if (!function_exists($f)) $f = $f . '_dist'; // laquelle a une definition par defaut if (!function_exists($f)) $f = 'boucle_DEFAUT'; if (!function_exists($f)) $f = 'boucle_DEFAUT_dist'; $req = "\n\n\tstatic \$connect = " . _q($boucle->sql_serveur) . ";" . $f($id, $boucles); } else $req = ("\n\treturn '';"); $boucles[$id]->return = "function BOUCLE" . strtr($id, "-", "_") . $nom . '(&$Cache, &$Pile, &$doublons, &$Numrows, $SP) {' . $req . "\n}\n\n"; if ($debug) $GLOBALS['debug_objets']['code'][$nom . $id] = $boucles[$id]->return; } // Au final, si le corps ou un critere au moins s'est mal compile // retourner False, sinon inserer leur decompilation if (is_bool($corps)) return false; foreach ($boucles as $id => $boucle){ if ($boucle->return===false) return false; $boucle->return = "\n\n/* BOUCLE " . $boucle->type_requete . " " . (!$debug ? '' : str_replace('*/', '* /', decompiler_criteres($boucle->param, $boucle->criteres))) . " */\n\n " . $boucle->return; } $secondes = spip_timer('calcul_skel'); spip_log("COMPIL ($secondes) [$sourcefile] $nom.php"); // $connect n'est pas sûr : on nettoie $connect = preg_replace(',[^\w],', '', $connect); // Assimiler la fct principale a une boucle anonyme, c'est plus simple $code = new Boucle; $code->descr = $descr; $code->return = ' // // Fonction principale du squelette ' . $sourcefile . ($connect ? " pour $connect" : '') . (!CODE_COMMENTE ? '' : "\n// Temps de compilation total: $secondes") . "\n//" . (!$debug ? '' : ("\n/*\n" . str_replace('*/', '* /', public_decompiler($squelette)) . "\n*/")) . " function " . $nom . '($Cache, $Pile, $doublons=array(), $Numrows=array(), $SP=0) { ' // reporter de maniere securisee les doublons inclus . ' if (isset($Pile[0]["doublons"]) AND is_array($Pile[0]["doublons"])) $doublons = nettoyer_env_doublons($Pile[0]["doublons"]); $connect = ' . _q($connect) . '; $page = ' . // ATTENTION, le calcul de l'expression $corps affectera $Cache // c'est pourquoi on l'affecte a la variable auxiliaire $page. // avant de referencer $Cache $corps . "; return analyse_resultat_skel(" . var_export($nom, true) . ", \$Cache, \$page, " . var_export($sourcefile, true) . "); }"; $boucles[''] = $code; return $boucles; }
/** * Relâcher un verrou SQL local * * @deprecated Pas d'équivalence actuellement en dehors de MySQL * @see spip_get_lock() * * @param string $nom * Inutilisé. Le nom est calculé en fonction de la connexion principale * @return string|bool * True si réussite, false sinon. */ function spip_release_lock($nom) { $connexion =& $GLOBALS['connexions'][0]; $bd = $connexion['db']; $prefixe = $connexion['prefixe']; $nom = "{$bd}:{$prefixe}:{$nom}" . _LOCK_TIME; $connexion['last'] = $q = "SELECT RELEASE_LOCK(" . _q($nom) . ")"; @mysql_query($q); }
function type_urls_edit_urls_1_action() { // forms[1] : editer un objet (cas SPIP < 2.0) $type = _request('ar_type_objet'); $table = $type.($type=='syndic'?'':'s'); $id = intval(_request('ar_num_objet')); $url = trim(_request('ar_url_objet')); $q = "UPDATE spip_$table SET url_propre="._q($url)." WHERE id_$type=$id"; spip_query($q); redirige_vers_exec(array('ar_num_objet' => _request('ar_num_objet'), 'ar_type_objet' => _request('ar_type_objet'))); }
function calculer_parties(&$boucles, $id_boucle, $debut, $mode) { $total_parties = $boucles[$id_boucle]->total_parties; preg_match(",([+-/p])([+-/])?,", $mode, $regs); list(,$op1,$op2) = $regs; $nombre_boucle = "\$Numrows['$id_boucle']['total']"; // {1/3} if ($op1 == '/') { $pmoins1 = is_numeric($debut) ? ($debut-1) : "($debut-1)"; $totpos = is_numeric($total_parties) ? ($total_parties) : "($total_parties ? $total_parties : 1)"; $fin = "ceil(($nombre_boucle * $debut )/$totpos) - 1"; $debut = !$pmoins1 ? 0 : "ceil(($nombre_boucle * $pmoins1)/$totpos);"; } else { // cas {n-1,x} if ($op1 == '-') $debut = "$nombre_boucle - $debut;"; // cas {x,n-1} if ($op2 == '-') { $fin = '$debut_boucle + '.$nombre_boucle.' - ' . (is_numeric($total_parties) ? ($total_parties+1) : ($total_parties . ' - 1')); } else { // {x,1} ou {pagination} $fin = '$debut_boucle' . (is_numeric($total_parties) ? (($total_parties==1) ? "" :(' + ' . ($total_parties-1))): ('+' . $total_parties . ' - 1')); } // {pagination}, gerer le debut_xx=-1 pour tout voir if ($op1 == 'p') { $debut .= ";\n \$debut_boucle = ((\$tout=(\$debut_boucle == -1))?0:(\$debut_boucle))"; $debut .= ";\n \$debut_boucle = max(0,min(\$debut_boucle,floor(($nombre_boucle-1)/($total_parties))*($total_parties)))"; $fin = "(\$tout ? $nombre_boucle : $fin)"; } } // Notes : // $debut_boucle et $fin_boucle sont les indices SQL du premier // et du dernier demandes dans la boucle : 0 pour le premier, // n-1 pour le dernier ; donc total_boucle = 1 + debut - fin // Utiliser min pour rabattre $fin_boucle sur total_boucle. $boucles[$id_boucle]->mode_partie = "\n\t" . '$debut_boucle = ' . $debut . ";\n " . '$fin_boucle = min(' . $fin . ", \$Numrows['$id_boucle']['total'] - 1);\n " . '$Numrows[\''.$id_boucle. "']['grand_total'] = \$Numrows['$id_boucle']['total'];\n " . '$Numrows[\''.$id_boucle.'\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);' . "\n\tif (\$debut_boucle>0 AND \$debut_boucle < \$Numrows['$id_boucle']['grand_total'] AND sql_seek(\$result,\$debut_boucle,"._q($boucles[$id_boucle]->sql_serveur).",'continue'))\n\t\t\$Numrows['$id_boucle']['compteur_boucle'] = \$debut_boucle;\n\t"; $boucles[$id_boucle]->partie = " if (\$Numrows['$id_boucle']['compteur_boucle'] <= \$debut_boucle) continue; if (\$Numrows['$id_boucle']['compteur_boucle']-1 > \$fin_boucle) break;"; }
function balise_PARAMETRES_FORUM_dist($p) { // s'il y a un id_article dans le contexte, regarder le statut // accepter_forum de cet article $_id_article = champ_sql('id_article', $p); $p->code = ' // refus des forums ? (quete_accepter_forum(' . $_id_article . ')=="non" OR ($GLOBALS["meta"]["forums_publics"] == "non" AND quete_accepter_forum(' . $_id_article . ') == "")) ? "" : // sinon: '; // pas de calculs superflus si le site est monolingue $lang = strpos($GLOBALS['meta']['langues_utilisees'], ','); // si on est dans une boucle de forums, c'est une reponse if ($p->type_requete == 'forums') { $_id_reponse = champ_sql('id_forum', $p); } else { $_id_reponse = "null"; } // objet et id_objet principaux sont a determiner // dans le contexte ; on demande en tout etat de cause // a la boucle mere de reserver son id_primary if ($p->id_boucle and isset($p->boucles[$p->id_boucle]) and $primary = $p->boucles[$p->id_boucle]->primary) { $_type = _q($p->boucles[$p->id_boucle]->type_requete); $_primary = champ_sql($primary, $p); } else { $_type = "null"; $_primary = "null"; } // le code de base des parametres $c = 'calcul_parametres_forum($Pile[0],' . $_id_reponse . ',' . $_type . ',' . $_primary . ')'; // ajouter la lang, eventuellement donnee par le contexte if ($lang) { $_lang = champ_sql('lang', $p); $c = "lang_parametres_forum({$c},{$_lang})"; } // Syntaxe [(#PARAMETRES_FORUM{#SELF})] pour fixer le retour du forum # note : ce bloc qui sert a recuperer des arguments calcules pourrait # porter un nom et faire partie de l'API. $retour = interprete_argument_balise(1, $p); if ($retour === null) { $retour = "''"; } // Attention un eventuel &retour=xxx dans l'URL est prioritaire $c .= '. (($lien = (_request("retour") ? _request("retour") : str_replace("&", "&", ' . $retour . '))) ? "&retour=".rawurlencode($lien) : "")'; $c = '(' . $c . ')'; // Ajouter le code d'invalideur specifique a cette balise include_spip('inc/invalideur'); if ($i = charger_fonction('code_invalideur_forums', '', true)) { $p->code .= $i($p, $c); } else { $p->code .= $c; } $p->interdire_scripts = false; return $p; }
<?php if (!defined('__KIMS__')) { exit; } checkAdmin(0); $name = trim($name); $name = str_replace('http://', '', $name); $name = str_replace('/', '', $name); if ($vtype == 'sub') { $name = $name . $_fdomain; } if ($cat && !$vtype) { $R = getDbData($table['s_domain'], "uid<>" . $cat . " and name='" . $name . "'", '*'); if ($R['uid']) { getLink('', '', _q('This is a domain already has registered.', 'a1001', 'domain'), ''); } getDbUpdate($table['s_domain'], "name='{$name}',site='{$site}'", 'uid=' . $cat); getLink('reload', 'parent.', '', ''); } else { $R = getDbData($table['s_domain'], "name='" . $name . "'", '*'); if ($R['uid']) { getLink('', '', _LANG('a1001', 'domain'), ''); } $MAXC = getDbCnt($table['s_domain'], 'max(gid)', 'depth=' . ($depth + 1) . ' and parent=' . $parent); $gid = $MAXC + 1; $xdepth = $depth + 1; getDbInsert($table['s_domain'], "gid,is_child,parent,depth,name,site", "'{$gid}','0','{$parent}','{$xdepth}','{$name}','{$site}'"); if ($parent) { getDbUpdate($table['s_domain'], 'is_child=1', 'uid=' . $parent); }
function spip_pg_showtable($nom_table, $serveur = '', $requeter = true) { $connexion =& $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]; $link = $connexion['link']; $connexion['last'] = $q = "SELECT column_name, column_default, data_type FROM information_schema.columns WHERE table_name ILIKE " . _q($nom_table); $res = spip_pg_query_simple($link, $q); if (!$res) { return false; } // etrangement, $res peut ne rien contenir, mais arriver ici... // il faut en tenir compte dans le return $fields = array(); while ($field = pg_fetch_array($res, NULL, PGSQL_NUM)) { $fields[$field[0]] = $field[2] . (!$field[1] ? '' : " DEFAULT " . $field[1]); } $connexion['last'] = $q = "SELECT indexdef FROM pg_indexes WHERE tablename ILIKE " . _q($nom_table); $res = spip_pg_query_simple($link, $q); $keys = array(); while ($index = pg_fetch_array($res, NULL, PGSQL_NUM)) { if (preg_match('/CREATE\\s+(UNIQUE\\s+)?INDEX\\s([^\\s]+).*\\((.*)\\)$/', $index[0], $r)) { $nom = str_replace($nom_table . '_', '', $r[2]); $keys[$r[1] ? "PRIMARY KEY" : "KEY " . $nom] = $r[3]; } } return count($fields) ? array('field' => $fields, 'key' => $keys) : false; }
$GLOBALS['couleur_claire'] = $GLOBALS['couleurs_spip'][$choix_couleur]['couleur_claire']; // charger l'affichage minimal et initialiser a la langue par defaut include_spip('inc/minipres'); // si la langue est specifiee par cookie alors ... if (isset($GLOBALS['_COOKIE']['spip_lang_ecrire'])) { $spip_lang_ecrire = $GLOBALS['_COOKIE']['spip_lang_ecrire']; // si pas authentifie, changer juste pour cette execution if ($var_auth) changer_langue($GLOBALS['_COOKIE']['spip_lang_ecrire']); // si authentifie, changer definitivement si ce n'est fait else { if (($spip_lang_ecrire <> $GLOBALS['auteur_session']['lang']) AND changer_langue($spip_lang_ecrire)) { spip_query("UPDATE spip_auteurs SET lang = " . _q($spip_lang_ecrire) . " WHERE id_auteur = " . intval($GLOBALS['auteur_session']['id_auteur'])); $GLOBALS['auteur_session']['lang'] = $var_lang_ecrire; $session = charger_fonction('session', 'inc'); $session($GLOBALS['auteur_session']); } } } utiliser_langue_visiteur(); define('_TRANCHES', 10); // // Gestion d'une page normale de l'espace prive //
function enregistrer_entites($entites = array(), $id_article) { // effacer les entites deja enregistrées pour cet article (maj) include_spip("base/abstract_sql"); //var_dump("delete from entites_nommees where id_article=$id_article"); sql_query("delete from entites_nommees where id_article={$id_article}"); if (is_array($entites)) { foreach ($entites as $entite) { /* if(preg_match("/^a\|/", $entite)){ var_dump("enregis",$entite); exit ; } */ if (preg_match("/^\\|/", $entite)) { var_dump("alert pas d'entite", $entite, $entites); continue; } $e = explode("|", $entite); $id_article_entite = $e[2]; $extrait = _q($e[3]); $entite = _q($e[0]); $type_entite = _q($e[1]); $date = _q(sql_getfetsel("date_redac", "spip_articles", "id_article={$id_article}")); //var_dump($date); $req = "INSERT INTO entites_nommees (entite, type_entite, id_article, extrait, date) VALUES ({$entite},{$type_entite},{$id_article_entite},{$extrait},{$date})"; sql_query($req); //var_dump("<pre>",$req,"</pre>"); } } }
/** * Compile le critère `branche` qui sélectionne dans une boucle les * éléments appartenant à une branche d'une rubrique. * * Cherche l'identifiant de la rubrique en premier paramètre du critère {branche XX} * s'il est renseigné, sinon, sans paramètre ({branche} tout court) dans les * boucles parentes. On calcule avec lui la liste des identifiants * de rubrique de toute la branche. * * La boucle qui possède ce critère cherche une liaison possible avec * la colonne id_rubrique, et tentera de trouver une jointure avec une autre * table si c'est nécessaire pour l'obtenir. * * @link http://www.spip.net/@branche * * @param string $idb Identifiant de la boucle * @param array $boucles AST du squelette * @param Critere $crit Paramètres du critère dans cette boucle * @return void **/ function critere_branche_dist($idb, &$boucles, $crit) { $not = $crit->not; $boucle =& $boucles[$idb]; // prendre en priorite un identifiant en parametre {branche XX} if (isset($crit->param[0])) { $arg = calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent); // sinon on le prend chez une boucle parente } else { $arg = kwote(calculer_argument_precedent($idb, 'id_rubrique', $boucles)); } //Trouver une jointure $champ = "id_rubrique"; $desc = $boucle->show; //Seulement si necessaire if (!array_key_exists($champ, $desc['field'])) { $cle = trouver_jointure_champ($champ, $boucle); $trouver_table = charger_fonction("trouver_table", "base"); $desc = $trouver_table($boucle->from[$cle]); if (count(trouver_champs_decomposes($champ, $desc)) > 1) { $decompose = decompose_champ_id_objet($champ); $champ = array_shift($decompose); $boucle->where[] = array("'='", _q($cle . "." . reset($decompose)), '"' . sql_quote(end($decompose)) . '"'); } } else { $cle = $boucle->id_table; } $c = "sql_in('{$cle}" . ".{$champ}', calcul_branche_in({$arg})" . ($not ? ", 'NOT'" : '') . ")"; $boucle->where[] = !$crit->cond ? $c : "({$arg} ? {$c} : " . ($not ? "'0=1'" : "'1=1'") . ')'; }
function legender_auteur_voir($auteur) { global $spip_lang_right; $res = ""; $id_auteur = $auteur['id_auteur']; // Bouton "modifier" ? if (autoriser('modifier', 'auteur', $id_auteur)) { $res .= "<span id='bouton_modifier_auteur'>"; if (_request('edit') == 'oui') { $clic = _T('icone_retour'); $retour = _T('admin_modifier_auteur'); } else { $clic = _T('admin_modifier_auteur'); $retour = _T('icone_retour'); } $h = generer_url_ecrire("auteur_infos","id_auteur=$id_auteur&edit=oui"); $h = "<a\nhref='$h'>$clic</a>"; $res .= icone_inline($clic, $h, "redacteurs-24.gif", "edit.gif", $spip_lang_right); $res .= http_script(" var intitule_bouton = "._q($retour)."; jQuery('#bouton_modifier_auteur a') .click(function() { jQuery('#auteur_infos_edit') .toggle(); jQuery('#auteur-voir') .toggle(); return false; });"); $res .= "</span>\n"; } $res .= gros_titre( sinon($auteur['nom'],_T('item_nouvel_auteur')), '',false); $res .= "<div class='nettoyeur'></div>"; $contenu_auteur = ""; if (strlen($auteur['email'])) $contenu_auteur .= "<div>"._T('email_2') ." <b><a href='mailto:".htmlspecialchars($auteur['email'])."'>" .$auteur['email']."</a></b></div>"; // message d'information d'envoi d'email pour modif et de confirmation // on ne fait ici qu'informer, sans aucune action if ($email = _request('email_confirm')){ $contenu_auteur .= "<p><strong>"._T('form_auteur_envoi_mail_confirmation',array('email'=>$email))."</strong></p>"; } elseif (_request('email_modif')==='ok'){ $contenu_auteur .= "<p><strong>"._T('form_auteur_email_modifie')."</strong></p>"; } if ($auteur['url_site']) { if (!$auteur['nom_site']) $auteur['nom_site'] = _T('info_site'); $contenu_auteur .= propre(_T('info_site_2')." [{{".$auteur['nom_site']."}}->".$auteur['url_site']."]"); } if (strlen($auteur['bio'])) { $contenu_auteur .= propre("<quote>".$auteur['bio']."</quote>"); } if (strlen($auteur['pgp'])) { $contenu_auteur .= propre("PGP: <cadre>".$auteur['pgp']."</cadre>"); } $contexte = array('id'=>$id_auteur); // permettre aux plugin de faire des modifs ou des ajouts $contenu_auteur = pipeline('afficher_contenu_objet', array( 'args'=>array( 'type'=>'auteur', 'id_objet'=>$id_auteur, 'contexte'=>$contexte ), 'data'=> $contenu_auteur ) ); $res .= "<div id='auteur_infos_voir'>$contenu_auteur</div>\n"; return $res; }
/** * Calcul des critères {suivant} et {precedent} (avant l'existence d'Iterateurs). * On reprend en grande partie le fonctionnement de {pagination} avec debut_xx=@yy * en jouant de sql_seek pour se déplacer à la bonne position sur les résultats de * la boucle. * * @param string $type type de décalage : 'suivant' ou 'precedent' **/ function calculer_critere_suivant_precedent_dist($idb, &$boucles, $crit, $type) { $boucle = &$boucles[$idb]; $primary = $boucle->primary; $arg = kwote(calculer_argument_precedent($idb, $primary, $boucles)); $partie = "0;\n" ."\tif (\$id_actuel = $arg) {\n" ."\t\t".'$debut_boucle = quete_position_primary(\''.$primary.'\', $id_actuel, "'.$type.'", $result, '._q($boucle->sql_serveur).');'."\n" // pas de resultat, on cree une selection vide ."\t\t".'if ($debut_boucle === false){'."\n" ."\t\t\t".'@sql_free($result,'._q($boucle->sql_serveur).");\n" ."\t\t\t"."\$where[] = array('=','0','1');\n" // forcer 0 resultat ."\t\t\t".'$result = calculer_select($select, $from, $type, $where, $join, $groupby, $orderby, $limit, $having, $table, $id, $connect);'."\n" //."\t\t\t"."\$Numrows['$idb']['total'] = 0;\n" ."\t\t} else {\n" // si on a des resultats, il faut remettre le compteur a zero. ."\t\t".'if (!sql_seek($result,0,'._q($boucle->sql_serveur).")){\n" ."\t\t\t".'@sql_free($result,'._q($boucle->sql_serveur).");\n" ."\t\t\t".'$result = calculer_select($select, $from, $type, $where, $join, $groupby, $orderby, $limit, $having, $table, $id, $connect);'."\n" ."\t\t}\n" // donner un bon GRAND_TOTAL pour la fonction calculer_parties() // NAN ça marche pas non plus... mah que passa ? //."\t\t\t"."\$Numrows['$idb']['total'] = (\$Numrows['$idb']['total'] >= 1 ? 2 : 0);\n" ."\t\t}\n" ."\t}\n" ."\t".'$debut_boucle = intval($debut_boucle)'; $boucle->total_parties = 1; calculer_parties($boucles, $idb, $partie, '++'); // ajouter la cle primaire dans le select // sauf si pas de primaire, ou si primaire composee // dans ce cas, on ne sait pas gerer une pagination indirecte // : il faut id_xx dans le select pour la fonction quete_position_primary() $t = $boucle->id_table . '.' . $primary; if ($boucle->primary AND !preg_match('/[,\s]/',$primary) AND !in_array($t, $boucle->select)) { $boucle->select[]= $t; } // forcer le compilo à ne pas prendre en static a cause du $where fluctuant $boucle->where[]= array("'='","'1'","sql_quote(1)"); }
function compiler_squelette($squelette, $boucles, $nom, $descr, $sourcefile, $connect = '') { static $trouver_table; spip_timer('calcul_skel'); if (defined('_VAR_MODE') and _VAR_MODE == 'debug') { $GLOBALS['debug_objets']['squelette'][$nom] = $descr['squelette']; $GLOBALS['debug_objets']['sourcefile'][$nom] = $sourcefile; if (!isset($GLOBALS['debug_objets']['principal'])) { $GLOBALS['debug_objets']['principal'] = $nom; } } foreach ($boucles as $id => $boucle) { $GLOBALS['debug_objets']['boucle'][$nom . $id] = $boucle; } $descr['documents'] = compile_inclure_doublons($squelette); // Demander la description des tables une fois pour toutes // et reperer si les doublons sont demandes // pour un inclure ou une boucle document // c'est utile a la fonction champs_traitements if (!$trouver_table) { $trouver_table = charger_fonction('trouver_table', 'base'); } foreach ($boucles as $id => $boucle) { if (!($type = $boucle->type_requete)) { continue; } if (!$descr['documents'] and ($type == 'documents' and $boucle->doublons or compile_inclure_doublons($boucle->avant) or compile_inclure_doublons($boucle->apres) or compile_inclure_doublons($boucle->milieu) or compile_inclure_doublons($boucle->altern))) { $descr['documents'] = true; } if ($type != TYPE_RECURSIF) { if (!$boucles[$id]->sql_serveur and $connect) { $boucles[$id]->sql_serveur = $connect; } // chercher dans les iterateurs du repertoire iterateur/ if ($g = charger_fonction(preg_replace('/\\W/', '_', $boucle->type_requete), 'iterateur', true)) { $boucles[$id] = $g($boucle); // sinon, en cas de requeteur d'un type predefini, // utiliser les informations donnees par le requeteur // cas "php:xx" et "data:xx". } else { if ($boucle->sql_serveur and $requeteur = charger_fonction($boucle->sql_serveur, 'requeteur', true)) { $requeteur($boucles, $boucle, $id); // utiliser la description des champs transmis } else { $show = $trouver_table($type, $boucles[$id]->sql_serveur); // si la table n'existe pas avec le connecteur par defaut, // c'est peut etre une table qui necessite son connecteur dedie fourni // permet une ecriture allegee (GEO) -> (geo:GEO) if (!$show and $show = $trouver_table($type, strtolower($type))) { $boucles[$id]->sql_serveur = strtolower($type); } if ($show) { $boucles[$id]->show = $show; // recopie les infos les plus importantes $boucles[$id]->primary = isset($show['key']["PRIMARY KEY"]) ? $show['key']["PRIMARY KEY"] : ''; $boucles[$id]->id_table = $x = preg_replace(",^spip_,", "", $show['id_table']); $boucles[$id]->from[$x] = $nom_table = $show['table']; $boucles[$id]->iterateur = 'SQL'; $boucles[$id]->descr =& $descr; if (!$boucles[$id]->jointures and is_array($show['tables_jointures']) and count($x = $show['tables_jointures'])) { $boucles[$id]->jointures = $x; } if ($boucles[$id]->jointures_explicites) { $jointures = preg_split("/\\s+/", $boucles[$id]->jointures_explicites); while ($j = array_pop($jointures)) { array_unshift($boucles[$id]->jointures, $j); } } } else { // Pas une erreur si la table est optionnelle if ($boucles[$id]->table_optionnelle) { $boucles[$id]->type_requete = ''; } else { $boucles[$id]->type_requete = false; $boucle = $boucles[$id]; $x = (!$boucle->sql_serveur ? '' : $boucle->sql_serveur . ":") . $type; $msg = array('zbug_table_inconnue', array('table' => $x)); erreur_squelette($msg, $boucle); } } } } } } // Commencer par reperer les boucles appelees explicitement // car elles indexent les arguments de maniere derogatoire foreach ($boucles as $id => $boucle) { if ($boucle->type_requete == TYPE_RECURSIF and $boucle->param) { $boucles[$id]->descr =& $descr; $rec =& $boucles[$boucle->param[0]]; if (!$rec) { $msg = array('zbug_boucle_recursive_undef', array('nom' => $boucle->param[0])); erreur_squelette($msg, $boucle); $boucles[$id]->type_requete = false; } else { $rec->externe = $id; $descr['id_mere'] = $id; $boucles[$id]->return = calculer_liste(array($rec), $descr, $boucles, $boucle->param); } } } foreach ($boucles as $id => $boucle) { $id = strval($id); // attention au type dans index_pile $type = $boucle->type_requete; if ($type and $type != TYPE_RECURSIF) { $res = ''; if ($boucle->param) { // retourne un tableau en cas d'erreur $res = calculer_criteres($id, $boucles); } $descr['id_mere'] = $id; $boucles[$id]->return = calculer_liste($boucle->milieu, $descr, $boucles, $id); // Si les criteres se sont mal compiles // ne pas tenter d'assembler le code final // (mais compiler le corps pour detection d'erreurs) if (is_array($res)) { $boucles[$id]->type_requete = false; } } } // idem pour la racine $descr['id_mere'] = ''; $corps = calculer_liste($squelette, $descr, $boucles); // Calcul du corps de toutes les fonctions PHP, // en particulier les requetes SQL et TOTAL_BOUCLE // de'terminables seulement maintenant foreach ($boucles as $id => $boucle) { $boucle = $boucles[$id] = pipeline('pre_boucle', $boucle); if ($boucle->return === false) { $corps = false; continue; } // appeler la fonction de definition de la boucle if ($req = $boucle->type_requete) { // boucle personnalisée ? $table = strtoupper($boucle->type_requete); $serveur = strtolower($boucle->sql_serveur); if ((!$serveur or !function_exists($f = "boucle_" . $serveur . "_" . $table) and !function_exists($f = $f . "_dist")) and !function_exists($f = "boucle_" . $table) and !function_exists($f = $f . "_dist")) { // fonction de boucle standard if (!function_exists($f = 'boucle_DEFAUT')) { $f = 'boucle_DEFAUT_dist'; } } $req = "\n\n\tstatic \$command = array();\n\t" . "static \$connect;\n\t" . "\$command['connect'] = \$connect = " . _q($boucle->sql_serveur) . ";" . $f($id, $boucles); } else { $req = "\n\treturn '';"; } $boucles[$id]->return = "\n\nfunction BOUCLE" . strtr($id, "-", "_") . $nom . '(&$Cache, &$Pile, &$doublons, &$Numrows, $SP) {' . $req . "\n}\n"; } // Au final, si le corps ou un critere au moins s'est mal compile // retourner False, sinon inserer leur decompilation if (is_bool($corps)) { return false; } $principal = "\nfunction " . $nom . '($Cache, $Pile, $doublons=array(), $Numrows=array(), $SP=0) { ' . ' if (isset($Pile[0]["doublons"]) AND is_array($Pile[0]["doublons"])) $doublons = nettoyer_env_doublons($Pile[0]["doublons"]); $connect = ' . _q($connect) . '; $page = ' . $corps . ";\n\n\treturn analyse_resultat_skel(" . var_export($nom, true) . ", \$Cache, \$page, " . var_export($sourcefile, true) . ");\n}"; $secondes = spip_timer('calcul_skel'); spip_log("COMPIL ({$secondes}) [{$sourcefile}] {$nom}.php"); // $connect n'est pas sûr : on nettoie $connect = preg_replace(',[^\\w],', '', $connect); // Assimiler la fct principale a une boucle anonyme, pour retourner un resultat simple $code = new Boucle(); $code->descr = $descr; $code->return = ' // // Fonction principale du squelette ' . $sourcefile . ($connect ? " pour {$connect}" : '') . (!CODE_COMMENTE ? '' : "\n// Temps de compilation total: {$secondes}") . "\n//\n" . $principal; $boucles[''] = $code; return $boucles; }
function balise_LANGUE_PREFEREE_SECTEUR_REDIRECTION_dyn($liste_rub_exclues="") { include_spip('inc/meta'); // Recuperation des langues des secteurs $langues_secteurs = array(); include_spip('base/abstract_sql'); $query = 'SELECT DISTINCT(lang) FROM spip_rubriques WHERE id_parent=0 AND statut="publie" GROUP BY lang'; if ($res = sql_query($query)) { // was spip_query($query)) { while($row = sql_fetch($res)) { // was spip_fetch_array $langues_secteurs[] = $row['lang']; } } // Détection de la langue preferee if (isset($_GET['lang']) && in_array($_GET['lang'], $langues_secteurs)) { // Soit passee dans l'url, auquel cas c'est un choix qu'on conserve pour la suite $langue_preferee = $_GET['lang']; include_spip('inc/cookie'); // On pose un cookie d'un an de duree de vie spip_setcookie('spip_langue_preferee', $langue_preferee, time() + 3660*24*365, chemin_cookie()); } elseif(isset($_COOKIE['spip_lang']) && in_array($_COOKIE['spip_lang'], $langues_secteurs)){ //Soit un cookie lang est présent $langue_preferee = $_COOKIE['spip_lang']; include_spip('inc/cookie'); // On pose un cookie d'un an de duree de vie spip_setcookie('spip_langue_preferee', $langue_preferee, time() + 3660*24*365, chemin_cookie()); }elseif (isset($_COOKIE['spip_langue_preferee']) && in_array($_COOKIE['spip_langue_preferee'], $langues_secteurs)) { // Soit deja enregistree dans un cookie $langue_preferee = $_COOKIE['spip_langue_preferee']; } else { // Soit indeterminee $langues_navigateur = getenv('HTTP_ACCEPT_LANGUAGE'); // On supprime les taux de pertinence des langues acceptees $langues_navigateur = preg_replace("/;q=[.0-9]+(,)?/", "$1", $langues_navigateur); $langues_navigateur = explode(',', $langues_navigateur); // Quelles sont les langues acceptees disponibles dans les secteurs $langues_possibles = array_intersect($langues_navigateur, $langues_secteurs); if (count($langues_possibles)) { list(, $langue_preferee) = each($langues_possibles); } else { // fr-ca -> fr $langues_navigateur_reduites = array(); foreach($langues_navigateur as $langue) { $langue_reduite = substr($langue, 0, 2); if (!in_array($langue_reduite, $langues_navigateur_reduites)) { $langues_navigateur_reduites[] = $langue_reduite; } } // Quelles sont les langues acceptees reduites disponibles dans les secteurs $langues_reduites_possibles = array_intersect($langues_navigateur_reduites, $langues_secteurs); if (count($langues_reduites_possibles)) { list(, $langue_preferee) = each($langues_reduites_possibles); } elseif (in_array(lire_meta('langue_site'), $langues_secteurs)) { // Quelle est alors la langue par defaut du site $langue_preferee = lire_meta('langue_site'); } else { // Tant pis, on prend le premier secteur qui vient... list(, $langue_preferee) = each($langues_secteurs); } } } // On recupere l'id du premier secteur trouve correspondant a la langue preferee (tant pis s'il y en a plusieurs) if (!empty($liste_rub_exclues)) { $query='SELECT id_rubrique FROM spip_rubriques WHERE id_parent=0 AND lang='._q($langue_preferee).' AND id_rubrique NOT IN ('.$liste_rub_exclues.') LIMIT 0,1'; } else { $query = 'SELECT id_rubrique FROM spip_rubriques WHERE id_parent=0 AND lang='._q($langue_preferee).' LIMIT 0,1'; } $res = sql_query($query) ; // was spip_query($query); if ($row = sql_fetch($res)) { // was spip_fetch_array $id_rubrique = $row['id_rubrique']; if ( $GLOBALS['spip_version_code']<1.93) { // spip 1.9.x if (!function_exists('generer_url_rubrique')) { include_spip('urls/'.$GLOBALS['type_urls']); } $url_rubrique = generer_url_rubrique($id_rubrique); } else { // spip 2.x if (!function_exists('generer_url_entite')) { include_spip('inc/utils'); } $url_rubrique = generer_url_entite($id_rubrique,'rubrique'); } spip_log('Redirection vers '.$url_rubrique); header('Location: '.$url_rubrique); exit; } }
function crayons_update($id, $colval = array(), $type = '') { if (!$colval or !count($colval)) { return false; } list($distant, $table) = distant_table($type); if ($distant) { list($nom_table, $where) = table_where($type, $id); if (!$nom_table) { return false; } $update = $sep = ''; foreach ($colval as $col => $val) { $update .= $sep . '`' . $col . '`=' . _q($val); $sep = ', '; } $a = spip_query($q = 'UPDATE `' . $nom_table . '` SET ' . $update . ' WHERE ' . $where, $distant); #spip_log($q); include_spip('inc/invalideur'); suivre_invalideur($cond, $modif = true); } else { // cle primaire composee : 3-4-rubrique // calculer un where approprie // et modifier sans passer par la fonction destinee aux tables principales // on limite a SPIP 2 mini car sql_updateq n'est pas mappe dans les crayons_compat if (is_scalar($id) and $GLOBALS['spip_version_code'] >= '1.93') { list($nom_table, $where) = table_where($type, $id, true); // where sous forme de tableau $a = sql_updateq($nom_table, $colval, $where); } else { // modification d'une table principale include_spip('inc/modifier'); $a = modifier_contenu($type, $id, array(), $colval); } } return $a; }
/** * Retourne une ressource de la liste des tables de la base de données * * @param string $match * Filtre sur tables à récupérer * @param string $serveur * Connecteur de la base * @param bool $requeter * true pour éxecuter la requête * false pour retourner le texte de la requête. * @return ressource * Ressource à utiliser avec sql_fetch() **/ function spip_sqlite_showbase($match, $serveur = '', $requeter = true) { // type est le type d'entrée : table / index / view // on ne retourne que les tables (?) et non les vues... # ESCAPE non supporte par les versions sqlite <3 # return spip_sqlite_query("SELECT name FROM sqlite_master WHERE type='table' AND tbl_name LIKE "._q($match)." ESCAPE '\'", $serveur, $requeter); $match = preg_quote($match); $match = str_replace("\\\\_", "[[TIRETBAS]]", $match); $match = str_replace("\\\\%", "[[POURCENT]]", $match); $match = str_replace("_", ".", $match); $match = str_replace("%", ".*", $match); $match = str_replace("[[TIRETBAS]]", "_", $match); $match = str_replace("[[POURCENT]]", "%", $match); $match = "^{$match}\$"; return spip_sqlite_query("SELECT name FROM sqlite_master WHERE type='table' AND tbl_name REGEXP " . _q($match), $serveur, $requeter); }
/** * Compile la balise `#PUBLIE` qui indique si un objet est publié ou non * * @balise * @link http://www.spip.net/5545 * @see objet_test_si_publie() * @example * ``` * #PUBLIE : porte sur la boucle en cours * [(#PUBLIE{article, 3}|oui) ... ] : pour l'objet indiqué * ``` * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer */ function balise_PUBLIE_dist($p) { if (!($_type = interprete_argument_balise(1, $p))) { $_type = _q($p->type_requete); $_id = champ_sql($p->boucles[$p->id_boucle]->primary, $p); } else { $_id = interprete_argument_balise(2, $p); } $connect = ''; if (isset($p->boucles[$p->id_boucle])) { $connect = $p->boucles[$p->id_boucle]->sql_serveur; } $p->code = "(objet_test_si_publie(" . $_type . ",intval(" . $_id . ")," . _q($connect) . ")?' ':'')"; $p->interdire_scripts = false; return $p; }