Ticket #2612: revisedPatch.diff
| File revisedPatch.diff, 16.3 kB (added by gkruse@gmail.com, 10 months ago) |
|---|
-
svnauthz/model.py
old new 131 131 132 132 def serialize(self): 133 133 ret=""+ self.member.__str__() + " = " 134 134 135 if (self.r): 135 136 ret +="r" 136 137 if (self.w): -
svnauthz/admin_ui.py
old new 1 1 import pkg_resources 2 2 from trac.core import * 3 3 from trac.perm import PermissionSystem 4 4 5 from trac.util import sorted5 from trac.util import get_pkginfo, get_module_path, sorted 6 6 from trac.config import Option 7 from webadmin.web_ui import IAdminPageProvider7 from trac.admin.api import IAdminPanelProvider 8 8 9 9 from model import * 10 10 from io import * 11 from acct_mgr.api import AccountManager12 11 from trac.web.chrome import ITemplateProvider 13 12 14 13 from urllib import pathname2url, url2pathname … … 23 22 24 23 25 24 class SvnAuthzAdminPage(Component): 25 implements(IAdminPanelProvider, ITemplateProvider) 26 26 27 implements(IAdminPageProvider, ITemplateProvider)28 29 27 def __init__(self): 30 28 self.authz_file = self.env.config.get("trac", "authz_file") 31 29 self.authz_module = self.env.config.get("trac", "authz_module_name") 32 30 if self.authz_module != None and self.authz_module.strip() == "": 33 31 self.authz_module = None 34 self.account_manager = AccountManager(self.env)32 35 33 36 # IAdminPageProvider 37 def get_admin_pages(self, req): 34 # ITemplateProvider methods 35 def get_htdocs_dirs(self): 36 return [] 37 38 def get_templates_dirs(self): 39 return [pkg_resources.resource_filename('svnauthz', 'templates')] 40 41 # IAdminPanelProvider 42 def get_admin_panels(self, req): 38 43 if req.perm.has_permission('TRAC_ADMIN'): 39 44 yield ('subversion', 'Subversion', 'svnauthz', 'Subversion Access') 40 45 41 def process_admin_request(self, req, cat, page, path_info): 46 def render_admin_panel(self, req, cat, page, path_info): 47 data = {} 42 48 perm = PermissionSystem(self.env) 43 49 self.env.log.debug("SvnAuthzAdminPlugin: cat=%s page=%s path_info=%s" 44 50 % (cat, page, path_info)) 45 51 self.authz = self._get_model(); 46 52 if req.method == 'POST': 47 53 if req.args.get('addgroup'): 48 self._add_group(req)54 data.update(self._add_group(req)) 49 55 elif req.args.get('addpath'): 50 self._add_path(req)56 data.update(self._add_path(req)) 51 57 elif req.args.get('addgroupmember'): 52 self._add_group_member(req)58 data.update(self._add_group_member(req)) 53 59 elif req.args.get('removegroupmembers'): 54 self._del_group_member(req)60 data.update(self._del_group_member(req)) 55 61 elif req.args.get('removegroups'): 56 self._del_groups(req)62 data.update(self._del_groups(req)) 57 63 elif req.args.get('removepaths'): 58 self._del_paths(req)64 data.update(self._del_paths(req)) 59 65 elif req.args.get('addpathmember'): 60 self._add_path_member(req)66 data.update(self._add_path_member(req)) 61 67 elif req.args.get('changepathmembers'): 62 self._change_path_members(req)68 data.update(self._change_path_members(req)) 63 69 64 70 # Handle group and path edit mode handling 65 71 editgroup = None 66 72 editpath = None 67 73 if path_info and path_info.startswith("editgroup/"): 68 editgroup = self._edit_group(req, cat, page, path_info) 74 editgroup, d = self._edit_group(req, cat, page, path_info) 75 data.update(d) 69 76 elif path_info and path_info.startswith("editpath/"): 70 editpath = self._edit_path(req, cat, page, path_info) 77 editpath, d = self._edit_path(req, cat, page, path_info) 78 data.update(d) 79 print data 71 80 72 81 paths_disp = [] 73 82 for repository, path in [(p.get_repo(), p.get_path()) for p in self.authz.get_paths()]: … … 85 94 'url' : path_disp_url, 86 95 'href': path_disp_href 87 96 }) 88 req.hdf['paths'] = sorted(paths_disp)97 data['paths'] = sorted(paths_disp) 89 98 90 99 groups_disp = [] 91 100 for group_disp in sorted([g.get_name() for g in self.authz.get_groups()]): … … 100 109 'url': group_disp_url, 101 110 'href': group_disp_href 102 111 }) 103 req.hdf['groups'] = groups_disp112 data['groups'] = groups_disp 104 113 105 114 self._persist_model(self.authz) 106 115 107 return 'admin_authz. cs', None116 return 'admin_authz.html',data 108 117 109 # ITemplateProvider110 111 def get_htdocs_dirs(self):112 """Return the absolute path of a directory containing additional113 static resources (such as images, style sheets, etc).114 """115 return []116 117 def get_templates_dirs(self):118 """Return the absolute path of the directory containing the provided119 ClearSilver templates.120 """121 from pkg_resources import resource_filename122 return [resource_filename(__name__, 'templates')]123 124 118 def _add_group(self, req): 125 119 groupname = req.args.get('groupname') 126 120 try: 127 121 self.authz.add_group(Group(groupname, [])) 122 return {} 128 123 except Exception, e: 129 re q.hdf['addgroup.error'] = e124 return {'addgroup_error' : e} 130 125 131 126 def _del_groups(self, req): 132 127 groups_to_del = req.args.get('selgroup') … … 137 132 for group in groups_to_del: 138 133 self.authz.del_group(url2pathname(group)) 139 134 else: 140 re q.hdf['delgroup.error'] = "Invalid type of group selection"135 return {'delgroup_error' : "Invalid type of group selection"} 141 136 except Exception, e: 142 req.hdf['delgroup.error'] = e 137 return {'delgroup_error' : e } 138 return {} 143 139 144 140 def _del_paths(self, req): 145 141 paths_to_del = req.args.get('selpath') … … 152 148 if validpath: 153 149 self.authz.del_path(validpath[1], self.authz_module) 154 150 except Exception, e: 155 re q.hdf['delpath.error'] = e151 return {'delpath_error' : e } 156 152 157 153 return {} 158 154 def _add_path(self, req): 159 155 path = req.args.get('path') 160 156 repository = None 161 157 try: 162 158 self.authz.add_path(Path(path, [], self.authz_module)) 159 return {} 163 160 except Exception, e: 164 re q.hdf['addpath.error'] = e161 return {'addpath_error' : e} 165 162 166 163 def _add_group_member(self, req): 167 164 editgroup = url2pathname(req.args.get('editgroup')) 168 165 subject = req.args.get('subject') 169 166 group = self.authz.find_group(editgroup) 170 167 if (group == None): 171 req.hdf['addgroupmember.error'] = "Group %s does not exist" % editgroup 172 return 168 return {'addgroupmember_error': "Group %s does not exist" % editgroup } 173 169 try: 174 170 member = self._get_member(subject) 175 171 assert (member != None) 176 172 group.append(member) 177 173 except Exception, e: 178 req.hdf['addgroupmember.error'] = e 174 return {'addgroupmember_error':e} 175 return {} 179 176 180 177 def _add_path_member(self, req): 181 178 editpath = url2pathname(req.args.get('editpath')) … … 184 181 paths = [(p.get_repo(), p.get_path()) for p in self.authz.get_paths()] 185 182 validpath = self._get_valid_path(paths, editpath) 186 183 if not validpath: 187 req.hdf['changepathmember.error'] = "Not a valid path: %s" % editpath 188 return 184 return {'changepathmember_error' : "Not a valid path: %s" % editpath} 189 185 path = validpath[1] 190 186 path_members = self.authz.find_path(path, self.authz_module) 191 187 … … 208 204 assert (s != None) 209 205 path_members.append(PathAcl(s, read, write)) 210 206 except Exception, e: 211 req.hdf['addpathmember.error'] = e 207 return {'addpathmember_error' : e } 208 return {} 212 209 213 210 214 211 def _del_group_member(self, req): … … 216 213 members_to_del = req.args.get('selgroupmember') 217 214 group = self.authz.find_group(editgroup) 218 215 if not group: 219 req.hdf['delgroupmember.error'] = "Group %s does not exist" % editgroup 220 return 216 return {'delgroupmember_error': "Group %s does not exist" % editgroup } 221 217 try: 222 218 if isinstance(members_to_del, types.StringTypes): 223 219 group.remove(self._get_member(members_to_del)) … … 225 221 for member in members_to_del: 226 222 group.remove(self._get_member(member)) 227 223 else: 228 re q.hdf['delgroupmember.error'] = "Wrong type of selection"224 return {'delgroupmember_error': "Wrong type of selection" } 229 225 except Exception, e: 230 re q.hdf['delgroupmember.error'] = e226 return {'delgroupmember_error': e} 231 227 228 return {} 229 232 230 def _change_path_members(self, req): 233 231 editpath = url2pathname(req.args.get('editpath')) 234 232 paths = [(p.get_repo(), p.get_path()) for p in self.authz.get_paths()] 235 233 validpath = self._get_valid_path(paths, editpath) 236 234 if not validpath: 237 req.hdf['changepathmember.error'] = "Not a valid path: %s" % editpath 238 return 235 return {'changepathmember_error' : "Not a valid path: %s" % editpath } 239 236 path = validpath[1] 240 237 members_to_del = req.args.get('selpathmember') 241 238 member_acls = req.args.get('selpathmember_acl') … … 243 240 244 241 if len(path_members) == 0: 245 242 # Nothing to do 246 return 243 return {} 247 244 248 245 try: 249 246 if members_to_del != None: 250 247 if isinstance(members_to_del, types.StringTypes): 251 248 members_to_del = [members_to_del] 252 249 if not isinstance(members_to_del, types.ListType): 253 req.hdf['changepathmember.error'] = "Wrong type of member selection" 254 return 250 return {'changepathmember_error': "Wrong type of member selection"} 255 251 for member in members_to_del: 256 252 path_members.remove(path_members.find_path_member(self._get_member(member))) 257 253 except Exception, e: 258 req.hdf['changepathmember.error'] = e 259 return 254 return {'changepathmember_error': e} 260 255 261 256 if member_acls == None: 262 257 member_acls = "" … … 277 272 member.set_read(read) 278 273 member.set_write(write) 279 274 except Exception, e: 280 req.hdf['changepathmember.error'] = e 275 return {'changepathmember_error':e} 276 return {} 281 277 282 278 def _edit_group(self, req, cat, page, path_info): 283 279 """ 284 280 Populates the editgroup.* parts of the hdf 285 281 @return the value of editgroup.url or None 286 282 """ 283 data = {} 287 284 editgroup = url2pathname(path_info[path_info.index('/')+1:len(path_info)]) 288 285 group = self.authz.find_group(editgroup) 286 print group 289 287 if group != None: 290 req.hdf['editgroup.name'] = editgroup291 req.hdf['editgroup.url'] = pathname2url(editgroup)292 req.hdf['editgroup.members'] = [m.__str__() for m in group]288 data['editgroup_name'] = editgroup 289 data['editgroup_url'] = pathname2url(editgroup) 290 data['editgroup_members'] = [m.__str__() for m in group] 293 291 294 292 # Populate member candidates 295 293 not_in_list = [m.__str__() for m in group] 296 294 not_in_list.append("@%s" % editgroup) 297 295 candidates = self._get_candidate_subjects(not_in_list) 298 296 if candidates != []: 299 req.hdf['editgroup.candidates'] = candidates 300 return req.hdf['editgroup.url'] 301 return None 297 data['editgroup_candidates'] = candidates 298 return data['editgroup_url'], data 299 self.env.log.debug("SvnAdminAuthz: Group %s not found." % editgroup) 300 return None, {} 302 301 302 def _get_all_users(self): 303 """ 304 Fetches all users/groups from PermissionSystem 305 """ 306 perm = PermissionSystem(self.env) 307 users = ["*"] 308 data = perm.get_all_permissions() 309 if not data: 310 return [] # we abort here 311 312 for (subject, action) in data: 313 if subject not in users and subject not in ["anonymous", "authenticated"]: 314 users.append(subject) 315 return users 316 303 317 def _get_candidate_subjects(self, not_in_list = []): 304 318 candidates = [] 305 users = [user for user in self. account_manager.get_users()319 users = [user for user in self._get_all_users() 306 320 if user not in not_in_list] 307 321 candidates += sorted(users) 308 322 candidates += sorted([group.__str__() for group in self.authz.get_groups() 309 323 if group.__str__() not in not_in_list]) 310 self.env.log.debug("Candidates:")311 for c in candidates:312 self.env.log.debug(" %s" % c)324 #self.env.log.debug("Candidates:") 325 #for c in candidates: 326 # self.env.log.debug(" %s" % c) 313 327 return candidates 314 328 315 329 def _edit_path(self, req, cat, page, path_info): … … 317 331 Populates the editpath.* parts of the hdf 318 332 @return the value of editgroup.url or None 319 333 """ 334 data = {} 320 335 editpath = url2pathname(path_info[path_info.index('/')+1:len(path_info)]) 321 336 paths = [(p.get_repo(), p.get_path()) for p in self.authz.get_paths()] 322 337 validpath = self._get_valid_path(paths, editpath) 323 338 if validpath: 324 req.hdf['editpath.name'] = self._get_disp_path_name(validpath[0], validpath[1])325 req.hdf['editpath.url'] = pathname2url(editpath)339 data['editpath_name'] = self._get_disp_path_name(validpath[0], validpath[1]) 340 data['editpath_url'] = pathname2url(editpath) 326 341 pathmembers = self.authz.find_path(validpath[1], validpath[0]) 327 342 editpath_members = [] 328 343 for member in pathmembers: … … 335 350 editpath_members.append({'subject' : member.get_member().__str__(), 336 351 'read' : read, 337 352 'write' : write}) 338 req.hdf['editpath.members'] = editpath_members353 data['editpath_members'] = editpath_members 339 354 340 355 # Populate member candidates 341 356 not_in_list = [m.get_member().__str__() for m in pathmembers] 342 357 candidates = self._get_candidate_subjects(not_in_list) 343 358 if candidates != []: 344 req.hdf['editpath.candidates'] = candidates345 return req.hdf['editpath.url']346 return None 359 data['editpath_candidates'] = candidates 360 return data['editpath_url'], data 361 return None, {} 347 362 348 363 def _get_valid_path(self, pathlist, path): 349 364 for repository, pathname in pathlist: -
setup.py
old new 3 3 from setuptools import setup, find_packages 4 4 5 5 PACKAGE = 'SvnAuthzAdminPlugin' 6 VERSION = '0.1 '6 VERSION = '0.1.2 (Moved to Trac 0.11)' 7 7 8 8 setup( name=PACKAGE, version=VERSION, 9 9 author = 'Gergely Kis', … … 15 15 package_dir = { 'svnauthz' : 'svnauthz', 16 16 'svnauthz_test' : 'svnauthz_test' }, 17 17 packages = ['svnauthz', 'svnauthz_test' ], 18 package_data = { 'svnauthz' : ['templates/* .cs', ]},18 package_data = { 'svnauthz' : ['templates/*', ]}, 19 19 entry_points = {'trac.plugins': ['svnauthz.admin_ui = svnauthz.admin_ui', 20 'svnauthz.SvnAuthzFile = svnauthz.SvnAuthzFile']}, 21 install_requires = ['TracWebAdmin', 'TracAccountManager'] 20 # 'svnauthz.SvnAuthzFile = svnauthz.SvnAuthzFile' 21 ]}, 22 zip_safe = False, 23 install_requires = [] 22 24 )
