pvl/login/server.py
changeset 350 1ca04394c314
parent 349 3c20473d0bdc
child 351 147f5e86b139
--- a/pvl/login/server.py	Mon Jan 13 02:28:19 2014 +0200
+++ b/pvl/login/server.py	Mon Jan 13 02:46:18 2014 +0200
@@ -25,6 +25,9 @@
             '//netdna.bootstrapcdn.com/bootstrap/3.0.3/js/bootstrap.min.js',
     )
 
+    def redirect (self, *url, **params) :
+        return pvl.web.response.redirect(self.url(*url, **params))
+
     def process_cookie (self) :
         """
             Reverse the urlencoding used for the cookie...
@@ -55,6 +58,9 @@
             self.pubtkt = self.process_cookie()
         except pubtkt.Error as ex :
             self.cookie_error = ex
+            
+        if not self.pubtkt :
+            return self.redirect(Login)
 
     def render_valid (self, valid) :
         seconds = valid.seconds + valid.days * (24 * 60 * 60)
@@ -91,7 +97,6 @@
             yield 'keys', "Authentication token", pubtkt.bauth
 
     def render_pubtkt (self, pubtkt) :
-
         return html.div(class_='panel panel-info')(
             html.div(class_='panel-heading')("Login: {pubtkt.uid}".format(pubtkt=self.pubtkt)),
             html.div(class_='panel-body')(
@@ -103,6 +108,11 @@
                     info,
                 ) for icon, title, info in self.render_pubtkt_fields(pubtkt)
             ),
+            html.div(class_='panel-footer')(
+                html.form(action='/logout', method='post')(
+                    html.button(type='submit', class_='btn btn-warning')("Logout"),
+                ),
+            ),
         )
 
     def render_info (self) :
@@ -111,13 +121,8 @@
                     html.h2("Invalid cookie"),
                     html.p(self.cookie_error),
             )
-        elif self.pubtkt :
-            return self.render_pubtkt(self.pubtkt)
 
-        else :
-            return (
-                    html.a(href=self.url(Login), title="Login")(html.h2("No login")),
-            )
+        return self.render_pubtkt(self.pubtkt)
    
     def render (self) :
 
@@ -176,7 +181,7 @@
         domain = self.app.login_domain
 
         return html.div(class_='container')(
-            html.form(action=self.request.path, method='POST', id='login')(
+            html.form(action=self.url(), method='POST', id='login')(
                 html.fieldset(
                     html.legend("Log in"),
                 
@@ -196,10 +201,49 @@
             )
         )
 
+class Logout (Handler) :
+    TITLE = "Logout"
+
+    def process (self) :
+        try :
+            self.pubtkt = self.process_cookie() 
+        except Error as ex :
+            self.pubtkt_error = ex
+            self.pubtkt = ex.pubtkt
+
+        if not self.pubtkt :
+            return self.redirect(Index)
+
+        if self.request.method == 'POST' :
+            back = self.app.login_server
+
+            response = pvl.web.response.redirect(back)
+
+            response.set_cookie(self.app.cookie_name, '',
+                    expires = 0,
+                    domain      = self.app.cookie_domain,
+                    secure      = self.app.cookie_secure,
+                    httponly    = self.app.cookie_httponly,
+            )
+            
+            return response
+    
+    def render (self) :
+        return html.div(class_='container')(
+            html.form(action=self.url(), method='post')(
+                html.fieldset(
+                    html.legend("Logout {pubtkt.uid}".format(pubtkt=self.pubtkt)),
+            
+                    html.button(type='submit', class_='btn btn-warning')("Logout"),
+                )
+            )
+        )
+
 class LoginApplication (pvl.web.Application) :
     URLS = urls.Map((
         urls.rule('/',              Index),
         urls.rule('/login',         Login),
+        urls.rule('/logout',        Logout),
     ))
 
     PUBLIC_KEY = 'etc/login/public.pem'