def post(self): """Handles POST requests.""" username = self.payload.get('username') agreed_to_terms = self.payload.get('agreed_to_terms') default_dashboard = self.payload.get('default_dashboard') can_receive_email_updates = self.payload.get( 'can_receive_email_updates') bulk_email_signup_message_should_be_shown = False if can_receive_email_updates is not None: bulk_email_signup_message_should_be_shown = ( user_services.update_email_preferences( self.user_id, can_receive_email_updates, feconf.DEFAULT_EDITOR_ROLE_EMAIL_PREFERENCE, feconf.DEFAULT_FEEDBACK_MESSAGE_EMAIL_PREFERENCE, feconf.DEFAULT_SUBSCRIPTION_EMAIL_PREFERENCE)) if bulk_email_signup_message_should_be_shown: self.render_json({ 'bulk_email_signup_message_should_be_shown': (bulk_email_signup_message_should_be_shown) }) return has_ever_registered = user_services.has_ever_registered(self.user_id) has_fully_registered_account = ( user_services.has_fully_registered_account(self.user_id)) if has_fully_registered_account: self.render_json({}) return if not isinstance(agreed_to_terms, bool) or not agreed_to_terms: raise self.InvalidInputException( 'In order to edit explorations on this site, you will ' 'need to accept the license terms.') else: user_services.record_agreement_to_terms(self.user_id) if not user_services.get_username(self.user_id): try: user_services.set_username(self.user_id, username) except utils.ValidationError as e: raise self.InvalidInputException(e) # Note that an email is only sent when the user registers for the first # time. if feconf.CAN_SEND_EMAILS and not has_ever_registered: email_manager.send_post_signup_email(self.user_id) user_services.generate_initial_profile_picture(self.user_id) if not has_ever_registered: # Set the default dashboard for new users. user_services.update_user_default_dashboard( self.user_id, default_dashboard) self.render_json({ 'bulk_email_signup_message_should_be_shown': (bulk_email_signup_message_should_be_shown) })
def get(self): if self.user_id and user_services.has_fully_registered_account( self.user_id): user_settings = user_services.get_user_settings(self.user_id) default_dashboard = user_settings.default_dashboard if default_dashboard == constants.DASHBOARD_TYPE_CREATOR: self.redirect(feconf.CREATOR_DASHBOARD_URL) else: self.redirect(feconf.LEARNER_DASHBOARD_URL) else: self.render_template('splash-page.mainpage.html')
def get(self): """Handles GET requests.""" return_url = self.request.get('return_url', self.request.uri) # Validating return_url for no external redirections. if re.match('^/[^//]', return_url) is None: return_url = '/' if user_services.has_fully_registered_account(self.user_id): self.redirect(return_url) return self.render_template('oppia-root.mainpage.html')
def get(self): """Handles GET requests.""" return_url = self.normalized_request.get( 'return_url', self.request.uri) # Ruling out the possibility of None for mypy type checking. assert self.user_id is not None # Validating return_url for no external redirections. if re.match('^/[^//]', return_url) is None: return_url = '/' if user_services.has_fully_registered_account(self.user_id): self.redirect(return_url) return self.render_template('oppia-root.mainpage.html')
def __init__(self, request, response): # pylint: disable=super-init-not-called # Set self.request, self.response and self.app. self.initialize(request, response) self.start_time = datetime.datetime.utcnow() # Initializes the return dict for the handlers. self.values = {} # TODO(#13155): Remove the if-else part once all the handlers have had # schema validation implemented. if self.request.get('payload'): self.payload = json.loads(self.request.get('payload')) else: self.payload = None self.iframed = False self.user_id = None self.username = None self.email = None self.partially_logged_in = False self.user_is_scheduled_for_deletion = False self.current_user_is_super_admin = False self.normalized_request = None self.normalized_payload = None try: auth_claims = auth_services.get_auth_claims_from_request(request) except auth_domain.StaleAuthSessionError: auth_services.destroy_auth_session(self.response) self.redirect(user_services.create_login_url(self.request.uri)) return except auth_domain.InvalidAuthSessionError: logging.exception('User session is invalid!') auth_services.destroy_auth_session(self.response) self.redirect(user_services.create_login_url(self.request.uri)) return else: self.current_user_is_super_admin = ( auth_claims is not None and auth_claims.role_is_super_admin) if auth_claims: auth_id = auth_claims.auth_id user_settings = user_services.get_user_settings_by_auth_id(auth_id) if user_settings is None: # If the user settings are not yet created and the request leads # to signup page create a new user settings. Otherwise logout # the not-fully registered user. email = auth_claims.email if 'signup?' in self.request.uri: user_settings = ( user_services.create_new_user(auth_id, email)) else: logging.exception( 'Cannot find user %s with email %s on page %s' % ( auth_id, email, self.request.uri)) auth_services.destroy_auth_session(self.response) return self.email = user_settings.email self.values['user_email'] = user_settings.email self.user_id = user_settings.user_id if user_settings.deleted: self.user_is_scheduled_for_deletion = user_settings.deleted elif (self.REDIRECT_UNFINISHED_SIGNUPS and not user_services.has_fully_registered_account(self.user_id)): self.partially_logged_in = True else: self.username = user_settings.username self.values['username'] = self.username # In order to avoid too many datastore writes, we do not bother # recording a log-in if the current time is sufficiently close # to the last log-in time. if (user_settings.last_logged_in is None or not utils.are_datetimes_close( datetime.datetime.utcnow(), user_settings.last_logged_in)): user_services.record_user_logged_in(self.user_id) self.roles = ( [feconf.ROLE_ID_GUEST] if self.user_id is None else user_settings.roles) self.user = user_services.get_user_actions_info(self.user_id) if not self._is_requested_path_currently_accessible_to_user(): auth_services.destroy_auth_session(self.response) return self.values['is_super_admin'] = self.current_user_is_super_admin
def __init__(self, request, response): # pylint: disable=super-init-not-called # Set self.request, self.response and self.app. self.initialize(request, response) self.start_time = datetime.datetime.utcnow() # Initializes the return dict for the handlers. self.values = {} if self.request.get('payload'): self.payload = json.loads(self.request.get('payload')) else: self.payload = None self.iframed = False auth_claims = auth_services.get_auth_claims_from_request(request) self.current_user_is_super_admin = (auth_claims is not None and auth_claims.role_is_super_admin) if (feconf.ENABLE_MAINTENANCE_MODE and not self.current_user_is_super_admin): return self.user_id = None self.username = None self.partially_logged_in = False self.user_is_scheduled_for_deletion = False if auth_claims: auth_id = auth_claims.auth_id user_settings = user_services.get_user_settings_by_auth_id(auth_id) if user_settings is None: # If the user settings are not yet created and the request leads # to signup page create a new user settings. Otherwise logout # the not-fully registered user. email = auth_claims.email if 'signup?' in self.request.uri: user_settings = (user_services.create_new_user( auth_id, email)) else: logging.error( 'Cannot find user %s with email %s on page %s' % (auth_id, email, self.request.uri)) auth_services.destroy_auth_session(self.response) return self.values['user_email'] = user_settings.email self.user_id = user_settings.user_id if user_settings.deleted: self.user_is_scheduled_for_deletion = user_settings.deleted elif (self.REDIRECT_UNFINISHED_SIGNUPS and not user_services.has_fully_registered_account( self.user_id)): self.partially_logged_in = True else: self.username = user_settings.username self.values['username'] = self.username # In order to avoid too many datastore writes, we do not bother # recording a log-in if the current time is sufficiently close # to the last log-in time. if (user_settings.last_logged_in is None or not utils.are_datetimes_close( datetime.datetime.utcnow(), user_settings.last_logged_in)): user_services.record_user_logged_in(self.user_id) self.role = (feconf.ROLE_ID_GUEST if self.user_id is None else user_settings.role) self.user = user_services.get_user_actions_info(self.user_id) self.values['is_moderator'] = (user_services.is_at_least_moderator( self.user_id)) self.values['is_admin'] = user_services.is_admin(self.user_id) self.values['is_topic_manager'] = (user_services.is_topic_manager( self.user_id)) self.values['is_super_admin'] = self.current_user_is_super_admin
def __init__(self, request, response): # pylint: disable=super-init-not-called # Set self.request, self.response and self.app. self.initialize(request, response) self.start_time = datetime.datetime.utcnow() # Initializes the return dict for the handlers. self.values = {} if self.request.get('payload'): self.payload = json.loads(self.request.get('payload')) else: self.payload = None self.iframed = False self.is_super_admin = ( current_user_services.is_current_user_super_admin()) if feconf.ENABLE_MAINTENANCE_MODE and not self.is_super_admin: return self.gae_id = current_user_services.get_current_gae_id() self.user_id = None self.username = None self.partially_logged_in = False self.user_is_scheduled_for_deletion = False if self.gae_id: user_settings = user_services.get_user_settings_by_gae_id( self.gae_id, strict=False) if user_settings is None: email = current_user_services.get_current_user_email() user_settings = user_services.create_new_user( self.gae_id, email) self.values['user_email'] = user_settings.email self.user_id = user_settings.user_id if user_settings.deleted: self.user_is_scheduled_for_deletion = user_settings.deleted elif (self.REDIRECT_UNFINISHED_SIGNUPS and not user_services.has_fully_registered_account( user_settings.user_id)): self.partially_logged_in = True else: self.username = user_settings.username self.values['username'] = self.username # In order to avoid too many datastore writes, we do not bother # recording a log-in if the current time is sufficiently close # to the last log-in time. if (user_settings.last_logged_in is None or not utils.are_datetimes_close( datetime.datetime.utcnow(), user_settings.last_logged_in)): user_services.record_user_logged_in(self.user_id) self.role = ( feconf.ROLE_ID_GUEST if self.user_id is None else user_settings.role) self.user = user_services.UserActionsInfo(self.user_id) self.values['is_moderator'] = user_services.is_at_least_moderator( self.user_id) self.values['is_admin'] = user_services.is_admin(self.user_id) self.values['is_topic_manager'] = ( user_services.is_topic_manager(self.user_id)) self.values['is_super_admin'] = self.is_super_admin
def __init__(self, request, response): # pylint: disable=super-init-not-called # Set self.request, self.response and self.app. self.initialize(request, response) self.start_time = datetime.datetime.utcnow() # Initializes the return dict for the handlers. self.values = {} # This try-catch block is intended to log cases where getting the # request payload errors with ValueError: Invalid boundary in multipart # form: b''. This is done to gather sufficient data to help debug the # error if it arises in the future. try: payload_json_string = self.request.get('payload') except ValueError as e: logging.error('%s: request %s', e, self.request) raise e # TODO(#13155): Remove the if-else part once all the handlers have had # schema validation implemented. if payload_json_string: self.payload = json.loads(payload_json_string) else: self.payload = None self.iframed = False self.user_id = None self.username = None self.email = None self.partially_logged_in = False self.user_is_scheduled_for_deletion = False self.current_user_is_super_admin = False # Once the attribute `normalized_request` is type annotated here, make # sure to fix all the subclasses using normalized_request.get() method # by removing their type: ignore[union-attr] and using a type cast # instead to eliminate the possibility on union types. # e.g. ClassroomAccessValidationHandler. self.normalized_request = None self.normalized_payload = None try: auth_claims = auth_services.get_auth_claims_from_request(request) except auth_domain.StaleAuthSessionError: auth_services.destroy_auth_session(self.response) self.redirect(user_services.create_login_url(self.request.uri)) return except auth_domain.UserDisabledError: auth_services.destroy_auth_session(self.response) self.redirect('/logout?redirect_url=%s' % feconf.PENDING_ACCOUNT_DELETION_URL) return except auth_domain.InvalidAuthSessionError: logging.exception('User session is invalid!') auth_services.destroy_auth_session(self.response) self.redirect(user_services.create_login_url(self.request.uri)) return else: self.current_user_is_super_admin = ( auth_claims is not None and auth_claims.role_is_super_admin) if auth_claims: auth_id = auth_claims.auth_id user_settings = user_services.get_user_settings_by_auth_id(auth_id) if user_settings is None: # If the user settings are not yet created and the request leads # to signup page create a new user settings. Otherwise logout # the not-fully registered user. email = auth_claims.email if 'signup?' in self.request.uri: user_settings = (user_services.create_new_user( auth_id, email)) else: logging.exception( 'Cannot find user %s with email %s on page %s' % (auth_id, email, self.request.uri)) auth_services.destroy_auth_session(self.response) return self.email = user_settings.email self.values['user_email'] = user_settings.email self.user_id = user_settings.user_id if user_settings.deleted: self.user_is_scheduled_for_deletion = user_settings.deleted elif (self.REDIRECT_UNFINISHED_SIGNUPS and not user_services.has_fully_registered_account( self.user_id)): self.partially_logged_in = True else: self.username = user_settings.username self.values['username'] = self.username # In order to avoid too many datastore writes, we do not bother # recording a log-in if the current time is sufficiently close # to the last log-in time. if (user_settings.last_logged_in is None or not utils.are_datetimes_close( datetime.datetime.utcnow(), user_settings.last_logged_in)): user_services.record_user_logged_in(self.user_id) self.roles = ([feconf.ROLE_ID_GUEST] if self.user_id is None else user_settings.roles) self.user = user_services.get_user_actions_info(self.user_id) if not self._is_requested_path_currently_accessible_to_user(): auth_services.destroy_auth_session(self.response) return self.values['is_super_admin'] = self.current_user_is_super_admin
def test_has_not_fully_registered_for_guest_user_is_false(self): self.assertFalse(user_services.has_fully_registered_account(None))
def __init__(self, request, response): # pylint: disable=super-init-not-called # Set self.request, self.response and self.app. self.initialize(request, response) self.start_time = datetime.datetime.utcnow() # Initializes the return dict for the handlers. self.values = {} if self.request.get('payload'): self.payload = json.loads(self.request.get('payload')) else: self.payload = None self.iframed = False self.is_super_admin = user_services.is_current_user_super_admin() if feconf.ENABLE_MAINTENANCE_MODE and not self.is_super_admin: return self.gae_id = user_services.get_current_gae_id() self.user_id = None self.username = None self.partially_logged_in = False self.user_is_scheduled_for_deletion = False # TODO(#11462): This part should be moved to the service layer when we # migrate to Firebase. if self.gae_id: user_settings = user_services.get_user_settings_by_gae_id( self.gae_id, strict=False) if user_settings is None: # If the user settings are not yet created and the request leads # to signup page create a new user settings. Otherwise logout # the not-fully registered user. email = user_services.get_current_user_email() if 'signup?' in self.request.uri: user_settings = user_services.create_new_user( self.gae_id, email) else: logging.error( 'Cannot find user %s with email %s on page %s' % (self.gae_id, email, self.request.uri)) _clear_login_cookies(self.response.headers) return self.values['user_email'] = user_settings.email self.user_id = user_settings.user_id if user_settings.deleted: self.user_is_scheduled_for_deletion = user_settings.deleted elif (self.REDIRECT_UNFINISHED_SIGNUPS and not user_services.has_fully_registered_account( user_settings.user_id)): self.partially_logged_in = True else: self.username = user_settings.username self.values['username'] = self.username # In order to avoid too many datastore writes, we do not bother # recording a log-in if the current time is sufficiently close # to the last log-in time. if (user_settings.last_logged_in is None or not utils.are_datetimes_close( datetime.datetime.utcnow(), user_settings.last_logged_in)): user_services.record_user_logged_in(self.user_id) self.role = (feconf.ROLE_ID_GUEST if self.user_id is None else user_settings.role) self.user = user_services.UserActionsInfo(self.user_id) self.values['is_moderator'] = user_services.is_at_least_moderator( self.user_id) self.values['is_admin'] = user_services.is_admin(self.user_id) self.values['is_topic_manager'] = (user_services.is_topic_manager( self.user_id)) self.values['is_super_admin'] = self.is_super_admin