1+ import uuid
2+
3+ from traitlets import Bool
4+ from tornado import gen
5+
6+ from jupyterhub .auth import Authenticator
7+ from jupyterhub .handlers import BaseHandler
8+ from jupyterhub .utils import url_path_join
9+
10+
11+ class TmpAuthenticateHandler (BaseHandler ):
12+ def initialize (self , force_new_server , process_user ):
13+ super ().initialize ()
14+ self .force_new_server = force_new_server
15+ self .process_user = process_user
16+
17+ @gen .coroutine
18+ def get (self ):
19+
20+ raw_user = yield self .get_current_user ()
21+
22+ if raw_user :
23+ if self .force_new_server and raw_user .running :
24+ status = yield raw_user .spawner .poll_and_notify ()
25+ if status is None :
26+ yield self .stop_single_user (raw_user )
27+
28+ else :
29+ username = str (uuid .uuid4 ())
30+ raw_user = self .user_from_username (username )
31+ self .set_login_cookie (raw_user )
32+
33+ user = yield gen .maybe_future (self .process_user (raw_user , self ))
34+
35+ server_name = ''
36+ redirection = self .get_next_url (user )
37+ user .spawners [server_name ].environment ["NETPYNE_URL" ] = ''
38+
39+ if 'hub/new-server=' in self .request .uri :
40+ server_name = str (uuid .uuid4 ()).split ('-' ).pop ()
41+ redirection = f'/hub/spawn/{ user .name } /{ server_name } '
42+ user .spawners [server_name ].environment ["NETPYNE_URL" ] = self .request .uri .split ('=' ).pop ()
43+
44+ self .redirect (redirection )
45+
46+
47+ class TmpAuthenticator (Authenticator ):
48+ auto_login = True
49+ login_service = 'tmp'
50+
51+ force_new_server = Bool (
52+ False ,
53+ help = """
54+ Stop the user's server and start a new one when visiting /hub/tmplogin
55+ When set to True, users going to /hub/tmplogin will *always* get a
56+ new single-user server. When set to False, they'll be
57+ redirected to their current session if one exists.
58+ """ ,
59+ config = True
60+ )
61+
62+ def process_user (self , user , handler ):
63+ return user
64+
65+ def get_handlers (self , app ):
66+ # FIXME: How to do this better?
67+ extra_settings = {
68+ 'force_new_server' : self .force_new_server ,
69+ 'process_user' : self .process_user
70+ }
71+ return [
72+ ('/tmplogin.*' , TmpAuthenticateHandler , extra_settings ),
73+ ('/new-server=.*' , TmpAuthenticateHandler , extra_settings )
74+ ]
75+
76+ def login_url (self , base_url ):
77+ return url_path_join (base_url , 'tmplogin' )
0 commit comments