Skip to content

Commit

Permalink
Merge branch 'gwtadmin' into v3.0-devel
Browse files Browse the repository at this point in the history
  • Loading branch information
greghaynes authored and Gregory Haynes committed Aug 13, 2010
2 parents 93f5b15 + 9038e7a commit 793712b
Show file tree
Hide file tree
Showing 63 changed files with 59 additions and 2,510 deletions.
3 changes: 3 additions & 0 deletions src/pyscripts/xsbs/http/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
from xsbs.settings import PluginConfig
from xsbs.events import eventHandler

from sessionmanager import SessionManager

config = PluginConfig('httpserver')
port = config.getOption('Config', 'port', '8081')
enable = config.getOption('Config', 'enable', 'yes') == 'yes'
Expand All @@ -19,6 +21,7 @@ def __init__(self, address, port):
self.port = port
self.root_site = RootSite()
self.server_site = server.Site(self.root_site)
self.sessionManager = SessionManager()
def start(self):
self.connection = reactor.listenTCP(port, self.server_site)
def stop(self):
Expand Down
52 changes: 36 additions & 16 deletions src/pyscripts/xsbs/http/jsonapi.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,17 @@ def setJsonHeaders(request):
'invalid_parameters': {
'error': 'INVALID_PARAMETERS'
},
'invalid_login': {
'error': 'INVALID_LOGIN'
'not_logged_in': {
'error': 'NOT_LOGGED_IN'
},
'insufficient_permissions': {
'error': 'INSUFFICIENT_PERMISSIONS'
},
'success': {
'result': 'SUCCESS'
},
'no_session': {
'error': 'NO_SESSION'
}
}

Expand All @@ -48,40 +51,57 @@ def __call__(self, *args, **kwargs):
class JsonSite(resource.Resource):
def render_GET(self, request):
setJsonHeaders(request)

# Grab the session if it exists
try:
sesskey = request.args['sessionkey'][0]
except KeyError:
pass
else:
try:
request.session = httpServer.sessionManager.sessions[sesskey]
except KeyError:
pass

return self.render_JSON(request)
def render_OPTIONS(self, request):
setJsonHeaders(request)
return None
def render_JSON(self, request):
return ''

class JsonUserSite(JsonSite):
class JsonSessionSite(resource.Resource):
def render_JSON(self, request):
try:
username = request.args['username'][0]
password = request.args['password'][0]
session = request.session
except AttributeError:
return response('no_session', 'No active session')
else:
return self.render_session_JSON(request, session)

class JsonUserSite(JsonSessionSite):
def render_session_JSON(self, request, session):
try:
user_id = session['user_id']
except KeyError:
return response('invalid_login', 'Missing username or password')
user = userAuth(username, password)
if not user:
return response('invalid_login', 'No user found with matching username and password')
return self.render_user_JSON(request, user)
return response('not_logged_in', 'Not currently logged in')
return self.render_user_JSON(request, user_id)

class JsonAtLeastMasterSite(JsonUserSite):
def render_user_JSON(self, request, user):
if not isUserAtLeastMaster(user.id):
def render_user_JSON(self, request, user_id):
if not isUserAtLeastMaster(user_id):
return response('insufficient_permissions', 'User does not have master permissions')
return self.render_master_JSON(request, user)

class JsonMasterSite(JsonUserSite):
def render_user_JSON(self, request, user):
if not isUserMaster(user.id):
def render_user_JSON(self, request, user_id):
if not isUserMaster(user_id):
return response('insufficient_permissions', 'User does not have master permissions')
return self.render_master_JSON(request, user)

class JsonAdminSite(JsonUserSite):
def render_user_JSON(self, request, user):
if not isUserAdmin(user.id):
def render_user_JSON(self, request, user_id):
if not isUserAdmin(user_id):
return response('insufficient_permissions', 'User does not have admin permissions')
return self.render_admin_JSON(request, user)

Expand Down
20 changes: 20 additions & 0 deletions src/pyscripts/xsbs/http/sessionmanager.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import time

class Session(dict):
def __init__(self, key):
self.key = key
self.create_time = time.time()
self.touch_time = self.create_time
def touch(self):
self.touch_time = time.time()

class SessionManager(object):
def __init__(self, stale_secs=3600):
self.sessions = {}
self.stale_secs = stale_secs
def removeStales(self):
cur_time = time.time()
for session in self.sessions.values():
if (session.touch_time + self.stale_secs) < cur_time:
del self.sessions[session.key]

0 comments on commit 793712b

Please sign in to comment.