1 | <?php |
---|
2 | |
---|
3 | /***************************************************************************\ |
---|
4 | * SPIP, Systeme de publication pour l'internet * |
---|
5 | * * |
---|
6 | * Copyright (c) 2001-2015 * |
---|
7 | * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * |
---|
8 | * * |
---|
9 | * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * |
---|
10 | * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * |
---|
11 | \***************************************************************************/ |
---|
12 | |
---|
13 | if (!defined("_ECRIRE_INC_VERSION")) return; |
---|
14 | |
---|
15 | function action_editer_url_dist() { |
---|
16 | |
---|
17 | // Rien a faire ici pour le moment |
---|
18 | #$securiser_action = charger_fonction('securiser_action', 'inc'); |
---|
19 | #$arg = $securiser_action(); |
---|
20 | |
---|
21 | } |
---|
22 | |
---|
23 | |
---|
24 | function url_nettoyer($titre, $longueur_maxi, $longueur_min = 0, $separateur = '-', $filtre = ''){ |
---|
25 | |
---|
26 | $titre = supprimer_tags(supprimer_numero(extraire_multi($titre))); |
---|
27 | $url = translitteration(corriger_caracteres($titre)); |
---|
28 | |
---|
29 | if ($filtre) |
---|
30 | $url = $filtre($url); |
---|
31 | |
---|
32 | // on va convertir tous les caracteres de ponctuation et espaces |
---|
33 | // a l'exception de l'underscore (_), car on veut le conserver dans l'url |
---|
34 | $url = str_replace('_', chr(7), $url); |
---|
35 | $url = @preg_replace(',[[:punct:][:space:]]+,u', ' ', $url); |
---|
36 | $url = str_replace(chr(7), '_', $url); |
---|
37 | |
---|
38 | // S'il reste trop de caracteres non latins, les gerer comme wikipedia |
---|
39 | // avec rawurlencode : |
---|
40 | if (preg_match_all(",[^a-zA-Z0-9 _]+,", $url, $r, PREG_SET_ORDER)) { |
---|
41 | foreach ($r as $regs) { |
---|
42 | $url = substr_replace($url, rawurlencode($regs[0]), |
---|
43 | strpos($url, $regs[0]), strlen($regs[0])); |
---|
44 | } |
---|
45 | } |
---|
46 | |
---|
47 | // S'il reste trop peu, renvoyer vide |
---|
48 | if (strlen($url) < $longueur_min) |
---|
49 | return ''; |
---|
50 | |
---|
51 | // Sinon couper les mots et les relier par des $separateur |
---|
52 | $mots = preg_split(",[^a-zA-Z0-9_%]+,", $url); |
---|
53 | $url = ''; |
---|
54 | foreach ($mots as $mot) { |
---|
55 | if (!strlen($mot)) continue; |
---|
56 | $url2 = $url.$separateur.$mot; |
---|
57 | |
---|
58 | // Si on depasse $longueur_maxi caracteres, s'arreter |
---|
59 | // ne pas compter 3 caracteres pour %E9 mais un seul |
---|
60 | $long = preg_replace(',%.,', '', $url2); |
---|
61 | if (strlen($long) > $longueur_maxi) { |
---|
62 | break; |
---|
63 | } |
---|
64 | |
---|
65 | $url = $url2; |
---|
66 | } |
---|
67 | $url = substr($url, 1); |
---|
68 | |
---|
69 | // On enregistre en utf-8 dans la base |
---|
70 | $url = rawurldecode($url); |
---|
71 | |
---|
72 | if (strlen($url) < $longueur_min) |
---|
73 | return ''; |
---|
74 | return $url; |
---|
75 | } |
---|
76 | |
---|
77 | function url_insert(&$set, $confirmer, $separateur){ |
---|
78 | $has_parent = true; |
---|
79 | # assurer la coherence des champs techniques si non fournis |
---|
80 | if (!isset($set['id_parent'])){ |
---|
81 | $has_parent = false; |
---|
82 | $set['id_parent'] = 0; |
---|
83 | } |
---|
84 | if (!isset($set['segments'])) |
---|
85 | $set['segments'] = count(explode('/',$set['url'])); |
---|
86 | $perma = false; |
---|
87 | if (isset($set['perma']) AND $set['perma']){ |
---|
88 | unset($set['perma']); |
---|
89 | $perma = true; |
---|
90 | } |
---|
91 | $redate = true; |
---|
92 | |
---|
93 | # le separateur ne peut pas contenir de / |
---|
94 | if (strpos($separateur,'/')!==false) |
---|
95 | $separateur = "-"; |
---|
96 | |
---|
97 | // Si l'insertion echoue, c'est une violation d'unicite. |
---|
98 | $where_urllike = 'url LIKE '.url_sql_quote_like($set['url'])." AND NOT(type=".sql_quote($set['type'])." AND id_objet=".intval($set['id_objet']).")"; |
---|
99 | $where_thisurl = $where_urllike.($has_parent?" AND id_parent=".intval($set['id_parent']):""); |
---|
100 | if ( |
---|
101 | // si pas de parent defini, il faut que cette url soit unique, independamment de id_parent |
---|
102 | // il faut utiliser un LIKE pour etre case unsensitive en sqlite |
---|
103 | (!$has_parent AND sql_countsel("spip_urls",$where_urllike)) |
---|
104 | OR @sql_insertq('spip_urls', $set) <= 0) { |
---|
105 | |
---|
106 | // On veut chiper une ancienne adresse ou prendre celle d'un repertoire deja present? |
---|
107 | if ( |
---|
108 | (!is_dir(_DIR_RACINE.$set['url']) AND !file_exists(_DIR_RACINE.$set['url'])) |
---|
109 | // un vieux url |
---|
110 | AND $vieux = sql_fetsel('*', 'spip_urls', $where_thisurl,'','perma DESC') |
---|
111 | // qui n'est pas permanente |
---|
112 | AND !$vieux['perma'] |
---|
113 | // et dont l'objet a une url plus recente |
---|
114 | AND $courant = sql_fetsel('*', 'spip_urls', |
---|
115 | 'type='.sql_quote($vieux['type']).' AND id_objet='.sql_quote($vieux['id_objet']) |
---|
116 | .' AND url<>'.sql_quote($set['url']) |
---|
117 | .' AND date>'.sql_quote($vieux['date']), '', 'date DESC', 1) |
---|
118 | ) { |
---|
119 | if ($confirmer AND !_request('ok2')) { |
---|
120 | die ("Vous voulez chiper l'URL de l'objet ".$courant['type']." " |
---|
121 | . $courant['id_objet']." qui a maintenant l'url " |
---|
122 | . $courant['url']); |
---|
123 | } |
---|
124 | $where_thisurl = "url=".sql_quote($vieux['url'])." AND id_parent=".intval($vieux['id_parent']); |
---|
125 | // si oui on le chipe |
---|
126 | sql_updateq('spip_urls', $set, $where_thisurl); |
---|
127 | sql_updateq('spip_urls', array('date' => date('Y-m-d H:i:s')), $where_thisurl); |
---|
128 | spip_log("reattribue url ".$vieux['url'] |
---|
129 | ." de ".$vieux['type']."#".$vieux['id_objet']." (parent ".$vieux['id_parent'].")" |
---|
130 | ." A ".$set['type']."#".$set['id_objet']." (parent ".$set['id_parent'].")","urls"._LOG_INFO_IMPORTANTE); |
---|
131 | } |
---|
132 | |
---|
133 | // Sinon |
---|
134 | else { |
---|
135 | |
---|
136 | // Soit c'est un Come Back d'une ancienne url propre de l'objet |
---|
137 | // Soit c'est un vrai conflit. Rajouter l'ID jusqu'a ce que ca passe, |
---|
138 | // mais se casser avant que ca ne casse. |
---|
139 | |
---|
140 | // il peut etre du a un changement de casse de l'url simplement |
---|
141 | // pour ce cas, on reecrit systematiquement l'url en plus d'actualiser la date |
---|
142 | $where = "type=".sql_quote($set['type']) |
---|
143 | ." AND id_objet=".intval($set['id_objet']) |
---|
144 | ." AND id_parent=".intval($set['id_parent']) |
---|
145 | ." AND url LIKE "; |
---|
146 | if ( |
---|
147 | !is_dir(_DIR_RACINE.$set['url']) AND !file_exists(_DIR_RACINE.$set['url']) |
---|
148 | AND sql_countsel('spip_urls', $where .url_sql_quote_like($set['url']))) { |
---|
149 | sql_updateq('spip_urls', array('url'=>$set['url'], 'date' => date('Y-m-d H:i:s')), $where .url_sql_quote_like($set['url'])); |
---|
150 | spip_log("reordonne ".$set['type']." ".$set['id_objet'],"urls"); |
---|
151 | $redate = false; |
---|
152 | } |
---|
153 | else { |
---|
154 | $set['url'] .= $separateur.$set['id_objet']; |
---|
155 | if (strlen($set['url']) > 200) |
---|
156 | //serveur out ? retourner au mieux |
---|
157 | return false; |
---|
158 | elseif (sql_countsel('spip_urls', $where . url_sql_quote_like($set['url']))) { |
---|
159 | sql_updateq('spip_urls', array('url'=>$set['url'], 'date' => date('Y-m-d H:i:s')), $where .url_sql_quote_like($set['url'])); |
---|
160 | $redate = false; |
---|
161 | } |
---|
162 | else { |
---|
163 | // remettre id_parent et perma comme il faut si besoin |
---|
164 | if (!$has_parent) unset($set['id_parent']); |
---|
165 | if ($perma) $set['perma'] = true; |
---|
166 | return url_insert($set, $confirmer, $separateur); |
---|
167 | } |
---|
168 | } |
---|
169 | } |
---|
170 | } |
---|
171 | |
---|
172 | $where_thisurl = 'url='.sql_quote($set['url'])." AND id_parent=".intval($set['id_parent']); // maj |
---|
173 | if ($redate) |
---|
174 | sql_updateq('spip_urls', array('date' => date('Y-m-d H:i:s')), $where_thisurl); |
---|
175 | |
---|
176 | // si url perma, poser le flag sur la seule url qu'on vient de mettre |
---|
177 | if ($perma) |
---|
178 | sql_update('spip_urls', array('perma' => "($where_thisurl)"), "type=".sql_quote($set['type'])." AND id_objet=".intval($set['id_objet'])); |
---|
179 | |
---|
180 | spip_log("Creation de l'url propre '" . $set['url'] . "' pour ".$set['type']." ".$set['id_objet']." (parent ".$set['id_parent']." perma ".($perma?"1":"0").")","urls"); |
---|
181 | return true; |
---|
182 | } |
---|
183 | |
---|
184 | function url_sql_quote_like($url){ |
---|
185 | return sql_quote(str_replace(array("%","_"),array("\\%","\\_"),$url))." ESCAPE ".sql_quote('\\'); |
---|
186 | } |
---|
187 | |
---|
188 | function url_verrouiller($objet, $id_objet, $url){ |
---|
189 | $where = "id_objet=".intval($id_objet)." AND type=".sql_quote($objet); |
---|
190 | $where .= " AND url=".sql_quote($url); |
---|
191 | |
---|
192 | // pour verrouiller une url, on fixe sa date dans le futur, dans 10 ans |
---|
193 | sql_updateq('spip_urls', array('date' => date('Y-m-d H:i:s',time()+10*365.25*24*3600)), $where); |
---|
194 | } |
---|
195 | |
---|
196 | function url_delete($objet, $id_objet, $url = ""){ |
---|
197 | $where = "id_objet=".intval($id_objet)." AND type=".sql_quote($objet); |
---|
198 | if (strlen($url)) |
---|
199 | $where .= " AND url=".sql_quote($url); |
---|
200 | |
---|
201 | sql_delete("spip_urls",$where); |
---|
202 | } |
---|
203 | ?> |
---|