Files
jupyterhub/multiuser_notebook/singleuser.py
2014-06-19 16:51:55 -07:00

119 lines
3.5 KiB
Python

#!/usr/bin/env python
"""Dummy Single-User app to test the multi-user environment"""
import json
import os
import requests
import tornado.httpserver
import tornado.ioloop
import tornado.options
from tornado import web
from tornado.web import RequestHandler, Application
from tornado.websocket import WebSocketHandler
from tornado.log import app_log
from tornado.options import define, options
from IPython.html import utils
from .headers import HeadersHandler
here = os.path.dirname(__file__)
class BaseHandler(RequestHandler):
@property
def cookie_name(self):
return self.settings['cookie_name']
@property
def user(self):
return self.settings['user']
@property
def multiuser_api_key(self):
return self.settings['multiuser_api_key']
@property
def multiuser_api_url(self):
return self.settings['multiuser_api_url']
def verify_token(self, token):
r = requests.get(utils.url_path_join(
self.multiuser_api_url, "authorizations", token,
),
headers = {'Authorization' : 'token %s' % self.multiuser_api_key}
)
if r.status_code == 404:
return {'user' : ''}
r.raise_for_status()
return r.json()
def get_current_user(self):
token = self.get_cookie(self.cookie_name, '')
if token:
auth_data = self.verify_token(token)
if not auth_data:
# treat invalid token the same as no token
return None
user = auth_data['user']
if user == self.user:
return user
else:
raise web.HTTPError(403, "User %s does not have access to %s" % (user, self.user))
else:
app_log.debug("No token cookie")
return None
class MainHandler(BaseHandler):
@web.authenticated
def get(self, uri):
self.write("single-user %s: %s" % (self.user, uri))
class WSHandler(BaseHandler, WebSocketHandler):
def open(self):
import IPython
IPython.embed()
def main():
env = os.environ
define("port", default=8888, help="run on the given port", type=int)
define("user", default='', help="my username", type=str)
define("cookie_name", default='cookie', help="my cookie name", type=str)
define("base_url", default='/', help="My base URL", type=str)
define("multiuser_prefix", default='/multiuser/', help="The multi-user URL", type=str)
define("multiuser_api_url", default='http://localhost:8001/multiuser/api/', help="The multi-user API URL", type=str)
tornado.options.parse_command_line()
handlers = [
("/headers", HeadersHandler),
(r"(.*)", MainHandler),
]
base_url = options.base_url
for i, tup in enumerate(handlers):
lis = list(tup)
lis[0] = utils.url_path_join(base_url, tup[0])
handlers[i] = tuple(lis)
application = Application(handlers,
user=options.user,
multiuser_api_key=env['IPY_API_TOKEN'],
cookie_secret=env['IPY_COOKIE_SECRET'],
cookie_name=options.cookie_name,
login_url=utils.url_path_join(options.multiuser_prefix, 'login'),
multiuser_api_url = options.multiuser_api_url,
)
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(options.port)
app_log.info("User %s listening on %s" % (options.user, options.port))
tornado.ioloop.IOLoop.instance().start()
if __name__ == "__main__":
main()