Exemple #1
0
    def get_user_data(self):
        from models import UserData

        user_id = None
        email = None

        if self.uses_google():
            user_id, email = get_google_user_id_and_email_from_oauth_map(self)
        elif self.uses_facebook():
            user_id = get_facebook_user_id_from_oauth_map(self)
            email = user_id

        user_data = UserData.get_from_user_id(user_id) or \
                    UserData.get_from_db_key_email(email) or \
                    UserData.insert_for(user_id, email)

        return user_data
Exemple #2
0
    def get_user_data(self):
        from models import UserData

        user_id = None
        email = None

        if self.uses_google():
            user_id, email = get_google_user_id_and_email_from_oauth_map(self)
        elif self.uses_facebook():
            user_id = get_facebook_user_id_from_oauth_map(self)
            email = user_id

        user_data = UserData.get_from_user_id(user_id) or \
                    UserData.get_from_db_key_email(email) or \
                    UserData.insert_for(user_id, email)

        return user_data
Exemple #3
0
    def award_author_badges(self, entity):

        user_data_author = UserData.get_from_db_key_email(entity.author.email())

        if not user_data_author:
            return

        possible_badges = badges_with_context_type(BadgeContextType.FEEDBACK)

        awarded = False
        for badge in possible_badges:
            if not badge.is_already_owned_by(user_data=user_data_author, feedback=entity):
                if badge.is_satisfied_by(user_data=user_data_author, feedback=entity):
                    badge.award_to(user_data=user_data_author, feedback=entity)
                    awarded = True

        if awarded:
            user_data_author.put()
Exemple #4
0
    def award_author_badges(self, entity):

        user_data_author = UserData.get_from_db_key_email(
            entity.author.email())

        if not user_data_author:
            return

        possible_badges = badges_with_context_type(BadgeContextType.FEEDBACK)

        awarded = False
        for badge in possible_badges:
            if not badge.is_already_owned_by(user_data=user_data_author,
                                             feedback=entity):
                if badge.is_satisfied_by(user_data=user_data_author,
                                         feedback=entity):
                    badge.award_to(user_data=user_data_author, feedback=entity)
                    awarded = True

        if awarded:
            user_data_author.put()
Exemple #5
0
    def get(self):
        cont = self.request_continue_url()

        self._consume_auth_token()

        user_data = UserData.current(create_if_none=True)
        if not user_data:
            # Nobody is logged in - clear any expired Facebook cookies
            # that may be hanging around.
            facebook_util.delete_fb_cookies(self)

            logging.critical(("Missing UserData during PostLogin, " +
                              "with id: %s, cookies: (%s), google user: %s") %
                             (util.get_current_user_id_unsafe(),
                              os.environ.get('HTTP_COOKIE', ''),
                              users.get_current_user()))
            self._finish_and_redirect(cont)
            return

        first_time = not user_data.last_login

        if not user_data.has_sendable_email():

            if not user_data.is_facebook_user:
                # TODO(benkomalo): seems like there are some phantoms hitting
                # this code path at least - are there any others?
                logging.error(
                    "Non-FB users should have a valid email. User: [%s]" %
                    user_data)

            # Facebook can give us the user's e-mail if the user granted
            # us permission to see it - try to update existing users with
            # emails, if we don't already have one for them.
            fb_email = facebook_util.get_fb_email_from_cookies()
            if fb_email:
                # We have to be careful - we haven't always asked for emails
                # from facebook users, so getting an e-mail after the fact
                # may result in a collision with an existing Google or Khan
                # account. In those cases, we silently drop the e-mail.
                existing_user = \
                    user_models.UserData.get_from_user_input_email(fb_email)

                if (existing_user and
                        existing_user.user_id != user_data.user_id):
                    logging.warning("FB user gave us e-mail and it "
                                    "corresponds to an existing account. "
                                    "Ignoring e-mail value.")
                else:
                    user_data.user_email = fb_email

        # If the user has a public profile, we stop "syncing" their username
        # from Facebook, as they now have an opportunity to set it themself
        if not user_data.username:
            user_data.update_nickname()

        # Set developer and moderator to True if user is admin
        if ((not user_data.developer or not user_data.moderator) and
                users.is_current_user_admin()):
            user_data.developer = True
            user_data.moderator = True

        user_data.last_login = datetime.datetime.utcnow()
        user_data.put()

        complete_signup = self.request_bool("completesignup", default=False)
        if first_time:
            email_now_verified = None
            if user_data.has_sendable_email():
                email_now_verified = user_data.email

                # Look for a matching UnverifiedUser with the same e-mail
                # to see if the user used Google login to verify.
                unverified_user = user_models.UnverifiedUser.get_for_value(
                        email_now_verified)
                if unverified_user:
                    unverified_user.delete()

            # Note that we can only migrate phantom users right now if this
            # login is not going to lead to a "/completesignup" page, which
            # indicates the user has to finish more information in the
            # signup phase.
            if not complete_signup:
                # If user is brand new and has 0 points, migrate data.
                phantom_id = get_phantom_user_id_from_cookies()
                if phantom_id:
                    phantom_data = UserData.get_from_db_key_email(phantom_id)
                    if _upgrade_phantom_into(phantom_data, user_data):
                        cont = "/newaccount?continue=%s" % cont
        if complete_signup:
            cont = "/completesignup"

        self._finish_and_redirect(cont)
Exemple #6
0
def retrieve_identity(query):
    from models import UserData
    user_data = UserData.get_from_db_key_email(query)
    return user_data.gae_bingo_identity if user_data else None
Exemple #7
0
def retrieve_identity(query):
    from models import UserData
    user_data = UserData.get_from_db_key_email(query)
    return user_data.gae_bingo_identity if user_data else None
Exemple #8
0
    def get(self):
        cont = self.request_string('continue', default = "/")

        # Immediately after login we make sure this user has a UserData entity
        user_data = UserData.current()
        if user_data:

            # Update email address if it has changed
            current_google_user = users.get_current_user()
            if current_google_user and current_google_user.email() != user_data.email:
                user_data.user_email = current_google_user.email()
                user_data.put()

            # Update nickname if it has changed
            current_nickname = get_nickname_for(user_data)
            if user_data.user_nickname != current_nickname:
                user_data.user_nickname = current_nickname
                user_data.put()

            # Set developer and moderator to True if user is admin
            if (not user_data.developer or not user_data.moderator) and users.is_current_user_admin():
                user_data.developer = True
                user_data.moderator = True
                user_data.put()

            # If user is brand new and has 0 points, migrate data
            phantom_id = get_phantom_user_id_from_cookies()
            if phantom_id:
                phantom_data = UserData.get_from_db_key_email(phantom_id)

                # First make sure user has 0 points and phantom user has some activity
                if user_data.points == 0 and phantom_data and phantom_data.points > 0:

                    # Make sure user has no students
                    if not user_data.has_students():

                        # Clear all "login" notifications
                        UserNotifier.clear_all(phantom_data)

                        # Update phantom user_data to real user_data
                        phantom_data.user_id = user_data.user_id
                        phantom_data.current_user = user_data.current_user
                        phantom_data.user_email = user_data.user_email
                        phantom_data.user_nickname = user_data.user_nickname

                        if phantom_data.put():
                            # Phantom user was just transitioned to real user
                            user_counter.add(1)
                            user_data.delete()

                        cont = "/newaccount?continue=%s" % cont
        else:

            # If nobody is logged in, clear any expired Facebook cookie that may be hanging around.
            self.delete_cookie("fbsr_" + App.facebook_app_id)
            self.delete_cookie("fbs_" + App.facebook_app_id)

            logging.critical("Missing UserData during PostLogin, with id: %s, cookies: (%s), google user: %s" % (
                    util.get_current_user_id(), os.environ.get('HTTP_COOKIE', ''), users.get_current_user()
                )
            )

        # Always delete phantom user cookies on login
        self.delete_cookie('ureg_id')

        self.redirect(cont)
Exemple #9
0
    def get(self):
        cont = self.request_continue_url()

        self._consume_auth_token()

        user_data = UserData.current(create_if_none=True)
        if not user_data:
            # Nobody is logged in - clear any expired Facebook cookies
            # that may be hanging around.
            facebook_util.delete_fb_cookies(self)

            logging.critical(
                ("Missing UserData during PostLogin, " +
                 "with id: %s, cookies: (%s), google user: %s") %
                (util.get_current_user_id_unsafe(),
                 os.environ.get('HTTP_COOKIE', ''), users.get_current_user()))
            self._finish_and_redirect(cont)
            return

        first_time = not user_data.last_login

        if not user_data.has_sendable_email():

            if not user_data.is_facebook_user:
                # TODO(benkomalo): seems like there are some phantoms hitting
                # this code path at least - are there any others?
                logging.error(
                    "Non-FB users should have a valid email. User: [%s]" %
                    user_data)

            # Facebook can give us the user's e-mail if the user granted
            # us permission to see it - try to update existing users with
            # emails, if we don't already have one for them.
            fb_email = facebook_util.get_fb_email_from_cookies()
            if fb_email:
                # We have to be careful - we haven't always asked for emails
                # from facebook users, so getting an e-mail after the fact
                # may result in a collision with an existing Google or Khan
                # account. In those cases, we silently drop the e-mail.
                existing_user = \
                    user_models.UserData.get_from_user_input_email(fb_email)

                if (existing_user
                        and existing_user.user_id != user_data.user_id):
                    logging.warning("FB user gave us e-mail and it "
                                    "corresponds to an existing account. "
                                    "Ignoring e-mail value.")
                else:
                    user_data.user_email = fb_email

        # If the user has a public profile, we stop "syncing" their username
        # from Facebook, as they now have an opportunity to set it themself
        if not user_data.username:
            user_data.update_nickname()

        # Set developer and moderator to True if user is admin
        if ((not user_data.developer or not user_data.moderator)
                and users.is_current_user_admin()):
            user_data.developer = True
            user_data.moderator = True

        user_data.last_login = datetime.datetime.utcnow()
        user_data.put()

        complete_signup = self.request_bool("completesignup", default=False)
        if first_time:
            email_now_verified = None
            if user_data.has_sendable_email():
                email_now_verified = user_data.email

                # Look for a matching UnverifiedUser with the same e-mail
                # to see if the user used Google login to verify.
                unverified_user = user_models.UnverifiedUser.get_for_value(
                    email_now_verified)
                if unverified_user:
                    unverified_user.delete()

            # Note that we can only migrate phantom users right now if this
            # login is not going to lead to a "/completesignup" page, which
            # indicates the user has to finish more information in the
            # signup phase.
            if not complete_signup:
                # If user is brand new and has 0 points, migrate data.
                phantom_id = get_phantom_user_id_from_cookies()
                if phantom_id:
                    phantom_data = UserData.get_from_db_key_email(phantom_id)
                    if _upgrade_phantom_into(phantom_data, user_data):
                        cont = "/newaccount?continue=%s" % cont
        if complete_signup:
            cont = "/completesignup"

        self._finish_and_redirect(cont)