diff options
-rw-r--r-- | ipsilon/util/page.py | 15 | ||||
-rw-r--r-- | ipsilon/util/trans.py | 28 |
2 files changed, 37 insertions, 6 deletions
diff --git a/ipsilon/util/page.py b/ipsilon/util/page.py index db1c145..0929961 100644 --- a/ipsilon/util/page.py +++ b/ipsilon/util/page.py @@ -22,9 +22,11 @@ from ipsilon.util.trans import Transaction from urllib import unquote try: from urlparse import urlparse + from urlparse import parse_qs except ImportError: # pylint: disable=no-name-in-module, import-error from urllib.parse import urlparse + from urllib.parse import parse_qs def admin_protect(fn): @@ -123,7 +125,18 @@ class Page(Log): def get_valid_transaction(self, provider, **kwargs): try: - return Transaction(provider, **kwargs) + t = Transaction(provider) + # Try with kwargs first + tid = t.find_tid(kwargs) + if not tid: + # If no TID yet See if we have it in a referer + if 'referer' in cherrypy.request.headers: + r = urlparse(unquote(cherrypy.request.headers['referer'])) + if r.query: + tid = t.find_tid(parse_qs(r.query)) + if not tid: + t.create_tid() + return t except ValueError: msg = 'Transaction expired, or cookies not available' raise cherrypy.HTTPError(401, msg) diff --git a/ipsilon/util/trans.py b/ipsilon/util/trans.py index 8d4be14..5ac3e42 100644 --- a/ipsilon/util/trans.py +++ b/ipsilon/util/trans.py @@ -17,18 +17,36 @@ class Transaction(Log): self.transaction_id = None self._ts = TranStore() self.cookie = None + + # Backwards compat, + # if arguments are passed find or get new transaction + if kwargs: + self.find_tid(kwargs) + if not self.transaction_id: + self.create_tid() + + def find_tid(self, kwargs): tid = kwargs.get(TRANSID) if tid: + # If more than one only pick the first + if isinstance(tid, list): + tid = tid[0] self.transaction_id = tid data = self.retrieve() if data and 'provider' in data: self.provider = data['provider'] self._get_cookie(data) - 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: %s %s' % (self.provider, + self.transaction_id)) + return tid + + return None + + def create_tid(self): + data = {'provider': self.provider, + 'origintime': str(datetime.now())} + self.transaction_id = self._ts.new_unique_data(TRANSTABLE, data) + self._set_cookie() self.debug('Transaction: %s %s' % (self.provider, self.transaction_id)) |