changeset 300:8f7b8e965fe4

fixed 404s added extra validator for magic repo_name path in routes
author Marcin Kuzminski <marcin@python-works.com>
date Mon, 28 Jun 2010 18:09:56 +0200
parents d303aacb3349
children 752675cdd167
files pylons_app/config/environment.py pylons_app/config/routing.py
diffstat 2 files changed, 46 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/pylons_app/config/environment.py	Mon Jun 28 13:54:47 2010 +0200
+++ b/pylons_app/config/environment.py	Mon Jun 28 18:09:56 2010 +0200
@@ -63,6 +63,7 @@
     init_model(sa_engine_db1)
     repo2db_mapper(_get_repos_cached_initial(config['pylons.app_globals']))
     set_available_permissions(config)
+    config['base_path'] = config['pylons.app_globals'].base_path
     # CONFIGURATION OPTIONS HERE (note: all config options will override
     # any Pylons config options)
     
--- a/pylons_app/config/routing.py	Mon Jun 28 13:54:47 2010 +0200
+++ b/pylons_app/config/routing.py	Mon Jun 28 18:09:56 2010 +0200
@@ -5,6 +5,7 @@
 refer to the routes manual at http://routes.groovie.org/docs/
 """
 from routes import Mapper
+from pylons_app.lib.utils import check_repo as cr
 
 def make_map(config):
     """Create, configure and return the routes Mapper"""
@@ -21,7 +22,15 @@
     # CUSTOM ROUTES HERE
     map.connect('hg_home', '/', controller='hg', action='index')
     
-    
+    def check_repo(environ, match_dict):
+        """
+        check for valid repository for proper 404 handling
+        @param environ:
+        @param match_dict:
+        """
+        repo_name = match_dict.get('repo_name')
+        return not cr(repo_name, config['base_path'])
+ 
     #REST routes
     with map.submapper(path_prefix='/_admin', controller='repos') as m:
         m.connect("repos", "/repos",
@@ -36,20 +45,27 @@
         m.connect("formatted_new_repo", "/repos/new.{format}",
              action="new", conditions=dict(method=["GET"]))
         m.connect("/repos/{repo_name:.*}",
-             action="update", conditions=dict(method=["PUT"]))
+             action="update", conditions=dict(method=["PUT"],
+                                              function=check_repo))
         m.connect("/repos/{repo_name:.*}",
-             action="delete", conditions=dict(method=["DELETE"]))
+             action="delete", conditions=dict(method=["DELETE"],
+                                              function=check_repo))
         m.connect("edit_repo", "/repos/{repo_name:.*}/edit",
-             action="edit", conditions=dict(method=["GET"]))
+             action="edit", conditions=dict(method=["GET"],
+                                            function=check_repo))
         m.connect("formatted_edit_repo", "/repos/{repo_name:.*}.{format}/edit",
-             action="edit", conditions=dict(method=["GET"]))
+             action="edit", conditions=dict(method=["GET"],
+                                            function=check_repo))
         m.connect("repo", "/repos/{repo_name:.*}",
-             action="show", conditions=dict(method=["GET"]))
+             action="show", conditions=dict(method=["GET"],
+                                            function=check_repo))
         m.connect("formatted_repo", "/repos/{repo_name:.*}.{format}",
-             action="show", conditions=dict(method=["GET"]))
+             action="show", conditions=dict(method=["GET"],
+                                            function=check_repo))
         #ajax delete repo perm user
         m.connect('delete_repo_user', "/repos_delete_user/{repo_name:.*}",
-             action="delete_perm_user", conditions=dict(method=["DELETE"]))
+             action="delete_perm_user", conditions=dict(method=["DELETE"],
+                                                        function=check_repo))
         
     map.resource('user', 'users', path_prefix='/_admin')
     map.resource('permission', 'permissions', path_prefix='/_admin')
@@ -62,33 +78,41 @@
     
     #FEEDS
     map.connect('rss_feed_home', '/{repo_name:.*}/feed/rss',
-                controller='feed', action='rss')
+                controller='feed', action='rss',
+                conditions=dict(function=check_repo))
     map.connect('atom_feed_home', '/{repo_name:.*}/feed/atom',
-                controller='feed', action='atom')
+                controller='feed', action='atom',
+                conditions=dict(function=check_repo))
     
     map.connect('login_home', '/login', controller='login')
     map.connect('logout_home', '/logout', controller='login', action='logout')
     
     map.connect('changeset_home', '/{repo_name:.*}/changeset/{revision}',
-                controller='changeset', revision='tip')
+                controller='changeset', revision='tip',
+                conditions=dict(function=check_repo))
     map.connect('summary_home', '/{repo_name:.*}/summary',
-                controller='summary')
+                controller='summary', conditions=dict(function=check_repo))
     map.connect('shortlog_home', '/{repo_name:.*}/shortlog',
-                controller='shortlog')
+                controller='shortlog', conditions=dict(function=check_repo))
     map.connect('branches_home', '/{repo_name:.*}/branches',
-                controller='branches')
+                controller='branches', conditions=dict(function=check_repo))
     map.connect('tags_home', '/{repo_name:.*}/tags',
-                controller='tags')
+                controller='tags', conditions=dict(function=check_repo))
     map.connect('changelog_home', '/{repo_name:.*}/changelog',
-                controller='changelog')    
+                controller='changelog', conditions=dict(function=check_repo))    
     map.connect('files_home', '/{repo_name:.*}/files/{revision}/{f_path:.*}',
-                controller='files', revision='tip', f_path='')
+                controller='files', revision='tip', f_path='',
+                conditions=dict(function=check_repo))
     map.connect('files_diff_home', '/{repo_name:.*}/diff/{f_path:.*}',
-                controller='files', action='diff', revision='tip', f_path='')
+                controller='files', action='diff', revision='tip', f_path='',
+                conditions=dict(function=check_repo))
     map.connect('files_raw_home', '/{repo_name:.*}/rawfile/{revision}/{f_path:.*}',
-                controller='files', action='rawfile', revision='tip', f_path='')
+                controller='files', action='rawfile', revision='tip', f_path='',
+                conditions=dict(function=check_repo))
     map.connect('files_annotate_home', '/{repo_name:.*}/annotate/{revision}/{f_path:.*}',
-                controller='files', action='annotate', revision='tip', f_path='')    
+                controller='files', action='annotate', revision='tip', f_path='',
+                conditions=dict(function=check_repo))    
     map.connect('files_archive_home', '/{repo_name:.*}/archive/{revision}/{fileformat}',
-                controller='files', action='archivefile', revision='tip')
+                controller='files', action='archivefile', revision='tip',
+                conditions=dict(function=check_repo))
     return map