Jelajahi Sumber

HUE-1556 [core] Create the users home directory automatically at login

Add tests by monkey patching LdapBackend.
Abraham Elmahrek 11 tahun lalu
induk
melakukan
c6ac0c060a

+ 2 - 1
apps/useradmin/src/useradmin/tests.py

@@ -17,9 +17,9 @@
 # limitations under the License.
 
 import json
+import ldap
 import re
 import urllib
-import ldap
 
 from nose.plugins.attrib import attr
 from nose.tools import assert_true, assert_equal, assert_false
@@ -55,6 +55,7 @@ def reset_all_groups():
   for grp in Group.objects.all():
     grp.delete()
 
+
 class LdapTestConnection(object):
   """
   Test class which mimics the behaviour of LdapConnection (from ldap_access.py).

+ 1 - 1
desktop/core/src/desktop/auth/views.py

@@ -103,7 +103,7 @@ def dt_login(request):
         if request.session.test_cookie_worked():
           request.session.delete_test_cookie()
 
-        if is_first_login_ever or backend_name == 'AllowAllBackend':
+        if is_first_login_ever or backend_name in ('AllowAllBackend', 'LdapBackend'):
           # Create home directory for first user.
           try:
             ensure_home_directory(request.fs, user.username)

+ 80 - 0
desktop/core/src/desktop/auth/views_test.py

@@ -19,7 +19,10 @@ from nose.tools import assert_true, assert_false, assert_equal
 
 from django.contrib.auth.models import User
 from django.test.client import Client
+from django.conf import settings
+
 from desktop import conf
+from desktop.auth.backend import rewrite_user
 from desktop.lib.django_test_util import make_logged_in_client
 from hadoop.test_base import PseudoHdfsTestBase
 from hadoop import pseudo_hdfs4
@@ -63,6 +66,69 @@ class TestLoginWithHadoop(PseudoHdfsTestBase):
     # 'Could not create home directory.' won't show up because the messages are consumed before
 
 
+class TestLdapLogin(PseudoHdfsTestBase):
+  @classmethod
+  def setup_class(cls):
+    PseudoHdfsTestBase.setup_class()
+
+    from desktop.auth import backend
+    cls.ldap_backend = backend.LdapBackend
+    backend.LdapBackend = MockLdapBackend
+    MockLdapBackend.__name__ = 'LdapBackend'
+
+    cls.old_backend = settings.AUTHENTICATION_BACKENDS
+    settings.AUTHENTICATION_BACKENDS = ("desktop.auth.backend.LdapBackend",)
+
+  @classmethod
+  def teardown_class(cls):
+    from desktop.auth import backend
+    backend.LdapBackend = cls.ldap_backend
+
+    settings.AUTHENTICATION_BACKENDS = cls.old_backend
+    MockLdapBackend.__name__ = 'MockLdapBackend'
+
+  def setUp(self):
+    # Simulate first login ever
+    User.objects.all().delete()
+    self.c = Client()
+
+  def test_login(self):
+    response = self.c.get('/accounts/login/')
+    assert_equal(200, response.status_code, "Expected ok status.")
+    assert_false(response.context['first_login_ever'])
+
+    response = self.c.post('/accounts/login/', {
+        'username': "ldap1",
+        'password': "ldap1"
+    })
+    assert_equal(302, response.status_code, "Expected ok redirect status.")
+    assert_true(self.fs.exists("/user/ldap1"))
+
+    response = self.c.get('/accounts/login/')
+    assert_equal(200, response.status_code, "Expected ok status.")
+    assert_false(response.context['first_login_ever'])
+
+  def test_login_home_creation_failure(self):
+    response = self.c.get('/accounts/login/')
+    assert_equal(200, response.status_code, "Expected ok status.")
+    assert_false(response.context['first_login_ever'])
+
+    # Create home directory as a file in order to fail in the home creation later
+    cluster = pseudo_hdfs4.shared_cluster()
+    fs = cluster.fs
+    assert_false(cluster.fs.exists("/user/ldap2"))
+    fs.do_as_superuser(fs.create, "/user/ldap2")
+
+    response = self.c.post('/accounts/login/', {
+        'username':" ldap2",
+        'password': "ldap2"
+    }, follow=True)
+    assert_equal(200, response.status_code, "Expected ok status.")
+    assert_true('/beeswax' in response.content, response.content)
+    # Custom login process should not do 'http-equiv="refresh"' but call the correct view
+    # 'Could not create home directory.' won't show up because the messages are consumed before
+
+
 class TestLogin(object):
   def setUp(self):
     # Simulate first login ever
@@ -89,3 +155,17 @@ class TestLogin(object):
     # Login
     response = client.post('/accounts/login/', dict(username="test", password="test"), follow=True)
     assert_true(any(["admin_wizard.mako" in _template.filename for _template in response.template]), response.template) # Go to superuser wizard
+
+
+class MockLdapBackend(object):
+  def authenticate(self, username=None, password=None):
+    user, created = User.objects.get_or_create(username=username)
+    return user
+
+  def get_user(self, user_id):
+    return rewrite_user(User.objects.get(id=user_id))
+
+  @classmethod
+  def manages_passwords_externally(cls):
+    return True
+LdapBackend = MockLdapBackend