Exemplo n.º 1
0
    def _register_user(self):
        """Actually register new user in the system based on context values."""
        context = self.request.context
        email = self._email_from_context(context)

        try:
            user = pyramid_basemodel.Session.query(User).filter(User.email == email).one()
            # If we are here that means that in the DB exists user with the same email but without the provider
            # then we connect social account to this user
            if not self.set_provider(
                user, context.provider_name, context.profile['accounts'][0]['userid']
            ):
                # authenticating user with different social account than assigned,
                # recogniced by same email address used
                logger.debug('''Authenticated {user.id} connected to
                             {context.provider_name} id {connected_id},
                             with {userid}'''.format(
                    user=user,
                    context=context,
                    connected_id=user.provider_id(context.provider_name),
                    userid=context.profile['accounts'][0]['userid']))
            pyramid_basemodel.Session.flush()
        except NoResultFound:
            length_min = self.config.register.password.length_min
            user = User(
                email=email,
                password=tools.password_generator(length_min),
                address_ip=self.request.remote_addr
            )
            self.request.registry.notify(BeforeSocialRegister(self.request, user, context.profile))
            self.set_provider(user, context.provider_name, context.profile['accounts'][0]['userid'])
            pyramid_basemodel.Session.add(user)
            pyramid_basemodel.Session.flush()
            user.is_active = True
        return user
Exemplo n.º 2
0
    def _register_user(self):
        """Actually register new user in the system based on context values."""
        context = self.request.context
        email = self._email_from_context(context)

        try:
            user = pyramid_basemodel.Session.query(User).filter(
                User.email == email).one()
            # If we are here that means that in the DB exists user with the same email but without the provider
            # then we connect social account to this user
            if not self.set_provider(user, context.provider_name,
                                     context.profile['accounts'][0]['userid']):
                # authenticating user with different social account than assigned,
                # recogniced by same email address used
                logger.debug('''Authenticated {user.id} connected to
                             {context.provider_name} id {connected_id},
                             with {userid}'''.format(
                    user=user,
                    context=context,
                    connected_id=user.provider_id(context.provider_name),
                    userid=context.profile['accounts'][0]['userid']))
            pyramid_basemodel.Session.flush()
        except NoResultFound:
            length_min = self.config.register.password.length_min
            user = User(email=email,
                        password=tools.password_generator(length_min),
                        address_ip=self.request.remote_addr)
            self.request.registry.notify(
                BeforeSocialRegister(self.request, user, context.profile))
            self.set_provider(user, context.provider_name,
                              context.profile['accounts'][0]['userid'])
            pyramid_basemodel.Session.add(user)
            pyramid_basemodel.Session.flush()
            user.is_active = True
        return user
Exemplo n.º 3
0
    def _fillin_user(self, response, user):
        """
        Fill new user object in, with sent data.

        :param dict response: response to return from register view
        :param pyramid_fullauth.models.User user: new user object

        :returns: response
        :rtype: dict
        """
        email = self.request.POST.get('email', text_type(''))
        # here if e-mail is already in database

        if pyramid_basemodel.Session.query(User).filter(
                User.email == email).count() != 0:
            response['errors']['email'] = self.request._(
                'User with given e-mail already exists!',
                domain='pyramid_fullauth')
        try:
            try:
                user.email = email
            except ValidateError as e:
                # do not overwrite existing error
                if 'email' not in response['errors']:
                    response['errors']['email'] = text_type(e)

            if self.config.register.password.require:
                try:
                    tools.validate_passsword(
                        self.request,
                        self.request.POST.get('password', text_type('')), user)
                except ValidateError as e:
                    response['errors']['password'] = text_type(e)
            else:
                user.password = tools.password_generator(
                    self.config.register.password.length_min)

            self.request.registry.notify(
                BeforeRegister(self.request, user, response['errors']))
            if not response['errors']:
                pyramid_basemodel.Session.add(user)
                pyramid_basemodel.Session.flush()

                # lets add AuthenticationProvider as email!
                user.providers.append(
                    AuthenticationProvider(provider=text_type('email'),
                                           provider_id=user.id))
            else:
                return response
        except AttributeError as e:
            response['errors']['msg'] = text_type(e)

        return response
Exemplo n.º 4
0
    def _fillin_user(self, response, user):
        """
        Fill new user object in, with sent data.

        :param dict response: response to return from register view
        :param pyramid_fullauth.models.User user: new user object

        :returns: response
        :rtype: dict
        """
        email = self.request.POST.get('email', text_type(''))
        # here if e-mail is already in database

        if pyramid_basemodel.Session.query(User).filter(User.email == email).count() != 0:
            response['errors']['email'] = self.request._(
                'User with given e-mail already exists!',
                domain='pyramid_fullauth')
        try:
            try:
                user.email = email
            except ValidateError as e:
                # do not overwrite existing error
                if 'email' not in response['errors']:
                    response['errors']['email'] = text_type(e)

            if self.config.register.password.require:
                try:
                    tools.validate_passsword(self.request,
                                             self.request.POST.get('password', text_type('')),
                                             user)
                except ValidateError as e:
                    response['errors']['password'] = text_type(e)
            else:
                user.password = tools.password_generator(
                    self.config.register.password.length_min)

            self.request.registry.notify(BeforeRegister(self.request, user, response['errors']))
            if not response['errors']:
                pyramid_basemodel.Session.add(user)
                pyramid_basemodel.Session.flush()

                # lets add AuthenticationProvider as email!
                user.providers.append(
                    AuthenticationProvider(provider=text_type('email'), provider_id=user.id))
            else:
                return response
        except AttributeError as e:
            response['errors']['msg'] = text_type(e)

        return response
Exemplo n.º 5
0
    def _set_password(self, password, user):
        """
        Set password on a User object.

        :param str password: email address
        :param pyramid_fullauth.models.User user: user object

        :returns: error or None if no error occured.
        :rtype: str
        """
        if self.config.register.password.require:
            try:
                tools.validate_passsword(self.request, password, user)
            except ValidateError as e:
                return text_type(e)
        else:
            user.password = tools.password_generator(
                self.config.register.password.length_min)
Exemplo n.º 6
0
    def _set_password(self, password, user):
        """
        Set password on a User object.

        :param str password: email address
        :param pyramid_fullauth.models.User user: user object

        :returns: error or None if no error occured.
        :rtype: str
        """
        if self.config.register.password.require:
            try:
                tools.validate_passsword(self.request, password, user)
            except ValidateError as ex:
                return text_type(ex)
        else:
            user.password = tools.password_generator(
                self.config.register.password.length_min
            )
        return None
Exemplo n.º 7
0
 def test_password_generator(self, length):
     assert len(password_generator(length)) == length
Exemplo n.º 8
0
    def register_POST(self):
        '''
            Process POST register request
        '''

        invalid_fields = {}
        response_values = {
            'status': False,
            'msg': self.request._('You have an error in your registration form',
                                  domain='pyramid_fullauth'),
            'csrf_token': self.request.session.get_csrf_token()}
        response_values['errors'] = invalid_fields

        email = self.request.POST.get('email', u'')
        # here if e-mail is already in database
        try:
            Session.query(User).filter(User.email == email).one()
            invalid_fields['email'] = self.request._('User with given e-mail already exists!',
                                                     domain='pyramid_fullauth')
        except NoResultFound:
            pass

        try:
            user = User()
            try:
                user.email = email
            except ValidateError as e:
                # do not overwrite existing error
                if not 'email' in invalid_fields:
                    invalid_fields['email'] = str(e)

            user.address_ip = self.request.remote_addr

            if self.request.config.fullauth.register.password.require:
                try:
                    tools.validate_passsword(self.request,
                                             self.request.POST.get('password', u''),
                                             user)
                except ValidateError as e:
                    invalid_fields['password'] = e.message
            else:
                user.password = tools.password_generator(
                    self.request.config.fullauth.register.password.length_min)

            self.request.registry.notify(BeforeRegister(self.request, user, invalid_fields))
            if not invalid_fields:
                Session.add(user)
                Session.flush()
                # lets add AuthenticationProvider as email!
                user.providers.append(
                    AuthenticationProvider(provider=u'email', provider_id=user.id))
            else:
                return response_values
        except AttributeError as e:
            invalid_fields['msg'] = str(e)
            return response_values

        response_values['status'] = True
        response_values['msg'] = self.request._('You have successfully registered',
                                                domain='pyramid_fullauth')

        try:
            self.request.registry.notify(AfterRegister(self.request, user, response_values))
        except HTTPFound as redirect:
            return redirect

        return response_values
Exemplo n.º 9
0
    def register_social(self):
        '''
            Action provides social authorization functionality. When authorization with facebook or twitter is done successfully
            action tries to find existing user in database, if it exists - login this user, otherwise creates new user.
        '''

        def set_provider(user, provider_name, user_provider_id):
            '''
                Method sets the provider authentication method for user.
            '''
            if user.id:
                try:
                    provider_auth = Session.query(
                        AuthenticationProvider).filter(AuthenticationProvider.user_id == user.id,
                                                       AuthenticationProvider.provider == provider_name).one()
                    if provider_auth.provider_id != user_provider_id:
                        return False
                    return True
                except NoResultFound:
                    pass

            provider_auth = AuthenticationProvider()
            provider_auth.provider = provider_name
            provider_auth.provider_id = user_provider_id
            user.providers.append(provider_auth)
            return True

        context = self.request.context
        response_values = {'status': False, 'csrf_token': self.request.session.get_csrf_token()}
        user = self.request.user

        if user:
            # when user is logged in already, just connect social account to
            # this app account
            try:
                if set_provider(user, context.provider_name, context.profile['accounts'][0]['userid']):
                    Session.flush()
                else:
                    response_values['msg'] = 'Your account is already connected to other {provider} account.'.format(
                        provider=context.provider_name)
                    return response_values
            except IntegrityError:
                response_values['msg'] = 'This {provider} account is already connected with other account.'.format(
                    provider=context.provider_name)
                try:
                    self.request.registry.notify(SocialAccountAlreadyConnected(
                        self.request, user, context.profile, response_values))
                except HTTPFound as redirect:
                    # it's a redirect, let's follow it!
                    return redirect
                return response_values
        else:
            # getting verified email from provider
            if 'verifiedEmail' in context.profile:
                email = context.profile['verifiedEmail']
            # getting first of the emails provided by social login provider
            elif 'emails' in context.profile and context.profile['emails'] and 'value' in context.profile['emails'][0]:
                email = context.profile['emails'][0]['value']
            # generating some random email address based on social userid and provider domain
            else:
                email = u'{0}@{1}'.format(context.profile['accounts'][
                                          0]['userid'], context.profile['accounts'][0]['domain'])

            try:
                user = Session.query(
                    User).join(AuthenticationProvider).filter(AuthenticationProvider.provider == context.provider_name,
                                                              AuthenticationProvider.provider_id == context.profile['accounts'][0]['userid']).one()
            except NoResultFound:
                user = None

            # If the user for the provider was not found then check if in the DB exists user with the same email
            if not user:
                try:
                    user = Session.query(User).filter(User.email == email).one()
                    # If we are here that means that in the DB exists user with the same email but without the provider
                    # then we connect social account to this user
                    set_provider(user, context.provider_name, context.profile['accounts'][0]['userid'])
                    Session.flush()
                except NoResultFound:
                    length_min = self.request.config.fullauth.register.password.length_min
                    user = User(email=email,
                                password=tools.password_generator(length_min),
                                address_ip=self.request.remote_addr)
                    self.request.registry.notify(BeforeSocialRegister(self.request, user, context.profile))
                    set_provider(user, context.provider_name, context.profile['accounts'][0]['userid'])
                    Session.add(user)
                    Session.flush()
                    user.is_active = True

                    try:
                        self.request.registry.notify(AfterSocialRegister(
                            self.request, user, context.profile, response_values))
                    except HTTPFound as redirect:
                        # it's a redirect, let's follow it!
                        return redirect

        # if we're here, user exists
        try:
            self.request.registry.notify(AfterSocialLogIn(self.request, user, context.profile))
        except HTTPFound as redirect:
            # it's a redirect, let's follow it!
            return self.request.login_perform(user, location=redirect.location)
        else:
            return self.request.login_perform(user)
Exemplo n.º 10
0
def test_password_generator(length):
    """Test password_generator generating proper length of a random password."""
    assert len(password_generator(length)) == length
Exemplo n.º 11
0
def test_password_generator(length):
    """Test password_generator generating proper length of a random password."""
    assert len(password_generator(length)) == length