mirror of
https://github.com/jupyterhub/jupyterhub.git
synced 2025-10-17 06:52:59 +00:00
Redirect requests to logged in user
If a user, alice, requests /user/bob/notebooks/mynotebook.ipynb, redirect her to /user/alice/notebooks/mynotebook.ipynb. Currently, such requests get stuck in a redirect loop because the request will be redirected to login page with a next parameter that when followed is again redirected. When notebook_dir is consistent across users, this will allow users to share notebook URLs. Fixes #424.
This commit is contained in:
@@ -454,22 +454,25 @@ class PrefixRedirectHandler(BaseHandler):
|
||||
|
||||
|
||||
class UserSpawnHandler(BaseHandler):
|
||||
"""Requests to /user/name handled by the Hub
|
||||
should result in spawning the single-user server and
|
||||
being redirected to the original.
|
||||
"""Redirect requests to /user/name/* handled by the Hub.
|
||||
|
||||
If logged in, spawn a single-user server and redirect request.
|
||||
If a user, alice, requests /user/bob/notebooks/mynotebook.ipynb,
|
||||
redirect her to /user/alice/notebooks/mynotebook.ipynb, which should
|
||||
in turn call this function.
|
||||
"""
|
||||
@gen.coroutine
|
||||
def get(self, name):
|
||||
def get(self, name, user_path):
|
||||
current_user = self.get_current_user()
|
||||
if current_user and current_user.name == name:
|
||||
# logged in, spawn the server
|
||||
# logged in as correct user, spawn the server
|
||||
if current_user.spawner:
|
||||
if current_user.spawn_pending:
|
||||
# spawn has started, but not finished
|
||||
html = self.render_template("spawn_pending.html", user=current_user)
|
||||
self.finish(html)
|
||||
return
|
||||
|
||||
|
||||
# spawn has supposedly finished, check on the status
|
||||
status = yield current_user.spawner.poll()
|
||||
if status is not None:
|
||||
@@ -486,13 +489,11 @@ class UserSpawnHandler(BaseHandler):
|
||||
target = current_user.host + target
|
||||
self.redirect(target)
|
||||
else:
|
||||
# not logged in to the right user,
|
||||
# clear any cookies and reload (will redirect to login)
|
||||
self.clear_login_cookie()
|
||||
self.redirect(url_concat(
|
||||
self.settings['login_url'],
|
||||
{'next': self.request.uri,
|
||||
}))
|
||||
# logged in as a different user, redirect
|
||||
target = url_path_join(self.base_url, 'user', current_user.name,
|
||||
user_path or '')
|
||||
self.redirect(target)
|
||||
|
||||
|
||||
class CSPReportHandler(BaseHandler):
|
||||
'''Accepts a content security policy violation report'''
|
||||
@@ -503,6 +504,6 @@ class CSPReportHandler(BaseHandler):
|
||||
self.request.body.decode('utf8', 'replace'))
|
||||
|
||||
default_handlers = [
|
||||
(r'/user/([^/]+)/?.*', UserSpawnHandler),
|
||||
(r'/user/([^/]+)(/.*)?', UserSpawnHandler),
|
||||
(r'/security/csp-report', CSPReportHandler),
|
||||
]
|
||||
|
Reference in New Issue
Block a user