Пример #1
0
    def get(self):
        oauth_token = self.request.get('oauth_token')
        oauth_verifier = self.request.get('oauth_verifier')
        twitter_helper = twitter.TwitterAuth(self)
        user_data = twitter_helper.auth_complete(oauth_token, oauth_verifier)
        if self.user:
            # new association with twitter
            user_info = models.User.get_by_id(long(self.user_id))
            if models.SocialUser.check_unique(user_info.key, 'twitter',
                                              str(user_data['id'])):
                social_user = models.SocialUser(user=user_info.key,
                                                provider='twitter',
                                                uid=str(user_data['id']),
                                                extra_data=user_data)
                social_user.put()

                message = _('Twitter association added!')
                self.add_message(message, 'success')
            else:
                message = _('This Twitter account is already in use!')
                self.add_message(message, 'error')
            self.redirect_to('edit-profile')
        else:
            # login with twitter
            social_user = models.SocialUser.get_by_provider_and_uid(
                'twitter', str(user_data['id']))
            if social_user:
                # Social user is exist. Need authenticate related site account
                user = social_user.user.get()
                self.auth.set_session(self.auth.store.user_to_dict(user),
                                      remember=True)
                visitLog = models.VisitLog(user=user.key,
                                           uastring=self.request.user_agent,
                                           ip=self.request.remote_addr,
                                           timestamp=utils.get_date_time())
                visitLog.put()
                self.redirect_to('secure')
            else:
                # Social user is not exist. Need show login and registration forms
                twitter_helper.save_association_data(user_data)
                message = _(
                    'Account with association to your Twitter does not exist. You can associate it right now, if you login with existing site account or create new on Sign up page.'
                )
                self.add_message(message, 'info')
                self.redirect_to('login')
        """
Пример #2
0
 def get(self, provider_name):
     provider_display_name = models.SocialUser.PROVIDERS_INFO[
         provider_name]['label']
     if not config.enable_federated_login:
         message = _('Federated login is disabled.')
         self.add_message(message, 'warning')
         return self.redirect_to('login')
     callback_url = "%s/social_login/%s/complete" % (self.request.host_url,
                                                     provider_name)
     if provider_name == "twitter":
         twitter_helper = twitter.TwitterAuth(self,
                                              redirect_uri=callback_url)
         self.redirect(twitter_helper.auth_url())
     else:
         message = _('%s authentication is not implemented yet.'
                     ) % provider_display_name
         self.add_message(message, 'warning')
         self.redirect_to('edit-profile')
Пример #3
0
    def post(self):
        """
        username: Get the username from POST dict
        password: Get the password from POST dict
        """

        if not self.form.validate():
            return self.get()
        username = self.form.username.data.lower()

        try:
            if utils.is_email_valid(username):
                user = models.User.get_by_email(username)
                if user:
                    auth_id = user.auth_ids[0]
                else:
                    raise InvalidAuthIdError
            else:
                auth_id = "own:%s" % username
                user = models.User.get_by_auth_id(auth_id)

            password = self.form.password.data.strip()
            remember_me = True if str(
                self.request.POST.get('remember_me')) == 'on' else False

            # Password to SHA512
            password = utils.encrypt(password, config.salt)

            # Try to login user with password
            # Raises InvalidAuthIdError if user is not found
            # Raises InvalidPasswordError if provided password
            # doesn't match with specified user
            self.auth.get_user_by_password(auth_id,
                                           password,
                                           remember=remember_me)

            # if user account is not activated, logout and redirect to home
            if (user.activated == False):
                # logout
                self.auth.unset_session()

                # redirect to home with error message
                resend_email_uri = self.uri_for('resend-account-activation',
                                                encoded_email=utils.encode(
                                                    user.email))
                message = _('Sorry, your account') + ' <strong>{0:>s}</strong>'.format(username) + " " +\
                          _('has not been activated. Please check your email to activate your account') + ". " +\
                          _('Or click') + " <a href='"+resend_email_uri+"'>" + _('this') + "</a> " + _('to resend the email')
                self.add_message(message, 'error')
                return self.redirect_to('home')

            # check twitter association in session
            twitter_helper = twitter.TwitterAuth(self)
            twitter_association_data = twitter_helper.get_association_data()
            if twitter_association_data is not None:
                if models.SocialUser.check_unique(
                        user.key, 'twitter',
                        str(twitter_association_data['id'])):
                    social_user = models.SocialUser(
                        user=user.key,
                        provider='twitter',
                        uid=str(twitter_association_data['id']),
                        extra_data=twitter_association_data)
                    social_user.put()

            logVisit = models.LogVisit(user=user.key,
                                       uastring=self.request.user_agent,
                                       ip=self.request.remote_addr,
                                       timestamp=utils.get_date_time())
            logVisit.put()
            self.redirect_to('home')
        except (InvalidAuthIdError, InvalidPasswordError), e:
            # Returns error message to self.response.write in
            # the BaseHandler.dispatcher
            message = _("Login invalid, Try again.") + "<br/>" + _("Don't have an account?") + \
                    '  <a href="' + self.uri_for('register') + '">' + _("Sign Up") + '</a>'
            self.add_message(message, 'error')
            return self.redirect_to('login')
Пример #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()
        email = self.form.email.data.lower()
        password = self.form.password.data.strip()
        country = self.form.country.data

        # Password to SHA512
        password = utils.encrypt(password, config.salt)

        # Passing password_raw=password so password will be hashed
        # Returns a tuple, where first value is BOOL.
        # If True ok, If False no new user is created
        unique_properties = ['username', 'email']
        auth_id = "own:%s" % username
        user = self.auth.store.user_model.create_user(auth_id,
                                                      unique_properties,
                                                      password_raw=password,
                                                      username=username,
                                                      name=name,
                                                      last_name=last_name,
                                                      email=email,
                                                      country=country,
                                                      activated=False)

        if not user[0]:  #user is a tuple
            message = _('Sorry, This user') + ' <strong>{0:>s}</strong>'.format(username) + " " +\
                      _('is already registered.')
            self.add_message(message, 'error')
            return self.redirect_to('register')
        else:
            # User registered successfully
            # But if the user registered using the form, the user has to check their email to activate the account ???
            try:
                user_info = models.User.get_by_email(email)
                if (user_info.activated == False):
                    # send email
                    subject = config.app_name + " Account Verification Email"
                    encoded_email = utils.encode(email)
                    confirmation_url = self.uri_for(
                        "account-activation",
                        encoded_email=encoded_email,
                        _full=True)

                    # load email's template
                    template_val = {
                        "app_name": config.app_name,
                        "username": username,
                        "confirmation_url": confirmation_url,
                        "support_url": self.uri_for("contact", _full=True)
                    }
                    body_path = "emails/account_activation.txt"
                    body = self.jinja2.render_template(body_path,
                                                       **template_val)

                    email_url = self.uri_for('taskqueue-send-email')
                    taskqueue.add(url=email_url,
                                  params={
                                      'to': str(email),
                                      'subject': subject,
                                      'body': body,
                                  })

                    message = _('Congratulations') + ", " + str(username) + "! " + _('You are now registered') +\
                              ". " + _('Please check your email to activate your account')
                    self.add_message(message, 'success')
                    return self.redirect_to('home')

                # If the user didn't register using registration form ???
                db_user = self.auth.get_user_by_password(
                    user[1].auth_ids[0], password)
                # Check twitter association in session
                twitter_helper = twitter.TwitterAuth(self)
                twitter_association_data = twitter_helper.get_association_data(
                )
                if twitter_association_data is not None:
                    if models.SocialUser.check_unique(
                            user[1].key, 'twitter',
                            str(twitter_association_data['id'])):
                        social_user = models.SocialUser(
                            user=user[1].key,
                            provider='twitter',
                            uid=str(twitter_association_data['id']),
                            extra_data=twitter_association_data)
                        social_user.put()
                message = _('Welcome') + " " + str(username) + ", " + _(
                    'you are now logged in.')
                self.add_message(message, 'success')
                return self.redirect_to('home')
            except (AttributeError, KeyError), e:
                message = _('Unexpected error creating '\
                            'user') + " " + '{0:>s}.'.format(username)
                self.add_message(message, 'error')
                self.abort(403)
Пример #5
0
    def get(self, provider_name):
        if not config.enable_federated_login:
            message = _('Federated login is disabled.')
            self.add_message(message, 'warning')
            return self.redirect_to('login')
        if provider_name == "twitter":
            oauth_token = self.request.get('oauth_token')
            oauth_verifier = self.request.get('oauth_verifier')
            twitter_helper = twitter.TwitterAuth(self)
            user_data = twitter_helper.auth_complete(oauth_token,
                                                     oauth_verifier)
            if self.user:
                # new association with twitter
                user_info = models.User.get_by_id(long(self.user_id))
                if models.SocialUser.check_unique(user_info.key, 'twitter',
                                                  str(user_data['id'])):
                    social_user = models.SocialUser(user=user_info.key,
                                                    provider='twitter',
                                                    uid=str(user_data['id']),
                                                    extra_data=user_data)
                    social_user.put()

                    message = _('Twitter association added!')
                    self.add_message(message, 'success')
                else:
                    message = _('This Twitter account is already in use!')
                    self.add_message(message, 'error')
                self.redirect_to('edit-profile')
            else:
                # login with twitter
                social_user = models.SocialUser.get_by_provider_and_uid(
                    'twitter', str(user_data['id']))
                if social_user:
                    # Social user exists. Need authenticate related site account
                    user = social_user.user.get()
                    self.auth.set_session(self.auth.store.user_to_dict(user),
                                          remember=True)
                    logVisit = models.LogVisit(
                        user=user.key,
                        uastring=self.request.user_agent,
                        ip=self.request.remote_addr,
                        timestamp=utils.get_date_time())
                    logVisit.put()
                    self.redirect_to('home')
                else:
                    # Social user does not exists. Need show login and registration forms
                    twitter_helper.save_association_data(user_data)
                    message = _(
                        'Account with association to your Twitter does not exist. You can associate it right now, if you login with existing site account or create new on Sign up page.'
                    )
                    self.add_message(message, 'info')
                    self.redirect_to('login')
            # Debug Callback information provided


#            for k,v in user_data.items():
#                print(k +":"+  v )
# google, myopenid, yahoo OpenID Providers
        elif provider_name in models.SocialUser.open_id_providers():
            provider_display_name = models.SocialUser.PROVIDERS_INFO[
                provider_name]['label']
            # get info passed from OpenId Provider
            from google.appengine.api import users
            current_user = users.get_current_user()
            if current_user:
                if current_user.federated_identity():
                    uid = current_user.federated_identity()
                else:
                    uid = current_user.user_id()
                email = current_user.email()
            else:
                message = _(
                    'No user authentication information received from %s.  Please ensure you are logging in from an authorized OpenID Provider (OP).'
                    % provider_display_name)
                self.add_message(message, 'error')
                return self.redirect_to('login')
            if self.user:
                # add social account to user
                user_info = models.User.get_by_id(long(self.user_id))
                if models.SocialUser.check_unique(user_info.key, provider_name,
                                                  uid):
                    social_user = models.SocialUser(user=user_info.key,
                                                    provider=provider_name,
                                                    uid=uid)
                    social_user.put()

                    message = provider_display_name + _(' association added!')
                    self.add_message(message, 'success')
                else:
                    message = _('This %s account is already in use!' %
                                provider_display_name)
                    self.add_message(message, 'error')
                self.redirect_to('edit-profile')
            else:
                # login with OpenId Provider
                social_user = models.SocialUser.get_by_provider_and_uid(
                    provider_name, uid)
                if social_user:
                    # Social user found. Authenticate the user
                    user = social_user.user.get()
                    self.auth.set_session(self.auth.store.user_to_dict(user),
                                          remember=True)
                    logVisit = models.LogVisit(
                        user=user.key,
                        uastring=self.request.user_agent,
                        ip=self.request.remote_addr,
                        timestamp=utils.get_date_time())
                    logVisit.put()
                    self.redirect_to('home')
                else:
                    # Social user does not exist yet so create it with the federated identity provided (uid)
                    # and create prerequisite user and log the user account in
                    if models.SocialUser.check_unique_uid(provider_name, uid):
                        # create user
                        # Returns a tuple, where first value is BOOL.
                        # If True ok, If False no new user is created
                        # Assume provider has already verified email address
                        # if email is provided so set activated to True
                        auth_id = "%s:%s" % (provider_name, uid)
                        if email:
                            unique_properties = ['email']
                            user_info = self.auth.store.user_model.create_user(
                                auth_id,
                                unique_properties,
                                email=email,
                                activated=True)
                        else:
                            user_info = self.auth.store.user_model.create_user(
                                auth_id, activated=True)
                        if not user_info[0]:  #user is a tuple
                            message = _('This %s account is already in use!' %
                                        provider_display_name)
                            self.add_message(message, 'error')
                            return self.redirect_to('register')

                        user = user_info[1]

                        # create social user and associate with user
                        social_user = models.SocialUser(user=user.key,
                                                        provider=provider_name,
                                                        uid=uid)
                        social_user.put()
                        # authenticate user
                        self.auth.set_session(
                            self.auth.store.user_to_dict(user), remember=True)
                        logVisit = models.LogVisit(
                            user=user.key,
                            uastring=self.request.user_agent,
                            ip=self.request.remote_addr,
                            timestamp=utils.get_date_time())
                        logVisit.put()
                        self.redirect_to('home')

                        message = provider_display_name + _(
                            ' association added!')
                        self.add_message(message, 'success')
                        self.redirect_to('home')
                    else:
                        message = _('This %s account is already in use!' %
                                    provider_display_name)
                        self.add_message(message, 'error')
                    self.redirect_to('login')
        else:
            message = _('%s authentication is not implemented yet.'
                        ) % provider_display_name
            self.add_message(message, 'warning')
            self.redirect_to('login')
Пример #6
0
 def get(self):
     callback_url = "%s/login/twitter/complete" % self.request.host_url
     twitter_helper = twitter.TwitterAuth(self, redirect_uri=callback_url)
     self.redirect(twitter_helper.auth_url())