Skip to content
Snippets Groups Projects
Forked from uffd / uffd
66 commits behind the upstream repository.
  • Julian's avatar
    4a9c455f
    Move User, Group and Mail models from LDAP to DB · 4a9c455f
    Julian authored
    * Removal of ldapalchemy and LDAP mocking support
    * Removal of dependency on ldap3 (except for the migration)
    * Remaining "LDAP_<name>" config keys are renamed to "<name>"
    * Web interface to create, edit and delete groups
    * Consistent foreign key, cascading and nullable configuration on all models
    * User/Group.dn is replaced with numeric User/Group.id
    * User.uid is renamed to User.unix_uid (to differentiate with new User.id)
    * Group.gid is renamed to Group.unix_gid (to differentiate with new Group.id)
    * All User/Group/Mail related routes now use the database ids instead of uid/gid/dn
    * PasswordToken/MailToken now reference users directly instead of storing loginnames
    
    The database migration (optionally) uses the v1 config keys to connect to
    an LDAP server and to import all users, groups and mail forwardings.
    4a9c455f
    History
    Move User, Group and Mail models from LDAP to DB
    Julian authored
    * Removal of ldapalchemy and LDAP mocking support
    * Removal of dependency on ldap3 (except for the migration)
    * Remaining "LDAP_<name>" config keys are renamed to "<name>"
    * Web interface to create, edit and delete groups
    * Consistent foreign key, cascading and nullable configuration on all models
    * User/Group.dn is replaced with numeric User/Group.id
    * User.uid is renamed to User.unix_uid (to differentiate with new User.id)
    * Group.gid is renamed to Group.unix_gid (to differentiate with new Group.id)
    * All User/Group/Mail related routes now use the database ids instead of uid/gid/dn
    * PasswordToken/MailToken now reference users directly instead of storing loginnames
    
    The database migration (optionally) uses the v1 config keys to connect to
    an LDAP server and to import all users, groups and mail forwardings.
test_rolemod.py 7.45 KiB
from flask import url_for

from uffd.user.models import User, Group
from uffd.role.models import Role, RoleGroup
from uffd.database import db

from utils import dump, UffdTestCase

class TestRolemodViewsLoggedOut(UffdTestCase):
	def test_acl_nologin(self):
		r = self.client.get(path=url_for('rolemod.index'), follow_redirects=True)
		dump('rolemod_acl_nologin', r)
		self.assertEqual(r.status_code, 200)

	def test_index(self):
		db.session.add(Role(name='test_role_1', moderator_group=self.get_access_group()))
		db.session.add(Role(name='test_role_2', moderator_group=self.get_admin_group()))
		db.session.add(Role(name='test_role_3'))
		db.session.commit()
		self.login_as('user')
		r = self.client.get(path=url_for('rolemod.index'), follow_redirects=True)
		dump('rolemod_index', r)
		self.assertEqual(r.status_code, 200)
		self.assertIn('test_role_1'.encode(), r.data)
		self.assertNotIn('test_role_2'.encode(), r.data)
		self.assertNotIn('test_role_3'.encode(), r.data)

class TestRolemodViews(UffdTestCase):
	def setUp(self):
		super().setUp()
		self.login_as('user')

	def test_acl_notmod(self):
		db.session.add(Role(name='test', moderator_group=self.get_admin_group()))
		db.session.commit()
		r = self.client.get(path=url_for('rolemod.index'), follow_redirects=True)
		dump('rolemod_acl_notmod', r)
		self.assertEqual(r.status_code, 403)

	def test_show(self):
		role = Role(name='test', moderator_group=self.get_access_group())
		db.session.add(role)
		role.members.append(self.get_admin())
		db.session.commit()
		r = self.client.get(path=url_for('rolemod.show', role_id=role.id), follow_redirects=True)
		dump('rolemod_show', r)
		self.assertEqual(r.status_code, 200)

	def test_show_empty(self):
		role = Role(name='test', moderator_group=self.get_access_group())
		db.session.add(role)
		db.session.commit()
		r = self.client.get(path=url_for('rolemod.show', role_id=role.id), follow_redirects=True)
		dump('rolemod_show_empty', r)
		self.assertEqual(r.status_code, 200)

	def test_show_noperm(self):
		# Make sure we pass the blueprint-wide acl check
		db.session.add(Role(name='other_role', moderator_group=self.get_access_group()))
		role = Role(name='test', moderator_group=self.get_admin_group())
		db.session.add(role)
		db.session.commit()
		r = self.client.get(path=url_for('rolemod.show', role_id=role.id), follow_redirects=True)
		dump('rolemod_show_noperm', r)
		self.assertEqual(r.status_code, 403)

	def test_show_nomod(self):
		# Make sure we pass the blueprint-wide acl check
		db.session.add(Role(name='other_role', moderator_group=self.get_access_group()))
		role = Role(name='test')
		db.session.add(role)
		db.session.commit()
		r = self.client.get(path=url_for('rolemod.show', role_id=role.id), follow_redirects=True)
		dump('rolemod_show_nomod', r)
		self.assertEqual(r.status_code, 403)

	def test_update(self):
		role = Role(name='test', description='old_description', moderator_group=self.get_access_group())
		db.session.add(role)
		db.session.commit()
		r = self.client.post(path=url_for('rolemod.update', role_id=role.id), data={'description': 'new_description'}, follow_redirects=True)
		dump('rolemod_update', r)
		self.assertEqual(r.status_code, 200)
		self.assertEqual(Role.query.get(role.id).description, 'new_description')

	def test_update_descr_too_long(self):
		role = Role(name='test', description='old_description', moderator_group=self.get_access_group())
		db.session.add(role)
		db.session.commit()
		r = self.client.post(path=url_for('rolemod.update', role_id=role.id), data={'description': 'long_description'*300}, follow_redirects=True)
		dump('rolemod_update_descr_too_long', r)
		self.assertEqual(r.status_code, 200)
		self.assertEqual(Role.query.get(role.id).description, 'old_description')

	def test_update_noperm(self):
		# Make sure we pass the blueprint-wide acl check
		db.session.add(Role(name='other_role', moderator_group=self.get_access_group()))
		role = Role(name='test', description='old_description', moderator_group=self.get_admin_group())
		db.session.add(role)
		db.session.commit()
		r = self.client.post(path=url_for('rolemod.update', role_id=role.id), data={'description': 'new_description'}, follow_redirects=True)
		dump('rolemod_update_noperm', r)
		self.assertEqual(r.status_code, 403)
		self.assertEqual(Role.query.get(role.id).description, 'old_description')

	def test_update_nomod(self):
		# Make sure we pass the blueprint-wide acl check
		db.session.add(Role(name='other_role', moderator_group=self.get_access_group()))
		role = Role(name='test', description='old_description')
		db.session.add(role)
		db.session.commit()
		r = self.client.post(path=url_for('rolemod.update', role_id=role.id), data={'description': 'new_description'}, follow_redirects=True)
		dump('rolemod_update_nomod', r)
		self.assertEqual(r.status_code, 403)
		self.assertEqual(Role.query.get(role.id).description, 'old_description')

	def test_delete_member(self):
		role = Role(name='test', moderator_group=self.get_access_group())
		role.groups[self.get_admin_group()] = RoleGroup()
		db.session.add(role)
		role.members.append(self.get_admin())
		db.session.commit()
		role.update_member_groups()
		db.session.commit()
		user = self.get_admin()
		group = self.get_admin_group()
		self.assertTrue(user in group.members)
		role = Role.query.get(role.id)
		self.assertTrue(user in role.members)
		r = self.client.get(path=url_for('rolemod.delete_member', role_id=role.id, member_id=user.id), follow_redirects=True)
		dump('rolemod_delete_member', r)
		self.assertEqual(r.status_code, 200)
		user_updated = self.get_admin()
		group = self.get_admin_group()
		self.assertFalse(user_updated in group.members)
		role = Role.query.get(role.id)
		self.assertFalse(user_updated in role.members)

	def test_delete_member_nomember(self):
		role = Role(name='test', moderator_group=self.get_access_group())
		role.groups[self.get_admin_group()] = RoleGroup()
		db.session.add(role)
		db.session.commit()
		user = self.get_admin()
		r = self.client.get(path=url_for('rolemod.delete_member', role_id=role.id, member_id=user.id), follow_redirects=True)
		dump('rolemod_delete_member_nomember', r)
		self.assertEqual(r.status_code, 200)

	def test_delete_member_noperm(self):
		# Make sure we pass the blueprint-wide acl check
		db.session.add(Role(name='other_role', moderator_group=self.get_access_group()))
		role = Role(name='test', moderator_group=self.get_admin_group())
		db.session.add(role)
		role.members.append(self.get_admin())
		db.session.commit()
		user = self.get_admin()
		role = Role.query.get(role.id)
		self.assertTrue(user in role.members)
		r = self.client.get(path=url_for('rolemod.delete_member', role_id=role.id, member_id=user.id), follow_redirects=True)
		dump('rolemod_delete_member_noperm', r)
		self.assertEqual(r.status_code, 403)
		user_updated = self.get_admin()
		role = Role.query.get(role.id)
		self.assertTrue(user_updated in role.members)

	def test_delete_member_nomod(self):
		# Make sure we pass the blueprint-wide acl check
		db.session.add(Role(name='other_role', moderator_group=self.get_access_group()))
		role = Role(name='test')
		db.session.add(role)
		role.members.append(self.get_admin())
		db.session.commit()
		user = self.get_admin()
		role = Role.query.get(role.id)
		self.assertTrue(user in role.members)
		r = self.client.get(path=url_for('rolemod.delete_member', role_id=role.id, member_id=user.id), follow_redirects=True)
		dump('rolemod_delete_member_nomod', r)
		self.assertEqual(r.status_code, 403)
		user_updated = self.get_admin()
		role = Role.query.get(role.id)
		self.assertTrue(user_updated in role.members)