import pytest from lemur.auth.ldap import * # noqa from mock import patch, MagicMock class LdapPrincipalTester(LdapPrincipal): def __init__(self, args): super().__init__(args) self.ldap_server = 'ldap://localhost' def bind_test(self): groups = [('user', {'memberOf': ['CN=Lemur Access,OU=Groups,DC=example,DC=com'.encode('utf-8'), 'CN=Pen Pushers,OU=Groups,DC=example,DC=com'.encode('utf-8')]})] self.ldap_client = MagicMock() self.ldap_client.search_s.return_value = groups self._bind() def authorize_test_groups_to_roles_admin(self): self.ldap_groups = ''.join(['CN=Pen Pushers,OU=Groups,DC=example,DC=com', 'CN=Lemur Admins,OU=Groups,DC=example,DC=com', 'CN=Lemur Read Only,OU=Groups,DC=example,DC=com']) self.ldap_required_group = None self.ldap_groups_to_roles = {'Lemur Admins': 'admin', 'Lemur Read Only': 'read-only'} return self._authorize() def authorize_test_required_group(self, group): self.ldap_groups = ''.join(['CN=Lemur Access,OU=Groups,DC=example,DC=com', 'CN=Pen Pushers,OU=Groups,DC=example,DC=com']) self.ldap_required_group = group return self._authorize() @pytest.fixture() def principal(session): args = {'username': 'user', 'password': 'p4ssw0rd'} yield LdapPrincipalTester(args) class TestLdapPrincipal: @patch('ldap.initialize') def test_bind(self, app, principal): self.test_ldap_user = principal self.test_ldap_user.bind_test() group = 'Pen Pushers' assert group in self.test_ldap_user.ldap_groups assert self.test_ldap_user.ldap_principal == 'user@example.com' def test_authorize_groups_to_roles_admin(self, app, principal): self.test_ldap_user = principal roles = self.test_ldap_user.authorize_test_groups_to_roles_admin() assert any(x.name == "admin" for x in roles) def test_authorize_required_group_missing(self, app, principal): self.test_ldap_user = principal roles = self.test_ldap_user.authorize_test_required_group('Not Allowed') assert not roles def test_authorize_required_group_access(self, session, principal): self.test_ldap_user = principal roles = self.test_ldap_user.authorize_test_required_group('Lemur Access') assert len(roles) >= 1 assert any(x.name == "user@example.com" for x in roles)