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')
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')