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