comparison pylons_app/lib/auth.py @ 453:3ed2d46a2ca7

permission refactoring, Implemented views for default permissions, fixes #23 user registration is controlled by permission system. Implemented manual registration option websetup fills default permissions
author Marcin Kuzminski <marcin@python-works.com>
date Sat, 21 Aug 2010 16:34:37 +0200
parents 04e8b31fb245
children 63c697d1a631
comparison
equal deleted inserted replaced
452:25ab66a26975 453:3ed2d46a2ca7
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 UserToPerm
31 from sqlalchemy.exc import OperationalError 32 from sqlalchemy.exc import OperationalError
32 from sqlalchemy.orm.exc import NoResultFound, MultipleResultsFound 33 from sqlalchemy.orm.exc import NoResultFound, MultipleResultsFound
33 import bcrypt 34 import bcrypt
34 from decorator import decorator 35 from decorator import decorator
35 import logging 36 import logging
133 134
134 sa = meta.Session 135 sa = meta.Session
135 user.permissions['repositories'] = {} 136 user.permissions['repositories'] = {}
136 user.permissions['global'] = set() 137 user.permissions['global'] = set()
137 138
138 #first fetch default permissions 139 #===========================================================================
139 default_perms = sa.query(RepoToPerm, Repository, Permission)\ 140 # fetch default permissions
141 #===========================================================================
142 default_perms = sa.query(RepoToPerm, UserToPerm, Repository, Permission)\
143 .outerjoin((UserToPerm, RepoToPerm.user_id == UserToPerm.user_id))\
140 .join((Repository, RepoToPerm.repository_id == Repository.repo_id))\ 144 .join((Repository, RepoToPerm.repository_id == Repository.repo_id))\
141 .join((Permission, RepoToPerm.permission_id == Permission.permission_id))\ 145 .join((Permission, RepoToPerm.permission_id == Permission.permission_id))\
142 .filter(RepoToPerm.user_id == sa.query(User).filter(User.username == 146 .filter(RepoToPerm.user_id == sa.query(User).filter(User.username ==
143 'default').one().user_id).all() 147 'default').one().user_id).all()
144 148
145 if user.is_admin: 149 if user.is_admin:
150 #=======================================================================
151 # #admin have all rights set to admin
152 #=======================================================================
146 user.permissions['global'].add('hg.admin') 153 user.permissions['global'].add('hg.admin')
147 #admin have all rights set to admin 154
148 for perm in default_perms: 155 for perm in default_perms:
149 p = 'repository.admin' 156 p = 'repository.admin'
150 user.permissions['repositories'][perm.RepoToPerm.repository.repo_name] = p 157 user.permissions['repositories'][perm.RepoToPerm.repository.repo_name] = p
151 158
152 else: 159 else:
153 user.permissions['global'].add('repository.create') 160 #=======================================================================
154 user.permissions['global'].add('hg.register') 161 # set default permissions
155 162 #=======================================================================
163
164 #default global
165 for perm in default_perms:
166 user.permissions['global'].add(perm.UserToPerm.permission.permission_name)
167
168 # user.permissions['global'].add('hg.create.repository')
169 # user.permissions['global'].add('hg.register')
170
171 #default repositories
156 for perm in default_perms: 172 for perm in default_perms:
157 if perm.Repository.private and not perm.Repository.user_id == user.user_id: 173 if perm.Repository.private and not perm.Repository.user_id == user.user_id:
158 #disable defaults for private repos, 174 #disable defaults for private repos,
159 p = 'repository.none' 175 p = 'repository.none'
160 elif perm.Repository.user_id == user.user_id: 176 elif perm.Repository.user_id == user.user_id:
163 else: 179 else:
164 p = perm.Permission.permission_name 180 p = perm.Permission.permission_name
165 181
166 user.permissions['repositories'][perm.RepoToPerm.repository.repo_name] = p 182 user.permissions['repositories'][perm.RepoToPerm.repository.repo_name] = p
167 183
168 184 #=======================================================================
169 user_perms = sa.query(RepoToPerm, Permission, Repository)\ 185 # #overwrite default with user permissions if any
186 #=======================================================================
187 user_perms = sa.query(RepoToPerm, UserToPerm, Permission, Repository)\
188 .outerjoin((UserToPerm, RepoToPerm.user_id == UserToPerm.user_id))\
170 .join((Repository, RepoToPerm.repository_id == Repository.repo_id))\ 189 .join((Repository, RepoToPerm.repository_id == Repository.repo_id))\
171 .join((Permission, RepoToPerm.permission_id == Permission.permission_id))\ 190 .join((Permission, RepoToPerm.permission_id == Permission.permission_id))\
172 .filter(RepoToPerm.user_id == user.user_id).all() 191 .filter(RepoToPerm.user_id == user.user_id).all()
173 #overwrite userpermissions with defaults 192
174 for perm in user_perms: 193 for perm in user_perms:
175 #set write if owner 194 if perm.Repository.user_id == user.user_id:#set admin if owner
176 if perm.Repository.user_id == user.user_id: 195 p = 'repository.admin'
177 p = 'repository.write'
178 else: 196 else:
179 p = perm.Permission.permission_name 197 p = perm.Permission.permission_name
180 user.permissions['repositories'][perm.RepoToPerm.repository.repo_name] = p 198 user.permissions['repositories'][perm.RepoToPerm.repository.repo_name] = p
181 meta.Session.remove() 199 meta.Session.remove()
182 return user 200 return user