From 7605a4263263fb399176a0d9eea49ab7ecc81274 Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Sun, 5 Oct 2014 14:00:25 -0400 Subject: [PATCH] Fix transaction handling in providers When a provider redirects to the login code, it must retain 'ownership' of the transaction, otherwise the login code will wipe the transaction data as sson as the authentication is completed but before the provider has completed its part of the transaction. Make sure the transaction code retrieves the 'owner' from the data for pre-existing transactions. Signed-off-by: Simo Sorce Reviewed-by: Patrick Uiterwijk --- ipsilon/login/common.py | 1 + ipsilon/util/trans.py | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/ipsilon/login/common.py b/ipsilon/login/common.py index 3f44c15..2fee357 100755 --- a/ipsilon/login/common.py +++ b/ipsilon/login/common.py @@ -79,6 +79,7 @@ class LoginManagerBase(PluginObject, Log): # on direct login the UI (ie not redirected by a provider) we ned to # remove the transaction cookie as it won't be needed anymore if trans.provider == 'login': + self.debug('Wiping transaction data') trans.wipe() raise cherrypy.HTTPRedirect(redirect) diff --git a/ipsilon/util/trans.py b/ipsilon/util/trans.py index 4d2f887..8208d4a 100755 --- a/ipsilon/util/trans.py +++ b/ipsilon/util/trans.py @@ -15,7 +15,6 @@ TRANSID = "ipsilon_transaction_id" class Transaction(Log): def __init__(self, provider, **kwargs): - self.debug('Transaction: %s' % repr(kwargs)) self.provider = provider self.transaction_id = None self._ts = TranStore() @@ -23,14 +22,17 @@ class Transaction(Log): tid = kwargs.get(TRANSID) if tid: self.transaction_id = tid - data = self._ts.get_unique_data(TRANSTABLE, tid) + data = self.retrieve() + if data and 'provider' in data: + self.provider = data['provider'] self._get_cookie() else: data = {'provider': self.provider, 'origintime': str(datetime.now())} self.transaction_id = self._ts.new_unique_data(TRANSTABLE, data) self._set_cookie() - self.debug('Transaction id: %s' % self.transaction_id) + self.debug('Transaction: %s %s' % (self.provider, + self.transaction_id)) def _set_cookie(self): self.cookie = SecureCookie(name=None, value=self.provider) -- 2.20.1