def get(self): if self.config("gauth"): # self_redirect_uri should be similar to 'http://<host>/hostlaunchipnb/' self_redirect_uri = self.request.full_url() idx = self_redirect_uri.index("hostlaunchipnb/") self_redirect_uri = self_redirect_uri[0:(idx + len("hostlaunchipnb/"))] # state indicates the stage of auth during multistate auth state = self.get_argument('state', None) code = self.get_argument('code', False) if code is not False: user = yield self.get_authenticated_user( redirect_uri=self_redirect_uri, code=code) # get user info http = tornado.httpclient.AsyncHTTPClient() auth_string = "%s %s" % (user['token_type'], user['access_token']) response = yield http.fetch( 'https://www.googleapis.com/userinfo/v2/me', headers={"Authorization": auth_string}) user_info = json.loads(response.body) user_id = user_info['email'] jbuser = JBoxUserV2(user_id, create=True) if state == 'store_creds': creds = self.make_credentials(user) jbuser.set_gtok(base64.b64encode(creds.to_json())) jbuser.save() #self.log_info(str(user)) #self.log_info(creds.to_json()) else: if self.get_cookie("is_invite", "no") == "yes": code, status = jbuser.get_activation_state() if status != JBoxUserV2.ACTIVATION_GRANTED: jbuser.set_activation_state( code, JBoxUserV2.ACTIVATION_REQUESTED) jbuser.save() self.redirect('/?_msg=' + str(status)) return else: self.set_session_cookie(user_id) if jbuser.is_new: jbuser.save() self.redirect('/') return else: if state == 'ask_gdrive': jbox_cookie = AuthHandler.get_session_cookie(self) scope = ['https://www.googleapis.com/auth/drive'] extra_params = { 'approval_prompt': 'force', 'access_type': 'offline', 'login_hint': jbox_cookie['u'], 'include_granted_scopes': 'true', 'state': 'store_creds' } else: scope = ['profile', 'email'] extra_params = {'approval_prompt': 'auto'} yield self.authorize_redirect( redirect_uri=self_redirect_uri, client_id=self.settings['google_oauth']['key'], scope=scope, response_type='code', extra_params=extra_params) else: sessname = unquote(self.get_argument("sessname")) self.set_session_cookie(sessname) self.redirect('/')
def publish_stats(): JBoxUserV2.calc_stats() JBoxUserV2.log_debug("stats: %r", JBoxUserV2.STATS) JBoxDynConfig.set_stat(CloudHost.INSTALL_ID, JBoxUserV2.STAT_NAME, JBoxUserV2.STATS)
def publish_stats(): JBoxUserV2.calc_stats() JBoxDynConfig.set_stat(CloudHost.INSTALL_ID, JBoxUserV2.STAT_NAME, JBoxUserV2.STATS)
def get(self): sessname = unquote(self.get_cookie("sessname")) jbox_cookie = AuthHandler.get_session_cookie(self) if (None == sessname) or (len(sessname) == 0) or (None == jbox_cookie): self.send_error() return user_id = jbox_cookie['u'] cont = JBoxContainer.get_by_name(sessname) if cont is None: self.send_error() return juliaboxver, upgrade_available = self.get_upgrade_available(cont) if self.do_upgrade(cont, upgrade_available): response = {'code': 0, 'data': ''} self.write(response) return user = JBoxUserV2(user_id) is_admin = sessname in self.config("admin_sessnames", []) manage_containers = is_admin or user.has_role( JBoxUserV2.ROLE_MANAGE_CONTAINERS) show_report = is_admin or user.has_role(JBoxUserV2.ROLE_ACCESS_STATS) invites_perm = is_admin or user.has_role( JBoxUserV2.ROLE_MANAGE_INVITES) sections = [] loads = [] report = {} report_span = 'day' invites_info = [] action = self.get_argument("action", None) #invite_code = self.request.get("invite_code", None) if action == "invites_report" and invites_perm: self.write( dict(code=0, data=[obj for obj in JBoxInvite.table().scan()])) return if manage_containers: sections, loads = self.do_containers() if show_report: today = datetime.now() if self.get_argument('range', 'day') == 'week': dates = [today - timedelta(days=i) for i in range(6, -1, -1)] report_span = 'week' else: dates = [today] report = JBoxAccountingV2.get_stats(dates) d = dict(manage_containers=manage_containers, show_report=show_report, invites_perm=invites_perm, report_span=report_span, sessname=sessname, user_id=user_id, created=isodate.datetime_isoformat(cont.time_created()), started=isodate.datetime_isoformat(cont.time_started()), allowed_till=isodate.datetime_isoformat( (cont.time_started() + timedelta(seconds=self.config('expire')))), mem=cont.get_memory_allocated(), cpu=cont.get_cpu_allocated(), disk=cont.get_disk_allocated(), expire=self.config('expire'), sections=sections, loads=loads, report=report, juliaboxver=juliaboxver, upgrade_available=upgrade_available) self.rendertpl("ipnbadmin.tpl", d=d, cfg=self.config())
def do_monitor_loading(self, user_id): sessname = unique_sessname(user_id) self.log_debug("Monitoring loading of session [%s] user[%s]...", sessname, user_id) cont = JBoxContainer.get_by_name(sessname) if (cont is None) or (not cont.is_running()): loading_step = int(self.get_cookie("loading", 0)) if loading_step > 30: self.log_error( "Could not start instance. Session [%s] for user [%s] didn't load.", sessname, user_id) self.clear_container_cookies() self.rendertpl( "index.tpl", cfg=self.config(), state=self.state( error= 'Could not start your instance! Please try again.', pending_activation=False, user_id=user_id)) return else: loading_step += 1 self.set_cookie("loading", str(loading_step)) self.rendertpl("loading.tpl", user_id=user_id) else: if self.config("gauth"): jbuser = JBoxUserV2(user_id) creds = jbuser.get_gtok() if creds is not None: try: creds_json = json.loads(base64.b64decode(creds)) creds_json = self.renew_creds(creds_json) authtok = creds_json['access_token'] except: self.log_warn( "stale stored creds. will renew on next use. user: "******"sesskey")) self.clear_cookie("loading") self.set_container_cookies({ "sessname": sessname, "hostshell": shellport, "hostupload": uplport, "hostipnb": ipnbport, "sign": sign }) self.set_lb_tracker_cookie() self.rendertpl("ipnbsess.tpl", sessname=sessname, cfg=self.config(), creds=creds, authtok=authtok, user_id=user_id)
def get(self): jbox_cookie = AuthHandler.get_session_cookie(self) if self.config("invite_only"): if self.get_argument("invite", False): self.set_cookie("is_invite", "yes") self.redirect('/hostlaunchipnb/') return if None == jbox_cookie: which_msg = int( self.get_argument("_msg", JBoxUserV2.ACTIVATION_NONE)) if self.get_argument("_msg", "") != "": self.clear_cookie("is_invite") if which_msg == JBoxUserV2.ACTIVATION_GRANTED: msg = "Your account has already been approved" elif which_msg == JBoxUserV2.ACTIVATION_REQUESTED: msg = "You have already registered for an invite" else: msg = "Thank you for your interest! We will get back to you with an invitation soon." state = self.state(success=msg) else: state = self.state() self.rendertpl("index.tpl", cfg=self.config(), state=state) else: user_id = jbox_cookie['u'] sessname = esc_sessname(user_id) if self.config("gauth"): try: jbuser = JBoxUserV2(user_id) except: # stale cookie. we don't have the user in our database anymore self.log_info( "stale cookie. we don't have the user in our database anymore. user: "******"invite_only"): code, status = jbuser.get_activation_state() if status != JBoxUserV2.ACTIVATION_GRANTED: invite_code = self.get_argument("invite_code", False) if invite_code is not False: try: invite = JBoxInvite(invite_code) except: invite = None if (invite is not None ) and invite.is_invited(user_id): jbuser.set_activation_state( invite_code, JBoxUserV2.ACTIVATION_GRANTED) jbuser.save() self.redirect('/hostlaunchipnb/') return else: error_msg = 'You entered an invalid invitation code. Try again or request a new invitation.' else: error_msg = 'Enter the invitation code' self.rendertpl("index.tpl", cfg=self.config(), state=self.state(error=error_msg, ask_invite_code=True, user_id=user_id)) return creds = jbuser.get_gtok() if creds is not None: try: creds_json = json.loads(base64.b64decode(creds)) creds_json = self.renew_creds(creds_json) authtok = creds_json['access_token'] except: self.log_info( "stale stored creds. will renew on next use. user: " + user_id) creds = None authtok = None else: authtok = None else: creds = None authtok = None self.chk_and_launch_docker(sessname, creds, authtok, user_id)
def get(self): sessname = unquote(self.get_cookie("sessname")) jbox_cookie = AuthHandler.get_session_cookie(self) if (None == sessname) or (len(sessname) == 0) or (None == jbox_cookie): self.send_error() return user_id = jbox_cookie['u'] cont = JBoxContainer.get_by_name(sessname) if cont is None: self.send_error() return juliaboxver, upgrade_available = self.get_upgrade_available(cont) if self.do_upgrade(cont, upgrade_available): response = {'code': 0, 'data': ''} self.write(response) return user = JBoxUserV2(user_id) show_report = (sessname in self.config("report_sessnames", []) or user.get_role() == JBoxUserV2.ROLE_REPORT) admin_user = (sessname in self.config("admin_sessnames", []) or user.get_role() == JBoxUserV2.ROLE_ADMIN) show_report = show_report or admin_user sections = [] loads = [] report = {} report_span = 'day' if admin_user: sections, loads = self.admin_stats() if show_report: today = datetime.now() if self.get_argument('range', 'day') == 'week': dates = [today - timedelta(days=i) for i in range(6, -1, -1)] report_span = 'week' else: dates = [today] report = JBoxAccountingV2.get_stats(dates) d = dict(admin_user=admin_user, show_report=show_report, report_span=report_span, sessname=sessname, user_id=user_id, created=isodate.datetime_isoformat(cont.time_created()), started=isodate.datetime_isoformat(cont.time_started()), allowed_till=isodate.datetime_isoformat( (cont.time_started() + timedelta(seconds=self.config('expire')))), mem=cont.get_memory_allocated(), cpu=cont.get_cpu_allocated(), disk=cont.get_disk_allocated(), expire=self.config('expire'), sections=sections, loads=loads, report=report, juliaboxver=juliaboxver, upgrade_available=upgrade_available) self.rendertpl("ipnbadmin.tpl", d=d, cfg=self.config())