[SPIP][PLUGINS] v3.0-->v3.2
[lhc/web/www.git] / www / ecrire / action / redirect.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2017 *
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 /**
14 * Gestion de redirection publique à la volée d'un objet éditorial en
15 * recalculant au passage son URL
16 *
17 * @package SPIP\Core\Redirections
18 **/
19
20 if (!defined('_ECRIRE_INC_VERSION')) {
21 return;
22 }
23
24 /**
25 * Script utile pour recalculer une URL symbolique dès son changement
26 *
27 * Cette action est appelé par les boutons 'Voir en ligne' ou par
28 * le fichier `.htaccess` activé lors d'une URL du genre : http://site/1234
29 *
30 * @example
31 * ```
32 * [(#VAL{redirect}
33 * |generer_url_action{type=article&id=#ID_ARTICLE}
34 * |parametre_url{var_mode,calcul}
35 * |icone_horizontale{<:icone_voir_en_ligne:>,racine})]
36 * ```
37 **/
38 function action_redirect_dist() {
39 $type = _request('type');
40 $id = intval(_request('id'));
41 $page = false;
42
43 // verifier le type ou page transmis
44 if (!preg_match('/^\w+$/', $type)) {
45 $page = _request('page');
46 if (!preg_match('/^\w+$/', $page)) {
47 return;
48 }
49 }
50
51 if ($var_mode = _request('var_mode')) {
52 // forcer la mise a jour de l'url de cet objet !
53 if (!defined('_VAR_URLS')) {
54 define('_VAR_URLS', true);
55 }
56 }
57
58 if ($page) {
59 $url = generer_url_public($page, '', true);
60 } else {
61 $url = calculer_url_redirect_entite($type, $id, $var_mode);
62 }
63
64 $status = '302';
65 if ($url) {
66 if ($var_mode) {
67 $url = parametre_url($url, 'var_mode', $var_mode);
68 }
69
70 if ($var_mode == 'preview'
71 and defined('_PREVIEW_TOKEN')
72 and _PREVIEW_TOKEN
73 and autoriser('previsualiser')
74 ) {
75 include_spip('inc/securiser_action');
76 $token = calculer_token_previsu($url);
77 $url = parametre_url($url, 'var_previewtoken', $token);
78 }
79
80 if (_request('status') and _request('status') == '301') {
81 $status = '301';
82 }
83 } else {
84 $url = generer_url_public('404', '', true);
85 }
86
87 redirige_par_entete(str_replace('&amp;', '&', $url), '', $status);
88 }
89
90 /**
91 * Retourne l’URL de l’objet sur lequel on doit rediriger
92 *
93 * On met en cache les calculs (si memoization),
94 * et on ne donne pas l’URL si la personne n’y a pas accès
95 *
96 * @param string $type
97 * @param int $id
98 * @param string $var_mode
99 */
100 function calculer_url_redirect_entite($type, $id, $var_mode) {
101 // invalider le cache à chaque modif en bdd
102 $date = 0;
103 if (isset($GLOBALS['meta']['derniere_modif'])) {
104 $date = $GLOBALS['meta']['derniere_modif'];
105 }
106 $key = "url-$date-$type-$id";
107
108 // Obtenir l’url et si elle est publié du cache memoization
109 if (function_exists('cache_get') and $desc = cache_get($key)) {
110 list($url, $publie) = $desc;
111 }
112 // Si on ne l’a pas trouvé, ou si var mode, on calcule l’url et son état publie
113 if (empty($desc) or $var_mode) {
114 $publie = objet_test_si_publie($type, $id);
115 $url = generer_url_entite_absolue($id, $type, '', '', true);
116 if (function_exists('cache_set')) {
117 cache_set($key, array($url, $publie), 3600);
118 }
119 }
120
121 // On valide l’url si elle est publiee ; sinon si preview on teste l’autorisation
122 if ($publie) {
123 return $url;
124 } elseif (defined('_VAR_PREVIEW') and _VAR_PREVIEW and autoriser('voir', $type, $id)) {
125 return $url;
126 }
127
128 return;
129 }