+
+/**
+ * Calculer le token de prévisu
+ *
+ * Il permettra de transmettre une URL publique d’un élément non encore publié,
+ * pour qu’une personne tierce le relise. Valable quelques temps.
+ *
+ * @see verifier_token_previsu()
+ * @param string $url Url à autoriser en prévisu
+ * @param int|null id_auteur qui génère le token de prévisu. Null utilisera auteur courant.
+ * @param string $alea Nom de l’alea à utiliser
+ * @return string Token, de la forme "{id}*{hash}"
+ */
+function calculer_token_previsu($url, $id_auteur = null, $alea = 'alea_ephemere') {
+ if (is_null($id_auteur)) {
+ if (!empty($GLOBALS['visiteur_session']['id_auteur'])) {
+ $id_auteur = $GLOBALS['visiteur_session']['id_auteur'];
+ }
+ }
+ if (!$id_auteur = intval($id_auteur)) {
+ return "";
+ }
+ // On nettoie l’URL de tous les var_.
+ $url = nettoyer_uri_var($url);
+
+ $token = _action_auteur('previsualiser-' . $url, $id_auteur, null, $alea);
+ return "$id_auteur-$token";
+}
+
+
+/**
+ * Vérifie un token de prévisu
+ *
+ * Découpe le token pour avoir l’id_auteur,
+ * Retrouve à partir de l’url un objet/id_objet en cours de parcours
+ * Recrée un token pour l’auteur et l’objet trouvé et le compare au token.
+ *
+ * @see calculer_token_previsu()
+ * @param string $token Token, de la forme '{id}*{hash}'
+ * @return false|array
+ * - `False` si echec,
+ * + Tableau (id auteur, type d’objet, id_objet) sinon.
+ */
+function verifier_token_previsu($token) {
+ // retrouver auteur / hash
+ $e = explode('-', $token, 2);
+ if (count($e) == 2 and is_numeric(reset($e))) {
+ $id_auteur = intval(reset($e));
+ } else {
+ return false;
+ }
+
+ // calculer le type et id de l’url actuelle
+ include_spip('inc/urls');
+ include_spip('inc/filtres_mini');
+ $url = url_absolue(self());
+
+ // verifier le token
+ $_token = calculer_token_previsu($url, $id_auteur, 'alea_ephemere');
+ if (!$_token or $token !== $_token) {
+ $_token = calculer_token_previsu($url, $id_auteur, 'alea_ephemere_ancien');
+ if (!$_token or $token !== $_token) {
+ return false;
+ }
+ }
+
+ return array(
+ 'id_auteur' => $id_auteur,
+ );
+}
+
+/**
+ * Décrire un token de prévisu en session
+ * @uses verifier_token_previsu()
+ * @return bool|array
+ */
+function decrire_token_previsu() {
+ static $desc = null;
+ if (is_null($desc)) {
+ if ($token = _request('var_previewtoken')) {
+ $desc = verifier_token_previsu($token);
+ } else {
+ $desc = false;
+ }
+ }
+ return $desc;
+}
\ No newline at end of file