[#6412] ticket:385 Allow only [-_a-zA-Z0-9]+ in short urls
diff --git a/ForgeShortUrl/forgeshorturl/main.py b/ForgeShortUrl/forgeshorturl/main.py
index d26c69e..3081e81 100644
--- a/ForgeShortUrl/forgeshorturl/main.py
+++ b/ForgeShortUrl/forgeshorturl/main.py
@@ -196,6 +196,16 @@
 
 
 class ShortURLAdminController(DefaultAdminController):
+
+    shorturl_validators = All(
+        validators.NotEmpty(),
+        validators.Regex(
+            r'^[-_a-zA-Z0-9]+$',
+            messages={'invalid': 'must include only letters, numbers, dashes and underscores.'}
+        )
+    )
+
+
     def __init__(self, app):
         self.app = app
 
@@ -215,7 +225,7 @@
     @expose('jinja:forgeshorturl:templates/form.html')
     @validate(dict(full_url=All(validators.URL(add_http=True),
                                 validators.NotEmpty()),
-                   short_url=validators.NotEmpty()))
+                   short_url=shorturl_validators))
     def add(self, short_url='', full_url='', description='', private='off',
             update=False, **kw):
         if update:
diff --git a/ForgeShortUrl/forgeshorturl/tests/functional/test.py b/ForgeShortUrl/forgeshorturl/tests/functional/test.py
index e162b38..8f0fc64 100644
--- a/ForgeShortUrl/forgeshorturl/tests/functional/test.py
+++ b/ForgeShortUrl/forgeshorturl/tests/functional/test.py
@@ -97,6 +97,16 @@
         r = self.app.post('/admin/url/add', params=d)
         assert 'exists' in self.webflash(r)
 
+    def test_shorturl_chars_restrictions(self):
+        d = dict(short_url='', full_url='http://sf.net/')
+        r = self.app.post('/admin/url/add', params=d)
+        assert ShortUrl.query.find(dict(app_config_id=c.app.config._id)).count() == 0
+        assert 'Please enter a value' in self.webflash(r)
+        d = dict(short_url='g*', full_url='http://sf.net/')
+        r = self.app.post('/admin/url/add', params=d)
+        assert ShortUrl.query.find(dict(app_config_id=c.app.config._id)).count() == 0
+        assert 'Short url: must include only letters, numbers, dashes and underscores.' in self.webflash(r)
+
     def test_shorturl_remove(self):
         self.app.post('/admin/url/add',
                 params=dict(short_url='g', full_url='http://google.com/'))