In configure we do not need to set_config()
[cascardo/ipsilon.git] / ipsilon / login / common.py
index 6231997..028b754 100755 (executable)
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-from ipsilon.util.log import Log
 from ipsilon.util.page import Page
 from ipsilon.util.user import UserSession
 from ipsilon.util.plugin import PluginLoader, PluginObject
 from ipsilon.util.plugin import PluginInstaller
 from ipsilon.info.common import Info
 from ipsilon.util.cookies import SecureCookie
-from ipsilon.util.trans import Transaction
 import cherrypy
 
 
 USERNAME_COOKIE = 'ipsilon_default_username'
 
 
-class LoginManagerBase(PluginObject, Log):
+class LoginManagerBase(PluginObject):
 
     def __init__(self):
         super(LoginManagerBase, self).__init__()
+        self._site = None
         self.path = '/'
         self.next_login = None
         self.info = None
+        self.is_enabled = False
 
     def redirect_to_path(self, path):
         base = cherrypy.config.get('base.mount', "")
@@ -117,10 +117,13 @@ class LoginManagerBase(PluginObject, Log):
         raise NotImplementedError
 
     def enable(self, site):
-        plugins = site[FACILITY]
-        if self in plugins['enabled']:
+        if self.is_enabled:
             return
 
+        if not self._site:
+            self._site = site
+        plugins = self._site[FACILITY]
+
         # configure self
         if self.name in plugins['config']:
             self.set_config(plugins['config'][self.name])
@@ -142,16 +145,18 @@ class LoginManagerBase(PluginObject, Log):
             root.first_login = self
 
         plugins['enabled'].append(self)
+        self.is_enabled = True
         self._debug('Login plugin enabled: %s' % self.name)
 
         # Get handle of the info plugin
         self.info = root.info
 
     def disable(self, site):
-        plugins = site[FACILITY]
-        if self not in plugins['enabled']:
+        if not self.is_enabled:
             return
 
+        plugins = self._site[FACILITY]
+
         # remove self from chain
         root = plugins['root']
         if root.first_login == self:
@@ -165,6 +170,7 @@ class LoginManagerBase(PluginObject, Log):
         self.next_login = None
 
         plugins['enabled'].remove(self)
+        self.is_enabled = False
         self._debug('Login plugin disabled: %s' % self.name)
 
 
@@ -193,7 +199,7 @@ class LoginFormBase(LoginPageBase):
         return self._template(self.formtemplate, **context)
 
     def root(self, *args, **kwargs):
-        self.trans = Transaction('login', **kwargs)
+        self.trans = self.get_valid_transaction('login', **kwargs)
         op = getattr(self, cherrypy.request.method, self.GET)
         if callable(op):
             return op(*args, **kwargs)
@@ -210,8 +216,10 @@ class LoginFormBase(LoginPageBase):
         if username is None:
             username = ''
 
+        target = None
         if self.trans is not None:
             tid = self.trans.transaction_id
+            target = self.trans.retrieve().get('login_target')
         if tid is None:
             tid = ''
 
@@ -224,6 +232,9 @@ class LoginFormBase(LoginPageBase):
             "description": self.lm.help_text,
             "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:
@@ -240,6 +251,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)
 
@@ -262,7 +274,7 @@ class Login(Page):
 
     def root(self, *args, **kwargs):
         if self.first_login:
-            trans = Transaction('login', **kwargs)
+            trans = self.get_valid_transaction('login', **kwargs)
             redirect = '%s/login/%s?%s' % (self.basepath,
                                            self.first_login.path,
                                            trans.get_GET_arg())
@@ -277,6 +289,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):