Browse Source

HUE-1989 [site] Live demo hosting

Here is a basic demo backend that creates a regular user with some
random name and logs him in automatically.
Support a superuser login/password when adding a GET 'admin' parameter.
Currently configured by using demo_enabled=True
Romain Rigaux 11 years ago
parent
commit
4a15302

+ 34 - 0
desktop/core/src/desktop/auth/backend.py

@@ -231,6 +231,40 @@ class AllowAllBackend(DesktopBackendBase):
     return True
 
 
+class DemoBackend(django.contrib.auth.backends.ModelBackend):
+  """
+  Log automatically users without a session with a new user account.
+  """
+  def authenticate(self, username, password):
+    user = super(DemoBackend, self).authenticate(username, password)
+
+    if not user:
+      username = self._randome_name()
+
+      user = find_or_create_user(username, None)
+
+      user.is_superuser = False
+      user.save()
+      default_group = get_default_user_group()
+      if default_group is not None:
+        user.groups.add(default_group)
+
+    user = rewrite_user(user)
+
+    return user
+
+  def get_user(self, user_id):
+    user = super(DemoBackend, self).get_user(user_id)
+    user = rewrite_user(user)
+    return user
+
+  def _randome_name(self):
+    import string
+    import random
+
+    N = 7
+    return ''.join(random.choice(string.ascii_lowercase + string.digits) for _ in range(N))
+
 
 class PamBackend(DesktopBackendBase):
   """

+ 7 - 3
desktop/core/src/desktop/auth/views.py

@@ -40,7 +40,7 @@ from desktop.auth.forms import UserCreationForm, AuthenticationForm
 from desktop.lib.django_util import render
 from desktop.lib.django_util import login_notrequired
 from desktop.log.access import access_warn, last_access_map
-from desktop.conf import OAUTH
+from desktop.conf import OAUTH, DEMO_ENABLED
 
 LOG = logging.getLogger(__name__)
 
@@ -80,7 +80,6 @@ def get_backend_name():
 
 @login_notrequired
 def dt_login(request):
-  """Used by the non-jframe login"""
   redirect_to = request.REQUEST.get('next', '/')
   is_first_login_ever = first_login_ever()
   backend_name = get_backend_name()
@@ -98,7 +97,6 @@ def dt_login(request):
         # It provides 'backends' on the User object.
         user = auth_form.get_user()
         login(request, user)
-
         if request.session.test_cookie_worked():
           request.session.delete_test_cookie()
 
@@ -120,6 +118,12 @@ def dt_login(request):
     first_user_form = None
     auth_form = AuthenticationForm()
 
+  if DEMO_ENABLED.get() and not 'admin' in request.REQUEST:
+    user = authenticate(username='', password='')
+    login(request, user)
+    ensure_home_directory(request.fs, user.username)
+    return HttpResponseRedirect(redirect_to)
+
   request.session.set_test_cookie()
   return render('login.mako', request, {
     'action': urlresolvers.reverse('desktop.auth.views.dt_login'),

+ 7 - 0
desktop/core/src/desktop/conf.py

@@ -141,6 +141,13 @@ APP_BLACKLIST = Config(
   help=_('Comma separated list of apps to not load at server startup.')
 )
 
+DEMO_ENABLED = Config( # Internal and Temporary
+  key="demo_enabled",
+  help=_("To set to true in combination when using Hue demo backend."),
+  type=coerce_bool,
+  private=True,
+  default=False)
+
 def is_https_enabled():
   return bool(SSL_CERTIFICATE.get() and SSL_PRIVATE_KEY.get())
 

+ 2 - 0
desktop/core/src/desktop/settings.py

@@ -298,6 +298,8 @@ if 'test' in sys.argv:
 TIME_ZONE = desktop.conf.TIME_ZONE.get()
 # Desktop supports only one authentication backend.
 AUTHENTICATION_BACKENDS = (desktop.conf.AUTH.BACKEND.get(),)
+if desktop.conf.DEMO_ENABLED.get():
+  AUTHENTICATION_BACKENDS = ('desktop.auth.backend.DemoBackend',)
 
 EMAIL_HOST = desktop.conf.SMTP.HOST.get()
 EMAIL_PORT = desktop.conf.SMTP.PORT.get()