Эх сурвалжийг харах

[useradmin] LDAP errors caught and logged

logging ldap errors in ldap_access since a bad DN could cause problems.
PopupException with LDAP exception added.
abec 13 жил өмнө
parent
commit
0b8148b

+ 20 - 21
apps/useradmin/src/useradmin/templates/add_ldap_user.mako

@@ -27,42 +27,41 @@ ${layout.menubar(section='users', _=_)}
 
 
 <div class="container-fluid">
-   <h1>${_('Hue Users - Add/Sync LDAP user')}</h1>
-
+    <h1>${_('Hue Users - Add/Sync LDAP user')}</h1>
     <br/>
 
-	<form id="editForm" method="POST" class="form form-horizontal">
-		<fieldset>
-		      % for field in form.fields:	
+  <form id="editForm" method="POST" class="form form-horizontal">
+    <fieldset>
+          % for field in form.fields:
                   % if form[field].is_hidden:
                       ${ form[field] }
                   % else:
                       ${ layout.render_field(form[field]) }
-                  % endif	
-		      % endfor				
-		</fieldset>
-		<br/>
-		<div class="form-actions">
-			% if username:
-				<input type="submit" class="btn btn-primary" value="${_('Update user')}"/>
-			% else:
-			    <input type="submit" class="btn btn-primary" value="${_('Add/Sync user')}"/>
-			% endif
-			<a href="/useradmin/users" class="btn">${_('Cancel')}</a>
-		</div>
-	</form>
+                  % endif
+          % endfor
+    </fieldset>
+    <br/>
+    <div class="form-actions">
+      % if username:
+        <input type="submit" class="btn btn-primary" value="${_('Update user')}"/>
+      % else:
+          <input type="submit" class="btn btn-primary" value="${_('Add/Sync user')}"/>
+      % endif
+      <a href="/useradmin/users" class="btn">${_('Cancel')}</a>
+    </div>
+  </form>
 </div>
 
 <script type="text/javascript" charset="utf-8">
-	$(document).ready(function(){
-		$("#id_groups").jHueSelector({
+  $(document).ready(function(){
+    $("#id_groups").jHueSelector({
             selectAllLabel: "${_('Select all')}",
             searchPlaceholder: "${_('Search')}",
             noChoicesFound: "${_('No groups found.')} <a href='${url('useradmin.views.edit_group')}'>${_('Create a new group now')} &raquo;</a>",
             width:618,
             height:240
         });
-	});
+  });
 </script>
 
 ${commonfooter(messages)}

+ 16 - 0
apps/useradmin/src/useradmin/tests.py

@@ -22,6 +22,7 @@ Tests for "user admin"
 """
 
 import urllib
+from ldap import LDAPError
 
 from nose.plugins.attrib import attr
 from nose.tools import assert_true, assert_equal, assert_false
@@ -487,6 +488,21 @@ def test_sync_ldap_users_groups():
   assert_true(c.get(URL))
   assert_true(c.post(URL))
 
+def test_ldap_exception_handling():
+  reset_all_users()
+  reset_all_groups()
+
+  # Set up LDAP tests to use a LdapTestConnection instead of an actual LDAP connection
+  class LdapTestConnectionError(LdapTestConnection):
+    def find_user(self, user, find_by_dn=False):
+      raise LDAPError('No such object')
+  ldap_access.CACHED_LDAP_CONN = LdapTestConnectionError()
+
+  c = make_logged_in_client('test', is_superuser=True)
+
+  response = c.post(reverse(add_ldap_user), dict(username='moe', password1='test', password2='test'), follow=True)
+  assert_true('There was an error when communicating with LDAP' in response.content, response)
+
 @attr('requires_hadoop')
 def test_ensure_home_directory_add_ldap_user():
   URL = reverse(add_ldap_user)

+ 18 - 4
apps/useradmin/src/useradmin/views.py

@@ -26,6 +26,7 @@ import threading
 import subprocess
 
 import ldap_access
+from ldap import LDAPError
 
 from django.contrib.auth.models import User, Group
 from desktop.lib.django_util import render
@@ -272,7 +273,12 @@ def add_ldap_user(request):
     if form.is_valid():
       username = form.cleaned_data['username']
       import_by_dn = form.cleaned_data['dn']
-      user = import_ldap_user(username, import_by_dn)
+      try:
+        user = import_ldap_user(username, import_by_dn)
+      except LDAPError, e:
+        LOG.error("LDAP Exception: %s" % e)
+        raise PopupException(_('There was an error when communicating with LDAP: %s') % str(e))
+
       if user and form.cleaned_data['ensure_home_directory']:
         try:
           ensure_home_directory(request.fs, user.username)
@@ -309,7 +315,11 @@ def add_ldap_group(request):
       groupname = form.cleaned_data['name']
       import_by_dn = form.cleaned_data['dn']
       import_members = form.cleaned_data['import_members']
-      group = import_ldap_group(groupname, import_members, import_by_dn)
+      try:
+        group = import_ldap_group(groupname, import_members, import_by_dn)
+      except LDAPError, e:
+        LOG.error("LDAP Exception: %s" % e)
+        raise PopupException(_('There was an error when communicating with LDAP: %s') % str(e))
 
       if group is None:
         errors = form._errors.setdefault('name', ErrorList())
@@ -336,8 +346,12 @@ def sync_ldap_users_groups(request):
   if request.method == 'POST':
     form = SyncLdapUsersGroupsForm(request.POST)
     if form.is_valid():
-      users = sync_ldap_users()
-      groups = sync_ldap_groups()
+      try:
+        users = sync_ldap_users()
+        groups = sync_ldap_groups()
+      except LDAPError:
+        LOG.error("LDAP Exception: %s" % e)
+        raise PopupException(_('There was an error when communicating with LDAP: %s') % str(e))
 
       # Create home dirs for every user sync'd
       if form.cleaned_data['ensure_home_directory']: