##// END OF EJS Templates
Wrapped calls for git and hg middleware in extra block that clears db Session....
marcink -
r1761:b265be1c beta
parent child Browse files
Show More
@@ -4,6 +4,9 b' Provides the BaseController class for su'
4 4 """
5 5 import logging
6 6 import time
7
8 from paste.auth.basic import AuthBasicAuthenticator
9
7 10 from pylons import config, tmpl_context as c, request, session, url
8 11 from pylons.controllers import WSGIController
9 12 from pylons.controllers.util import redirect
@@ -12,8 +15,9 b' from pylons.templating import render_mak'
12 15 from rhodecode import __version__, BACKENDS
13 16
14 17 from rhodecode.lib import str2bool
15 from rhodecode.lib.auth import AuthUser, get_container_username
16 from rhodecode.lib.utils import get_repo_slug
18 from rhodecode.lib.auth import AuthUser, get_container_username, authfunc,\
19 HasPermissionAnyMiddleware
20 from rhodecode.lib.utils import get_repo_slug, invalidate_cache
17 21 from rhodecode.model import meta
18 22
19 23 from rhodecode.model.db import Repository
@@ -22,6 +26,60 b' from rhodecode.model.scm import ScmModel'
22 26
23 27 log = logging.getLogger(__name__)
24 28
29 class BaseVCSController(object):
30
31 def __init__(self, application, config):
32 self.application = application
33 self.config = config
34 # base path of repo locations
35 self.basepath = self.config['base_path']
36 #authenticate this mercurial request using authfunc
37 self.authenticate = AuthBasicAuthenticator('', authfunc)
38 self.ipaddr = '0.0.0.0'
39
40 def _invalidate_cache(self, repo_name):
41 """
42 Set's cache for this repository for invalidation on next access
43
44 :param repo_name: full repo name, also a cache key
45 """
46 invalidate_cache('get_repo_cached_%s' % repo_name)
47
48 def _check_permission(self, action, user, repo_name):
49 """
50 Checks permissions using action (push/pull) user and repository
51 name
52
53 :param action: push or pull action
54 :param user: user instance
55 :param repo_name: repository name
56 """
57 if action == 'push':
58 if not HasPermissionAnyMiddleware('repository.write',
59 'repository.admin')(user,
60 repo_name):
61 return False
62
63 else:
64 #any other action need at least read permission
65 if not HasPermissionAnyMiddleware('repository.read',
66 'repository.write',
67 'repository.admin')(user,
68 repo_name):
69 return False
70
71 return True
72
73 def __call__(self, environ, start_response):
74 start = time.time()
75 try:
76 return self._handle_request(environ, start_response)
77 finally:
78 log = logging.getLogger(self.__class__.__name__)
79 log.debug('Request time: %.3fs' % (time.time() - start))
80 meta.Session.remove()
81
82
25 83 class BaseController(WSGIController):
26 84
27 85 def __before__(self):
@@ -30,7 +30,6 b' import traceback'
30 30
31 31 from dulwich import server as dulserver
32 32
33
34 33 class SimpleGitUploadPackHandler(dulserver.UploadPackHandler):
35 34
36 35 def handle(self):
@@ -66,12 +65,12 b' dulserver.DEFAULT_HANDLERS = {'
66 65 from dulwich.repo import Repo
67 66 from dulwich.web import HTTPGitApplication
68 67
69 from paste.auth.basic import AuthBasicAuthenticator
70 68 from paste.httpheaders import REMOTE_USER, AUTH_TYPE
71 69
72 70 from rhodecode.lib import safe_str
73 from rhodecode.lib.auth import authfunc, HasPermissionAnyMiddleware, get_container_username
74 from rhodecode.lib.utils import invalidate_cache, is_valid_repo
71 from rhodecode.lib.base import BaseVCSController
72 from rhodecode.lib.auth import get_container_username
73 from rhodecode.lib.utils import is_valid_repo
75 74 from rhodecode.model.db import User
76 75
77 76 from webob.exc import HTTPNotFound, HTTPForbidden, HTTPInternalServerError
@@ -91,17 +90,9 b' def is_git(environ):'
91 90 return False
92 91
93 92
94 class SimpleGit(object):
93 class SimpleGit(BaseVCSController):
95 94
96 def __init__(self, application, config):
97 self.application = application
98 self.config = config
99 # base path of repo locations
100 self.basepath = self.config['base_path']
101 #authenticate this mercurial request using authfunc
102 self.authenticate = AuthBasicAuthenticator('', authfunc)
103
104 def __call__(self, environ, start_response):
95 def _handle_request(self, environ, start_response):
105 96 if not is_git(environ):
106 97 return self.application(environ, start_response)
107 98
@@ -132,9 +123,8 b' class SimpleGit(object):'
132 123 if action in ['pull', 'push']:
133 124 anonymous_user = self.__get_user('default')
134 125 username = anonymous_user.username
135 anonymous_perm = self.__check_permission(action,
136 anonymous_user,
137 repo_name)
126 anonymous_perm = self._check_permission(action,anonymous_user,
127 repo_name)
138 128
139 129 if anonymous_perm is not True or anonymous_user.active is False:
140 130 if anonymous_perm is not True:
@@ -179,16 +169,11 b' class SimpleGit(object):'
179 169 start_response)
180 170
181 171 #check permissions for this repository
182 perm = self.__check_permission(action, user,
172 perm = self._check_permission(action, user,
183 173 repo_name)
184 174 if perm is not True:
185 175 return HTTPForbidden()(environ, start_response)
186 176
187 extras = {'ip': ipaddr,
188 'username': username,
189 'action': action,
190 'repository': repo_name}
191
192 177 #===================================================================
193 178 # GIT REQUEST HANDLING
194 179 #===================================================================
@@ -203,7 +188,7 b' class SimpleGit(object):'
203 188 try:
204 189 #invalidate cache on push
205 190 if action == 'push':
206 self.__invalidate_cache(repo_name)
191 self._invalidate_cache(repo_name)
207 192
208 193 app = self.__make_app(repo_name, repo_path)
209 194 return app(environ, start_response)
@@ -225,31 +210,6 b' class SimpleGit(object):'
225 210
226 211 return gitserve
227 212
228 def __check_permission(self, action, user, repo_name):
229 """
230 Checks permissions using action (push/pull) user and repository
231 name
232
233 :param action: push or pull action
234 :param user: user instance
235 :param repo_name: repository name
236 """
237 if action == 'push':
238 if not HasPermissionAnyMiddleware('repository.write',
239 'repository.admin')(user,
240 repo_name):
241 return False
242
243 else:
244 #any other action need at least read permission
245 if not HasPermissionAnyMiddleware('repository.read',
246 'repository.write',
247 'repository.admin')(user,
248 repo_name):
249 return False
250
251 return True
252
253 213 def __get_repository(self, environ):
254 214 """
255 215 Get's repository name out of PATH_INFO header
@@ -285,10 +245,3 b' class SimpleGit(object):'
285 245 service_cmd if service_cmd else 'other')
286 246 else:
287 247 return 'other'
288
289 def __invalidate_cache(self, repo_name):
290 """we know that some change was made to repositories and we should
291 invalidate the cache to see the changes right away but only for
292 push requests"""
293 invalidate_cache('get_repo_cached_%s' % repo_name)
294
@@ -31,13 +31,12 b' import traceback'
31 31 from mercurial.error import RepoError
32 32 from mercurial.hgweb import hgweb_mod
33 33
34 from paste.auth.basic import AuthBasicAuthenticator
35 34 from paste.httpheaders import REMOTE_USER, AUTH_TYPE
36 35
37 36 from rhodecode.lib import safe_str
38 from rhodecode.lib.auth import authfunc, HasPermissionAnyMiddleware, get_container_username
39 from rhodecode.lib.utils import make_ui, invalidate_cache, \
40 is_valid_repo, ui_sections
37 from rhodecode.lib.base import BaseVCSController
38 from rhodecode.lib.auth import get_container_username
39 from rhodecode.lib.utils import make_ui, is_valid_repo, ui_sections
41 40 from rhodecode.model.db import User
42 41
43 42 from webob.exc import HTTPNotFound, HTTPForbidden, HTTPInternalServerError
@@ -55,18 +54,9 b' def is_mercurial(environ):'
55 54 return False
56 55
57 56
58 class SimpleHg(object):
57 class SimpleHg(BaseVCSController):
59 58
60 def __init__(self, application, config):
61 self.application = application
62 self.config = config
63 # base path of repo locations
64 self.basepath = self.config['base_path']
65 #authenticate this mercurial request using authfunc
66 self.authenticate = AuthBasicAuthenticator('', authfunc)
67 self.ipaddr = '0.0.0.0'
68
69 def __call__(self, environ, start_response):
59 def _handle_request(self, environ, start_response):
70 60 if not is_mercurial(environ):
71 61 return self.application(environ, start_response)
72 62
@@ -98,9 +88,8 b' class SimpleHg(object):'
98 88 anonymous_user = self.__get_user('default')
99 89
100 90 username = anonymous_user.username
101 anonymous_perm = self.__check_permission(action,
102 anonymous_user,
103 repo_name)
91 anonymous_perm = self._check_permission(action,anonymous_user,
92 repo_name)
104 93
105 94 if anonymous_perm is not True or anonymous_user.active is False:
106 95 if anonymous_perm is not True:
@@ -145,7 +134,7 b' class SimpleHg(object):'
145 134 start_response)
146 135
147 136 #check permissions for this repository
148 perm = self.__check_permission(action, user,
137 perm = self._check_permission(action, user,
149 138 repo_name)
150 139 if perm is not True:
151 140 return HTTPForbidden()(environ, start_response)
@@ -171,9 +160,9 b' class SimpleHg(object):'
171 160 return HTTPNotFound()(environ, start_response)
172 161
173 162 try:
174 #invalidate cache on push
163 # invalidate cache on push
175 164 if action == 'push':
176 self.__invalidate_cache(repo_name)
165 self._invalidate_cache(repo_name)
177 166
178 167 app = self.__make_app(repo_path, baseui, extras)
179 168 return app(environ, start_response)
@@ -192,31 +181,6 b' class SimpleHg(object):'
192 181 return hgweb_mod.hgweb(repo_name, name=repo_name, baseui=baseui)
193 182
194 183
195 def __check_permission(self, action, user, repo_name):
196 """
197 Checks permissions using action (push/pull) user and repository
198 name
199
200 :param action: push or pull action
201 :param user: user instance
202 :param repo_name: repository name
203 """
204 if action == 'push':
205 if not HasPermissionAnyMiddleware('repository.write',
206 'repository.admin')(user,
207 repo_name):
208 return False
209
210 else:
211 #any other action need at least read permission
212 if not HasPermissionAnyMiddleware('repository.read',
213 'repository.write',
214 'repository.admin')(user,
215 repo_name):
216 return False
217
218 return True
219
220 184 def __get_repository(self, environ):
221 185 """
222 186 Get's repository name out of PATH_INFO header
@@ -257,11 +221,6 b' class SimpleHg(object):'
257 221 else:
258 222 return 'pull'
259 223
260 def __invalidate_cache(self, repo_name):
261 """we know that some change was made to repositories and we should
262 invalidate the cache to see the changes right away but only for
263 push requests"""
264 invalidate_cache('get_repo_cached_%s' % repo_name)
265 224
266 225 def __inject_extras(self, repo_path, baseui, extras={}):
267 226 """
General Comments 0
You need to be logged in to leave comments. Login now