diff --git a/rhodecode/model/forms.py b/rhodecode/model/forms.py --- a/rhodecode/model/forms.py +++ b/rhodecode/model/forms.py @@ -341,10 +341,7 @@ def LdapSettingsForm(tls_reqcert_choices ldap_base_dn = v.UnicodeString(strip=True,) ldap_filter = v.UnicodeString(strip=True,) ldap_search_scope = v.OneOf(search_scope_choices) - ldap_attr_login = All( - v.AttrLoginValidator(), - v.UnicodeString(strip=True,) - ) + ldap_attr_login = v.AttrLoginValidator()(not_empty=True) ldap_attr_firstname = v.UnicodeString(strip=True,) ldap_attr_lastname = v.UnicodeString(strip=True,) ldap_attr_email = v.UnicodeString(strip=True,) diff --git a/rhodecode/model/validators.py b/rhodecode/model/validators.py --- a/rhodecode/model/validators.py +++ b/rhodecode/model/validators.py @@ -723,13 +723,7 @@ def AttrLoginValidator(): 'this is the name of the attribute that is equivalent ' 'to "username"') } - - def validate_python(self, value, state): - if not value or not isinstance(value, (str, unicode)): - msg = M(self, 'invalid_cn', state) - raise formencode.Invalid(msg, value, state, - error_dict=dict(ldap_attr_login=msg) - ) + messages['empty'] = messages['invalid_cn'] return _validator diff --git a/rhodecode/tests/__init__.py b/rhodecode/tests/__init__.py --- a/rhodecode/tests/__init__.py +++ b/rhodecode/tests/__init__.py @@ -52,7 +52,7 @@ log = logging.getLogger(__name__) __all__ = [ 'parameterized', 'environ', 'url', 'get_new_dir', 'TestController', - 'SkipTest', + 'SkipTest', 'ldap_lib_installed', 'TESTS_TMP_PATH', 'HG_REPO', 'GIT_REPO', 'NEW_HG_REPO', 'NEW_GIT_REPO', 'HG_FORK', 'GIT_FORK', 'TEST_USER_ADMIN_LOGIN', 'TEST_USER_ADMIN_PASS', 'TEST_USER_REGULAR_LOGIN', 'TEST_USER_REGULAR_PASS', @@ -117,6 +117,15 @@ TEST_REPO_PREFIX = 'vcs-test' GIT_REMOTE_REPO = jn(TESTS_TMP_PATH, GIT_REPO) HG_REMOTE_REPO = jn(TESTS_TMP_PATH, HG_REPO) +#skip ldap tests if LDAP lib is not installed +ldap_lib_installed = False +try: + import ldap + ldap_lib_installed = True +except ImportError: + # means that python-ldap is not installed + pass + def get_new_dir(title): """ diff --git a/rhodecode/tests/functional/test_admin_ldap_settings.py b/rhodecode/tests/functional/test_admin_ldap_settings.py --- a/rhodecode/tests/functional/test_admin_ldap_settings.py +++ b/rhodecode/tests/functional/test_admin_ldap_settings.py @@ -1,15 +1,6 @@ from rhodecode.tests import * from rhodecode.model.db import RhodeCodeSetting -skip_ldap_test = False -try: - import ldap -except ImportError: - # means that python-ldap is not installed - skip_ldap_test = True - pass - - class TestLdapSettingsController(TestController): def test_index(self): @@ -20,26 +11,26 @@ class TestLdapSettingsController(TestCon def test_ldap_save_settings(self): self.log_user() - if skip_ldap_test: + if ldap_lib_installed: raise SkipTest('skipping due to missing ldap lib') test_url = url(controller='admin/ldap_settings', action='ldap_settings') response = self.app.post(url=test_url, - params={'ldap_host' : u'dc.example.com', - 'ldap_port' : '999', - 'ldap_tls_kind' : 'PLAIN', - 'ldap_tls_reqcert' : 'NEVER', - 'ldap_dn_user':'test_user', - 'ldap_dn_pass':'test_pass', - 'ldap_base_dn':'test_base_dn', - 'ldap_filter':'test_filter', - 'ldap_search_scope':'BASE', - 'ldap_attr_login':'test_attr_login', - 'ldap_attr_firstname':'ima', - 'ldap_attr_lastname':'tester', - 'ldap_attr_email':'test@example.com' }) + params={'ldap_host': u'dc.example.com', + 'ldap_port': '999', + 'ldap_tls_kind': 'PLAIN', + 'ldap_tls_reqcert': 'NEVER', + 'ldap_dn_user': 'test_user', + 'ldap_dn_pass': 'test_pass', + 'ldap_base_dn': 'test_base_dn', + 'ldap_filter': 'test_filter', + 'ldap_search_scope': 'BASE', + 'ldap_attr_login': 'test_attr_login', + 'ldap_attr_firstname': 'ima', + 'ldap_attr_lastname': 'tester', + 'ldap_attr_email': 'test@example.com' }) new_settings = RhodeCodeSetting.get_ldap_settings() self.assertEqual(new_settings['ldap_host'], u'dc.example.com', @@ -48,36 +39,58 @@ class TestLdapSettingsController(TestCon self.checkSessionFlash(response, 'LDAP settings updated successfully') - def test_ldap_error_form(self): + def test_ldap_error_form_wrong_port_number(self): self.log_user() - if skip_ldap_test: + if ldap_lib_installed: raise SkipTest('skipping due to missing ldap lib') test_url = url(controller='admin/ldap_settings', action='ldap_settings') response = self.app.post(url=test_url, - params={'ldap_host' : '', - 'ldap_port' : 'i-should-be-number', - 'ldap_tls_kind' : 'PLAIN', - 'ldap_tls_reqcert' : 'NEVER', - 'ldap_dn_user':'', - 'ldap_dn_pass':'', - 'ldap_base_dn':'', - 'ldap_filter':'', - 'ldap_search_scope':'BASE', - 'ldap_attr_login':'', # <----- missing required input - 'ldap_attr_firstname':'', - 'ldap_attr_lastname':'', - 'ldap_attr_email':'' }) + params={'ldap_host': '', + 'ldap_port': 'i-should-be-number', # bad port num + 'ldap_tls_kind': 'PLAIN', + 'ldap_tls_reqcert': 'NEVER', + 'ldap_dn_user': '', + 'ldap_dn_pass': '', + 'ldap_base_dn': '', + 'ldap_filter': '', + 'ldap_search_scope': 'BASE', + 'ldap_attr_login': '', + 'ldap_attr_firstname': '', + 'ldap_attr_lastname': '', + 'ldap_attr_email': ''}) + + response.mustcontain("""""" + """Please enter a number
""") + + def test_ldap_error_form(self): + self.log_user() + if ldap_lib_installed: + raise SkipTest('skipping due to missing ldap lib') + + test_url = url(controller='admin/ldap_settings', + action='ldap_settings') + + response = self.app.post(url=test_url, + params={'ldap_host': 'Host', + 'ldap_port': '123', + 'ldap_tls_kind': 'PLAIN', + 'ldap_tls_reqcert': 'NEVER', + 'ldap_dn_user': '', + 'ldap_dn_pass': '', + 'ldap_base_dn': '', + 'ldap_filter': '', + 'ldap_search_scope': 'BASE', + 'ldap_attr_login': '', # <----- missing required input + 'ldap_attr_firstname': '', + 'ldap_attr_lastname': '', + 'ldap_attr_email': ''}) response.mustcontain("""The LDAP Login""" """ attribute of the CN must be specified""") - - response.mustcontain("""Please """ - """enter a number""") - def test_ldap_login(self): pass diff --git a/rhodecode/tests/test_validators.py b/rhodecode/tests/test_validators.py --- a/rhodecode/tests/test_validators.py +++ b/rhodecode/tests/test_validators.py @@ -220,12 +220,16 @@ class TestReposGroups(unittest.TestCase) self.assertRaises(formencode.Invalid, validator.to_python, 'err') def test_LdapLibValidator(self): - validator = v.LdapLibValidator() - self.assertRaises(v.LdapImportError, validator.to_python, 'err') + if ldap_lib_installed: + validator = v.LdapLibValidator() + self.assertEqual("DN", validator.to_python('DN')) + else: + validator = v.LdapLibValidator() + self.assertRaises(v.LdapImportError, validator.to_python, 'err') def test_AttrLoginValidator(self): validator = v.AttrLoginValidator() - self.assertRaises(formencode.Invalid, validator.to_python, 123) + self.assertEqual('DN_attr', validator.to_python('DN_attr')) def test_NotReviewedRevisions(self): repo_id = Repository.get_by_repo_name(HG_REPO).repo_id