From b4b826ea1f852c966fc7a10944a21175e10afdef Mon Sep 17 00:00:00 2001 From: =?utf8?q?St=C3=A9phane=20Jacob?= Date: Fri, 8 Apr 2011 00:36:58 +0200 Subject: [PATCH] Improves url shortener. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Jacob --- configs/platal.ini | 3 +++ htdocs/url_redirect.php | 55 ++++++++++++++++++++++++++++++++++++++++ modules/urlshortener.php | 24 ++++++++---------- templates/urlshortener/admin.tpl | 19 +++++++++++--- upgrade/1.1.1/03_url.sql | 15 +++++++++++ upgrade/1.1.1/README | 3 +++ 6 files changed, 102 insertions(+), 17 deletions(-) create mode 100644 htdocs/url_redirect.php create mode 100644 upgrade/1.1.1/03_url.sql create mode 100644 upgrade/1.1.1/README diff --git a/configs/platal.ini b/configs/platal.ini index c7e159e..a057415 100644 --- a/configs/platal.ini +++ b/configs/platal.ini @@ -104,6 +104,9 @@ secure_domain = "" ; command line. The value is computed automatically when php serves a web page. baseurl = "https://www.example.org/" +; The base url of the url shortener. +baseurl_shortener = "" + ; $globals->sitename ; The name of the site ; diff --git a/htdocs/url_redirect.php b/htdocs/url_redirect.php new file mode 100644 index 0000000..f4e25bd --- /dev/null +++ b/htdocs/url_redirect.php @@ -0,0 +1,55 @@ +pl_self(), '/'); + +if (preg_match('/^[a-zA-Z0-9\-\/]+$/i', $alias)) { + $url = XDB::fetchOneCell('SELECT url + FROM url_shortener + WHERE alias = {?}', + $alias); + if ($url) { + http_redirect($url); + } +} + +header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found'); +?> + + + + 404 Not Found + + +

Not Found

+ The requested URL was not found on this server.

+


+
+ + + diff --git a/modules/urlshortener.php b/modules/urlshortener.php index 0e7f3a1..33b5153 100644 --- a/modules/urlshortener.php +++ b/modules/urlshortener.php @@ -24,22 +24,14 @@ class UrlShortenerModule extends PLModule function handlers() { return array( - 'url' => $this->make_hook('url', AUTH_COOKIE), + 'url' => $this->make_hook('url', AUTH_PUBLIC), 'admin/url' => $this->make_hook('admin_url', AUTH_MDP, 'admin') ); } function handler_url($page, $alias) { - $url = XDB::fetchOneCell('SELECT url - FROM url_shortener - WHERE alias = {?}', - $alias); - - if (is_null($url)) { - return PL_NOT_FOUND; - } - http_redirect($url); + http_redirect(Platal::globals()->core->base_url_shortener . $alias); } function handler_admin_url($page) @@ -54,17 +46,21 @@ class UrlShortenerModule extends PLModule $alias = Post::t('alias'); $url_regex = '{^(https?|ftp)://[a-zA-Z0-9._%#+/?=&~-]+$}i'; - if (!preg_match($url_regex, $url)) { + if (strlen($url) > 255 || !preg_match($url_regex, $url)) { $page->trigError("L'url donnée n'est pas valide."); return; } $page->assign('url', $url); if ($alias != '') { - if (!preg_match('/^[a-zA-Z0-9\-]{6}$/i', $alias)) { + if (!preg_match('/^[a-zA-Z0-9\-\/]+$/i', $alias)) { $page->trigError("L'alias proposé n'est pas valide."); return; } + if (preg_match('/^a\//i', $alias)) { + $page->trigError("L'alias commence par le préfixe 'a/' qui est réservé et donc non autorisé."); + return; + } $page->assign('alias', $alias); $used = XDB::fetchOneCell('SELECT COUNT(*) @@ -77,7 +73,7 @@ class UrlShortenerModule extends PLModule } } else { do { - $alias = rand_token(6); + $alias = 'a/' . rand_token(6); $used = XDB::fetchOneCell('SELECT COUNT(*) FROM url_shortener WHERE alias = {?}', @@ -89,7 +85,7 @@ class UrlShortenerModule extends PLModule XDB::execute('INSERT INTO url_shortener (url, alias) VALUES ({?}, {?})', $url, $alias); - $page->trigSuccess("L'url « " . $url . ' » est maintenant accessible depuis « ' . Platal::globals()->baseurl . '/url/' . $alias . ' ».'); + $page->trigSuccess("L'url « " . $url . ' » est maintenant accessible depuis « http://u.w4x.org/' . $alias . ' ».'); } } diff --git a/templates/urlshortener/admin.tpl b/templates/urlshortener/admin.tpl index e9d1dea..ec11de8 100644 --- a/templates/urlshortener/admin.tpl +++ b/templates/urlshortener/admin.tpl @@ -30,14 +30,27 @@ - Alias (6 caractères, optionnel) : + Alias (optionnel) : - - (peut contenir lettres, chiffres et tirets) + + (peut contenir lettres, chiffres, tirets et /)

+

Explications

+

+ L'alias peut être demandé. Dans ce cas, sa longueur maximal autorisée est + de 255 lettres, chiffres, tirets ou /. Ce dernier permet de définir des + domaines pour regrouper des raccourcis liés. Par exemple, « nl-04-04/ » + pourrait être utilisé comme base pour les urls de la lettre mensuelle d'avril + 2004.
+ Si aucun alias n'est fournit, le site en génère un de 6 caractères aléatoires + accolés à la la base « a/ Â» (par exemple : « a/azerty ». Ce + préfixe « a/ Â» et réservé à cet usage et ne peut être utilisé pour + former une url choisie. +

+ {* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *} diff --git a/upgrade/1.1.1/03_url.sql b/upgrade/1.1.1/03_url.sql new file mode 100644 index 0000000..14810a1 --- /dev/null +++ b/upgrade/1.1.1/03_url.sql @@ -0,0 +1,15 @@ +DROP TABLE IF EXISTS tmp_url_shortener; +CREATE TEMPORARY TABLE tmp_url_shortener LIKE url_shortener; +INSERT INTO tmp_url_shortener SELECT * FROM url_shortener; +DROP TABLE url_shortener; +CREATE TABLE url_shortener ( + alias VARCHAR(255) NOT NULL DEFAULT '', + url TEXT NOT NULL, + PRIMARY KEY (alias) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +INSERT INTO url_shortener (alias, url) + SELECT alias, url + FROM tmp_url_shortener; +DROP TABLE IF EXISTS tmp_url_shortener; + +-- vim:set syntax=mysql: diff --git a/upgrade/1.1.1/README b/upgrade/1.1.1/README new file mode 100644 index 0000000..936e205 --- /dev/null +++ b/upgrade/1.1.1/README @@ -0,0 +1,3 @@ +The following variable should be set: +[Core] +baseurl_shortener = "http://u.w4x.org/" -- 2.1.4