mirror of
https://github.com/jupyterhub/jupyterhub.git
synced 2025-10-12 12:33:02 +00:00
119 lines
3.5 KiB
Python
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()
|