|
|
@@ -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
|