summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordrebs <drebs@leap.se>2016-12-18 21:06:26 -0200
committerKali Kaneko <kali@leap.se>2017-02-09 17:41:36 +0100
commitc39bde684da223c46368605368f63ac1beb8b6d4 (patch)
tree542633191b7640b32cac0bda364dfe442d3cbd2e
parent260805b9967184841c4499f94713a9a48c49a813 (diff)
[feat] cache session data in server
-rw-r--r--server/src/leap/soledad/server/auth.py2
-rw-r--r--server/src/leap/soledad/server/resource.py3
-rw-r--r--server/src/leap/soledad/server/session.py55
3 files changed, 52 insertions, 8 deletions
diff --git a/server/src/leap/soledad/server/auth.py b/server/src/leap/soledad/server/auth.py
index f55b710e..c5b90359 100644
--- a/server/src/leap/soledad/server/auth.py
+++ b/server/src/leap/soledad/server/auth.py
@@ -45,7 +45,7 @@ class SoledadRealm(object):
def requestAvatar(self, avatarId, mind, *interfaces):
if IResource in interfaces:
- return (IResource, SoledadResource(avatarId), lambda: None)
+ return (IResource, SoledadResource(), lambda: None)
raise NotImplementedError()
diff --git a/server/src/leap/soledad/server/resource.py b/server/src/leap/soledad/server/resource.py
index 9922c997..67e9ae32 100644
--- a/server/src/leap/soledad/server/resource.py
+++ b/server/src/leap/soledad/server/resource.py
@@ -41,8 +41,7 @@ class SoledadResource(Resource):
for the Soledad Server.
"""
- def __init__(self, uuid):
- self._uuid = uuid
+ def __init__(self):
self.children = {'': wsgi_resource}
def getChild(self, path, request):
diff --git a/server/src/leap/soledad/server/session.py b/server/src/leap/soledad/server/session.py
index 22e1d1fb..75440089 100644
--- a/server/src/leap/soledad/server/session.py
+++ b/server/src/leap/soledad/server/session.py
@@ -21,15 +21,41 @@ from zope.interface import implementer
from twisted.cred import error
from twisted.python import log
+from twisted.python.components import registerAdapter
from twisted.web import util
from twisted.web.guard import HTTPAuthSessionWrapper
from twisted.web.resource import ErrorPage
from twisted.web.resource import IResource
+from twisted.web.server import Session
+from zope.interface import Interface
+from zope.interface import Attribute
from leap.soledad.server.auth import URLMapper
from leap.soledad.server.auth import portal
from leap.soledad.server.auth import credentialFactory
from leap.soledad.server.auth import UnauthorizedResource
+from leap.soledad.server.resource import SoledadResource
+
+
+class ISessionData(Interface):
+ username = Attribute('An uuid.')
+ password = Attribute('A token.')
+
+
+@implementer(ISessionData)
+class SessionData(object):
+ def __init__(self, session):
+ self.username = None
+ self.password = None
+
+
+registerAdapter(SessionData, Session, ISessionData)
+
+
+def _sessionData(request):
+ session = request.getSession()
+ data = ISessionData(session)
+ return data
@implementer(IResource)
@@ -71,8 +97,27 @@ class SoledadSession(HTTPAuthSessionWrapper):
except:
log.err(None, "Unexpected failure from credentials factory")
return ErrorPage(500, None, None)
- else:
- request_uuid = match.get('uuid')
- if request_uuid and request_uuid != credentials.username:
- return ErrorPage(500, None, None)
- return util.DeferredResource(self._login(credentials))
+
+ request_uuid = match.get('uuid')
+ if request_uuid and request_uuid != credentials.username:
+ return ErrorPage(500, None, None)
+
+ # eventually return a cached resouce
+ sessionData = _sessionData(request)
+ if sessionData.username == credentials.username \
+ and sessionData.password == credentials.password:
+ return SoledadResource()
+
+ return util.DeferredResource(self._login(credentials, sessionData))
+
+ def _login(self, credentials, sessionData):
+
+ def _cacheSessionData(res):
+ sessionData.username = credentials.username
+ sessionData.password = credentials.password
+ return res
+
+ d = self._portal.login(credentials, None, IResource)
+ d.addCallback(_cacheSessionData)
+ d.addCallbacks(self._loginSucceeded, self._loginFailed)
+ return d