##// END OF EJS Templates
fixes #25 removed crypt based password hashing and changed it into sha1 based.
marcink -
r412:b6a25169 default
parent child Browse files
Show More
@@ -1,431 +1,432 b''
1 #!/usr/bin/env python
1 #!/usr/bin/env python
2 # encoding: utf-8
2 # encoding: utf-8
3 # authentication and permission libraries
3 # authentication and permission libraries
4 # Copyright (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
4 # Copyright (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
5 #
5 #
6 # This program is free software; you can redistribute it and/or
6 # This program is free software; you can redistribute it and/or
7 # modify it under the terms of the GNU General Public License
7 # modify it under the terms of the GNU General Public License
8 # as published by the Free Software Foundation; version 2
8 # as published by the Free Software Foundation; version 2
9 # of the License or (at your opinion) any later version of the license.
9 # of the License or (at your opinion) any later version of the license.
10 #
10 #
11 # This program is distributed in the hope that it will be useful,
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
14 # GNU General Public License for more details.
15 #
15 #
16 # You should have received a copy of the GNU General Public License
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19 # MA 02110-1301, USA.
19 # MA 02110-1301, USA.
20 """
20 """
21 Created on April 4, 2010
21 Created on April 4, 2010
22
22
23 @author: marcink
23 @author: marcink
24 """
24 """
25 from beaker.cache import cache_region
25 from beaker.cache import cache_region
26 from pylons import config, session, url, request
26 from pylons import config, session, url, request
27 from pylons.controllers.util import abort, redirect
27 from pylons.controllers.util import abort, redirect
28 from pylons_app.lib.utils import get_repo_slug
28 from pylons_app.lib.utils import get_repo_slug
29 from pylons_app.model import meta
29 from pylons_app.model import meta
30 from pylons_app.model.db import User, RepoToPerm, Repository, Permission
30 from pylons_app.model.db import User, RepoToPerm, Repository, Permission
31 from sqlalchemy.exc import OperationalError
31 from sqlalchemy.exc import OperationalError
32 from sqlalchemy.orm.exc import NoResultFound, MultipleResultsFound
32 from sqlalchemy.orm.exc import NoResultFound, MultipleResultsFound
33 import crypt
33 import hashlib
34 from decorator import decorator
34 from decorator import decorator
35 import logging
35 import logging
36
36
37 log = logging.getLogger(__name__)
37 log = logging.getLogger(__name__)
38
38
39 def get_crypt_password(password):
39 def get_crypt_password(password):
40 """
40 """Cryptographic function used for password hashing based on sha1
41 Cryptographic function used for password hashing
42 @param password: password to hash
41 @param password: password to hash
43 """
42 """
44 return crypt.crypt(password, '6a')
43 hashed = hashlib.sha1(password).hexdigest()
45
44 return hashed[3:] + hashed[:3]
46
45
47 @cache_region('super_short_term', 'cached_user')
46 @cache_region('super_short_term', 'cached_user')
48 def get_user_cached(username):
47 def get_user_cached(username):
49 sa = meta.Session
48 sa = meta.Session
50 try:
49 try:
51 user = sa.query(User).filter(User.username == username).one()
50 user = sa.query(User).filter(User.username == username).one()
52 finally:
51 finally:
53 meta.Session.remove()
52 meta.Session.remove()
54 return user
53 return user
55
54
56 def authfunc(environ, username, password):
55 def authfunc(environ, username, password):
57 password_crypt = get_crypt_password(password)
56 password_crypt = get_crypt_password(password)
58 try:
57 try:
59 user = get_user_cached(username)
58 user = get_user_cached(username)
60 except (NoResultFound, MultipleResultsFound, OperationalError) as e:
59 except (NoResultFound, MultipleResultsFound, OperationalError) as e:
61 log.error(e)
60 log.error(e)
62 user = None
61 user = None
63
62
64 if user:
63 if user:
65 if user.active:
64 if user.active:
66 if user.username == username and user.password == password_crypt:
65 if user.username == username and user.password == password_crypt:
67 log.info('user %s authenticated correctly', username)
66 log.info('user %s authenticated correctly', username)
68 return True
67 return True
69 else:
68 else:
70 log.error('user %s is disabled', username)
69 log.error('user %s is disabled', username)
71
70
72 return False
71 return False
73
72
74 class AuthUser(object):
73 class AuthUser(object):
75 """
74 """
76 A simple object that handles a mercurial username for authentication
75 A simple object that handles a mercurial username for authentication
77 """
76 """
78 def __init__(self):
77 def __init__(self):
79 self.username = 'None'
78 self.username = 'None'
80 self.name = ''
79 self.name = ''
81 self.lastname = ''
80 self.lastname = ''
82 self.email = ''
81 self.email = ''
83 self.user_id = None
82 self.user_id = None
84 self.is_authenticated = False
83 self.is_authenticated = False
85 self.is_admin = False
84 self.is_admin = False
86 self.permissions = {}
85 self.permissions = {}
87
86
88
87
89 def set_available_permissions(config):
88 def set_available_permissions(config):
90 """
89 """
91 This function will propagate pylons globals with all available defined
90 This function will propagate pylons globals with all available defined
92 permission given in db. We don't wannt to check each time from db for new
91 permission given in db. We don't wannt to check each time from db for new
93 permissions since adding a new permission also requires application restart
92 permissions since adding a new permission also requires application restart
94 ie. to decorate new views with the newly created permission
93 ie. to decorate new views with the newly created permission
95 @param config:
94 @param config:
96 """
95 """
97 log.info('getting information about all available permissions')
96 log.info('getting information about all available permissions')
98 try:
97 try:
99 sa = meta.Session
98 sa = meta.Session
100 all_perms = sa.query(Permission).all()
99 all_perms = sa.query(Permission).all()
101 finally:
100 finally:
102 meta.Session.remove()
101 meta.Session.remove()
103
102
104 config['available_permissions'] = [x.permission_name for x in all_perms]
103 config['available_permissions'] = [x.permission_name for x in all_perms]
105
104
106 def set_base_path(config):
105 def set_base_path(config):
107 config['base_path'] = config['pylons.app_globals'].base_path
106 config['base_path'] = config['pylons.app_globals'].base_path
108
107
109 def fill_data(user):
108 def fill_data(user):
110 """
109 """
111 Fills user data with those from database and log out user if not present
110 Fills user data with those from database and log out user if not present
112 in database
111 in database
113 @param user:
112 @param user:
114 """
113 """
115 sa = meta.Session
114 sa = meta.Session
116 dbuser = sa.query(User).get(user.user_id)
115 dbuser = sa.query(User).get(user.user_id)
117 if dbuser:
116 if dbuser:
118 user.username = dbuser.username
117 user.username = dbuser.username
119 user.is_admin = dbuser.admin
118 user.is_admin = dbuser.admin
120 user.name = dbuser.name
119 user.name = dbuser.name
121 user.lastname = dbuser.lastname
120 user.lastname = dbuser.lastname
122 user.email = dbuser.email
121 user.email = dbuser.email
123 else:
122 else:
124 user.is_authenticated = False
123 user.is_authenticated = False
125 meta.Session.remove()
124 meta.Session.remove()
126 return user
125 return user
127
126
128 def fill_perms(user):
127 def fill_perms(user):
129 """
128 """
130 Fills user permission attribute with permissions taken from database
129 Fills user permission attribute with permissions taken from database
131 @param user:
130 @param user:
132 """
131 """
133
132
134 sa = meta.Session
133 sa = meta.Session
135 user.permissions['repositories'] = {}
134 user.permissions['repositories'] = {}
136 user.permissions['global'] = set()
135 user.permissions['global'] = set()
137
136
138 #first fetch default permissions
137 #first fetch default permissions
139 default_perms = sa.query(RepoToPerm, Repository, Permission)\
138 default_perms = sa.query(RepoToPerm, Repository, Permission)\
140 .join((Repository, RepoToPerm.repository_id == Repository.repo_id))\
139 .join((Repository, RepoToPerm.repository_id == Repository.repo_id))\
141 .join((Permission, RepoToPerm.permission_id == Permission.permission_id))\
140 .join((Permission, RepoToPerm.permission_id == Permission.permission_id))\
142 .filter(RepoToPerm.user_id == sa.query(User).filter(User.username ==
141 .filter(RepoToPerm.user_id == sa.query(User).filter(User.username ==
143 'default').one().user_id).all()
142 'default').one().user_id).all()
144
143
145 if user.is_admin:
144 if user.is_admin:
146 user.permissions['global'].add('hg.admin')
145 user.permissions['global'].add('hg.admin')
147 #admin have all rights set to admin
146 #admin have all rights set to admin
148 for perm in default_perms:
147 for perm in default_perms:
149 p = 'repository.admin'
148 p = 'repository.admin'
150 user.permissions['repositories'][perm.RepoToPerm.repository.repo_name] = p
149 user.permissions['repositories'][perm.RepoToPerm.repository.repo_name] = p
151
150
152 else:
151 else:
153 user.permissions['global'].add('repository.create')
152 user.permissions['global'].add('repository.create')
153 user.permissions['global'].add('hg.register')
154
154 for perm in default_perms:
155 for perm in default_perms:
155 if perm.Repository.private and not perm.Repository.user_id == user.user_id:
156 if perm.Repository.private and not perm.Repository.user_id == user.user_id:
156 #disable defaults for private repos,
157 #disable defaults for private repos,
157 p = 'repository.none'
158 p = 'repository.none'
158 elif perm.Repository.user_id == user.user_id:
159 elif perm.Repository.user_id == user.user_id:
159 #set admin if owner
160 #set admin if owner
160 p = 'repository.admin'
161 p = 'repository.admin'
161 else:
162 else:
162 p = perm.Permission.permission_name
163 p = perm.Permission.permission_name
163
164
164 user.permissions['repositories'][perm.RepoToPerm.repository.repo_name] = p
165 user.permissions['repositories'][perm.RepoToPerm.repository.repo_name] = p
165
166
166
167
167 user_perms = sa.query(RepoToPerm, Permission, Repository)\
168 user_perms = sa.query(RepoToPerm, Permission, Repository)\
168 .join((Repository, RepoToPerm.repository_id == Repository.repo_id))\
169 .join((Repository, RepoToPerm.repository_id == Repository.repo_id))\
169 .join((Permission, RepoToPerm.permission_id == Permission.permission_id))\
170 .join((Permission, RepoToPerm.permission_id == Permission.permission_id))\
170 .filter(RepoToPerm.user_id == user.user_id).all()
171 .filter(RepoToPerm.user_id == user.user_id).all()
171 #overwrite userpermissions with defaults
172 #overwrite userpermissions with defaults
172 for perm in user_perms:
173 for perm in user_perms:
173 #set write if owner
174 #set write if owner
174 if perm.Repository.user_id == user.user_id:
175 if perm.Repository.user_id == user.user_id:
175 p = 'repository.write'
176 p = 'repository.write'
176 else:
177 else:
177 p = perm.Permission.permission_name
178 p = perm.Permission.permission_name
178 user.permissions['repositories'][perm.RepoToPerm.repository.repo_name] = p
179 user.permissions['repositories'][perm.RepoToPerm.repository.repo_name] = p
179 meta.Session.remove()
180 meta.Session.remove()
180 return user
181 return user
181
182
182 def get_user(session):
183 def get_user(session):
183 """
184 """
184 Gets user from session, and wraps permissions into user
185 Gets user from session, and wraps permissions into user
185 @param session:
186 @param session:
186 """
187 """
187 user = session.get('hg_app_user', AuthUser())
188 user = session.get('hg_app_user', AuthUser())
188 if user.is_authenticated:
189 if user.is_authenticated:
189 user = fill_data(user)
190 user = fill_data(user)
190 user = fill_perms(user)
191 user = fill_perms(user)
191 session['hg_app_user'] = user
192 session['hg_app_user'] = user
192 session.save()
193 session.save()
193 return user
194 return user
194
195
195 #===============================================================================
196 #===============================================================================
196 # CHECK DECORATORS
197 # CHECK DECORATORS
197 #===============================================================================
198 #===============================================================================
198 class LoginRequired(object):
199 class LoginRequired(object):
199 """Must be logged in to execute this function else redirect to login page"""
200 """Must be logged in to execute this function else redirect to login page"""
200
201
201 def __call__(self, func):
202 def __call__(self, func):
202 return decorator(self.__wrapper, func)
203 return decorator(self.__wrapper, func)
203
204
204 def __wrapper(self, func, *fargs, **fkwargs):
205 def __wrapper(self, func, *fargs, **fkwargs):
205 user = session.get('hg_app_user', AuthUser())
206 user = session.get('hg_app_user', AuthUser())
206 log.debug('Checking login required for user:%s', user.username)
207 log.debug('Checking login required for user:%s', user.username)
207 if user.is_authenticated:
208 if user.is_authenticated:
208 log.debug('user %s is authenticated', user.username)
209 log.debug('user %s is authenticated', user.username)
209 return func(*fargs, **fkwargs)
210 return func(*fargs, **fkwargs)
210 else:
211 else:
211 log.warn('user %s not authenticated', user.username)
212 log.warn('user %s not authenticated', user.username)
212 log.debug('redirecting to login page')
213 log.debug('redirecting to login page')
213 return redirect(url('login_home'))
214 return redirect(url('login_home'))
214
215
215 class PermsDecorator(object):
216 class PermsDecorator(object):
216 """Base class for decorators"""
217 """Base class for decorators"""
217
218
218 def __init__(self, *required_perms):
219 def __init__(self, *required_perms):
219 available_perms = config['available_permissions']
220 available_perms = config['available_permissions']
220 for perm in required_perms:
221 for perm in required_perms:
221 if perm not in available_perms:
222 if perm not in available_perms:
222 raise Exception("'%s' permission is not defined" % perm)
223 raise Exception("'%s' permission is not defined" % perm)
223 self.required_perms = set(required_perms)
224 self.required_perms = set(required_perms)
224 self.user_perms = None
225 self.user_perms = None
225
226
226 def __call__(self, func):
227 def __call__(self, func):
227 return decorator(self.__wrapper, func)
228 return decorator(self.__wrapper, func)
228
229
229
230
230 def __wrapper(self, func, *fargs, **fkwargs):
231 def __wrapper(self, func, *fargs, **fkwargs):
231 # _wrapper.__name__ = func.__name__
232 # _wrapper.__name__ = func.__name__
232 # _wrapper.__dict__.update(func.__dict__)
233 # _wrapper.__dict__.update(func.__dict__)
233 # _wrapper.__doc__ = func.__doc__
234 # _wrapper.__doc__ = func.__doc__
234
235
235 self.user_perms = session.get('hg_app_user', AuthUser()).permissions
236 self.user_perms = session.get('hg_app_user', AuthUser()).permissions
236 log.debug('checking %s permissions %s for %s',
237 log.debug('checking %s permissions %s for %s',
237 self.__class__.__name__, self.required_perms, func.__name__)
238 self.__class__.__name__, self.required_perms, func.__name__)
238
239
239 if self.check_permissions():
240 if self.check_permissions():
240 log.debug('Permission granted for %s', func.__name__)
241 log.debug('Permission granted for %s', func.__name__)
241
242
242 return func(*fargs, **fkwargs)
243 return func(*fargs, **fkwargs)
243
244
244 else:
245 else:
245 log.warning('Permission denied for %s', func.__name__)
246 log.warning('Permission denied for %s', func.__name__)
246 #redirect with forbidden ret code
247 #redirect with forbidden ret code
247 return abort(403)
248 return abort(403)
248
249
249
250
250
251
251 def check_permissions(self):
252 def check_permissions(self):
252 """Dummy function for overriding"""
253 """Dummy function for overriding"""
253 raise Exception('You have to write this function in child class')
254 raise Exception('You have to write this function in child class')
254
255
255 class HasPermissionAllDecorator(PermsDecorator):
256 class HasPermissionAllDecorator(PermsDecorator):
256 """Checks for access permission for all given predicates. All of them
257 """Checks for access permission for all given predicates. All of them
257 have to be meet in order to fulfill the request
258 have to be meet in order to fulfill the request
258 """
259 """
259
260
260 def check_permissions(self):
261 def check_permissions(self):
261 if self.required_perms.issubset(self.user_perms.get('global')):
262 if self.required_perms.issubset(self.user_perms.get('global')):
262 return True
263 return True
263 return False
264 return False
264
265
265
266
266 class HasPermissionAnyDecorator(PermsDecorator):
267 class HasPermissionAnyDecorator(PermsDecorator):
267 """Checks for access permission for any of given predicates. In order to
268 """Checks for access permission for any of given predicates. In order to
268 fulfill the request any of predicates must be meet
269 fulfill the request any of predicates must be meet
269 """
270 """
270
271
271 def check_permissions(self):
272 def check_permissions(self):
272 if self.required_perms.intersection(self.user_perms.get('global')):
273 if self.required_perms.intersection(self.user_perms.get('global')):
273 return True
274 return True
274 return False
275 return False
275
276
276 class HasRepoPermissionAllDecorator(PermsDecorator):
277 class HasRepoPermissionAllDecorator(PermsDecorator):
277 """Checks for access permission for all given predicates for specific
278 """Checks for access permission for all given predicates for specific
278 repository. All of them have to be meet in order to fulfill the request
279 repository. All of them have to be meet in order to fulfill the request
279 """
280 """
280
281
281 def check_permissions(self):
282 def check_permissions(self):
282 repo_name = get_repo_slug(request)
283 repo_name = get_repo_slug(request)
283 try:
284 try:
284 user_perms = set([self.user_perms['repositories'][repo_name]])
285 user_perms = set([self.user_perms['repositories'][repo_name]])
285 except KeyError:
286 except KeyError:
286 return False
287 return False
287 if self.required_perms.issubset(user_perms):
288 if self.required_perms.issubset(user_perms):
288 return True
289 return True
289 return False
290 return False
290
291
291
292
292 class HasRepoPermissionAnyDecorator(PermsDecorator):
293 class HasRepoPermissionAnyDecorator(PermsDecorator):
293 """Checks for access permission for any of given predicates for specific
294 """Checks for access permission for any of given predicates for specific
294 repository. In order to fulfill the request any of predicates must be meet
295 repository. In order to fulfill the request any of predicates must be meet
295 """
296 """
296
297
297 def check_permissions(self):
298 def check_permissions(self):
298 repo_name = get_repo_slug(request)
299 repo_name = get_repo_slug(request)
299
300
300 try:
301 try:
301 user_perms = set([self.user_perms['repositories'][repo_name]])
302 user_perms = set([self.user_perms['repositories'][repo_name]])
302 except KeyError:
303 except KeyError:
303 return False
304 return False
304 if self.required_perms.intersection(user_perms):
305 if self.required_perms.intersection(user_perms):
305 return True
306 return True
306 return False
307 return False
307 #===============================================================================
308 #===============================================================================
308 # CHECK FUNCTIONS
309 # CHECK FUNCTIONS
309 #===============================================================================
310 #===============================================================================
310
311
311 class PermsFunction(object):
312 class PermsFunction(object):
312 """Base function for other check functions"""
313 """Base function for other check functions"""
313
314
314 def __init__(self, *perms):
315 def __init__(self, *perms):
315 available_perms = config['available_permissions']
316 available_perms = config['available_permissions']
316
317
317 for perm in perms:
318 for perm in perms:
318 if perm not in available_perms:
319 if perm not in available_perms:
319 raise Exception("'%s' permission in not defined" % perm)
320 raise Exception("'%s' permission in not defined" % perm)
320 self.required_perms = set(perms)
321 self.required_perms = set(perms)
321 self.user_perms = None
322 self.user_perms = None
322 self.granted_for = ''
323 self.granted_for = ''
323 self.repo_name = None
324 self.repo_name = None
324
325
325 def __call__(self, check_Location=''):
326 def __call__(self, check_Location=''):
326 user = session.get('hg_app_user', False)
327 user = session.get('hg_app_user', False)
327 if not user:
328 if not user:
328 return False
329 return False
329 self.user_perms = user.permissions
330 self.user_perms = user.permissions
330 self.granted_for = user.username
331 self.granted_for = user.username
331 log.debug('checking %s %s', self.__class__.__name__, self.required_perms)
332 log.debug('checking %s %s', self.__class__.__name__, self.required_perms)
332
333
333 if self.check_permissions():
334 if self.check_permissions():
334 log.debug('Permission granted for %s @%s', self.granted_for,
335 log.debug('Permission granted for %s @%s', self.granted_for,
335 check_Location)
336 check_Location)
336 return True
337 return True
337
338
338 else:
339 else:
339 log.warning('Permission denied for %s @%s', self.granted_for,
340 log.warning('Permission denied for %s @%s', self.granted_for,
340 check_Location)
341 check_Location)
341 return False
342 return False
342
343
343 def check_permissions(self):
344 def check_permissions(self):
344 """Dummy function for overriding"""
345 """Dummy function for overriding"""
345 raise Exception('You have to write this function in child class')
346 raise Exception('You have to write this function in child class')
346
347
347 class HasPermissionAll(PermsFunction):
348 class HasPermissionAll(PermsFunction):
348 def check_permissions(self):
349 def check_permissions(self):
349 if self.required_perms.issubset(self.user_perms.get('global')):
350 if self.required_perms.issubset(self.user_perms.get('global')):
350 return True
351 return True
351 return False
352 return False
352
353
353 class HasPermissionAny(PermsFunction):
354 class HasPermissionAny(PermsFunction):
354 def check_permissions(self):
355 def check_permissions(self):
355 if self.required_perms.intersection(self.user_perms.get('global')):
356 if self.required_perms.intersection(self.user_perms.get('global')):
356 return True
357 return True
357 return False
358 return False
358
359
359 class HasRepoPermissionAll(PermsFunction):
360 class HasRepoPermissionAll(PermsFunction):
360
361
361 def __call__(self, repo_name=None, check_Location=''):
362 def __call__(self, repo_name=None, check_Location=''):
362 self.repo_name = repo_name
363 self.repo_name = repo_name
363 return super(HasRepoPermissionAll, self).__call__(check_Location)
364 return super(HasRepoPermissionAll, self).__call__(check_Location)
364
365
365 def check_permissions(self):
366 def check_permissions(self):
366 if not self.repo_name:
367 if not self.repo_name:
367 self.repo_name = get_repo_slug(request)
368 self.repo_name = get_repo_slug(request)
368
369
369 try:
370 try:
370 self.user_perms = set([self.user_perms['repositories']\
371 self.user_perms = set([self.user_perms['repositories']\
371 [self.repo_name]])
372 [self.repo_name]])
372 except KeyError:
373 except KeyError:
373 return False
374 return False
374 self.granted_for = self.repo_name
375 self.granted_for = self.repo_name
375 if self.required_perms.issubset(self.user_perms):
376 if self.required_perms.issubset(self.user_perms):
376 return True
377 return True
377 return False
378 return False
378
379
379 class HasRepoPermissionAny(PermsFunction):
380 class HasRepoPermissionAny(PermsFunction):
380
381
381 def __call__(self, repo_name=None, check_Location=''):
382 def __call__(self, repo_name=None, check_Location=''):
382 self.repo_name = repo_name
383 self.repo_name = repo_name
383 return super(HasRepoPermissionAny, self).__call__(check_Location)
384 return super(HasRepoPermissionAny, self).__call__(check_Location)
384
385
385 def check_permissions(self):
386 def check_permissions(self):
386 if not self.repo_name:
387 if not self.repo_name:
387 self.repo_name = get_repo_slug(request)
388 self.repo_name = get_repo_slug(request)
388
389
389 try:
390 try:
390 self.user_perms = set([self.user_perms['repositories']\
391 self.user_perms = set([self.user_perms['repositories']\
391 [self.repo_name]])
392 [self.repo_name]])
392 except KeyError:
393 except KeyError:
393 return False
394 return False
394 self.granted_for = self.repo_name
395 self.granted_for = self.repo_name
395 if self.required_perms.intersection(self.user_perms):
396 if self.required_perms.intersection(self.user_perms):
396 return True
397 return True
397 return False
398 return False
398
399
399 #===============================================================================
400 #===============================================================================
400 # SPECIAL VERSION TO HANDLE MIDDLEWARE AUTH
401 # SPECIAL VERSION TO HANDLE MIDDLEWARE AUTH
401 #===============================================================================
402 #===============================================================================
402
403
403 class HasPermissionAnyMiddleware(object):
404 class HasPermissionAnyMiddleware(object):
404 def __init__(self, *perms):
405 def __init__(self, *perms):
405 self.required_perms = set(perms)
406 self.required_perms = set(perms)
406
407
407 def __call__(self, user, repo_name):
408 def __call__(self, user, repo_name):
408 usr = AuthUser()
409 usr = AuthUser()
409 usr.user_id = user.user_id
410 usr.user_id = user.user_id
410 usr.username = user.username
411 usr.username = user.username
411 usr.is_admin = user.admin
412 usr.is_admin = user.admin
412
413
413 try:
414 try:
414 self.user_perms = set([fill_perms(usr)\
415 self.user_perms = set([fill_perms(usr)\
415 .permissions['repositories'][repo_name]])
416 .permissions['repositories'][repo_name]])
416 except:
417 except:
417 self.user_perms = set()
418 self.user_perms = set()
418 self.granted_for = ''
419 self.granted_for = ''
419 self.username = user.username
420 self.username = user.username
420 self.repo_name = repo_name
421 self.repo_name = repo_name
421 return self.check_permissions()
422 return self.check_permissions()
422
423
423 def check_permissions(self):
424 def check_permissions(self):
424 log.debug('checking mercurial protocol '
425 log.debug('checking mercurial protocol '
425 'permissions for user:%s repository:%s',
426 'permissions for user:%s repository:%s',
426 self.username, self.repo_name)
427 self.username, self.repo_name)
427 if self.required_perms.intersection(self.user_perms):
428 if self.required_perms.intersection(self.user_perms):
428 log.debug('permission granted')
429 log.debug('permission granted')
429 return True
430 return True
430 log.debug('permission denied')
431 log.debug('permission denied')
431 return False
432 return False
General Comments 0
You need to be logged in to leave comments. Login now