[#4347] ticket:82 add validator, fix command
diff --git a/ForgeBlog/forgeblog/command/rssfeeds.py b/ForgeBlog/forgeblog/command/rssfeeds.py
index 715afae..965c54f 100644
--- a/ForgeBlog/forgeblog/command/rssfeeds.py
+++ b/ForgeBlog/forgeblog/command/rssfeeds.py
@@ -116,7 +116,7 @@
 
 class RssFeedsCommand(base.BlogCommand):
     summary = 'Rss feed client'
-    parser = base.Command.standard_parser(verbose=True)
+    parser = base.BlogCommand.standard_parser(verbose=True)
     parser.add_option('-a', '--appid', dest='appid', default='',
                       help='application id')
     parser.add_option('-u', '--username', dest='username', default='root',
@@ -160,7 +160,7 @@
         allura_base.log.info("Get feed: %s" % feed_url)
         f = feedparser.parse(feed_url)
         if f.bozo:
-            base.log.exception("%s: %s" % (feed_url, f.bozo_exception))
+            allura_base.log.exception("%s: %s" % (feed_url, f.bozo_exception))
             return
         for e in f.entries:
             title = e.title
diff --git a/ForgeBlog/forgeblog/main.py b/ForgeBlog/forgeblog/main.py
index 1a3becb..fe94841 100644
--- a/ForgeBlog/forgeblog/main.py
+++ b/ForgeBlog/forgeblog/main.py
@@ -9,6 +9,7 @@
 from tg import expose, validate, redirect, flash
 from tg.decorators import with_trailing_slash, without_trailing_slash
 from pylons import g, c, request, response
+import formencode
 from formencode import validators
 from webob import exc
 
@@ -401,18 +402,30 @@
     @without_trailing_slash
     @expose()
     @require_post()
-    def set_exfeed(self, **kw):
-        new_exfeed = kw.get('new_exfeed', None)
+    def set_exfeed(self, new_exfeed=None, **kw):
         exfeed_val = kw.get('exfeed', [])
         if type(exfeed_val) == unicode:
-            exfeed_list = []
-            exfeed_list.append(exfeed_val)
+            tmp_exfeed_list = []
+            tmp_exfeed_list.append(exfeed_val)
         else:
-            exfeed_list = exfeed_val
+            tmp_exfeed_list = exfeed_val
 
         if new_exfeed is not None and new_exfeed != '':
-            exfeed_list.append(new_exfeed)
+            tmp_exfeed_list.append(new_exfeed)
+
+        exfeed_list = []
+        invalid_list = []
+        v = validators.URL()
+        for link in tmp_exfeed_list:
+            try:
+                v.to_python(link)
+                exfeed_list.append(link)
+            except formencode.api.Invalid:
+                invalid_list.append(link)
 
         self.app.external_feeds_list = exfeed_list
         flash('External feeds updated')
+        if len(invalid_list) > 0:
+            flash('Invalid link(s): %s' % ','.join(link for link in invalid_list))
+
         redirect(c.project.url()+'admin/tools')
diff --git a/ForgeBlog/forgeblog/templates/blog/admin_exfeed.html b/ForgeBlog/forgeblog/templates/blog/admin_exfeed.html
index 2c337bc..e87c891 100644
--- a/ForgeBlog/forgeblog/templates/blog/admin_exfeed.html
+++ b/ForgeBlog/forgeblog/templates/blog/admin_exfeed.html
@@ -15,7 +15,7 @@
   {% if allow_config %}
     <div class="grid-13">&nbsp;</div>
     <div class="grid-13">
-       <input type="text" name="new_exfeed" id="new_exfeed" value=""/>
+       <label>Add RSS/Atom feed URL:</label> <input type="text" name="new_exfeed" id="new_exfeed" value=""/>
     </div>
     <div class="grid-13">&nbsp;</div>
     <hr>