Fix compatibility with Django 2.2 and other dependencies
- drop mockldap in favour of volatildap - fix URLs and settings - fix tests
This commit is contained in:
		
							parent
							
								
									c4485945fc
								
							
						
					
					
						commit
						427fdd9c03
					
				
					 15 changed files with 106 additions and 197 deletions
				
			
		
							
								
								
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							|  | @ -44,3 +44,4 @@ _build/ | |||
| .coverage | ||||
| coverage-report/ | ||||
| .idea/ | ||||
| .env | ||||
|  | @ -4,10 +4,7 @@ This module defines the Celery_ app for gvaldap. | |||
| .. _Celery: http://www.celeryproject.org/ | ||||
| 
 | ||||
| """ | ||||
| from __future__ import absolute_import | ||||
| 
 | ||||
| import os | ||||
| 
 | ||||
| from celery import Celery | ||||
| 
 | ||||
| from django.conf import settings | ||||
|  | @ -15,12 +12,12 @@ from django.conf import settings | |||
| os.environ.setdefault('DJANGO_SETTINGS_MODULE', | ||||
|                       'gvaldap.settings.production') | ||||
| 
 | ||||
| 
 | ||||
| app = Celery('gvaldap') | ||||
| 
 | ||||
| 
 | ||||
| def get_installed_apps(): | ||||
|     return settings.INSTALLED_APPS | ||||
| 
 | ||||
| 
 | ||||
| app.config_from_object('django.conf:settings') | ||||
| app.autodiscover_tasks(get_installed_apps) | ||||
|  |  | |||
|  | @ -2,16 +2,13 @@ | |||
| This module provides tests for :py:mod:`ldaptasks.tasks`. | ||||
| 
 | ||||
| """ | ||||
| from __future__ import absolute_import | ||||
| 
 | ||||
| import volatildap | ||||
| from django.conf import settings | ||||
| from django.test import TestCase | ||||
| from celery.exceptions import Reject | ||||
| 
 | ||||
| from mockldap import MockLdap | ||||
| 
 | ||||
| from ldapentities.models import LdapUser | ||||
| from ldaptasks.tasks import ( | ||||
| from gvaldap.ldaptasks.tasks import ( | ||||
|     add_ldap_user_to_group, | ||||
|     create_ldap_group, | ||||
|     create_ldap_user, | ||||
|  | @ -25,9 +22,13 @@ from ldaptasks.tasks import ( | |||
| 
 | ||||
| 
 | ||||
| class LdapTaskTestCase(TestCase): | ||||
|     databases = ["default", "ldap"] | ||||
| 
 | ||||
|     directory = { | ||||
|         settings.DATABASES['ldap']['USER']: { | ||||
|             'userPassword': [settings.DATABASES['ldap']['PASSWORD']] | ||||
|             'objectClass': ['person'], | ||||
|             'userPassword': [settings.DATABASES['ldap']['PASSWORD']], | ||||
|             'sn': 'Admin', | ||||
|         }, | ||||
|         settings.GROUP_BASE_DN: { | ||||
|             'objectClass': ['top', 'organizationalUnit'], | ||||
|  | @ -59,19 +60,23 @@ class LdapTaskTestCase(TestCase): | |||
| 
 | ||||
|     @classmethod | ||||
|     def setUpClass(cls): | ||||
|         cls.mockldap = MockLdap(cls.directory) | ||||
|         super(LdapTaskTestCase, cls).setUpClass() | ||||
|         cls.ldap_server = volatildap.LdapServer( | ||||
|             initial_data=cls.directory, | ||||
|             schemas=['core.schema', 'cosine.schema', 'inetorgperson.schema', | ||||
|                      'nis.schema'], | ||||
|         ) | ||||
|         settings.DATABASES['ldap']['USER'] = cls.ldap_server.rootdn | ||||
|         settings.DATABASES['ldap']['PASSWORD'] = cls.ldap_server.rootpw | ||||
|         settings.DATABASES['ldap']['NAME'] = cls.ldap_server.uri | ||||
| 
 | ||||
|     @classmethod | ||||
|     def tearDownClass(cls): | ||||
|         del cls.mockldap | ||||
|         cls.ldap_server.stop() | ||||
|         super(LdapTaskTestCase, cls).tearDownClass() | ||||
| 
 | ||||
|     def setUp(self): | ||||
|         self.mockldap.start() | ||||
|         self.ldapobj = self.mockldap[settings.DATABASES['ldap']['NAME']] | ||||
| 
 | ||||
|     def tearDown(self): | ||||
|         self.mockldap.stop() | ||||
|         del self.ldapobj | ||||
|         self.ldap_server.start() | ||||
| 
 | ||||
|     def test_create_ldap_group(self): | ||||
|         result = create_ldap_group('test', 5000, 'test group') | ||||
|  | @ -79,9 +84,6 @@ class LdapTaskTestCase(TestCase): | |||
|             'groupname': 'test', 'gid': 5000, 'description': 'test group', | ||||
|             'group_dn': 'cn=test,%s' % settings.GROUP_BASE_DN | ||||
|         }, result) | ||||
|         self.assertEqual(self.ldapobj.methods_called(), [ | ||||
|             'initialize', 'simple_bind_s', 'search_s', 'add_s' | ||||
|         ]) | ||||
| 
 | ||||
|     def test_create_ldap_group_existing(self): | ||||
|         result = create_ldap_group('existing', 4711, 'existing test group') | ||||
|  | @ -90,10 +92,6 @@ class LdapTaskTestCase(TestCase): | |||
|             'description': 'existing test group', | ||||
|             'group_dn': 'cn=existing,%s' % settings.GROUP_BASE_DN | ||||
|         }, result) | ||||
|         self.assertEqual(self.ldapobj.methods_called(), [ | ||||
|             'initialize', 'simple_bind_s', 'search_s', 'search_s', 'search_s', | ||||
|             'search_s' | ||||
|         ]) | ||||
| 
 | ||||
|     def test_create_ldap_group_existing_modify(self): | ||||
|         result = create_ldap_group( | ||||
|  | @ -103,10 +101,6 @@ class LdapTaskTestCase(TestCase): | |||
|             'description': 'change existing test group', | ||||
|             'group_dn': 'cn=existing,%s' % settings.GROUP_BASE_DN | ||||
|         }, result) | ||||
|         self.assertEqual(self.ldapobj.methods_called(), [ | ||||
|             'initialize', 'simple_bind_s', 'search_s', 'search_s', | ||||
|             'search_s', 'search_s', 'modify_s' | ||||
|         ]) | ||||
| 
 | ||||
|     def test_create_ldap_user(self): | ||||
|         result = create_ldap_user( | ||||
|  | @ -117,19 +111,12 @@ class LdapTaskTestCase(TestCase): | |||
|             'homedir': '/home/test', 'shell': '/bin/bash', | ||||
|             'user_dn': 'uid=test,%s' % settings.USER_BASE_DN | ||||
|         }, result) | ||||
|         self.assertEqual(self.ldapobj.methods_called(), [ | ||||
|             'initialize', 'simple_bind_s', 'search_s', 'search_s', 'search_s', | ||||
|             'add_s', 'search_s', 'search_s', 'modify_s' | ||||
|         ]) | ||||
| 
 | ||||
|     def test_create_ldap_user_invalid_group(self): | ||||
|         with self.assertRaises(Reject): | ||||
|             create_ldap_user( | ||||
|                 'test', 5000, 5000, 'Test User', '/home/test', '/bin/bash', | ||||
|                 'secret') | ||||
|         self.assertEqual(self.ldapobj.methods_called(), [ | ||||
|             'initialize', 'simple_bind_s', 'search_s', 'search_s' | ||||
|         ]) | ||||
| 
 | ||||
|     def test_create_ldap_user_no_password(self): | ||||
|         result = create_ldap_user( | ||||
|  | @ -140,10 +127,6 @@ class LdapTaskTestCase(TestCase): | |||
|             'homedir': '/home/test', 'shell': '/bin/bash', | ||||
|             'user_dn': 'uid=test,%s' % settings.USER_BASE_DN | ||||
|         }, result) | ||||
|         self.assertEqual(self.ldapobj.methods_called(), [ | ||||
|             'initialize', 'simple_bind_s', 'search_s', 'search_s', 'search_s', | ||||
|             'add_s', 'search_s', 'search_s', 'modify_s' | ||||
|         ]) | ||||
| 
 | ||||
|     def test_create_ldap_user_existing(self): | ||||
|         result = create_ldap_user( | ||||
|  | @ -151,44 +134,29 @@ class LdapTaskTestCase(TestCase): | |||
|             '/bin/bash', 'secret' | ||||
|         ) | ||||
|         self.assertEqual({ | ||||
|             'username': 'existing',  'uid': 815, 'gid': 4711, | ||||
|             'username': 'existing', 'uid': 815, 'gid': 4711, | ||||
|             'gecos': 'existing test user', 'homedir': '/home/existing', | ||||
|             'shell': '/bin/bash', | ||||
|             'user_dn': u'uid=existing,%s' % settings.USER_BASE_DN | ||||
|         }, result) | ||||
|         self.assertEqual(self.ldapobj.methods_called(), [ | ||||
|             'initialize', 'simple_bind_s', 'search_s', 'search_s', 'search_s', | ||||
|             'search_s', 'search_s', 'search_s', 'modify_s' | ||||
|         ]) | ||||
| 
 | ||||
|     def test_set_ldap_user_password_existing(self): | ||||
|         result = set_ldap_user_password('existing', 'newpassword') | ||||
|         self.assertEqual({ | ||||
|             'username': 'existing', 'password_set': True | ||||
|         }, result) | ||||
|         self.assertEqual(self.ldapobj.methods_called(), [ | ||||
|             'initialize', 'simple_bind_s', 'search_s', 'search_s', 'search_s', | ||||
|             'search_s', 'modify_s' | ||||
|         ]) | ||||
| 
 | ||||
|     def test_set_ldap_user_password_missing(self): | ||||
|         result = set_ldap_user_password('missing', 'newpassword') | ||||
|         self.assertEqual({ | ||||
|             'username': 'missing', 'password_set': False | ||||
|         }, result) | ||||
|         self.assertEqual(self.ldapobj.methods_called(), [ | ||||
|             'initialize', 'simple_bind_s', 'search_s' | ||||
|         ]) | ||||
| 
 | ||||
|     def test_add_ldap_user_to_group_existing(self): | ||||
|         result = add_ldap_user_to_group('existing', 'existing') | ||||
|         self.assertEqual({ | ||||
|             'username': 'existing', 'groupname': 'existing', 'added': True | ||||
|         }, result) | ||||
|         self.assertEqual(self.ldapobj.methods_called(), [ | ||||
|             'initialize', 'simple_bind_s', 'search_s', 'search_s', 'search_s', | ||||
|             'search_s' | ||||
|         ]) | ||||
| 
 | ||||
|     def test_add_ldap_user_to_group_new_user(self): | ||||
|         create_ldap_group('test', 5000, 'test group') | ||||
|  | @ -196,39 +164,24 @@ class LdapTaskTestCase(TestCase): | |||
|         self.assertEqual({ | ||||
|             'username': 'existing', 'groupname': 'test', 'added': True | ||||
|         }, result) | ||||
|         self.assertEqual(self.ldapobj.methods_called(), [ | ||||
|             'initialize', 'simple_bind_s', 'search_s', 'add_s', 'search_s', | ||||
|             'search_s', 'search_s', 'search_s', 'search_s', 'search_s', | ||||
|             'modify_s' | ||||
|         ]) | ||||
| 
 | ||||
|     def test_add_ldap_user_to_group_no_group(self): | ||||
|         result = add_ldap_user_to_group('existing', 'test') | ||||
|         self.assertEqual({ | ||||
|             'username': 'existing', 'groupname': 'test', 'added': False | ||||
|         }, result) | ||||
|         self.assertEqual(self.ldapobj.methods_called(), [ | ||||
|             'initialize', 'simple_bind_s', 'search_s' | ||||
|         ]) | ||||
| 
 | ||||
|     def test_add_ldap_user_to_group_no_user(self): | ||||
|         with self.assertRaises(LdapUser.DoesNotExist): | ||||
|             add_ldap_user_to_group('test', 'existing') | ||||
|         self.assertEqual(self.ldapobj.methods_called(), [ | ||||
|             'initialize', 'simple_bind_s', 'search_s', 'search_s', 'search_s' | ||||
|         ]) | ||||
| 
 | ||||
|     def test_remove_ldap_user_from_group_existing(self): | ||||
|         result = remove_ldap_user_from_group('existing', 'existing') | ||||
|         self.assertEqual({ | ||||
|             'username': 'existing', 'groupname': 'existing', 'removed': True | ||||
|         }, result) | ||||
|         self.assertNotIn('memberUid', self.ldapobj.directory[ | ||||
|             'cn=existing,' + settings.GROUP_BASE_DN]) | ||||
|         self.assertEqual(self.ldapobj.methods_called(), [ | ||||
|             'initialize', 'simple_bind_s', 'search_s', 'search_s', 'search_s', | ||||
|             'search_s', 'search_s', 'search_s', 'modify_s' | ||||
|         ]) | ||||
|         self.assertNotIn('memberUid', self.ldap_server.get( | ||||
|             'cn=existing,' + settings.GROUP_BASE_DN)) | ||||
| 
 | ||||
|     def test_remove_ldap_user_from_group_not_in_group(self): | ||||
|         create_ldap_group('test', 5000, 'test group') | ||||
|  | @ -236,123 +189,75 @@ class LdapTaskTestCase(TestCase): | |||
|         self.assertEqual({ | ||||
|             'username': 'existing', 'groupname': 'test', 'removed': False | ||||
|         }, result) | ||||
|         self.assertEqual(self.ldapobj.methods_called(), [ | ||||
|             'initialize', 'simple_bind_s', 'search_s', 'add_s', 'search_s', | ||||
|             'search_s', 'search_s', 'search_s' | ||||
|         ]) | ||||
| 
 | ||||
|     def test_remove_ldap_user_from_group_no_group(self): | ||||
|         result = remove_ldap_user_from_group('existing', 'test') | ||||
|         self.assertEqual({ | ||||
|             'username': 'existing', 'groupname': 'test', 'removed': False | ||||
|         }, result) | ||||
|         self.assertEqual(self.ldapobj.methods_called(), [ | ||||
|             'initialize', 'simple_bind_s', 'search_s' | ||||
|         ]) | ||||
| 
 | ||||
|     def test_remove_ldap_user_from_group_no_user(self): | ||||
|         result = remove_ldap_user_from_group('test', 'existing') | ||||
|         self.assertEqual({ | ||||
|             'username': 'test', 'groupname': 'existing', 'removed': False | ||||
|         }, result) | ||||
|         self.assertEqual(self.ldapobj.methods_called(), [ | ||||
|             'initialize', 'simple_bind_s', 'search_s', 'search_s', 'search_s' | ||||
|         ]) | ||||
| 
 | ||||
|     def test_delete_ldap_user_existing(self): | ||||
|         result = delete_ldap_user('existing') | ||||
|         self.assertEqual({'username': 'existing', 'deleted': True}, result) | ||||
|         self.assertNotIn( | ||||
|             'uid=existing,' + settings.USER_BASE_DN, self.ldapobj.directory) | ||||
|         self.assertNotIn('memberUid', self.ldapobj.directory[ | ||||
|             'cn=existing,' + settings.GROUP_BASE_DN]) | ||||
|         self.assertEqual(self.ldapobj.methods_called(), [ | ||||
|             'initialize', 'simple_bind_s', 'search_s', 'search_s', 'search_s', | ||||
|             'search_s', 'search_s', 'search_s', 'modify_s', 'delete_s' | ||||
|         ]) | ||||
|         with self.assertRaises(KeyError): | ||||
|             self.ldap_server.get('uid=existing,' + settings.USER_BASE_DN) | ||||
|         self.assertNotIn('memberUid', self.ldap_server.get( | ||||
|             'cn=existing,' + settings.GROUP_BASE_DN)) | ||||
| 
 | ||||
|     def test_delete_ldap_user_missing(self): | ||||
|         result = delete_ldap_user('missing') | ||||
|         self.assertEqual({'username': 'missing', 'deleted': False}, result) | ||||
|         self.assertEqual(self.ldapobj.methods_called(), [ | ||||
|             'initialize', 'simple_bind_s', 'search_s' | ||||
|         ]) | ||||
| 
 | ||||
|     def test_delete_ldap_user_no_group(self): | ||||
|         self.ldapobj.directory[ | ||||
|             'uid=existing,' + settings.USER_BASE_DN]['gidNumber'] = ['5000'] | ||||
|         self.ldap_server.get('uid=existing,' + settings.USER_BASE_DN)[ | ||||
|             'gidNumber'] = '5000' | ||||
|         result = delete_ldap_user('existing') | ||||
|         self.assertEqual({'username': 'existing', 'deleted': True}, result) | ||||
|         self.assertNotIn( | ||||
|             'uid=existing,' + settings.USER_BASE_DN, self.ldapobj.directory) | ||||
|         self.assertEqual(self.ldapobj.methods_called(), [ | ||||
|             'initialize', 'simple_bind_s', 'search_s', 'search_s', 'search_s', | ||||
|             'delete_s' | ||||
|         ]) | ||||
| 
 | ||||
|     def test_delete_ldap_user_not_in_group(self): | ||||
|         del self.ldapobj.directory[ | ||||
|              'cn=existing,' + settings.GROUP_BASE_DN]['memberUid'] | ||||
|         result = delete_ldap_user('existing') | ||||
|         self.assertEqual({'username': 'existing', 'deleted': True}, result) | ||||
|         self.assertNotIn( | ||||
|             'uid=existing,' + settings.USER_BASE_DN, self.ldapobj.directory) | ||||
|         self.assertEqual(self.ldapobj.methods_called(), [ | ||||
|             'initialize', 'simple_bind_s', 'search_s', 'search_s', 'search_s', | ||||
|             'search_s', 'delete_s' | ||||
|         ]) | ||||
|         with self.assertRaises(KeyError): | ||||
|             self.ldap_server.get('uid=existing,' + settings.USER_BASE_DN) | ||||
| 
 | ||||
|     def test_delete_ldap_user_chained_exsting(self): | ||||
|         result = delete_ldap_user_chained({'username': 'existing'}) | ||||
|         self.assertEqual({'username': 'existing', 'deleted': True}, result) | ||||
|         self.assertNotIn( | ||||
|             'uid=existing,' + settings.USER_BASE_DN, self.ldapobj.directory) | ||||
|         self.assertNotIn('memberUid', self.ldapobj.directory[ | ||||
|             'cn=existing,' + settings.GROUP_BASE_DN]) | ||||
|         self.assertEqual(self.ldapobj.methods_called(), [ | ||||
|             'initialize', 'simple_bind_s', 'search_s', 'search_s', 'search_s', | ||||
|             'search_s', 'search_s', 'search_s', 'modify_s', 'delete_s' | ||||
|         ]) | ||||
|         with self.assertRaises(KeyError): | ||||
|             self.ldap_server.get('uid=existing,' + settings.USER_BASE_DN) | ||||
|         group_object = self.ldap_server.get('cn=existing,' + settings.GROUP_BASE_DN) | ||||
|         self.assertNotIn('memberUid', group_object) | ||||
| 
 | ||||
|     def test_delete_ldap_group_if_empty_nonempty(self): | ||||
|         result = delete_ldap_group_if_empty('existing') | ||||
|         self.assertEqual({'groupname': 'existing', 'deleted': False}, result) | ||||
|         self.assertIn( | ||||
|             'cn=existing,' + settings.GROUP_BASE_DN, self.ldapobj.directory) | ||||
|         self.assertEqual(self.ldapobj.methods_called(), [ | ||||
|             'initialize', 'simple_bind_s', 'search_s', 'search_s' | ||||
|         ]) | ||||
|         ldap_object = self.ldap_server.get('cn=existing,' + settings.GROUP_BASE_DN) | ||||
|         self.assertIsNotNone(ldap_object) | ||||
| 
 | ||||
|     def test_delete_ldap_group_if_empty_missing(self): | ||||
|         result = delete_ldap_group_if_empty('missing') | ||||
|         self.assertEqual({'groupname': 'missing', 'deleted': False}, result) | ||||
|         self.assertEqual(self.ldapobj.methods_called(), [ | ||||
|             'initialize', 'simple_bind_s', 'search_s' | ||||
|         ]) | ||||
| 
 | ||||
|     def test_delete_ldap_group_if_empty_empty(self): | ||||
|         del self.ldapobj.directory[ | ||||
|              'cn=existing,' + settings.GROUP_BASE_DN]['memberUid'] | ||||
|         result = delete_ldap_group_if_empty('existing') | ||||
|         self.assertEqual({'groupname': 'existing', 'deleted': True}, result) | ||||
|         self.assertNotIn( | ||||
|             'cn=existing,' + settings.GROUP_BASE_DN, self.ldapobj.directory) | ||||
|         self.assertEqual(self.ldapobj.methods_called(), [ | ||||
|             'initialize', 'simple_bind_s', 'search_s', 'search_s', 'delete_s' | ||||
|         ]) | ||||
|         self.ldap_server.add({'cn=emptygroup,' + settings.GROUP_BASE_DN: { | ||||
|             'objectClass': ['posixGroup'], | ||||
|             'gidNumber': ['4712'], | ||||
|             'cn': ['existing'], | ||||
|             'description': ['existing test group'], | ||||
|         }}) | ||||
|         result = delete_ldap_group_if_empty('emptygroup') | ||||
|         self.assertEqual({'groupname': 'emptygroup', 'deleted': True}, result) | ||||
|         with self.assertRaises(KeyError): | ||||
|             self.ldap_server.get('cn=emptygroup,' + settings.GROUP_BASE_DN) | ||||
| 
 | ||||
|     def test_delete_ldap_group_existing(self): | ||||
|         result = delete_ldap_group('existing') | ||||
|         self.assertEqual({'groupname': 'existing', 'deleted': True}, result) | ||||
|         self.assertNotIn( | ||||
|             'cn=existing,' + settings.GROUP_BASE_DN, self.ldapobj.directory) | ||||
|         self.assertEqual(self.ldapobj.methods_called(), [ | ||||
|             'initialize', 'simple_bind_s', 'search_s', 'search_s', 'delete_s' | ||||
|         ]) | ||||
|         with self.assertRaises(KeyError): | ||||
|             self.ldap_server.get('cn=existing,' + settings.GROUP_BASE_DN) | ||||
| 
 | ||||
|     def test_delete_ldap_group_missing(self): | ||||
|         result = delete_ldap_group('missing') | ||||
|         self.assertEqual({'groupname': 'missing', 'deleted': False}, result) | ||||
|         self.assertEqual(self.ldapobj.methods_called(), [ | ||||
|             'initialize', 'simple_bind_s', 'search_s' | ||||
|         ]) | ||||
|  | @ -160,7 +160,7 @@ TEMPLATES = [ | |||
| 
 | ||||
| # ######### MIDDLEWARE CONFIGURATION | ||||
| # See: https://docs.djangoproject.com/en/dev/ref/settings/#middleware-classes | ||||
| MIDDLEWARE_CLASSES = ( | ||||
| MIDDLEWARE = ( | ||||
|     # Default Django middleware. | ||||
|     'django.middleware.common.CommonMiddleware', | ||||
|     'django.contrib.sessions.middleware.SessionMiddleware', | ||||
|  | @ -201,7 +201,7 @@ DJANGO_APPS = ( | |||
| # Apps specific for this project go here. | ||||
| LOCAL_APPS = ( | ||||
|     'ldapentities', | ||||
|     'ldaptasks', | ||||
|     'gvaldap.ldaptasks', | ||||
| ) | ||||
| 
 | ||||
| # See: https://docs.djangoproject.com/en/dev/ref/settings/#installed-apps | ||||
|  |  | |||
|  | @ -42,7 +42,7 @@ INSTALLED_APPS += ( | |||
|     'debug_toolbar', | ||||
| ) | ||||
| 
 | ||||
| MIDDLEWARE_CLASSES += ( | ||||
| MIDDLEWARE += ( | ||||
|     'debug_toolbar.middleware.DebugToolbarMiddleware', | ||||
| ) | ||||
| 
 | ||||
|  |  | |||
|  | @ -2,8 +2,6 @@ | |||
| This module implements tests for :py:mod:`gvaldap.celery`. | ||||
| 
 | ||||
| """ | ||||
| from __future__ import absolute_import | ||||
| 
 | ||||
| from unittest import TestCase | ||||
| 
 | ||||
| from gvaldap.celery import get_installed_apps | ||||
|  |  | |||
|  | @ -2,8 +2,6 @@ | |||
| This module provides tests for :py:mod:`gvaldap.wsgi`. | ||||
| 
 | ||||
| """ | ||||
| from __future__ import absolute_import | ||||
| 
 | ||||
| from unittest import TestCase | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -3,14 +3,15 @@ This module defines the main URLConf for gvaldap. | |||
| 
 | ||||
| """ | ||||
| 
 | ||||
| from django.conf.urls import include, url | ||||
| from django.conf import settings | ||||
| 
 | ||||
| from django.conf.urls import include, url | ||||
| from django.contrib import admin | ||||
| from django.contrib.staticfiles.urls import staticfiles_urlpatterns | ||||
| 
 | ||||
| admin.autodiscover() | ||||
| 
 | ||||
| urlpatterns = [ | ||||
|     url(r'^admin/', include(admin.site.urls)), | ||||
|     url(r'^admin/', admin.site.urls), | ||||
| ] | ||||
| 
 | ||||
| # Uncomment the next line to serve media files in dev. | ||||
|  | @ -18,6 +19,11 @@ urlpatterns = [ | |||
| 
 | ||||
| if settings.DEBUG:  # pragma: no cover | ||||
|     import debug_toolbar | ||||
|     urlpatterns += [ | ||||
|         url(r'^__debug__/', include(debug_toolbar.urls)), | ||||
|     ] | ||||
| 
 | ||||
|     urlpatterns = ( | ||||
|             [ | ||||
|                 url(r'^__debug__/', include(debug_toolbar.urls)), | ||||
|             ] | ||||
|             + staticfiles_urlpatterns() | ||||
|             + urlpatterns | ||||
|     ) | ||||
|  |  | |||
|  | @ -7,7 +7,7 @@ Admin classes for easy `django admin`_ based administration of LDAP entities. | |||
| 
 | ||||
| from django.contrib import admin | ||||
| 
 | ||||
| from .models import ( | ||||
| from ldapentities.models import ( | ||||
|     LdapGroup, | ||||
|     LdapUser, | ||||
| ) | ||||
|  |  | |||
|  | @ -9,7 +9,6 @@ The models are based on :py:class:`ldapmodels.Model` from `django-ldapdb`_. | |||
| from __future__ import unicode_literals | ||||
| 
 | ||||
| from django.conf import settings | ||||
| from django.utils.encoding import python_2_unicode_compatible | ||||
| from ldapdb.models.fields import ( | ||||
|     CharField, | ||||
|     IntegerField, | ||||
|  | @ -20,7 +19,6 @@ import ldapdb.models as ldapmodels | |||
| from passlib.hash import ldap_salted_sha1 | ||||
| 
 | ||||
| 
 | ||||
| @python_2_unicode_compatible | ||||
| class LdapGroup(ldapmodels.Model): | ||||
|     """ | ||||
|     Class for representing an LDAP group entity with objectClass `posixGroup`. | ||||
|  | @ -39,16 +37,16 @@ class LdapGroup(ldapmodels.Model): | |||
|     # LDAP meta-data | ||||
|     base_dn = settings.GROUP_BASE_DN | ||||
|     #: list of object classes | ||||
|     object_classes = [b'posixGroup'] | ||||
|     object_classes = ['posixGroup'] | ||||
| 
 | ||||
|     # posixGroup attributes | ||||
|     #: group id (`gidNumber`) | ||||
|     gid = IntegerField(db_column=b'gidNumber', unique=True) | ||||
|     gid = IntegerField(db_column='gidNumber', unique=True) | ||||
|     #: group name (`cn`) | ||||
|     name = CharField(db_column=b'cn', max_length=200, primary_key=True) | ||||
|     name = CharField(db_column='cn', max_length=200, primary_key=True) | ||||
|     #: group description (`description`) | ||||
|     description = CharField(db_column=b'description') | ||||
|     members = ListField(db_column=b'memberUid', blank=True) | ||||
|     description = CharField(db_column='description') | ||||
|     members = ListField(db_column='memberUid', blank=True) | ||||
| 
 | ||||
|     def __str__(self): | ||||
|         """ | ||||
|  | @ -57,7 +55,6 @@ class LdapGroup(ldapmodels.Model): | |||
|         return self.name | ||||
| 
 | ||||
| 
 | ||||
| @python_2_unicode_compatible | ||||
| class LdapUser(ldapmodels.Model): | ||||
|     """ | ||||
|     Class for representing an LDAP user entity with objectClasses `account` and | ||||
|  | @ -72,25 +69,25 @@ class LdapUser(ldapmodels.Model): | |||
|     """ | ||||
|     base_dn = settings.USER_BASE_DN | ||||
|     #: list of object classes | ||||
|     object_classes = [b'account', b'posixAccount'] | ||||
|     object_classes = ['account', 'posixAccount'] | ||||
| 
 | ||||
|     # posixAccount | ||||
|     #: user id (`uidNumber`) | ||||
|     uid = IntegerField(db_column=b'uidNumber', unique=True) | ||||
|     uid = IntegerField(db_column='uidNumber', unique=True) | ||||
|     #: group id (`gidNumber`) of the user's primary group | ||||
|     group = IntegerField(db_column=b'gidNumber') | ||||
|     group = IntegerField(db_column='gidNumber') | ||||
|     #: GECOS field (`gecos`) | ||||
|     gecos = CharField(db_column=b'gecos') | ||||
|     gecos = CharField(db_column='gecos') | ||||
|     #: home directory (`homeDirectory`) | ||||
|     home_directory = CharField(db_column=b'homeDirectory') | ||||
|     home_directory = CharField(db_column='homeDirectory') | ||||
|     #: login shell (`loginShell`) | ||||
|     login_shell = CharField(db_column=b'loginShell', default='/bin/bash') | ||||
|     login_shell = CharField(db_column='loginShell', default='/bin/bash') | ||||
|     #: user name (`uid`) | ||||
|     username = CharField(db_column=b'uid', primary_key=True) | ||||
|     username = CharField(db_column='uid', primary_key=True) | ||||
|     #: password (`userPassword`) in an LDAP compatible format | ||||
|     password = CharField(db_column=b'userPassword') | ||||
|     password = CharField(db_column='userPassword') | ||||
|     #: common name (`cn`) | ||||
|     common_name = CharField(db_column=b'cn') | ||||
|     common_name = CharField(db_column='cn') | ||||
| 
 | ||||
|     def __str__(self): | ||||
|         """ | ||||
|  |  | |||
|  | @ -4,13 +4,11 @@ This module provides tests for :py:mod:`ldapentities.admin`. | |||
| """ | ||||
| from __future__ import absolute_import | ||||
| 
 | ||||
| import volatildap | ||||
| from django.conf import settings | ||||
| from django.core.urlresolvers import reverse | ||||
| from django.test import TestCase | ||||
| from django.contrib.auth import get_user_model | ||||
| 
 | ||||
| from mockldap import MockLdap | ||||
| 
 | ||||
| from django.urls import reverse | ||||
| 
 | ||||
| User = get_user_model() | ||||
| 
 | ||||
|  | @ -18,38 +16,47 @@ TEST_USER = 'admin' | |||
| TEST_EMAIL = 'admin@example.org' | ||||
| TEST_PASSWORD = 'secret' | ||||
| 
 | ||||
| admin = ( | ||||
|     settings.DATABASES['ldap']['USER'], { | ||||
|         'userPassword': [settings.DATABASES['ldap']['PASSWORD']]}) | ||||
| groups = ( | ||||
|     settings.GROUP_BASE_DN, { | ||||
|         'objectClass': ['top', 'organizationalUnit'], 'ou': ['groups']}) | ||||
| admin = (settings.DATABASES['ldap']['USER'], { | ||||
|     'objectClass': ['person'], | ||||
|     'userPassword': [ | ||||
|         settings.DATABASES['ldap'][ | ||||
|             'PASSWORD']], | ||||
|     'sn': 'Admin', | ||||
| }) | ||||
| 
 | ||||
| groups = (settings.GROUP_BASE_DN, { | ||||
|     'objectClass': ['top', 'organizationalUnit'], 'ou': ['groups']}) | ||||
| users = ( | ||||
|     settings.USER_BASE_DN, { | ||||
|         'objectClass': ['top', 'organizationalUnit'], 'ou': ['users']}) | ||||
| 
 | ||||
| 
 | ||||
| class LdapUserAdminTest(TestCase): | ||||
|     databases = ["default", "ldap"] | ||||
|     directory = dict([admin, groups, users]) | ||||
| 
 | ||||
|     @classmethod | ||||
|     def setUpClass(cls): | ||||
|         cls.mockldap = MockLdap(cls.directory) | ||||
|         super(LdapUserAdminTest, cls).setUpClass() | ||||
|         cls.ldap_server = volatildap.LdapServer( | ||||
|             initial_data=cls.directory, | ||||
|             schemas=['core.schema', 'cosine.schema', 'inetorgperson.schema', | ||||
|                      'nis.schema'], | ||||
|         ) | ||||
|         settings.DATABASES['ldap']['USER'] = cls.ldap_server.rootdn | ||||
|         settings.DATABASES['ldap']['PASSWORD'] = cls.ldap_server.rootpw | ||||
|         settings.DATABASES['ldap']['NAME'] = cls.ldap_server.uri | ||||
| 
 | ||||
|     @classmethod | ||||
|     def tearDownClass(cls): | ||||
|         del cls.mockldap | ||||
|         cls.ldap_server.stop() | ||||
|         super(LdapUserAdminTest, cls).tearDownClass() | ||||
| 
 | ||||
|     def setUp(self): | ||||
|         User.objects.create_superuser( | ||||
|             TEST_USER, email=TEST_EMAIL, password=TEST_PASSWORD) | ||||
|         self.client.login(username=TEST_USER, password=TEST_PASSWORD) | ||||
|         self.mockldap.start() | ||||
|         self.ldapobj = self.mockldap[settings.DATABASES['ldap']['NAME']] | ||||
| 
 | ||||
|     def tearDown(self): | ||||
|         self.mockldap.stop() | ||||
|         del self.ldapobj | ||||
|         self.ldap_server.start() | ||||
| 
 | ||||
|     def test_can_administer_groups(self): | ||||
|         response = self.client.get(reverse( | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ exclude = migrations | |||
| exclude = migrations | ||||
| 
 | ||||
| [coverage:run] | ||||
| source = gvaldap,ldapentities,ldaptasks | ||||
| source = gvaldap,ldapentities,gvaldap.ldaptasks | ||||
| branch = True | ||||
| 
 | ||||
| [coverage:report] | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue