def get(self):
        # get info from Google login
        current_user = users.get_current_user()

        # handle old and new users
        try:
            uid = current_user.user_id()

            # see if user is in database
            user_info = User.get_by_uid(uid)

            # get the destination URL from the next parameter
            next = self.request.get('next')

            # create association if user doesn't exist
            if user_info is None:
                username = current_user.email().split("@")[0]
                email = current_user.email()

                # create entry in db
                user_info = User(last_login=datetime.now(),
                                 uid=str(uid),
                                 username=username,
                                 email=email,
                                 activated=True)

                # try to create unique username
                while True:
                    user_info.unique_properties = ['username']
                    uniques = ['User.username:%s' % user_info.username]
                    success, existing = Unique.create_multi(uniques)

                    # if we already have that username, create a new one and try again
                    if existing:
                        user_info.username = "******" % (username,
                                                       random.randrange(100))
                    else:
                        break

                # write out the user
                user_info.put()

                # wait a few seconds for database server to update
                time.sleep(1)
                log_message = "new user registered"

                # slack the new user signup
                if config.debug:
                    in_dev = " (in development)"
                else:
                    in_dev = ""

                slack_data = {
                    'text':
                    "Woot! New user %s just signed up%s!" %
                    (user_info.username, in_dev),
                    'username':
                    "******",
                    'icon_emoji':
                    ":cloud:"
                }
                h = httplib2.Http()
                resp, content = h.request(
                    config.slack_webhook,
                    'POST',
                    json.dumps(slack_data),
                    headers={'Content-Type': 'application/json'})

            else:
                # existing user logging in - force a2fa check before continuing
                now_minus_an_hour = datetime.now() + timedelta(
                    0, -config.session_age)

                if user_info.tfenabled and (user_info.last_login <
                                            now_minus_an_hour):
                    return self.redirect_to('login-tfa', next=next)
                else:
                    # two factor is disabled, or already complete
                    user_info.last_login = datetime.now()
                    user_info.put()
                    log_message = "user login"

            # set the user's session
            self.auth.set_session(self.auth.store.user_to_dict(user_info),
                                  remember=True)

            # log visit
            log = LogVisit(user=user_info.key,
                           message=log_message,
                           uastring=self.request.user_agent,
                           ip=self.request.remote_addr)
            log.put()
            message = "You have successfully logged in!"
            self.add_message(message, 'success')

            # take user to whatever page was originally requested, or status if none
            if next:
                return self.redirect(str(next))
            else:
                return self.redirect_to('account-status')

        except Exception as ex:
            message = "No user authentication information received from Google: %s" % ex
            self.add_message(message, 'error')
            return self.redirect_to('home')
Beispiel #2
0
    def get(self, npid=None):
        # get our request code back from the social login handler above
        code = self.request.get('code')

        # fire up the github auth object
        scope = 'user:email'
        github_helper = github.GithubAuth(scope)

        # retrieve the access token using the code and auth
        try:
            access_token = github_helper.get_access_token(code)
            user_data = github.get_user_info(access_token)
        except:
            message = 'Error while tokening with Github.'
            self.add_message(message, 'error')
            return self.redirect_to('index')

        # see if user is in database
        uid = str(user_data['id'])  # github id
        user_info = User.get_by_uid(uid)

        # less than ideal way to handle excessive 2FA requests
        #if not user_info.activated:
        #	self.add_message("This account has been deactivated due to excessive 2FA requests. Please contact us to resolve.", "error")
        #	return self.redirect_to('about')

        # never seen them, so create user
        if not user_info:
            name = user_data['name']
            username = user_data['login']
            email = user_data['email']
            location = user_data['location']
            company = user_data['company']

            # create entry in db
            user_info = User(last_login=datetime.now(),
                             uid=str(uid),
                             username=username,
                             name=name,
                             company=company,
                             location=location,
                             email=email,
                             activated=True)

            # try to create unique username
            while True:
                user_info.unique_properties = ['username']
                uniques = ['User.username:%s' % user_info.username]
                success, existing = Unique.create_multi(uniques)

                # if we already have that username, create a new one and try again
                if existing:
                    user_info.username = "******" % (username,
                                                   random.randrange(100))
                else:
                    break

            # write out the user
            user_info.put()

            # wait a few seconds for database server to update
            if config.isdev:
                time.sleep(1)  # seriously?

            # send to marketo if we have email
            # if len(email) > 3:
            try:
                email_test = len(email)

            except Exception as ex:
                slack.slack_message(
                    "New user's email appears to be empty: %s." % ex)
                email_test = 0

            if email_test > 3 and not config.isdev:
                try:
                    mc = MarketoClient(config.munchkin_id, config.mclient_id,
                                       config.mclient_secret)
                    try:
                        first = name.split()[0]
                    except:
                        first = ""

                    try:
                        last = name.split()[1]
                    except:
                        last = ""

                    leads = [{
                        "email": email,
                        "firstName": first,
                        "lastName": last,
                        "company": company,
                        "leadSource": config.mclient_leadSource
                    }]
                    lead = mc.execute(
                        method='push_lead',
                        leads=leads,
                        lookupField='email',
                        programName=config.mclient_programName,
                        programStatus=config.mclient_programStatus)
                except Exception as ex:
                    slack.slack_message(
                        "Marketo lead create failed because %s." % ex)

            # slack the new user signup
            slack.slack_message("New user signed up: %s|%s|%s|%s|%s" %
                                (name, username, email, location, company))

        # check out 2FA status
        now_minus_age = datetime.now() + timedelta(0, -config.session_age)

        # load the next destination, if any
        if npid:
            np_info = NextPages.get_by_npid(npid)
            next_page = np_info.url
            print next_page
        else:
            next_page = ""

        # check if 2FA is on
        if user_info.tfenabled and (user_info.last_login < now_minus_age):
            return self.redirect_to('login-tfa',
                                    next=next_page,
                                    uid=user_info.uid)
        else:
            # two factor is disabled, or already complete
            user_info.last_login = datetime.now()
            user_info.put()

        # log the user in
        self.auth.set_session(self.auth.store.user_to_dict(user_info),
                              remember=True)

        # log visit
        log_message = "user logged in"
        log = LogVisit(user=user_info.key,
                       message=log_message,
                       uastring=self.request.user_agent,
                       ip=self.request.remote_addr)
        log.put()
        message = "You have successfully logged in!"

        self.add_message(message, 'success')

        # remove the next page
        if np_info:
            np_info.key.delete()

        # get the destination URL from the next cookie
        if next_page > "":
            return self.redirect(str(next_page))
        else:
            return self.redirect_to('account-dashboard')

        try:
            pass
        except Exception as ex:
            message = "User login went wrong: %s" % ex
            self.add_message(message, 'error')
            return self.redirect_to('index')