Make availble a list of alternative aut methods
authorSimo Sorce <simo@redhat.com>
Mon, 27 Apr 2015 16:46:39 +0000 (12:46 -0400)
committerPatrick Uiterwijk <puiterwijk@redhat.com>
Mon, 27 Apr 2015 21:40:42 +0000 (23:40 +0200)
In the form case there is no way to automatically fallback to
other auth methods or even repeat transparent methods.
Add a simple list of alternative auth methods under the description
box so that the user can easily switch back and forth between them
if desired.

Fixes: https://fedorahosted.org/ipsilon/ticket/96

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

index 9496a4b..3f2b007 100644 (file)
@@ -142,6 +142,19 @@ class LoginManagerBase(ConfigHelper, PluginObject):
         except (ValueError, IndexError):
             return None
 
         except (ValueError, IndexError):
             return None
 
+    def other_login_stacks(self):
+        plugins = self._site[FACILITY]
+        stack = list()
+        try:
+            idx = plugins.enabled.index(self.name)
+        except (ValueError, IndexError):
+            idx = None
+        for i in range(0, len(plugins.enabled)):
+            if i == idx:
+                continue
+            stack.append(plugins.available[plugins.enabled[i]])
+        return stack
+
     def on_enable(self):
 
         # and add self to the root
     def on_enable(self):
 
         # and add self to the root
@@ -182,11 +195,14 @@ class LoginFormBase(LoginPageBase):
             return op(*args, **kwargs)
 
     def create_tmpl_context(self, **kwargs):
             return op(*args, **kwargs)
 
     def create_tmpl_context(self, **kwargs):
-        next_url = None
-        next_login = self.lm.next_login()
-        if next_login:
-            next_url = '%s?%s' % (next_login.path,
-                                  self.trans.get_GET_arg())
+        other_stacks = None
+        other_login_stacks = self.lm.other_login_stacks()
+        if other_login_stacks:
+            other_stacks = list()
+            for ls in other_login_stacks:
+                url = '%s?%s' % (ls.path, self.trans.get_GET_arg())
+                name = ls.name
+                other_stacks.append({'url': url, 'name': name})
 
         cookie = SecureCookie(USERNAME_COOKIE)
         cookie.receive()
 
         cookie = SecureCookie(USERNAME_COOKIE)
         cookie.receive()
@@ -210,7 +226,7 @@ class LoginFormBase(LoginPageBase):
             "username_text": self.lm.username_text,
             "password_text": self.lm.password_text,
             "description": self.lm.help_text,
             "username_text": self.lm.username_text,
             "password_text": self.lm.password_text,
             "description": self.lm.help_text,
-            "next_url": next_url,
+            "other_stacks": other_stacks,
             "username": username,
             "login_target": target,
             "cancel_url": '%s/login/cancel?%s' % (self.basepath,
             "username": username,
             "login_target": target,
             "cancel_url": '%s/login/cancel?%s' % (self.basepath,
index 69a0cc7..fe99c5a 100644 (file)
@@ -38,9 +38,6 @@
         {% else %}
           <a href="{{ basepath }}" title="Cancel" class="btn btn-link" tabindex="4">Cancel</a>
         {% endif %}
         {% 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 %}
         <button type="submit" value="login" class="btn btn-primary btn-lg" tabindex="3">Log In</button>
       </div>
     </div>
         <button type="submit" value="login" class="btn btn-primary btn-lg" tabindex="3">Log In</button>
       </div>
     </div>
 
 <div class="col-sm-5 col-md-6 col-lg-7 details">
   <p>{{description}}</p>
 
 <div class="col-sm-5 col-md-6 col-lg-7 details">
   <p>{{description}}</p>
+{% if other_stacks %}
+  <hr>
+  <p>Other authentication methods:
+  <ul>
+  {% for s in other_stacks %}
+    <li><a href="{{ s['url'] }}" class="btn btn-link" tabindex="5">{{ s['name'] }}</a></li>
+  {% endfor %}
+  </ul>
+  </p>
+{% endif %}
 </div>
 
 {% endblock %}
 </div>
 
 {% endblock %}