Return to provider if user cancels login
authorSimo Sorce <simo@redhat.com>
Tue, 14 Oct 2014 03:41:12 +0000 (23:41 -0400)
committerPatrick Uiterwijk <puiterwijk@redhat.com>
Fri, 24 Oct 2014 16:03:28 +0000 (18:03 +0200)
When the cancel button is hit return to the provider and eventually to the
original application via return urls.

Signed-off-by: Simo Sorce <simo@redhat.com>
Reviewed-by: Patrick Uiterwijk <puiterwijk@redhat.com>
ipsilon/login/common.py
templates/login/form.html

index cb45fd6..6cd1ca8 100755 (executable)
@@ -226,6 +226,8 @@ class LoginFormBase(LoginPageBase):
             "next_url": next_url,
             "username": username,
             "login_target": target,
+            "cancel_url": '%s/login/cancel?%s' % (self.basepath,
+                                                  self.trans.get_GET_arg()),
         }
         context.update(kwargs)
         if self.trans is not None:
@@ -242,6 +244,7 @@ class Login(Page):
 
     def __init__(self, *args, **kwargs):
         super(Login, self).__init__(*args, **kwargs)
+        self.cancel = Cancel(*args, **kwargs)
         self.first_login = None
         self.info = Info(self._site)
 
@@ -279,6 +282,25 @@ class Logout(Page):
         return self._template('logout.html', title='Logout')
 
 
+class Cancel(Page):
+
+    def GET(self, *args, **kwargs):
+
+        session = UserSession()
+        session.logout(None)
+
+        # return to the caller if any
+        transdata = self.get_valid_transaction('login', **kwargs).retrieve()
+        if 'login_return' not in transdata:
+            raise cherrypy.HTTPError(401)
+        raise cherrypy.HTTPRedirect(transdata['login_return'])
+
+    def root(self, *args, **kwargs):
+        op = getattr(self, cherrypy.request.method, self.GET)
+        if callable(op):
+            return op(*args, **kwargs)
+
+
 class LoginMgrsInstall(object):
 
     def __init__(self):
index e5e5978..69a0cc7 100644 (file)
     </div>
     <div class="form-group">
       <div class="col-sm-offset-2 col-md-offset-2 col-xs-12 col-sm-10 col-md-10 submit">
-        <a href="{{ basepath }}/" title="Cancel" class="btn btn-link" tabindex="4">Cancel</a>
+        {% if cancel_url %}
+          <a href="{{ cancel_url }}" title="Cancel" class="btn btn-link" tabindex="4">Cancel</a>
+        {% else %}
+          <a href="{{ basepath }}" title="Cancel" class="btn btn-link" tabindex="4">Cancel</a>
+        {% endif %}
         {% if next_url %}
           <a href="{{ next_url }}" title="Next authentication method" class="btn btn-link" tabindex="5">Next method </a>
         {% endif %}