X-Git-Url: http://git.cascardo.info/?p=cascardo%2Fipsilon.git;a=blobdiff_plain;f=ipsilon%2Flogin%2Fcommon.py;h=028b7544838be1f2c3622d2ffc83335bf8206669;hp=cb45fd6d347b4b92952ce40d5ce44dc819323675;hb=62b4656571be6e8671ada295047eac385d330f66;hpb=fe50fd3423969fca640cc35b32678bab5fd491cb diff --git a/ipsilon/login/common.py b/ipsilon/login/common.py index cb45fd6..028b754 100755 --- a/ipsilon/login/common.py +++ b/ipsilon/login/common.py @@ -17,7 +17,6 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -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 @@ -30,13 +29,15 @@ 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', "") @@ -116,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]) @@ -141,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: @@ -164,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) @@ -226,6 +233,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 +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) @@ -279,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):