diff --git a/CONTRIBUTORS b/CONTRIBUTORS --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -6,4 +6,5 @@ List of contributors to RhodeCode projec cejones Lorenzo M. Catucci Dmitri Kuznetsov - Jared Bunting \ No newline at end of file + Jared Bunting + Steve Romanow \ No newline at end of file diff --git a/rhodecode/lib/auth.py b/rhodecode/lib/auth.py --- a/rhodecode/lib/auth.py +++ b/rhodecode/lib/auth.py @@ -41,7 +41,7 @@ if __platform__ in PLATFORM_WIN: if __platform__ in PLATFORM_OTHERS: import bcrypt -from rhodecode.lib import str2bool +from rhodecode.lib import str2bool, safe_unicode from rhodecode.lib.exceptions import LdapPasswordError, LdapUsernameError from rhodecode.lib.utils import get_repo_slug from rhodecode.lib.auth_ldap import AuthLdap @@ -207,10 +207,10 @@ def authenticate(username, password): .get(k), [''])[0] user_attrs = { - 'name': get_ldap_attr('ldap_attr_firstname'), - 'lastname': get_ldap_attr('ldap_attr_lastname'), - 'email': get_ldap_attr('ldap_attr_email'), - } + 'name': safe_unicode(get_ldap_attr('ldap_attr_firstname')), + 'lastname': safe_unicode(get_ldap_attr('ldap_attr_lastname')), + 'email': get_ldap_attr('ldap_attr_email'), + } if user_model.create_ldap(username, password, user_dn, user_attrs): 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,4 +1,11 @@ from rhodecode.tests import * +from rhodecode.model.db import RhodeCodeSettings + +try: + import ldap +except ImportError: + # means that python-ldap is not installed + pass class TestLdapSettingsController(TestController): @@ -6,13 +13,60 @@ class TestLdapSettingsController(TestCon self.log_user() response = self.app.get(url(controller='admin/ldap_settings', action='index')) - # Test response... + self.assertTrue('LDAP administration' in response.body) def test_ldap_save_settings(self): - pass + self.log_user() + 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' }) + + new_settings = RhodeCodeSettings.get_ldap_settings() + self.assertEqual(new_settings['ldap_host'], u'dc.example.com', + 'fail db write compare') + + self.checkSessionFlash(response, + 'Ldap settings updated successfully') def test_ldap_error_form(self): - pass + self.log_user() + 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':'' }) + + self.assertTrue("""The LDAP Login""" + """ attribute of the CN must be specified""" in + response.body) + self.assertTrue("""Please """ + """enter a number""" in response.body) def test_ldap_login(self): pass