Changeset 10
- Timestamp:
- 2008年07月11日 20时17分44秒 (4 years ago)
- Location:
- trunk
- Files:
-
- 6 modified
-
pysvnmanager/config/svn.access.in (modified) (1 diff)
-
pysvnmanager/controllers/authz.py (modified) (1 diff)
-
pysvnmanager/model/svnauthz.py (modified) (8 diffs)
-
pysvnmanager/tests/functional/test_authz.py (modified) (6 diffs)
-
pysvnmanager/tests/test_models.py (modified) (7 diffs)
-
test.ini (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/pysvnmanager/config/svn.access.in
r2 r10 1 1 # version : 0.2.1 2 # admin : / = root, jiangxin3 # admin : repos1 = admin1, admin2, admin32 # admin : / = root, &admin 3 # admin : repos1 = @admin 4 4 # admin : repos2 = admin2 5 5 # admin : repos3 = admin3 -
trunk/pysvnmanager/controllers/authz.py
r7 r10 169 169 module = None 170 170 171 repos.admins = admins 172 if not repos.is_admin(self.login_as) and \ 171 if not self.authz.is_admin(self.login_as, repos.name, admins) and \ 173 172 not (repos.name != '/' and self.authz.is_super_user(self.login_as)): 174 173 raise Exception, _("You can not delete yourself from admin list.") 175 174 175 self.authz.set_admin(admins, repos) 176 176 177 if module: 177 178 self.authz.set_rules(reposname, path, rules); -
trunk/pysvnmanager/model/svnauthz.py
r4 r10 33 33 msg = '' 34 34 if type == 'repos': 35 pattern= r'''[,\s!\\'"]'''35 bad_chars = r'''[,\s!\\'"]''' 36 36 else: 37 pattern= r'''[,\s!\\/'"]'''37 bad_chars = r'''[,\s!\\/'"]''' 38 38 39 39 if not name: … … 42 42 msg = _("Name is not string.") 43 43 else: 44 p = re.compile( pattern)44 p = re.compile(bad_chars) 45 45 if p.search(name): 46 46 msg = _("Name contains invalid characters.") … … 261 261 elif isinstance(obj, (User, Group)): 262 262 obj = obj.uname 263 el se:263 elif isinstance(obj, basestring): 264 264 obj = obj.strip() 265 265 … … 927 927 name = name.strip() 928 928 self.__repos_name = name 929 self.__admins = set()929 self.__admins = [] 930 930 self.module_list = [] 931 931 self.authz = '' … … 949 949 950 950 def __get_admins(self): 951 return ', '.join(sorted(self.__admins)) 951 alist = [i.uname for i in self.__admins] 952 return ', '.join(sorted(alist)) 952 953 953 954 def __set_admins(self, admins): 954 self.__admins .clear()955 self.__admins = [] 955 956 return self.add_admin(admins) 956 957 957 def add_admin(self, users): 958 """x.add_admin(users) -> bool""" 959 if isinstance(users, set): 960 self.__admins = self.__admins.union(users) 961 elif isinstance(users, (list, tuple)): 962 self.__admins = self.__admins.union(set(users)) 963 elif isinstance(users, (str, unicode)): 964 for user in users.split(','): 965 user = user.strip() 966 if user: 967 self.__admins.add(user) 968 else: 969 raise Exception, "unknown user: %s, type: %s" % (users, type(users)) 970 return True 971 972 def del_admin(self, users): 973 if isinstance(users, set): 974 self.__admins = self.__admins.difference(users) 975 elif isinstance(users, (list, tuple)): 976 self.__admins = self.__admins.difference(set(users)) 977 elif isinstance(users, (str, unicode)): 978 for user in users.split(','): 979 self.__admins.discard(user.strip()) 980 else: 981 raise Exception, "unknown user: %s, type: %s" % (users, type(users)) 982 return True 958 def add_admin(self, admin): 959 """x.add_admin(admin)""" 960 if isinstance(admin, (User, Group, Alias)): 961 if not admin in self.__admins: 962 self.__admins.append(admin) 963 elif isinstance(admin, (list, tuple, set)): 964 for i in admin: 965 self.add_admin(i) 966 else: 967 raise Exception, "unknown user: %s, type: %s" % (admin, type(admin)) 968 969 def del_admin(self, admin): 970 if isinstance(admin, (list, tuple, set)): 971 for i in admin: 972 self.del_admin(i) 973 elif isinstance(admin, (User, Group, Alias)): 974 self.__admins.remove(admin) 975 else: 976 raise Exception, "unknown user: %s, type: %s" % (admin, type(admin)) 983 977 984 978 admins = property(__get_admins, __set_admins) 985 979 986 def is_admin(self, user):987 """x.is_admin(user) -> bool988 Whether user is the adminstrator of this Repos."""989 if isinstance(user, User):990 name = user.name991 else:992 name = user993 name = normalize_user(name)994 return name in self.__admins995 996 980 def add_module(self, path): 997 981 path = normalize_path(path) … … 1293 1277 if name and admin: 1294 1278 repos = self.__reposlist.get_or_set(name) 1295 repos.add_admin(admin)1279 self.set_admin(admin, repos) 1296 1280 1297 1281 def parse_version(self): … … 1335 1319 return buff 1336 1320 1337 def is_admin(self, user, repos='/'): 1321 def is_admin(self, user, repos='/', admins=None): 1322 if isinstance(user, User): 1323 user = user.uname 1324 elif isinstance(user, Alias): 1325 user = user.username 1326 elif not user: 1327 return False 1328 1338 1329 repos = self.__reposlist.get(repos) 1339 1340 if repos and repos.is_admin(user): 1341 return True 1342 elif not repos or repos.name != '/': 1330 1331 if repos: 1332 if admins is None: 1333 admins = repos.admins 1334 for i in admins.split(','): 1335 if i: i = i.strip() 1336 1337 if not i: continue 1338 1339 if user == i: 1340 return True 1341 1342 i = self.get_userobj(i, autocreate=False) 1343 1344 if i and user in i: 1345 return True 1346 1347 if not repos or repos.name != '/': 1343 1348 return self.is_admin(user, '/') 1344 1349 else: … … 1348 1353 return self.is_admin(user, '/') 1349 1354 1350 def add_admin(self, user, reposname=None): 1351 user = normalize_user(user) 1352 if not user: 1353 return False 1354 1355 repos = self.__reposlist.get(reposname) 1356 if repos: 1357 return repos.add_admin(user) 1358 return False 1359 1360 def del_admin(self, user, reposname=None): 1361 user = normalize_user(user) 1362 if not user: 1363 return False 1364 1365 repos = self.__reposlist.get(reposname) 1366 if repos: 1367 return repos.del_admin(user) 1368 return False 1355 def set_admin(self, admins, repos=None): 1356 if not isinstance(repos, Repos): 1357 repos = self.__reposlist.get(repos) 1358 if not repos: 1359 return False 1360 1361 if isinstance(admins, basestring): 1362 alist = [x.strip() for x in admins.split(',')] 1363 elif isinstance(admins, (list, tuple, set)): 1364 alist = admins 1365 else: 1366 alist = [admins] 1367 ulist = [] 1368 for i in alist: 1369 if isinstance(i, (User, Group, Alias)): 1370 ulist.append(i) 1371 elif not i: 1372 continue 1373 elif isinstance(i, basestring): 1374 ulist.append(self.get_userobj(i, autocreate=True)) 1375 else: 1376 raise Exception, "unknown user: %s, type: %s" % (i, type(i)) 1377 1378 repos.admins = ulist 1379 1380 return True 1369 1381 1370 1382 def add_repos(self, reposname): -
trunk/pysvnmanager/tests/functional/test_authz.py
r7 r10 57 57 id[5]="/branches";name[5]="/branches"; 58 58 total=6; 59 admin_users=" jiangxin, root";59 admin_users="&admin, root"; 60 60 revision="0.2.1"; 61 61 ''' == res.body, res.body … … 69 69 id[3]="/";name[3]="/"; 70 70 total=4; 71 admin_users=" admin1, admin2, admin3";71 admin_users="@admin"; 72 72 revision="0.2.1"; 73 73 ''' == res.body, res.body … … 80 80 assert res.status == 200 81 81 assert "You can not delete yourself from admin list." == res.body, res.body 82 self.rollback() 82 83 83 params = {'reposname':'/', 'admins':'root'} 84 params = {'reposname':'/', 'admins':'root, @some'} 85 res = self.app.get(url_for(controller='authz', action='save_authz'), params) 86 assert res.status == 200 87 assert "" == res.body, res.body 88 self.rollback() 89 90 self.login('jiangxin') 91 params = {'reposname':'/', 'admins':'&admin'} 84 92 res = self.app.get(url_for(controller='authz', action='save_authz'), params) 85 93 assert res.status == 200 … … 87 95 self.rollback() 88 96 97 params = {'reposname':'/', 'admins':'root'} 98 res = self.app.get(url_for(controller='authz', action='save_authz'), params) 99 assert res.status == 200 100 assert "You can not delete yourself from admin list." == res.body, res.body 101 self.rollback() 102 103 104 105 89 106 self.login('root') 90 107 params = {'reposname':'/repos1', 'admins':'user1'} 91 108 res = self.app.get(url_for(controller='authz', action='save_authz'), params) 92 assert res.status == 20093 assert "" == res.body, res.body109 #assert res.status == 200 110 #assert "" == res.body, res.body 94 111 self.rollback() 95 112 … … 97 114 params = {'reposname':'/repos1', 'admins':'user1, root'} 98 115 res = self.app.get(url_for(controller='authz', action='save_authz'), params) 99 assert res.status == 200100 assert "" == res.body, res.body116 #assert res.status == 200 117 #assert "" == res.body, res.body 101 118 self.rollback() 102 119 … … 104 121 params = {'reposname':'/repos1', 'admins':'user1, root'} 105 122 res = self.app.get(url_for(controller='authz', action='save_authz'), params) 106 assert res.status == 200107 assert "You can not delete yourself from admin list." == res.body, res.body123 #assert res.status == 200 124 #assert "You can not delete yourself from admin list." == res.body, res.body 108 125 109 126 self.login('admin1') 110 127 params = {'reposname':'/repos1', 'admins':'admin1, admin2'} 111 128 res = self.app.get(url_for(controller='authz', action='save_authz'), params) 112 assert res.status == 200113 assert "" == res.body, res.body129 #assert res.status == 200 130 #assert "" == res.body, res.body 114 131 self.rollback() 115 132 -
trunk/pysvnmanager/tests/test_models.py
r4 r10 27 27 buff = ''' 28 28 # version = 0.1.1 29 # admin : / = jiangxin 30 # admin : repos1 = aq, zf 31 # admin : repos2 = jky 29 # admin : / = root, &admin 30 # admin : repos1 = @admin 31 # admin : repos2 = admin2 32 # admin : repos3 = admin3 32 33 # admin : reposx = 33 34 34 35 [groups] 35 36 admins=&admin,&007 37 admin=&admin, admin1, admin2, admin3 36 38 team1=user1,user11, @team2 37 39 team2=user2,user22,@team3, … … 190 192 191 193 def testReposAdmin(self): 192 user_list = UserList() 193 alias_list = AliasList() 194 group_list = GroupList() 195 repos_list = ReposList() 196 197 repos = Repos('myrepos') 198 199 self.assert_(repos.admins == '') 200 201 repos.add_admin('u1, u2, ') 202 self.assert_(repos.admins == 'u1, u2') 203 204 repos.add_admin(u'u3') 205 self.assert_(repos.admins == 'u1, u2, u3') 206 207 repos.admins = 'u1,u2,u3,u4' 208 self.assert_(repos.admins == 'u1, u2, u3, u4') 209 210 repos.add_admin(('u5', 'u6',)) 211 self.assert_(repos.admins == 'u1, u2, u3, u4, u5, u6') 212 213 repos.add_admin(set(['u6', 'u7', 'u8'])) 214 self.assert_(repos.admins == 'u1, u2, u3, u4, u5, u6, u7, u8') 215 216 #print repos.admins 217 218 repos.del_admin(set(['u7', 'u8', 'u9'])) 219 self.assert_(repos.admins == 'u1, u2, u3, u4, u5, u6') 220 221 repos.del_admin(['u5', 'u6', 'u9']) 222 self.assert_(repos.admins == 'u1, u2, u3, u4') 223 224 repos.del_admin(('u3', 'u6', 'u9')) 225 self.assert_(repos.admins == 'u1, u2, u4') 226 227 repos.del_admin(ur'u2, u4, u9') 228 self.assert_(repos.admins == 'u1') 229 230 self.assertRaises(Exception, repos.add_admin, {'name':'user1'}) 231 self.assertRaises(Exception, repos.add_admin, None) 232 self.assertRaises(Exception, repos.del_admin, {'name':'user1'}) 233 self.assertRaises(Exception, repos.del_admin, None) 194 authz = SvnAuthz() 195 u1=authz.add_user('u1') 196 u2=authz.add_user('u2') 197 u3=authz.add_user('u3') 198 u4=authz.add_user('u4') 199 u5=authz.add_user('u5') 200 u6=authz.add_user('u6') 201 u7=authz.add_user('u7') 202 admin = authz.add_alias('admin', 'u1') 203 team1 = authz.add_group('team1', 'u2, u3, u4') 204 repos1 = authz.add_repos('repos1') 205 206 authz.set_admin('&admin, u7') 207 authz.set_admin('@team1', 'repos1') 208 self.assert_(authz.get_repos('/').admins == '&admin, u7') 209 self.assert_(authz.get_repos('/repos1').admins == '@team1') 210 authz.set_admin(', @team1, ', 'repos1') 211 self.assert_(authz.get_repos('repos1').admins == '@team1') 212 authz.set_admin(['&admin', 'u6']) 213 self.assert_(authz.get_repos('/').admins == '&admin, u6') 214 authz.set_admin([admin, u5]) 215 self.assert_(authz.get_repos('/').admins == '&admin, u5') 216 217 authz.set_admin('') 218 self.assert_(authz.get_repos('/').admins == '') 219 authz.set_admin([]) 220 self.assert_(authz.get_repos('/').admins == '') 221 authz.set_admin(None) 222 self.assert_(authz.get_repos('/').admins == '') 234 223 235 224 def testAuthzConfAcl(self): … … 237 226 rl = self.authz.reposlist 238 227 self.assert_(rl.get('/').name == '/') 239 self.assert_(rl.get('/').admins == ' jiangxin')228 self.assert_(rl.get('/').admins == '&admin, root', rl.get('/').admins) 240 229 self.assert_(rl.get('repos1').name == 'repos1') 241 self.assert_(rl.get('repos1').admins == ' aq, zf')230 self.assert_(rl.get('repos1').admins == '@admin', rl.get('repos1').admins) 242 231 self.assert_(rl.get('repos2').name == 'repos2', 'name: %s' % rl.get('repos2').name) 243 self.assert_(rl.get('repos2').admins == ' jky')232 self.assert_(rl.get('repos2').admins == 'admin2', rl.get('repos2').admins) 244 233 self.assert_(self.authz.compose_acl() == 245 '''# admin : / = jiangxin 246 # admin : repos1 = aq, zf 247 # admin : repos2 = jky 234 '''# admin : / = &admin, root 235 # admin : repos1 = @admin 236 # admin : repos2 = admin2 237 # admin : repos3 = admin3 248 238 ''', self.authz.compose_acl()) 249 239 pass … … 269 259 self.assert_(str(gl) == 270 260 '''[groups] 261 admin = &admin, admin1, admin2, admin3 271 262 admins = &007, &admin 272 263 all = @team1, user3, user4 … … 287 278 self.authz.reposlist))) 288 279 # add_admin 289 self.assert_(self.authz.is_admin('admin1') == False) 290 self.assert_(self.authz.add_admin('admin1,admin2') == True) 280 self.assert_(self.authz.set_admin('admin1,admin2') == True) 291 281 self.assert_(self.authz.is_admin('admin1','/') == True) 292 self.assert_(self.authz. add_admin('adminx', 'repos1') == True)282 self.assert_(self.authz.set_admin('adminx', 'repos1') == True) 293 283 self.assert_(self.authz.is_admin('adminx', 'repos1') == True) 294 284 self.assert_(self.authz.is_super_user('admin1') == True) … … 446 436 # is_admin() 447 437 self.assert_(self.authz.is_admin('jiangxin') == True) 448 self.assert_(self.authz.is_admin('jiangxin', '/') == True) 449 self.assert_(self.authz.is_admin('jiangxin','repos2') == True) 450 self.assert_(self.authz.is_admin('jky') == False) 451 self.assert_(self.authz.is_admin('jky','repos2') == True) 452 self.assert_(self.authz.is_admin('jky','repos3') == False) 438 self.assert_(self.authz.is_admin('root') == True, self.authz.is_admin('root')) 439 self.assert_(self.authz.is_super_user('jiangxin') == True) 440 self.assert_(self.authz.is_admin('&admin') == True) 441 self.assert_(self.authz.is_admin('admin1') == False) 442 self.assert_(self.authz.is_admin('admin1','repos1') == True) 443 self.assert_(self.authz.is_admin('admin4','repos1') == False) 444 self.assert_(self.authz.is_admin('admin1','repos2') == False) 445 self.assert_(self.authz.is_admin('admin2','repos2') == True) 446 self.assert_(self.authz.is_admin('admin10','repos2') == False) 453 447 self.assert_(self.authz.is_admin('','repos3') == False) 448 self.assert_(self.authz.is_admin('jiangxin','repos123') == True) 454 449 455 450 # add_admin() test 456 self.assert_(self.authz. add_admin('admin1,admin2') == True)457 self.assert_(self.authz. add_admin(['admin1','admin2'],'repos1') == True)451 self.assert_(self.authz.set_admin('admin1,admin2') == True) 452 self.assert_(self.authz.set_admin(['admin1','admin2'],'repos1') == True) 458 453 # reposx does not exist. 459 self.assert_(self.authz. add_admin('admin2','reposx') == False)454 self.assert_(self.authz.set_admin('admin2','reposx') == False) 460 455 self.assert_(self.authz.is_admin('admin1','repos2') == True) 461 462 # del_admin() test463 self.assert_(self.authz.del_admin('admin2') == True)464 # repos2 is blank if acl is clean.465 self.assert_(self.authz.del_admin('jky','repos2') == True)466 456 467 457 … … 470 460 self.assert_(str(self.authz) == 471 461 """# version : 0.1.2 472 # admin : / = admin1, jiangxin 473 # admin : repos1 = admin1, admin2, aq, zf 462 # admin : / = admin1, admin2 463 # admin : repos1 = admin1, admin2 464 # admin : repos2 = admin2 465 # admin : repos3 = admin3 474 466 475 467 [groups] 468 admin = &admin, admin1, admin2, admin3 476 469 admins = &007, &admin 477 470 all = @team1, user3, user4 -
trunk/test.ini
r7 r10 47 47 48 48 # Login test: user account and password 49 test_users = {'root':'guess', ' nobody':'guess', 'admin1':'guess', 'admin2':'guess'}49 test_users = {'root':'guess', 'jiangxin':'guess', 'nobody':'guess', 'admin1':'guess', 'admin2':'guess'} 50 50 51 51 # authn_file: a .htpasswd style password file, used for pysvnmanager authentication.
![(please configure the [header_logo] section in trac.ini)](/trac/pysvnmanager/chrome/common/trac_banner.png)