annotate rhodecode/lib/middleware/simplehg.py @ 671:bee56f209c40 rhodecode-0.0.1.0.1

fixes few bugs - fixed #53 python2.5 incompatible enumerate calls - fixed #52 disable mercurial extension for web - fixed #51 deleting repositories don't delete it's dependent objects - small css updated
author Marcin Kuzminski <marcin@python-works.com>
date Wed, 10 Nov 2010 01:14:44 +0100
parents ff449e9e6e38
children 7e536d1af60d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
178
24dbf4bc57aa simplehg update
Marcin Kuzminski <marcin@python-works.com>
parents: 177
diff changeset
1 #!/usr/bin/env python
24dbf4bc57aa simplehg update
Marcin Kuzminski <marcin@python-works.com>
parents: 177
diff changeset
2 # encoding: utf-8
252
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 248
diff changeset
3 # middleware to handle mercurial api calls
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 248
diff changeset
4 # Copyright (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
385
eda5f01de3c4 fixes #20 hg middleware breaks ui() instance when repository has hgrc file.
Marcin Kuzminski <marcin@python-works.com>
parents: 381
diff changeset
5 #
252
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 248
diff changeset
6 # This program is free software; you can redistribute it and/or
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 248
diff changeset
7 # modify it under the terms of the GNU General Public License
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 248
diff changeset
8 # as published by the Free Software Foundation; version 2
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 248
diff changeset
9 # of the License or (at your opinion) any later version of the license.
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 248
diff changeset
10 #
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 248
diff changeset
11 # This program is distributed in the hope that it will be useful,
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 248
diff changeset
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 248
diff changeset
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 248
diff changeset
14 # GNU General Public License for more details.
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 248
diff changeset
15 #
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 248
diff changeset
16 # You should have received a copy of the GNU General Public License
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 248
diff changeset
17 # along with this program; if not, write to the Free Software
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 248
diff changeset
18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 248
diff changeset
19 # MA 02110-1301, USA.
392
b27d32cb3157 Implemented hooks system,
Marcin Kuzminski <marcin@python-works.com>
parents: 385
diff changeset
20 """
b27d32cb3157 Implemented hooks system,
Marcin Kuzminski <marcin@python-works.com>
parents: 385
diff changeset
21 Created on 2010-04-28
b27d32cb3157 Implemented hooks system,
Marcin Kuzminski <marcin@python-works.com>
parents: 385
diff changeset
22
b27d32cb3157 Implemented hooks system,
Marcin Kuzminski <marcin@python-works.com>
parents: 385
diff changeset
23 @author: marcink
b27d32cb3157 Implemented hooks system,
Marcin Kuzminski <marcin@python-works.com>
parents: 385
diff changeset
24 SimpleHG middleware for handling mercurial protocol request (push/clone etc.)
b27d32cb3157 Implemented hooks system,
Marcin Kuzminski <marcin@python-works.com>
parents: 385
diff changeset
25 It's implemented with basic auth function
b27d32cb3157 Implemented hooks system,
Marcin Kuzminski <marcin@python-works.com>
parents: 385
diff changeset
26 """
317
c961b78ff0a0 rewritten simplehg middleware. Now permissions are checked for each repository/request/user
Marcin Kuzminski <marcin@python-works.com>
parents: 257
diff changeset
27 from itertools import chain
343
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
28 from mercurial.error import RepoError
111
70b1e5d1e20d simplehg, cleanup
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
29 from mercurial.hgweb import hgweb
70b1e5d1e20d simplehg, cleanup
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
30 from mercurial.hgweb.request import wsgiapplication
177
93bd77e1f3c1 Changed auth basic handler only for mercurial request.
Marcin Kuzminski <marcin@python-works.com>
parents: 171
diff changeset
31 from paste.auth.basic import AuthBasicAuthenticator
93bd77e1f3c1 Changed auth basic handler only for mercurial request.
Marcin Kuzminski <marcin@python-works.com>
parents: 171
diff changeset
32 from paste.httpheaders import REMOTE_USER, AUTH_TYPE
547
1e757ac98988 renamed project to rhodecode
Marcin Kuzminski <marcin@python-works.com>
parents: 536
diff changeset
33 from rhodecode.lib.auth import authfunc, HasPermissionAnyMiddleware, \
343
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
34 get_user_cached
547
1e757ac98988 renamed project to rhodecode
Marcin Kuzminski <marcin@python-works.com>
parents: 536
diff changeset
35 from rhodecode.lib.utils import is_mercurial, make_ui, invalidate_cache, \
385
eda5f01de3c4 fixes #20 hg middleware breaks ui() instance when repository has hgrc file.
Marcin Kuzminski <marcin@python-works.com>
parents: 381
diff changeset
36 check_repo_fast, ui_sections
334
6c23e72437e3 mercurial middleware now returns 500's instead of 404 on errors and 404 when repo not found, added tracebacks
Marcin Kuzminski <marcin@python-works.com>
parents: 331
diff changeset
37 from webob.exc import HTTPNotFound, HTTPForbidden, HTTPInternalServerError
547
1e757ac98988 renamed project to rhodecode
Marcin Kuzminski <marcin@python-works.com>
parents: 536
diff changeset
38 from rhodecode.lib.utils import action_logger
197
da59b7e07e3c Changed import to base. Removed action logging from auth to simplehg.
Marcin Kuzminski <marcin@python-works.com>
parents: 194
diff changeset
39 import logging
177
93bd77e1f3c1 Changed auth basic handler only for mercurial request.
Marcin Kuzminski <marcin@python-works.com>
parents: 171
diff changeset
40 import os
317
c961b78ff0a0 rewritten simplehg middleware. Now permissions are checked for each repository/request/user
Marcin Kuzminski <marcin@python-works.com>
parents: 257
diff changeset
41 import traceback
605
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
42
197
da59b7e07e3c Changed import to base. Removed action logging from auth to simplehg.
Marcin Kuzminski <marcin@python-works.com>
parents: 194
diff changeset
43 log = logging.getLogger(__name__)
177
93bd77e1f3c1 Changed auth basic handler only for mercurial request.
Marcin Kuzminski <marcin@python-works.com>
parents: 171
diff changeset
44
111
70b1e5d1e20d simplehg, cleanup
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
45 class SimpleHg(object):
70b1e5d1e20d simplehg, cleanup
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
46
70b1e5d1e20d simplehg, cleanup
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
47 def __init__(self, application, config):
70b1e5d1e20d simplehg, cleanup
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
48 self.application = application
70b1e5d1e20d simplehg, cleanup
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
49 self.config = config
177
93bd77e1f3c1 Changed auth basic handler only for mercurial request.
Marcin Kuzminski <marcin@python-works.com>
parents: 171
diff changeset
50 #authenticate this mercurial request using
350
664a5b8c551a Added application settings, are now customizable from database
Marcin Kuzminski <marcin@python-works.com>
parents: 343
diff changeset
51 self.authenticate = AuthBasicAuthenticator('', authfunc)
605
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
52
111
70b1e5d1e20d simplehg, cleanup
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
53 def __call__(self, environ, start_response):
70b1e5d1e20d simplehg, cleanup
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
54 if not is_mercurial(environ):
70b1e5d1e20d simplehg, cleanup
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
55 return self.application(environ, start_response)
343
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
56
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
57 #===================================================================
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
58 # AUTHENTICATE THIS MERCURIAL REQUEST
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
59 #===================================================================
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
60 username = REMOTE_USER(environ)
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
61 if not username:
548
b75b77ef649d renamed hg_app to rhodecode
Marcin Kuzminski <marcin@python-works.com>
parents: 547
diff changeset
62 self.authenticate.realm = self.config['rhodecode_realm']
343
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
63 result = self.authenticate(environ)
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
64 if isinstance(result, str):
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
65 AUTH_TYPE.update(environ, 'basic')
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
66 REMOTE_USER.update(environ, result)
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
67 else:
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
68 return result.wsgi_application(environ, start_response)
605
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
69
343
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
70 try:
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
71 repo_name = '/'.join(environ['PATH_INFO'].split('/')[1:])
445
946d8a680a1d made fix for pushing/pulling into paths that end with /
Marcin Kuzminski <marcin@python-works.com>
parents: 392
diff changeset
72 if repo_name.endswith('/'):
946d8a680a1d made fix for pushing/pulling into paths that end with /
Marcin Kuzminski <marcin@python-works.com>
parents: 392
diff changeset
73 repo_name = repo_name.rstrip('/')
343
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
74 except:
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
75 log.error(traceback.format_exc())
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
76 return HTTPInternalServerError()(environ, start_response)
605
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
77
343
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
78 #===================================================================
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
79 # CHECK PERMISSIONS FOR THIS REQUEST
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
80 #===================================================================
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
81 action = self.__get_action(environ)
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
82 if action:
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
83 username = self.__get_environ_user(environ)
124
f8ae5c1dfae2 Removed unneeded PATH_INFO manipulation, and added 404 codes on bad repositories paths
Marcin Kuzminski <marcin@python-works.com>
parents: 116
diff changeset
84 try:
343
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
85 user = self.__get_user(username)
334
6c23e72437e3 mercurial middleware now returns 500's instead of 404 on errors and 404 when repo not found, added tracebacks
Marcin Kuzminski <marcin@python-works.com>
parents: 331
diff changeset
86 except:
317
c961b78ff0a0 rewritten simplehg middleware. Now permissions are checked for each repository/request/user
Marcin Kuzminski <marcin@python-works.com>
parents: 257
diff changeset
87 log.error(traceback.format_exc())
334
6c23e72437e3 mercurial middleware now returns 500's instead of 404 on errors and 404 when repo not found, added tracebacks
Marcin Kuzminski <marcin@python-works.com>
parents: 331
diff changeset
88 return HTTPInternalServerError()(environ, start_response)
607
ff449e9e6e38 fixed chrome repo switcher issue
Marcin Kuzminski <marcin@python-works.com>
parents: 606
diff changeset
89
343
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
90 #check permissions for this repository
605
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
91 if action == 'push':
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
92 if not HasPermissionAnyMiddleware('repository.write',
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
93 'repository.admin')\
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
94 (user, repo_name):
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
95 return HTTPForbidden()(environ, start_response)
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
96
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
97 else:
607
ff449e9e6e38 fixed chrome repo switcher issue
Marcin Kuzminski <marcin@python-works.com>
parents: 606
diff changeset
98 #any other action need at least read permission
343
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
99 if not HasPermissionAnyMiddleware('repository.read',
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
100 'repository.write',
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
101 'repository.admin')\
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
102 (user, repo_name):
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
103 return HTTPForbidden()(environ, start_response)
605
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
104
606
f31f1327c1e9 Fixed journal action loggin doubled messages.
Marcin Kuzminski <marcin@python-works.com>
parents: 605
diff changeset
105 #log action
f31f1327c1e9 Fixed journal action loggin doubled messages.
Marcin Kuzminski <marcin@python-works.com>
parents: 605
diff changeset
106 if action in ('push', 'pull', 'clone'):
f31f1327c1e9 Fixed journal action loggin doubled messages.
Marcin Kuzminski <marcin@python-works.com>
parents: 605
diff changeset
107 proxy_key = 'HTTP_X_REAL_IP'
f31f1327c1e9 Fixed journal action loggin doubled messages.
Marcin Kuzminski <marcin@python-works.com>
parents: 605
diff changeset
108 def_key = 'REMOTE_ADDR'
f31f1327c1e9 Fixed journal action loggin doubled messages.
Marcin Kuzminski <marcin@python-works.com>
parents: 605
diff changeset
109 ipaddr = environ.get(proxy_key, environ.get(def_key, '0.0.0.0'))
f31f1327c1e9 Fixed journal action loggin doubled messages.
Marcin Kuzminski <marcin@python-works.com>
parents: 605
diff changeset
110 self.__log_user_action(user, action, repo_name, ipaddr)
605
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
111
343
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
112 #===================================================================
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
113 # MERCURIAL REQUEST HANDLING
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
114 #===================================================================
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
115 environ['PATH_INFO'] = '/'#since we wrap into hgweb, reset the path
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
116 self.baseui = make_ui('db')
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
117 self.basepath = self.config['base_path']
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
118 self.repo_path = os.path.join(self.basepath, repo_name)
334
6c23e72437e3 mercurial middleware now returns 500's instead of 404 on errors and 404 when repo not found, added tracebacks
Marcin Kuzminski <marcin@python-works.com>
parents: 331
diff changeset
119
343
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
120 #quick check if that dir exists...
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
121 if check_repo_fast(repo_name, self.basepath):
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
122 return HTTPNotFound()(environ, start_response)
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
123 try:
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
124 app = wsgiapplication(self.__make_app)
503
3d6d548ad3cc Added user action mapper to map push to changeset.
Marcin Kuzminski <marcin@python-works.com>
parents: 445
diff changeset
125 except RepoError, e:
343
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
126 if str(e).find('not found') != -1:
334
6c23e72437e3 mercurial middleware now returns 500's instead of 404 on errors and 404 when repo not found, added tracebacks
Marcin Kuzminski <marcin@python-works.com>
parents: 331
diff changeset
127 return HTTPNotFound()(environ, start_response)
343
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
128 except Exception:
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
129 log.error(traceback.format_exc())
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
130 return HTTPInternalServerError()(environ, start_response)
605
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
131
343
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
132 #invalidate cache on push
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
133 if action == 'push':
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
134 self.__invalidate_cache(repo_name)
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
135 messages = []
549
f99075170eb4 more renames for rhode code !!
Marcin Kuzminski <marcin@python-works.com>
parents: 548
diff changeset
136 messages.append('thank you for using rhodecode')
605
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
137
343
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
138 return self.msg_wrapper(app, environ, start_response, messages)
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
139 else:
605
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
140 return app(environ, start_response)
257
66f617f162f8 added custom messages for remote responses.
Marcin Kuzminski <marcin@python-works.com>
parents: 252
diff changeset
141
66f617f162f8 added custom messages for remote responses.
Marcin Kuzminski <marcin@python-works.com>
parents: 252
diff changeset
142
340
71f25781079d small fixes for hg middleware, messages are now propagated only on push
Marcin Kuzminski <marcin@python-works.com>
parents: 334
diff changeset
143 def msg_wrapper(self, app, environ, start_response, messages=[]):
257
66f617f162f8 added custom messages for remote responses.
Marcin Kuzminski <marcin@python-works.com>
parents: 252
diff changeset
144 """
66f617f162f8 added custom messages for remote responses.
Marcin Kuzminski <marcin@python-works.com>
parents: 252
diff changeset
145 Wrapper for custom messages that come out of mercurial respond messages
317
c961b78ff0a0 rewritten simplehg middleware. Now permissions are checked for each repository/request/user
Marcin Kuzminski <marcin@python-works.com>
parents: 257
diff changeset
146 is a list of messages that the user will see at the end of response
c961b78ff0a0 rewritten simplehg middleware. Now permissions are checked for each repository/request/user
Marcin Kuzminski <marcin@python-works.com>
parents: 257
diff changeset
147 from merurial protocol actions that involves remote answers
605
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
148 :param app:
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
149 :param environ:
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
150 :param start_response:
257
66f617f162f8 added custom messages for remote responses.
Marcin Kuzminski <marcin@python-works.com>
parents: 252
diff changeset
151 """
66f617f162f8 added custom messages for remote responses.
Marcin Kuzminski <marcin@python-works.com>
parents: 252
diff changeset
152 def custom_messages(msg_list):
66f617f162f8 added custom messages for remote responses.
Marcin Kuzminski <marcin@python-works.com>
parents: 252
diff changeset
153 for msg in msg_list:
66f617f162f8 added custom messages for remote responses.
Marcin Kuzminski <marcin@python-works.com>
parents: 252
diff changeset
154 yield msg + '\n'
66f617f162f8 added custom messages for remote responses.
Marcin Kuzminski <marcin@python-works.com>
parents: 252
diff changeset
155 org_response = app(environ, start_response)
66f617f162f8 added custom messages for remote responses.
Marcin Kuzminski <marcin@python-works.com>
parents: 252
diff changeset
156 return chain(org_response, custom_messages(messages))
111
70b1e5d1e20d simplehg, cleanup
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
157
197
da59b7e07e3c Changed import to base. Removed action logging from auth to simplehg.
Marcin Kuzminski <marcin@python-works.com>
parents: 194
diff changeset
158 def __make_app(self):
341
1ef52a70f3b7 Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 340
diff changeset
159 hgserve = hgweb(str(self.repo_path), baseui=self.baseui)
218
58b46f9194c3 version bump. Made changesets work as should, but vcs had to be fixed for that.
Marcin Kuzminski <marcin@python-works.com>
parents: 204
diff changeset
160 return self.__load_web_settings(hgserve)
605
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
161
197
da59b7e07e3c Changed import to base. Removed action logging from auth to simplehg.
Marcin Kuzminski <marcin@python-works.com>
parents: 194
diff changeset
162 def __get_environ_user(self, environ):
da59b7e07e3c Changed import to base. Removed action logging from auth to simplehg.
Marcin Kuzminski <marcin@python-works.com>
parents: 194
diff changeset
163 return environ.get('REMOTE_USER')
605
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
164
343
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
165 def __get_user(self, username):
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
166 return get_user_cached(username)
605
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
167
197
da59b7e07e3c Changed import to base. Removed action logging from auth to simplehg.
Marcin Kuzminski <marcin@python-works.com>
parents: 194
diff changeset
168 def __get_action(self, environ):
da59b7e07e3c Changed import to base. Removed action logging from auth to simplehg.
Marcin Kuzminski <marcin@python-works.com>
parents: 194
diff changeset
169 """
606
f31f1327c1e9 Fixed journal action loggin doubled messages.
Marcin Kuzminski <marcin@python-works.com>
parents: 605
diff changeset
170 Maps mercurial request commands into a clone,pull or push command.
f31f1327c1e9 Fixed journal action loggin doubled messages.
Marcin Kuzminski <marcin@python-works.com>
parents: 605
diff changeset
171 This should always return a valid command string
605
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
172 :param environ:
197
da59b7e07e3c Changed import to base. Removed action logging from auth to simplehg.
Marcin Kuzminski <marcin@python-works.com>
parents: 194
diff changeset
173 """
330
4c9a295d80a4 added new command mappings for mercurial 1.6
Marcin Kuzminski <marcin@python-works.com>
parents: 317
diff changeset
174 mapping = {'changegroup': 'pull',
4c9a295d80a4 added new command mappings for mercurial 1.6
Marcin Kuzminski <marcin@python-works.com>
parents: 317
diff changeset
175 'changegroupsubset': 'pull',
4c9a295d80a4 added new command mappings for mercurial 1.6
Marcin Kuzminski <marcin@python-works.com>
parents: 317
diff changeset
176 'stream_out': 'pull',
606
f31f1327c1e9 Fixed journal action loggin doubled messages.
Marcin Kuzminski <marcin@python-works.com>
parents: 605
diff changeset
177 #'listkeys': 'pull',
330
4c9a295d80a4 added new command mappings for mercurial 1.6
Marcin Kuzminski <marcin@python-works.com>
parents: 317
diff changeset
178 'unbundle': 'push',
4c9a295d80a4 added new command mappings for mercurial 1.6
Marcin Kuzminski <marcin@python-works.com>
parents: 317
diff changeset
179 'pushkey': 'push', }
197
da59b7e07e3c Changed import to base. Removed action logging from auth to simplehg.
Marcin Kuzminski <marcin@python-works.com>
parents: 194
diff changeset
180 for qry in environ['QUERY_STRING'].split('&'):
da59b7e07e3c Changed import to base. Removed action logging from auth to simplehg.
Marcin Kuzminski <marcin@python-works.com>
parents: 194
diff changeset
181 if qry.startswith('cmd'):
da59b7e07e3c Changed import to base. Removed action logging from auth to simplehg.
Marcin Kuzminski <marcin@python-works.com>
parents: 194
diff changeset
182 cmd = qry.split('=')[-1]
da59b7e07e3c Changed import to base. Removed action logging from auth to simplehg.
Marcin Kuzminski <marcin@python-works.com>
parents: 194
diff changeset
183 if mapping.has_key(cmd):
da59b7e07e3c Changed import to base. Removed action logging from auth to simplehg.
Marcin Kuzminski <marcin@python-works.com>
parents: 194
diff changeset
184 return mapping[cmd]
605
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
185 else:
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
186 return cmd
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
187
331
a9a6c74ad2a6 added ip loggin into mercurial middleware
Marcin Kuzminski <marcin@python-works.com>
parents: 330
diff changeset
188 def __log_user_action(self, user, action, repo, ipaddr):
536
39203995f2c4 made action logger more global, to be used in other places to log other actions.
Marcin Kuzminski <marcin@python-works.com>
parents: 503
diff changeset
189 action_logger(user, action, repo, ipaddr)
605
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
190
197
da59b7e07e3c Changed import to base. Removed action logging from auth to simplehg.
Marcin Kuzminski <marcin@python-works.com>
parents: 194
diff changeset
191 def __invalidate_cache(self, repo_name):
da59b7e07e3c Changed import to base. Removed action logging from auth to simplehg.
Marcin Kuzminski <marcin@python-works.com>
parents: 194
diff changeset
192 """we know that some change was made to repositories and we should
da59b7e07e3c Changed import to base. Removed action logging from auth to simplehg.
Marcin Kuzminski <marcin@python-works.com>
parents: 194
diff changeset
193 invalidate the cache to see the changes right away but only for
da59b7e07e3c Changed import to base. Removed action logging from auth to simplehg.
Marcin Kuzminski <marcin@python-works.com>
parents: 194
diff changeset
194 push requests"""
da59b7e07e3c Changed import to base. Removed action logging from auth to simplehg.
Marcin Kuzminski <marcin@python-works.com>
parents: 194
diff changeset
195 invalidate_cache('cached_repo_list')
da59b7e07e3c Changed import to base. Removed action logging from auth to simplehg.
Marcin Kuzminski <marcin@python-works.com>
parents: 194
diff changeset
196 invalidate_cache('full_changelog', repo_name)
605
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
197
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
198
218
58b46f9194c3 version bump. Made changesets work as should, but vcs had to be fixed for that.
Marcin Kuzminski <marcin@python-works.com>
parents: 204
diff changeset
199 def __load_web_settings(self, hgserve):
605
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
200 #set the global ui for hgserve instance passed
114
cc5cf1a93902 Implemented simplehg middleware,moved make_ui functions to lib.utils
Marcin Kuzminski <marcin@python-works.com>
parents: 111
diff changeset
201 hgserve.repo.ui = self.baseui
605
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
202
341
1ef52a70f3b7 Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 340
diff changeset
203 hgrc = os.path.join(self.repo_path, '.hg', 'hgrc')
1ef52a70f3b7 Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 340
diff changeset
204 repoui = make_ui('file', hgrc, False)
605
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
205
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
206
114
cc5cf1a93902 Implemented simplehg middleware,moved make_ui functions to lib.utils
Marcin Kuzminski <marcin@python-works.com>
parents: 111
diff changeset
207 if repoui:
385
eda5f01de3c4 fixes #20 hg middleware breaks ui() instance when repository has hgrc file.
Marcin Kuzminski <marcin@python-works.com>
parents: 381
diff changeset
208 #overwrite our ui instance with the section from hgrc file
eda5f01de3c4 fixes #20 hg middleware breaks ui() instance when repository has hgrc file.
Marcin Kuzminski <marcin@python-works.com>
parents: 381
diff changeset
209 for section in ui_sections:
eda5f01de3c4 fixes #20 hg middleware breaks ui() instance when repository has hgrc file.
Marcin Kuzminski <marcin@python-works.com>
parents: 381
diff changeset
210 for k, v in repoui.configitems(section):
eda5f01de3c4 fixes #20 hg middleware breaks ui() instance when repository has hgrc file.
Marcin Kuzminski <marcin@python-works.com>
parents: 381
diff changeset
211 hgserve.repo.ui.setconfig(section, k, v)
605
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
212
114
cc5cf1a93902 Implemented simplehg middleware,moved make_ui functions to lib.utils
Marcin Kuzminski <marcin@python-works.com>
parents: 111
diff changeset
213 return hgserve
605
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
214
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
215
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
216
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
217
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
218
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
219
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
220
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
221
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
222
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
223
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
224
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
225
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
226
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
227