def runTest(self): """Tests for the Copy Permissions functionality added in http://trac.edgewall.org/ticket/11099.""" checkbox_value = lambda s, p: '%s:%s' % (unicode_to_base64(s), unicode_to_base64(p)) grant_msg = "The subject %s has been granted the permission %s\." def grant_permission(subject, action): tc.formvalue('addperm', 'gp_subject', subject) tc.formvalue('addperm', 'action', action) tc.submit() tc.find(grant_msg % (subject, action)) tc.find(checkbox_value(subject, action)) env = self._testenv.get_trac_environment() # Copy permissions from subject to target self._tester.go_to_admin('Permissions') perm_sys = PermissionSystem(env) anon_perms = perm_sys.store.get_user_permissions('anonymous') for perm in anon_perms: tc.find(checkbox_value('anonymous', perm)) tc.notfind(checkbox_value('user1', perm)) tc.formvalue('copyperm', 'cp_subject', 'anonymous') tc.formvalue('copyperm', 'cp_target', 'user1') tc.submit() for perm in anon_perms: tc.find("The subject user1 has been granted the permission %s\." % perm) tc.find(checkbox_value('user1', perm)) # Subject doesn't have any permissions tc.notfind(checkbox_value('noperms', '')) tc.formvalue('copyperm', 'cp_subject', 'noperms') tc.formvalue('copyperm', 'cp_target', 'user1') tc.submit() tc.find("The subject noperms does not have any permissions\.") # Subject belongs to group but doesn't directly have any permissions grant_permission('group1', 'TICKET_VIEW') tc.formvalue('addsubj', 'sg_subject', 'noperms') tc.formvalue('addsubj', 'sg_group', 'group1') tc.submit() tc.find("The subject noperms has been added to the group group1\.") tc.formvalue('copyperm', 'cp_subject', 'noperms') tc.formvalue('copyperm', 'cp_target', 'user1') tc.submit() tc.find("The subject noperms does not have any permissions\.") # Target uses reserved all upper-case form tc.formvalue('copyperm', 'cp_subject', 'noperms') tc.formvalue('copyperm', 'cp_target', 'USER1') tc.submit() tc.find("All upper-cased tokens are reserved for permission names\.") self._tester.go_to_admin("Permissions") # Subject users reserved all upper-case form tc.formvalue('copyperm', 'cp_subject', 'USER1') tc.formvalue('copyperm', 'cp_target', 'noperms') tc.submit() tc.find("All upper-cased tokens are reserved for permission names\.") self._tester.go_to_admin("Permissions") # Target already possess one of the permissions anon_perms = perm_sys.store.get_user_permissions('anonymous') for perm in anon_perms: tc.notfind(checkbox_value('user2', perm)) grant_permission('user2', anon_perms[0]) tc.formvalue('copyperm', 'cp_subject', 'anonymous') tc.formvalue('copyperm', 'cp_target', 'user2') tc.submit() tc.notfind("The subject <em>user2</em> has been granted the " "permission %s\." % anon_perms[0]) for perm in anon_perms[1:]: tc.find("The subject user2 has been granted the permission %s\." % perm) tc.find(checkbox_value('user2', perm)) # Subject has a permission that is no longer defined try: env.db_transaction("INSERT INTO permission VALUES (%s,%s)", ('anonymous', 'NOTDEFINED_PERMISSION')) except env.db_exc.IntegrityError: pass env.config.touch() # invalidate permission cache tc.reload() tc.find(checkbox_value('anonymous', 'NOTDEFINED_PERMISSION')) perm_sys = PermissionSystem(env) anon_perms = perm_sys.store.get_user_permissions('anonymous') for perm in anon_perms: tc.notfind(checkbox_value('user3', perm)) tc.formvalue('copyperm', 'cp_subject', 'anonymous') tc.formvalue('copyperm', 'cp_target', 'user3') tc.submit() for perm in anon_perms: msg = grant_msg % ('user3', perm) if perm == 'NOTDEFINED_PERMISSION': tc.notfind(msg) tc.notfind(checkbox_value('user3', perm)) else: tc.find(msg) tc.find(checkbox_value('user3', perm)) perm_sys.revoke_permission('anonymous', 'NOTDEFINED_PERMISSION') # Actor doesn't posses permission grant_permission('anonymous', 'PERMISSION_GRANT') grant_permission('user3', 'TRAC_ADMIN') self._tester.logout() self._tester.go_to_admin("Permissions") try: tc.formvalue('copyperm', 'cp_subject', 'user3') tc.formvalue('copyperm', 'cp_target', 'user4') tc.submit() perm_sys = PermissionSystem(env) for perm in [perm[1] for perm in perm_sys.get_all_permissions() if perm[0] == 'user3' and perm[1] != 'TRAC_ADMIN']: tc.find(grant_msg % ('user4', perm)) tc.notfind("The permission TRAC_ADMIN was not granted to user4 " "because users cannot grant permissions they don't " "possess.") finally: self._testenv.revoke_perm('anonymous', 'PERMISSION_GRANT') self._tester.login('admin')
def runTest(self): """Tests for the Copy Permissions functionality added in http://trac.edgewall.org/ticket/11099.""" checkbox_value = lambda s, p: '%s:%s' % (unicode_to_base64(s), unicode_to_base64(p)) grant_msg = "The subject %s has been granted the permission %s\." def grant_permission(subject, action): tc.formvalue('addperm', 'gp_subject', subject) tc.formvalue('addperm', 'action', action) tc.submit() tc.find(grant_msg % (subject, action)) tc.find(checkbox_value(subject, action)) env = self._testenv.get_trac_environment() # Copy permissions from subject to target self._tester.go_to_admin('Permissions') perm_sys = PermissionSystem(env) anon_perms = perm_sys.store.get_user_permissions('anonymous') for perm in anon_perms: tc.find(checkbox_value('anonymous', perm)) tc.notfind(checkbox_value('user1', perm)) tc.formvalue('copyperm', 'cp_subject', 'anonymous') tc.formvalue('copyperm', 'cp_target', 'user1') tc.submit() for perm in anon_perms: tc.find("The subject user1 has been granted the permission %s\." % perm) tc.find(checkbox_value('user1', perm)) # Subject doesn't have any permissions tc.notfind(checkbox_value('noperms', '')) tc.formvalue('copyperm', 'cp_subject', 'noperms') tc.formvalue('copyperm', 'cp_target', 'user1') tc.submit() tc.find("The subject noperms does not have any permissions\.") # Subject belongs to group but doesn't directly have any permissions grant_permission('group1', 'TICKET_VIEW') tc.formvalue('addsubj', 'sg_subject', 'noperms') tc.formvalue('addsubj', 'sg_group', 'group1') tc.submit() tc.find("The subject noperms has been added to the group group1\.") tc.formvalue('copyperm', 'cp_subject', 'noperms') tc.formvalue('copyperm', 'cp_target', 'user1') tc.submit() tc.find("The subject noperms does not have any permissions\.") # Target uses reserved all upper-case form tc.formvalue('copyperm', 'cp_subject', 'noperms') tc.formvalue('copyperm', 'cp_target', 'USER1') tc.submit() tc.find("All upper-cased tokens are reserved for permission names\.") self._tester.go_to_admin("Permissions") # Subject users reserved all upper-case form tc.formvalue('copyperm', 'cp_subject', 'USER1') tc.formvalue('copyperm', 'cp_target', 'noperms') tc.submit() tc.find("All upper-cased tokens are reserved for permission names\.") self._tester.go_to_admin("Permissions") # Target already possess one of the permissions anon_perms = perm_sys.store.get_user_permissions('anonymous') for perm in anon_perms: tc.notfind(checkbox_value('user2', perm)) grant_permission('user2', anon_perms[0]) tc.formvalue('copyperm', 'cp_subject', 'anonymous') tc.formvalue('copyperm', 'cp_target', 'user2') tc.submit() tc.notfind("The subject <em>user2</em> has been granted the " "permission %s\." % anon_perms[0]) for perm in anon_perms[1:]: tc.find("The subject user2 has been granted the permission %s\." % perm) tc.find(checkbox_value('user2', perm)) # Subject has a permission that is no longer defined try: env.db_transaction("INSERT INTO permission VALUES (%s,%s)", ('anonymous', 'NOTDEFINED_PERMISSION')) except env.db_exc.IntegrityError: pass env.config.touch() # invalidate permission cache tc.reload() tc.find(checkbox_value('anonymous', 'NOTDEFINED_PERMISSION')) perm_sys = PermissionSystem(env) anon_perms = perm_sys.store.get_user_permissions('anonymous') for perm in anon_perms: tc.notfind(checkbox_value('user3', perm)) tc.formvalue('copyperm', 'cp_subject', 'anonymous') tc.formvalue('copyperm', 'cp_target', 'user3') tc.submit() for perm in anon_perms: msg = grant_msg % ('user3', perm) if perm == 'NOTDEFINED_PERMISSION': tc.notfind(msg) tc.notfind(checkbox_value('user3', perm)) else: tc.find(msg) tc.find(checkbox_value('user3', perm)) perm_sys.revoke_permission('anonymous', 'NOTDEFINED_PERMISSION') # Actor doesn't posses permission grant_permission('anonymous', 'PERMISSION_GRANT') grant_permission('user3', 'TRAC_ADMIN') self._tester.logout() self._tester.go_to_admin("Permissions") try: tc.formvalue('copyperm', 'cp_subject', 'user3') tc.formvalue('copyperm', 'cp_target', 'user4') tc.submit() perm_sys = PermissionSystem(env) for perm in [ perm[1] for perm in perm_sys.get_all_permissions() if perm[0] == 'user3' and perm[1] != 'TRAC_ADMIN' ]: tc.find(grant_msg % ('user4', perm)) tc.notfind("The permission TRAC_ADMIN was not granted to user4 " "because users cannot grant permissions they don't " "possess.") finally: self._testenv.revoke_perm('anonymous', 'PERMISSION_GRANT') self._tester.login('admin')