Exemple #1
0
def update_all_uniques():
    the_members = get_all_members(order=False)

    logging.info('starting unique cleanup')
    m_list = []
    t_list = []
    for m in the_members:
        ea = m.email_address.lower()
        if ea != m.email_address:
            # found an upper-case email

            # first, make new auth_id and email_addresses Uniques
            newauth = Unique.create('Member.auth_id:%s' % ea)
            if newauth is False:
                logging.error(
                    'Unable to create unique auth_id for email {0}'.format(ea))

            newemail = Unique.create('Member.email_address:%s' % ea)
            if newemail is False:
                logging.error(
                    'Unable to create unique email_address for email {0}'.
                    format(ea))

            if newauth and newemail:
                # delete the old unique values
                logging.info('deleting old tokens for {0}'.format(
                    m.email_address))
                Unique.delete_multi([
                    'Member.auth_id:%s' % m.email_address,
                    'Member.email_address:%s' % m.email_address
                ])
            else:
                logging.error('did not delete old tokens')

            m.email_address = ea
            m.auth_ids = [ea]
            m_list.append(m)
        else:
            # email address is fine, just make sure we have tokens for this guy
            t_list.append('Member.auth_id:%s' % ea)
            t_list.append('Member.email_address:%s' % ea)

    if m_list:
        ndb.put_multi(m_list)

    if t_list:
        Unique.create_multi(t_list)

    logging.info('unique cleanup done')
Exemple #2
0
def read_feed():
    feedparser._HTMLSanitizer.acceptable_elements = []  # cleans up all html tag
    feeds = feedparser.parse(GOODREADS_RSS_URL)

    for feed in feeds.entries:

        clearer_date = datetime.fromtimestamp(mktime(feed.published_parsed))

        uniques = ['Quote.link.%s' % feed.link,
                   'Quote.date.%s' % clearer_date, ]
        # transactionally create the unique quote based on date and link
        # https://webapp-improved.appspot.com/_modules/webapp2_extras/appengine/auth/models.html#Unique
        success, existing = Unique.create_multi(uniques)

        if success:
            quote = Quote()
            quote.date = clearer_date
            parsed_summary = [a for a in feed.summary.splitlines()
                              if a and a != '-']
            quote.text = parsed_summary[0]
            quote.author = parsed_summary[1]
            quote.link = feed.link
            quote.put()
            logging.info(
                'New feed: {}, dated: {} has been inserted into the datastore'
                .format(feed.link, clearer_date)
            )
        else:
            logging.debug('Properties %r are not unique.' % existing)
Exemple #3
0
 def deleteRelationship(self):
     success, existing = Unique.create_multi([
         'AreaUser.uniqueAreaUserString.%s:%s' %
         (self.userKey, self.privateArea)
     ])
     Unique.delete_multi(existing)
     self.key.delete()
Exemple #4
0
    def post(self):
        """ Get fields from POST dict """

        if not self.form.validate():
            return self.get()
        username = self.form.username.data.lower()
        name = self.form.name.data.strip()
        last_name = self.form.last_name.data.strip()
        country = self.form.country.data
        tz = self.form.tz.data

        try:
            user_info = self.user_model.get_by_id(long(self.user_id))

            try:
                message = ''
                # update username if it has changed and it isn't already taken
                if username != user_info.username:
                    user_info.unique_properties = ['username', 'email']
                    uniques = [
                        'User.username:%s' % username,
                        'User.auth_id:own:%s' % username,
                    ]
                    # Create the unique username and auth_id.
                    success, existing = Unique.create_multi(uniques)
                    if success:
                        # free old uniques
                        Unique.delete_multi(
                            ['User.username:%s' % user_info.username, 'User.auth_id:own:%s' % user_info.username])
                        # The unique values were created, so we can save the user.
                        user_info.username = username
                        user_info.auth_ids[0] = 'own:%s' % username
                        message += _('Your new username is <strong>{}</strong>').format(username)

                    else:
                        message += _(
                            'The username <strong>{}</strong> is already taken. Please choose another.').format(
                            username)
                        # At least one of the values is not unique.
                        self.add_message(message, 'error')
                        return self.get()
                user_info.name = name
                user_info.last_name = last_name
                user_info.country = country
                user_info.tz = tz
                user_info.put()
                message += " " + _('Thanks, your settings have been saved.')
                self.add_message(message, 'success')
                return self.get()

            except (AttributeError, KeyError, ValueError), e:
                logging.error('Error updating profile: ' + e)
                message = _('Unable to update profile. Please try again later.')
                self.add_message(message, 'error')
                return self.get()

        except (AttributeError, TypeError), e:
            login_error_message = _('Your session has expired.')
            self.add_message(login_error_message, 'error')
            self.redirect_to('login')
Exemple #5
0
    def set_email_to_pending(self):
        """ Changes the email address for the current user"""

        new_email = self.pending_change_email.lower()
        success = False
        if new_email != '':
            success, existing = \
                Unique.create_multi(['Member.auth_id:%s'%new_email,
                                     'Member.email_address:%s'%new_email])
            if not success:
                logging.error('Unable to create user for email %s because of \
                    duplicate keys' % new_email)
            else:
                # delete the old unique values
                Unique.delete_multi(['Member.auth_id:%s'%self.email_address,
                                     'Member.email_address:%s'%self.email_address])

                self.email_address=new_email
                self.auth_ids=[new_email]
            self.pending_change_email = ''
            self.put()

        if success:
            return new_email
        else:
            return None
Exemple #6
0
    def post(self):
        """
              Get fields from POST dict
        """
        if not self.form.validate():
            return self.get()
        username = self.form.username.data.lower()
        name = self.form.name.data.strip()
        last_name = self.form.last_name.data.strip()
        country = self.form.country.data

        try:
            user_info = models.User.get_by_id(long(self.user_id))
            
            try:
                message=''
                # update username if it has changed and it isn't already taken
                if username != user_info.username:
                    user_info.unique_properties = ['username','email']
                    uniques = [
                               'User.username:%s' % username,
                               'User.auth_id:own:%s' % username,
                               ]
                    # Create the unique username and auth_id.
                    success, existing = Unique.create_multi(uniques)
                    if success:
                        # free old uniques
                        Unique.delete_multi(['User.username:%s' % user_info.username, 'User.auth_id:own:%s' % user_info.username])
                        # The unique values were created, so we can save the user.
                        user_info.username=username
                        user_info.auth_ids[0]='own:%s' % username
                        message+= _('Your new username is ') + username + '.'
                        
                    else:
                        message+= _('Username') + ": " + username + " " + _('is already taken. It is not changed.')
                        # At least one of the values is not unique.
                        # Make a list of the property names that failed.
                        props = [name.split(':', 2)[-1] for name in uniques]
                        raise ValueError(_('Properties %r are not unique.' % props))
                user_info.name=name
                user_info.last_name=last_name
                user_info.country=country
                user_info.put()
                message+= " " + _('Your profile has been updated!')
                self.add_message(message,'success')
                return self.get()

            except (AttributeError, KeyError, ValueError), e:
                message = _('Unable to update profile!')
                logging.error('Unable to update profile: ' + e)
                self.add_message(message,'error')
                return self.get()

        except (AttributeError, TypeError), e:
            login_error_message = _('Sorry you are not logged in!')
            self.add_message(login_error_message,'error')
            self.redirect_to('login')
Exemple #7
0
def update_all_uniques():
    the_members = get_all_members(order=False)

    logging.info('starting unique cleanup')
    m_list=[]
    t_list=[]
    for m in the_members:
        ea = m.email_address.lower()
        if ea != m.email_address:
            # found an upper-case email
        
            # first, make new auth_id and email_addresses Uniques
            newauth = Unique.create('Member.auth_id:%s'%ea)
            if newauth is False:
                logging.error('Unable to create unique auth_id for email {0}'.format(ea))
        
            newemail = Unique.create('Member.email_address:%s'%ea)
            if newemail is False:
                logging.error('Unable to create unique email_address for email {0}'.format(ea))

            if newauth and newemail:            
                # delete the old unique values
                logging.info('deleting old tokens for {0}'.format(m.email_address))
                Unique.delete_multi(['Member.auth_id:%s'%m.email_address,
                                     'Member.email_address:%s'%m.email_address])
            else:
                logging.error('did not delete old tokens')

            m.email_address=ea
            m.auth_ids=[ea]
            m_list.append(m)
        else:
            # email address is fine, just make sure we have tokens for this guy
            t_list.append('Member.auth_id:%s'%ea)
            t_list.append('Member.email_address:%s'%ea)

    if m_list:
        ndb.put_multi(m_list)
        
    if t_list:
        Unique.create_multi(t_list)

    logging.info('unique cleanup done')
Exemple #8
0
 def Create(cls, lastname, firstname, gender, email, raw_password, phone):
   uniques = ['%s.%s:%s' % (cls.__name__, 'auth_id', email)]
   ok, existing = Unique.create_multi(uniques)
   if ok:
     password = security.generate_password_hash(raw_password, method='sha1', length=12, pepper=cls.Pepper)
     user = cls(auth_id=email, email=email, lastname=lastname, firstname=firstname, gender=gender, password=password, phone=phone)
     user.put()
     return user
   else:
     return None
Exemple #9
0
    def post(self, user_id):
        """ Get fields from POST dict """

        user_data = self._data()
        user_info = models.User.get_by_id(long(user_id))

        logging.info(user_data)

        if not user_info:
            raise Exception("User not found with id: " + user_id)

        username = user_data['username']
        try:
            message = ''
            # update username if it has changed and it isn't already taken

            user_info.unique_properties = ['username', 'email']
            uniques = [
                'User.username:%s' % username,
                'User.auth_id:own:%s' % username,
            ]
            # Create the unique username and auth_id.
            success, existing = Unique.create_multi(uniques)

            if not existing and not success:
                raise Exception("Error creating user")

            # free old uniques
            Unique.delete_multi(
                ['User.username:%s' % user_info.username, 'User.auth_id:own:%s' % user_info.username])
            # The unique values were created, so we can save the user.
            user_info.username = username
            user_info.auth_ids[0] = 'own:%s' % username
            user_info.name = user_data.get('name', None)
            user_info.last_name = user_data.get('last_name', None)

            if user_data.get('password', None) is not None:
                # Password to SHA512
                password = utils.hashing(user_data['password'], self.app.config.get('salt'))
                user_info.password = security.generate_password_hash(password, length=12)

            user_info.put()
            return True
        except (AttributeError, KeyError, ValueError), e:
            logging.error('Error updating profile: ')
            logging.exception(e)
            return False
Exemple #10
0
 def Create(cls, lastname, firstname, gender, email, raw_password, phone):
     uniques = ['%s.%s:%s' % (cls.__name__, 'auth_id', email)]
     ok, existing = Unique.create_multi(uniques)
     if ok:
         password = security.generate_password_hash(raw_password,
                                                    method='sha1',
                                                    length=12,
                                                    pepper=cls.Pepper)
         user = cls(auth_id=email,
                    email=email,
                    lastname=lastname,
                    firstname=firstname,
                    gender=gender,
                    password=password,
                    phone=phone)
         user.put()
         return user
     else:
         return None
    def post(self):
        if not self.form.validate():
            self.add_message("There were errors in subbitting the form.",
                             "error")
            return self.get()

        username = self.form.username.data.lower()
        name = self.form.name.data.strip()
        email = self.form.email.data.strip()
        company = self.form.company.data.strip()
        country = self.form.country.data.strip()
        timezone = self.form.timezone.data.strip()

        user_info = User.get_by_id(long(self.user_id))

        try:
            # update username if it has changed and it isn't already taken
            if username != user_info.username:
                user_info.unique_properties = ['username']
                uniques = ['User.username:%s' % username]

                # create the unique username and auth_id
                success, existing = Unique.create_multi(uniques)

                if success:
                    # free old uniques and update user
                    Unique.delete_multi(
                        ['User.username:%s' % user_info.username])
                    user_info.username = username
                    self.add_message(
                        'Your new username is %s.' % format(username),
                        'success')

                else:
                    # username not unique
                    self.add_message(
                        'The username %s is already in use.' %
                        format(username), 'error')
                    return self.get()

            # update email if it has changed and it isn't already taken
            if email != user_info.email:
                user_info.unique_properties = ['email']
                uniques = ['User.email:%s' % email]

                # create the unique username and auth_id
                success, existing = Unique.create_multi(uniques)

                if success:
                    # free old uniques and update user
                    Unique.delete_multi(['User.email:%s' % user_info.email])
                    user_info.email = email
                    self.add_message('Your new email is %s.' % format(email),
                                     'success')

                else:
                    # user's email not unique
                    self.add_message('That email address is already in use.',
                                     'error')
                    return self.get()

            # update database
            user_info.name = name
            user_info.company = company
            user_info.country = country
            user_info.timezone = timezone
            user_info.put()

            self.add_message("Your settings have been saved.", 'success')
            return self.get()

        except (AttributeError, KeyError, ValueError), e:
            logging.error('Error updating profile: ' + e)
            self.add_message(
                'Unable to update profile. Please try again later.', 'error')
            return self.get()
    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')
Exemple #13
0
	def post(self):
		if not self.form.validate():
			self.add_message("There were errors in subbitting the form.", "error")
			return self.get()

		username = self.form.username.data.lower()
		name = self.form.name.data.strip()
		email = self.form.email.data.strip()
		company = self.form.company.data.strip()
		country = self.form.country.data.strip()
		timezone = self.form.timezone.data.strip()

		user_info = User.get_by_id(long(self.user_id))

		try:
			# update username if it has changed and it isn't already taken
			if username != user_info.username:
				user_info.unique_properties = ['username']
				uniques = ['User.username:%s' % username]
				
				# create the unique username and auth_id
				success, existing = Unique.create_multi(uniques)

				if success:
					# free old uniques and update user
					Unique.delete_multi(['User.username:%s' % user_info.username])
					user_info.username = username
					self.add_message('Your new username is %s.' % format(username), 'success')

				else:
					# username not unique
					self.add_message('The username %s is already in use.' % format(username), 'error')
					return self.get()

			# update email if it has changed and it isn't already taken
			if email != user_info.email:
				user_info.unique_properties = ['email']
				uniques = ['User.email:%s' % email]
				
				# create the unique username and auth_id
				success, existing = Unique.create_multi(uniques)

				if success:
					# free old uniques and update user
					Unique.delete_multi(['User.email:%s' % user_info.email])
					user_info.email = email
					self.add_message('Your new email is %s.' % format(email), 'success')

				else:
					# user's email not unique
					self.add_message('That email address is already in use.', 'error')
					return self.get()

			# update database                
			user_info.name = name
			user_info.company = company
			user_info.country = country
			user_info.timezone = timezone
			user_info.put()

			self.add_message("Your settings have been saved.", 'success')
			return self.get()

		except (AttributeError, KeyError, ValueError), e:
			logging.error('Error updating profile: ' + e)
			self.add_message('Unable to update profile. Please try again later.', 'error')
			return self.get()
Exemple #14
0
	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')
Exemple #15
0
    def post(self):
        """ Get fields from POST dict """

        if not self.form.validate():
            return self.get()
        username = self.form.username.data.lower()
        name = self.form.name.data.strip()
        last_name = self.form.last_name.data.strip()
        country = self.form.country.data

        try:
            user_info = models.User.get_by_id(long(self.user_id))

            try:
                message = ''
                # update username if it has changed and it isn't already taken
                if username != user_info.username:
                    user_info.unique_properties = ['username', 'email']
                    uniques = [
                        'User.username:%s' % username,
                        'User.auth_id:own:%s' % username,
                    ]
                    # Create the unique username and auth_id.
                    success, existing = Unique.create_multi(uniques)
                    if success:
                        # free old uniques
                        Unique.delete_multi([
                            'User.username:%s' % user_info.username,
                            'User.auth_id:own:%s' % user_info.username
                        ])
                        # The unique values were created, so we can save the user.
                        user_info.username = username
                        user_info.auth_ids[0] = 'own:%s' % username
                        message += _('Your new username is '
                                     ) + '<strong>' + username + '</strong>.'

                    else:
                        message += _(
                            'Username'
                        ) + " <strong>" + username + "</strong> " + _(
                            'is already taken. It is not changed.')
                        # At least one of the values is not unique.
                        self.add_message(message, 'error')
                        return self.get()
                user_info.name = name
                user_info.last_name = last_name
                user_info.country = country
                user_info.put()
                message += " " + _('Your profile has been updated!')
                self.add_message(message, 'success')
                return self.get()

            except (AttributeError, KeyError, ValueError), e:
                message = _('Unable to update profile!')
                logging.error('Unable to update profile: ' + e)
                self.add_message(message, 'error')
                return self.get()

        except (AttributeError, TypeError), e:
            login_error_message = _('Sorry you are not logged in!')
            self.add_message(login_error_message, 'error')
            self.redirect_to('login')
Exemple #16
0
 def deleteRelationship(self):
     success, existing = Unique.create_multi(['AreaUser.uniqueAreaUserString.%s:%s' % (self.userKey, self.privateArea)])        
     Unique.delete_multi(existing)
     self.key.delete();
     
             
    def post(self):
        """ Get fields from POST dict """

        if not self.form.validate():
            return self.get()
        username = self.form.username.data.lower()
        name = self.form.name.data.strip()
        last_name = self.form.last_name.data.strip()
        country = self.form.country.data.strip()
        bio = self.form.bio.data.strip()
        twitter_widget_id = self.form.twitter_widget_id.data.strip()
        gravatar_url = self.form.gravatar_url.data.strip()
        google_plus_profile = self.form.google_plus_profile.data.strip()
        
        try:
            user_info = models.User.get_by_id(long(self.user_id))

            try:
                message=''
                # update username if it has changed and it isn't already taken
                if username != user_info.username:
                    user_info.unique_properties = ['username','email']
                    uniques = [
                               'User.username:%s' % username,
                               'User.auth_id:own:%s' % username,
                               ]
                    # Create the unique username and auth_id.
                    success, existing = Unique.create_multi(uniques)
                    if success:
                        # free old uniques
                        Unique.delete_multi(['User.username:%s' % user_info.username, 'User.auth_id:own:%s' % user_info.username])
                        # The unique values were created, so we can save the user.
                        user_info.username=username
                        user_info.auth_ids[0]='own:%s' % username
                        message+= _('Your new username is %s' % '<strong>{0:>s}</strong>'.format(username) )

                    else:
                        message+= _('The username %s is already taken. Please choose another.'
                                % '<strong>{0:>s}</strong>'.format(username) )
                        # At least one of the values is not unique.
                        self.add_message(message, 'error')
                        return self.get()
                user_info.name=name
                user_info.last_name=last_name
                user_info.country=country
                user_info.bio=bio
                user_info.twitter_widget_id=twitter_widget_id
                user_info.gravatar_url=gravatar_url
                user_info.google_plus_profile=google_plus_profile
                user_info.put()
                message+= " " + _('Thanks, your settings have been saved.  You may now dance.')
                self.add_message(message, 'success')
                return self.get()

            except (AttributeError, KeyError, ValueError), e:
                logging.error('Error updating profile: ' + e)
                message = _('Unable to update profile. Please try again later.')
                self.add_message(message, 'error')
                return self.get()

        except (AttributeError, TypeError), e:
            login_error_message = _('Sorry you are not logged in.')
            self.add_message(login_error_message, 'error')
            self.redirect_to('login')
Exemple #18
0
    def post(self):
        """ Get fields from POST dict """

        if not self.form.validate():
            return self.get()
        username = self.form.username.data.lower()
        name = self.form.name.data.strip()
        last_name = self.form.last_name.data.strip()
        country = self.form.country.data.strip()
        bio = self.form.bio.data.strip()
        twitter_widget_id = self.form.twitter_widget_id.data.strip()
        gravatar_url = self.form.gravatar_url.data.strip()
        google_plus_profile = self.form.google_plus_profile.data.strip()

        try:
            user_info = models.User.get_by_id(long(self.user_id))

            try:
                message = ''
                # update username if it has changed and it isn't already taken
                if username != user_info.username:
                    user_info.unique_properties = ['username', 'email']
                    uniques = [
                        'User.username:%s' % username,
                        'User.auth_id:own:%s' % username,
                    ]
                    # Create the unique username and auth_id.
                    success, existing = Unique.create_multi(uniques)
                    if success:
                        # free old uniques
                        Unique.delete_multi([
                            'User.username:%s' % user_info.username,
                            'User.auth_id:own:%s' % user_info.username
                        ])
                        # The unique values were created, so we can save the user.
                        user_info.username = username
                        user_info.auth_ids[0] = 'own:%s' % username
                        message += _(
                            'Your new username is %s' %
                            '<strong>{0:>s}</strong>'.format(username))

                    else:
                        message += _(
                            'The username %s is already taken. Please choose another.'
                            % '<strong>{0:>s}</strong>'.format(username))
                        # At least one of the values is not unique.
                        self.add_message(message, 'error')
                        return self.get()
                user_info.name = name
                user_info.last_name = last_name
                user_info.country = country
                user_info.bio = bio
                user_info.twitter_widget_id = twitter_widget_id
                user_info.gravatar_url = gravatar_url
                user_info.google_plus_profile = google_plus_profile
                user_info.put()
                message += " " + _(
                    'Thanks, your settings have been saved.  You may now dance.'
                )
                self.add_message(message, 'success')
                return self.get()

            except (AttributeError, KeyError, ValueError), e:
                logging.error('Error updating profile: ' + e)
                message = _(
                    'Unable to update profile. Please try again later.')
                self.add_message(message, 'error')
                return self.get()

        except (AttributeError, TypeError), e:
            login_error_message = _('Sorry you are not logged in.')
            self.add_message(login_error_message, 'error')
            self.redirect_to('login')
Exemple #19
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')