You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by ma...@apache.org on 2019/10/29 17:48:24 UTC

[airavata-django-portal] 01/02: AIRAVATA-3019 desktop client login page

This is an automated email from the ASF dual-hosted git repository.

machristie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/airavata-django-portal.git

commit 7011bd2e5f0f403ddc3da65427888f10256e89e3
Author: Marcus Christie <ma...@apache.org>
AuthorDate: Tue Oct 29 09:48:52 2019 -0400

    AIRAVATA-3019 desktop client login page
---
 .../login-desktop-success.html                     | 10 ++++
 .../django_airavata_auth/login-desktop.html        | 16 +++++++
 .../partials/username_password_login_form.html     |  3 ++
 django_airavata/apps/auth/urls.py                  |  3 ++
 django_airavata/apps/auth/views.py                 | 56 ++++++++++++++++++++--
 5 files changed, 85 insertions(+), 3 deletions(-)

diff --git a/django_airavata/apps/auth/templates/django_airavata_auth/login-desktop-success.html b/django_airavata/apps/auth/templates/django_airavata_auth/login-desktop-success.html
new file mode 100644
index 0000000..5dbc318
--- /dev/null
+++ b/django_airavata/apps/auth/templates/django_airavata_auth/login-desktop-success.html
@@ -0,0 +1,10 @@
+{% extends 'base.html' %}
+
+{% block content %}
+
+<main class="main-content">
+<div class="container">
+  <h1>Logged in</h1>
+</div>
+</main>
+{% endblock content %}
diff --git a/django_airavata/apps/auth/templates/django_airavata_auth/login-desktop.html b/django_airavata/apps/auth/templates/django_airavata_auth/login-desktop.html
new file mode 100644
index 0000000..9c4d978
--- /dev/null
+++ b/django_airavata/apps/auth/templates/django_airavata_auth/login-desktop.html
@@ -0,0 +1,16 @@
+{% extends 'base.html' %}
+
+{% block content %}
+
+<main class="main-content">
+<div class="container">
+    {% if options.external %}
+    {% include "./partials/externals_login_form.html" %}
+    {% endif %}
+
+    {% if options.password %}
+    {% include "./partials/username_password_login_form.html" %}
+    {% endif %}
+</div>
+</main>
+{% endblock content %}
diff --git a/django_airavata/apps/auth/templates/django_airavata_auth/partials/username_password_login_form.html b/django_airavata/apps/auth/templates/django_airavata_auth/partials/username_password_login_form.html
index 70c89ae..6cc3bcc 100644
--- a/django_airavata/apps/auth/templates/django_airavata_auth/partials/username_password_login_form.html
+++ b/django_airavata/apps/auth/templates/django_airavata_auth/partials/username_password_login_form.html
@@ -23,6 +23,9 @@
                     {% if login_type and login_type == 'password' %}
                     <input type="hidden" name="login_type" value="{{ login_type }}"/>
                     {% endif %}
+                    {% if login_desktop %}
+                    <input type="hidden" name="login_desktop" value="true"/>
+                    {% endif %}
                     <button type="submit" class="btn btn-primary btn-block">
                       {% if options.password.logo %}
                       <img src="{% static options.password.logo %}"/>
diff --git a/django_airavata/apps/auth/urls.py b/django_airavata/apps/auth/urls.py
index 658df10..b9e937e 100644
--- a/django_airavata/apps/auth/urls.py
+++ b/django_airavata/apps/auth/urls.py
@@ -23,4 +23,7 @@ urlpatterns = [
     url(r'^forgot-password/$', views.forgot_password, name="forgot_password"),
     url(r'^reset-password/(?P<code>[\w-]+)/$', views.reset_password,
         name="reset_password"),
+    url(r'^login-desktop/$', views.login_desktop, name="login_desktop"),
+    url(r'^login-desktop-success/$',
+        views.login_desktop_success, name="login_desktop_success"),
 ]
diff --git a/django_airavata/apps/auth/views.py b/django_airavata/apps/auth/views.py
index 681138e..caf2233 100644
--- a/django_airavata/apps/auth/views.py
+++ b/django_airavata/apps/auth/views.py
@@ -1,6 +1,7 @@
 import logging
+import time
 from datetime import datetime, timedelta, timezone
-from urllib.parse import quote
+from urllib.parse import quote, urlencode
 
 from django.conf import settings
 from django.contrib import messages
@@ -70,6 +71,7 @@ def handle_login(request):
     username = request.POST['username']
     password = request.POST['password']
     login_type = request.POST.get('login_type', None)
+    login_desktop = request.POST.get('login_desktop', "false") == "true"
     template = "django_airavata_auth/login.html"
     if login_type and login_type == 'password':
         template = "django_airavata_auth/login_username_password.html"
@@ -78,14 +80,20 @@ def handle_login(request):
     try:
         if user is not None:
             login(request, user)
-            next_url = request.POST.get('next', settings.LOGIN_REDIRECT_URL)
-            return redirect(next_url)
+            if login_desktop:
+                return _create_login_desktop_success_response(request)
+            else:
+                next_url = request.POST.get('next',
+                                            settings.LOGIN_REDIRECT_URL)
+                return redirect(next_url)
         else:
             messages.error(request, "Login failed. Please try again.")
     except Exception as err:
         logger.exception("Login failed for user {}".format(username))
         messages.error(request,
                        "Login failed: {}. Please try again.".format(str(err)))
+    if login_desktop:
+        return _create_login_desktop_failed_response(request)
     return render(request, template, {
         'username': username,
         'next': request.POST.get('next', None),
@@ -106,6 +114,8 @@ def callback(request):
     try:
         user = authenticate(request=request)
         login(request, user)
+        if login_desktop:
+            return _create_login_desktop_success_response(request)
         next_url = request.GET.get('next', settings.LOGIN_REDIRECT_URL)
         return redirect(next_url)
     except Exception as err:
@@ -115,6 +125,9 @@ def callback(request):
             request,
             "Failed to process OAuth2 callback: {}".format(str(err)))
         idp_alias = request.GET.get('idp_alias')
+        if login_desktop:
+            return _create_login_desktop_failed_response(
+                request, idp_alias=idp_alias)
         return redirect(reverse('django_airavata_auth:callback-error',
                                 args=(idp_alias,)))
 
@@ -422,3 +435,40 @@ def _send_email_to_user(template_id, context):
                                 context['email'])])
     msg.content_subtype = 'html'
     msg.send()
+
+
+def login_desktop(request):
+    context = {
+        'options': settings.AUTHENTICATION_OPTIONS,
+        'login_desktop': True
+    }
+    if 'username' in request.GET:
+        context['username'] = request.GET['username']
+    return render(request, 'django_airavata_auth/login-desktop.html', context)
+
+
+def login_desktop_success(request):
+    return render(request, 'django_airavata_auth/login-desktop-success.html')
+
+
+def _create_login_desktop_success_response(request):
+    valid_time = (request.session['ACCESS_TOKEN_EXPIRES_AT'] - time.time())
+    return redirect(
+        reverse('django_airavata_auth:login_desktop_success') +
+        "?" + urlencode({
+            'status': 'ok',
+            'code': request.session['ACCESS_TOKEN'],
+            'refresh_code': request.session['REFRESH_TOKEN'],
+            'valid_time': valid_time
+        }))
+
+
+def _create_login_desktop_failed_response(request, idp_alias=None):
+    params = {'status': 'failed'}
+    if idp_alias is not None:
+        return redirect(reverse('django_airavata_auth:callback-error',
+                                args=(idp_alias,)) + "?" + urlencode(params))
+    if 'username' in request.POST:
+        params['username'] = request.POST['username']
+    return redirect(reverse('django_airavata_auth:login_desktop') +
+                    "?" + urlencode(params))