Exemple #1
0
    def create_minimal_user(
            self,
            email,
            groups=[],
            save_now=False
    ) -> User:
        """Previous create_user method"""
        validator = TracimValidator()
        validator.add_validator('email', email, user_email_validator)
        validator.validate_all()
        self._check_email(email)
        user = User()
        user.email = email
        # TODO - G.M - 2018-11-29 - Check if this default_value can be
        # incorrect according to user_public_name_validator
        user.display_name = email.split('@')[0]
        user.created = datetime.datetime.utcnow()
        if not groups:
            gapi = GroupApi(
                current_user=self._user,  # User
                session=self._session,
                config=self._config,
            )
            groups = [gapi.get_one(Group.TIM_USER)]
        for group in groups:
            user.groups.append(group)

        self._session.add(user)

        if save_now:
            self._session.flush()

        return user
Exemple #2
0
    def insert(self):
        u = User()
        u.display_name = 'Global manager'
        u.email = '*****@*****.**'
        u.password = '******'
        self._session.add(u)
        uapi = UserApi(
            session=self._session,
            config=self._config,
            current_user=u)
        uapi.execute_created_user_actions(u)

        g1 = Group()
        g1.group_id = 1
        g1.group_name = 'users'
        g1.display_name = 'Users'
        g1.users.append(u)
        self._session.add(g1)

        g2 = Group()
        g2.group_id = 2
        g2.group_name = 'trusted-users'
        g2.display_name = 'Trusted Users'
        g2.users.append(u)
        self._session.add(g2)

        g3 = Group()
        g3.group_id = 3
        g3.group_name = 'administrators'
        g3.display_name = 'Administrators'
        g3.users.append(u)
        self._session.add(g3)
Exemple #3
0
    def test__unit__unicode__ok__no_display_name(self):

        email = '*****@*****.**'

        user = User()
        user.email = email

        assert user.__unicode__() == email
Exemple #4
0
    def test_unit__repr__ok__nominal_case(self):
        name = 'Damien'
        email = '*****@*****.**'

        user = User()
        user.display_name = name
        user.email = email

        assert user.__repr__() == "<User: email='*****@*****.**', display='Damien'>"  # nopep8
Exemple #5
0
    def test_unit__unicode__ok__nominal_case(self):
        name = 'Damien'
        email = '*****@*****.**'

        user = User()
        user.display_name = name
        user.email = email

        assert user.__unicode__() == name
Exemple #6
0
    def test_unit__validate_password__false__null_password(self):
        # Check bug #70 fixed
        # http://tracim.org/workspaces/4/folders/5/threads/70

        name = 'Damien'
        email = '*****@*****.**'

        user = User()
        user.display_name = name
        user.email = email

        assert user.validate_password('') is False
Exemple #7
0
 def test_unit__create_minimal_user_and_set_password__ok__nominal_case(self):
     u = User()
     u.email = 'bob@bob'
     u.password = '******'
     u.auth_type = AuthType.INTERNAL
     u.display_name = 'bob'
     api = UserApi(
         current_user=u,
         session=self.session,
         config=self.app_config,
     )
     assert u.email == 'bob@bob'
     api.set_email(u,'pass','newbobemail@bob')
     assert u is not None
     assert u.email == 'newbobemail@bob'
Exemple #8
0
    def test_unit__validate_password__false__bad_password(self):
        """
        Check if validate_password can correctly check if password is
        an uncorrect correct one
        """
        name = 'Damien'
        email = '*****@*****.**'
        password = '******'

        user = User()
        user.display_name = name
        user.email = email
        user.password = password

        assert user.validate_password('uncorrect_password') is False
Exemple #9
0
 def validate_reset_password_token(self, user: User, token: str) -> bool:
     self._check_user_auth_validity(user)
     self._check_password_modification_allowed(user)
     return user.validate_reset_password_token(
         token=token,
         validity_seconds=self._config.USER_RESET_PASSWORD_TOKEN_VALIDITY,
     )
Exemple #10
0
 def delete(self, user: User, do_save=False):
     if self._user and self._user == user:
         raise UserCantDeleteHimself("User {} can't delete himself".format(
             user.user_id))
     user.is_deleted = True
     if do_save:
         self.save(user)
Exemple #11
0
    def reset_password_notification(self,
                                    user: User,
                                    do_save: bool = False) -> str:
        """
        Reset password notification
        :param user: User who want is password resetted
        :param do_save: save update ?
        :return: reset_password_token
        """
        self._check_user_auth_validity(user)
        self._check_password_modification_allowed(user)
        if not self._config.EMAIL__NOTIFICATION__ACTIVATED:
            raise NotificationDisabledCantResetPassword(
                "cant reset password with notification disabled")
        token = user.generate_reset_password_token()
        try:
            email_manager = get_email_manager(self._config, self._session)
            email_manager.notify_reset_password(user, token)
        except SMTPException as exc:
            raise NotificationSendingFailed(
                "SMTP error, can't send notification") from exc
        except EmailTemplateError as exc:
            raise exc

        if do_save:
            self.save(user)
        return token
Exemple #12
0
 def validate_reset_password_token(self, user: User, token: str) -> bool:
     self._check_user_auth_validity(user)
     self._check_password_modification_allowed(user)
     return user.validate_reset_password_token(
         token=token,
         validity_seconds=self._config.USER_RESET_PASSWORD_TOKEN_VALIDITY,
     )
Exemple #13
0
    def test_unit__crud_caller__ok__workspace(self, session):
        hook = WorkspaceHookImpl()
        session.context.plugin_manager.register(hook)

        owner = User(email="john")
        session.add(owner)
        session.flush()

        workspace = Workspace(label="Hello", owner_id=owner.user_id)
        session.add(workspace)
        session.flush()
        hook.mock_hooks.assert_called_with("created",
                                           workspace=workspace,
                                           context=session.context)

        workspace.label = "World"
        session.flush()
        hook.mock_hooks.assert_called_with("modified",
                                           workspace=workspace,
                                           context=session.context)

        session.delete(workspace)
        session.flush()
        hook.mock_hooks.assert_called_with("deleted",
                                           workspace=workspace,
                                           context=session.context)
Exemple #14
0
    def test__unit__validate_password__ok__nominal_case(self):
        """
        Check if validate_password can correctly check if password i the correct
        one
        """

        name = 'Damien'
        email = '*****@*****.**'
        password = '******'

        user = User()
        user.display_name = name
        user.email = email
        user.password = password

        assert user.validate_password(password) is True
Exemple #15
0
 def insert(self):
     u = User()
     u.display_name = "Global manager"
     u.username = "******"
     u.email = "*****@*****.**"
     u.password = "******"
     u.profile = Profile.ADMIN
     u.config = UserConfig()
     self._session.add(u)
Exemple #16
0
    def disable(self, user: User, do_save=False):
        if self._user and self._user == user:
            raise UserCantDisableHimself(
                "User {} can't disable himself".format(user.user_id))

        user.is_active = False
        if do_save:
            self.save(user)
Exemple #17
0
 def anonymize_user(
         self,
         user: User,
         anonymized_user_display_name: typing.Optional[str] = None) -> User:
     """
     :param user: user to anonymize_if_required
     :return: user_id
     """
     hash = str(uuid.uuid4().hex)
     user.display_name = (
         anonymized_user_display_name
         or self.app_config.DEFAULT_ANONYMIZED_USER_DISPLAY_NAME)
     user.email = ANONYMIZED_USER_EMAIL_PATTERN.format(hash=hash)
     user.is_active = False
     user.is_deleted = True
     self.safe_update(user)
     return user
Exemple #18
0
 def delete(self, user: User, do_save=False):
     if self._user and self._user == user:
         raise UserCantDeleteHimself(
             "User {} can't delete himself".format(user.user_id)
         )
     user.is_deleted = True
     if do_save:
         self.save(user)
Exemple #19
0
 def test_unit__create_minimal_user_and_set_password__ok__nominal_case(self):
     u = User()
     u.email = "bob@bob"
     u.password = "******"
     u.auth_type = AuthType.INTERNAL
     u.display_name = "bob"
     api = UserApi(current_user=u, session=self.session, config=self.app_config)
     assert u.validate_password("pass")
     api.set_password(u, "pass", "newpass", "newpass")
     assert u is not None
     assert u.email == "bob@bob"
     assert u.display_name == "bob"
     assert u.validate_password("newpass")
     assert not u.validate_password("pass")
Exemple #20
0
    def test_unit__password__ok__nominal_case(self):
        """
        Check if password can be set and hashed password
        can be retrieve. Verify if hashed password is not
        same as password.
        """
        name = 'Damien'
        email = '*****@*****.**'
        password = '******'

        user = User()
        user.display_name = name
        user.email = email
        assert user._password is None
        user.password = password
        assert user._password is not None
        assert user._password != password
        assert user.password == user._password
Exemple #21
0
    def disable(self, user: User, do_save=False):
        if self._user and self._user == user:
            raise UserCantDisableHimself(
                "User {} can't disable himself".format(user.user_id)
            )

        user.is_active = False
        if do_save:
            self.save(user)
Exemple #22
0
    def test_unit__password__ok__nominal_case(self, session):
        """
        Check if password can be set and hashed password
        can be retrieve. Verify if hashed password is not
        same as password.
        """
        name = "Damien"
        email = "*****@*****.**"
        password = "******"

        user = User()
        user.display_name = name
        user.email = email
        assert user._password is None
        user.password = password
        assert user._password is not None
        assert user._password != password
        assert user.password == user._password
    def test_notifier_factory_method(self):
        u = User()
        self.app_config.EMAIL__NOTIFICATION__ACTIVATED = True
        notifier = NotifierFactory.create(self.app_config, u)
        eq_(EmailNotifier, notifier.__class__)

        self.app_config.EMAIL__NOTIFICATION__ACTIVATED = False
        notifier = NotifierFactory.create(self.app_config, u)
        eq_(DummyNotifier, notifier.__class__)
Exemple #24
0
    def test_notifier_factory_method(self, app_config):
        u = User()
        app_config.EMAIL__NOTIFICATION__ACTIVATED = True
        notifier = NotifierFactory.create(app_config, u)
        assert EmailNotifier == notifier.__class__

        app_config.EMAIL__NOTIFICATION__ACTIVATED = False
        notifier = NotifierFactory.create(app_config, u)
        assert DummyNotifier == notifier.__class__
Exemple #25
0
    def update(
        self,
        user: User,
        name: str = None,
        email: str = None,
        password: str = None,
        timezone: str = None,
        lang: str = None,
        groups: typing.Optional[typing.List[Group]] = None,
        do_save=True,
    ) -> User:
        if name is not None:
            user.display_name = name

        if email is not None and email != user.email:
            self._check_email(email)
            user.email = email

        if password is not None:
            user.password = password

        if timezone is not None:
            user.timezone = timezone

        if lang is not None:
            user.lang = lang

        if groups is not None:
            if self._user and self._user == user:
                raise UserCantChangeIsOwnProfile(
                    "User {} can't change is own profile".format(user.user_id))
            # INFO - G.M - 2018-07-18 - Delete old groups
            for group in user.groups:
                if group not in groups:
                    user.groups.remove(group)
            # INFO - G.M - 2018-07-18 - add new groups
            for group in groups:
                if group not in user.groups:
                    user.groups.append(group)

        if do_save:
            self.save(user)

        return user
Exemple #26
0
    def test_unit__create__ok__nominal_case(self):
        self.session.flush()
        transaction.commit()
        name = 'Damien'
        email = '*****@*****.**'

        user = User()
        user.display_name = name
        user.email = email

        self.session.add(user)
        self.session.flush()
        transaction.commit()

        new_user = self.session.query(User).filter(User.display_name == name).one()  # nopep8

        assert new_user.display_name == name
        assert new_user.email == email
        assert new_user.email_address == email
Exemple #27
0
    def execute_created_user_actions(self, created_user: User) -> None:
        """
        Execute actions when user just been created
        :return:
        """
        # NOTE: Cyclic import
        # TODO - G.M - 28-03-2018 - [Calendar] Reenable Calendar stuff
        #from tracim.lib.calendar import CalendarManager
        #from tracim.model.organisational import UserCalendar

        # TODO - G.M - 04-04-2018 - [auth]
        # Check if this is already needed with
        # new auth system
        created_user.ensure_auth_token(
            validity_seconds=self._config.USER_AUTH_TOKEN_VALIDITY)

        # Ensure database is up-to-date
        self._session.flush()
        transaction.commit()
Exemple #28
0
    def test_unit__create__ok__nominal_case(self, session):
        session.flush()
        transaction.commit()
        name = "Damien"
        email = "*****@*****.**"

        user = User()
        user.display_name = name
        user.email = email

        session.add(user)
        session.flush()
        transaction.commit()

        new_user = session.query(User).filter(User.display_name == name).one()

        assert new_user.display_name == name
        assert new_user.email == email
        assert new_user.email_address == email
Exemple #29
0
    def test__unit__ContentTypeCreationChecker__err__implicit_insufficent_role_in_workspace(
            self, session):

        current_user = User(user_id=2, email="*****@*****.**")
        current_user.profile = Profile.TRUSTED_USER
        current_workspace = Workspace(workspace_id=3, owner=current_user)
        candidate_content_type = TracimContentType(
            slug="test",
            fa_icon="",
            label="Test",
            creation_label="Test",
            available_statuses=[],
            minimal_role_content_creation=WorkspaceRoles.CONTENT_MANAGER,
        )
        role = UserRoleInWorkspace(user_id=2,
                                   workspace_id=3,
                                   role=WorkspaceRoles.CONTRIBUTOR.level)
        session.add(current_user)
        session.add(current_workspace)
        session.add(role)
        session.flush()
        transaction.commit()

        class FakeContentTypeList(object):
            def get_one_by_slug(self, slug=str) -> TracimContentType:
                return candidate_content_type

        class FakeBaseFakeTracimContext(BaseFakeTracimContext):
            @property
            def current_user(self):
                return current_user

            @property
            def current_workspace(self):
                return current_workspace

            @property
            def candidate_content_type(self):
                return candidate_content_type

        with pytest.raises(InsufficientUserRoleInWorkspace):
            assert ContentTypeCreationChecker(FakeContentTypeList()).check(
                FakeBaseFakeTracimContext())
Exemple #30
0
 def test_unit__get_current_user_ok__nominal_case(self):
     user = User(email='*****@*****.**')
     api = UserApi(
         current_user=user,
         session=self.session,
         config=self.app_config,
     )
     new_user = api.get_current_user()
     assert isinstance(new_user, User)
     assert user == new_user
Exemple #31
0
    def test_unit__create__ok__username_and_email(self, session):
        session.flush()
        transaction.commit()
        username = "******"
        email = "*****@*****.**"

        user = User()
        user.email = email
        user.username = username

        session.add(user)
        session.flush()
        transaction.commit()

        new_user = session.query(User).filter(User.email == email).one()

        assert new_user.email == email
        assert new_user.email_address == email
        assert new_user.username == username
Exemple #32
0
    def set_password_reset_token(
        self,
        user: User,
        new_password: str,
        new_password2: str,
        reset_token: str,
        do_save: bool = False,
    ):
        self._check_user_auth_validity(user)
        self._check_password_modification_allowed(user)
        self.validate_reset_password_token(user, reset_token)
        if new_password != new_password2:
            raise PasswordDoNotMatch("Passwords given are different")

        self.update(user=user, password=new_password, do_save=do_save)
        user.reset_tokens()
        if do_save:
            self.save(user)
        return user
Exemple #33
0
    def execute_created_user_actions(self, created_user: User) -> None:
        """
        Execute actions when user just been created
        :return:
        """
        # NOTE: Cyclic import
        # TODO - G.M - 28-03-2018 - [Calendar] Reenable Calendar stuff
        #from tracim.lib.calendar import CalendarManager
        #from tracim.model.organisational import UserCalendar

        # TODO - G.M - 04-04-2018 - [auth]
        # Check if this is already needed with
        # new auth system
        created_user.ensure_auth_token(
            validity_seconds=self._config.USER_AUTH_TOKEN_VALIDITY
        )

        # Ensure database is up-to-date
        self._session.flush()
        transaction.commit()
Exemple #34
0
    def set_password_reset_token(
        self,
        user: User,
        new_password: str,
        new_password2: str,
        reset_token: str,
        do_save: bool = False,
    ):
        self.validate_reset_password_token(user, reset_token)
        if new_password != new_password2:
            raise PasswordDoNotMatch('Passwords given are different')

        self.update(
            user=user,
            password=new_password,
            do_save=do_save,
        )
        user.reset_tokens()
        if do_save:
            self.save(user)
        return user
Exemple #35
0
    def test_unit__crud_caller__ok__user(self, session):
        hook = UserHookImpl()
        session.context.plugin_manager.register(hook)
        user = User(email="foo@bar")
        session.add(user)
        session.flush()
        hook.mock_hooks.assert_called_with("created",
                                           user=user,
                                           context=session.context)

        user.display_name = "John doe"
        session.flush()
        hook.mock_hooks.assert_called_with("modified",
                                           user=user,
                                           context=session.context)

        session.delete(user)
        session.flush()
        hook.mock_hooks.assert_called_with("deleted",
                                           user=user,
                                           context=session.context)
Exemple #36
0
    def create_minimal_user(self,
                            email,
                            profile: typing.Optional[Profile] = None,
                            save_now=False) -> User:
        """Previous create_user method"""
        lowercase_email = email.lower() if email is not None else None
        validator = TracimValidator()
        validator.add_validator("email", lowercase_email, user_email_validator)
        validator.validate_all()
        self._check_email(lowercase_email)
        user = User()
        user.email = lowercase_email
        # TODO - G.M - 2018-11-29 - Check if this default_value can be
        # incorrect according to user_public_name_validator
        user.display_name = email.split("@")[0]
        user.created = datetime.datetime.utcnow()
        if not profile:
            profile = Profile.get_profile_from_slug(
                self._config.USER__DEFAULT_PROFILE)
        user.profile = profile

        self._session.add(user)

        if save_now:
            self._session.flush()

        return user
Exemple #37
0
    def execute_created_user_actions(self, user: User) -> None:
        """
        WARNING ! This method Will be Deprecated soon, see
        https://github.com/tracim/tracim/issues/1589 and
        https://github.com/tracim/tracim/issues/1487

        This method do post-create user actions
        """

        # TODO - G.M - 04-04-2018 - [auth]
        # Check if this is already needed with
        # new auth system
        user.ensure_auth_token(
            validity_seconds=self._config.USER__AUTH_TOKEN__VALIDITY)

        # FIXME - G.M - 2019-03-18 - move this code to another place when
        # event mechanism is ready, see https://github.com/tracim/tracim/issues/1487
        # event on_created_user should start hook use by agenda  app code.

        app_lib = ApplicationApi(app_list=app_list)
        if app_lib.exist(AGENDA__APP_SLUG):
            agenda_api = AgendaApi(current_user=self._user,
                                   session=self._session,
                                   config=self._config)
            try:
                agenda_already_exist = agenda_api.ensure_user_agenda_exists(
                    user)
                if agenda_already_exist:
                    logger.warning(
                        self,
                        "user {} is just created but his own agenda already exist !!"
                        .format(user.user_id),
                    )
            except AgendaServerConnectionError as exc:
                logger.error(self, "Cannot connect to agenda server")
                logger.exception(self, exc)
            except Exception as exc:
                logger.error(
                    self, "Something goes wrong during agenda create/update")
                logger.exception(self, exc)
Exemple #38
0
 def insert(self):
     u = User()
     u.display_name = "Global manager"
     u.email = "*****@*****.**"
     u.password = "******"
     u.profile = Profile.ADMIN
     self._session.add(u)
Exemple #39
0
    def test_unit__create__error__no_username_and_no_email(self, session):
        session.flush()
        transaction.commit()

        user = User()
        session.add(user)
        with pytest.raises(Exception) as caught:
            session.flush()

        # NOTE BS 20200427: caught exception depend as database engine, but we expect
        # constraint name in exception message
        assert User.USERNAME_OR_EMAIL_REQUIRED_CONSTRAINT_NAME in str(
            caught.value)
Exemple #40
0
    def test_unit__repr__ok__with_username(self):
        user = User()
        user.display_name = "Damien"
        user.email = "*****@*****.**"
        user.username = "******"

        assert user.__repr__(
        ) == "<User: email='*****@*****.**', username='******' display='Damien'>"
Exemple #41
0
 def test_unit__create_minimal_user_and_set_password__ok__nominal_case(
         self):
     u = User()
     u.email = 'bob@bob'
     u.password = '******'
     u.auth_type = AuthType.INTERNAL
     u.display_name = 'bob'
     api = UserApi(
         current_user=u,
         session=self.session,
         config=self.app_config,
     )
     assert u.validate_password('pass')
     api.set_password(u, 'pass', 'newpass', 'newpass')
     assert u is not None
     assert u.email == 'bob@bob'
     assert u.display_name == 'bob'
     assert u.validate_password('newpass')
     assert not u.validate_password('pass')
Exemple #42
0
 def test_unit__get_user_with_context__nominal_case(self):
     user = User(email="*****@*****.**", display_name="Admin", is_active=True)
     api = UserApi(current_user=None, session=self.session, config=self.app_config)
     new_user = api.get_user_with_context(user)
     assert isinstance(new_user, UserInContext)
     assert new_user.user == user
     assert new_user.profile == "nobody"
     assert new_user.user_id == user.user_id
     assert new_user.email == "*****@*****.**"
     assert new_user.display_name == "Admin"
     assert new_user.is_active is True
     # TODO - G.M - 03-05-2018 - [avatar][agenda] Should test this
     # with true value when those param will be available.
     assert new_user.avatar_url is None
Exemple #43
0
    def create_minimal_user(self, email, groups=[], save_now=False) -> User:
        """Previous create_user method"""
        self._check_email(email)
        user = User()
        user.email = email
        user.display_name = email.split('@')[0]

        if not groups:
            gapi = GroupApi(
                current_user=self._user,  # User
                session=self._session,
                config=self._config,
            )
            groups = [gapi.get_one(Group.TIM_USER)]
        for group in groups:
            user.groups.append(group)

        self._session.add(user)

        if save_now:
            self._session.flush()

        return user
Exemple #44
0
    def test__unit__RoleChecker__ok__nominal_case(self, session):

        current_user = User(user_id=2, email="*****@*****.**")
        current_user.profile = Profile.TRUSTED_USER
        current_workspace = Workspace(workspace_id=3, owner=current_user)
        role = UserRoleInWorkspace(user_id=2, workspace_id=3, role=2)
        session.add(current_user)
        session.add(current_workspace)
        session.add(role)
        session.flush()
        transaction.commit()

        class FakeBaseFakeTracimContext(BaseFakeTracimContext):
            @property
            def current_user(self):
                return current_user

            @property
            def current_workspace(self):
                return current_workspace

        assert RoleChecker(1).check(FakeBaseFakeTracimContext())
        assert RoleChecker(2).check(FakeBaseFakeTracimContext())
Exemple #45
0
    def set_password_reset_token(
            self,
            user: User,
            new_password: str,
            new_password2: str,
            reset_token: str,
            do_save: bool = False,
    ):
        self._check_user_auth_validity(user)
        self._check_password_modification_allowed(user)
        self.validate_reset_password_token(user, reset_token)
        if new_password != new_password2:
            raise PasswordDoNotMatch('Passwords given are different')

        self.update(
            user=user,
            password=new_password,
            do_save=do_save,
        )
        user.reset_tokens()
        if do_save:
            self.save(user)
        return user
Exemple #46
0
    def _remote_user_authenticate(
        self,
        user: User,
        email: str,
    ) -> User:
        """
        Authenticate with remote_auth, return authenticated user
        or raise Exception like WrongAuthTypeForUser,
        UserDoesNotExist or UserAuthenticatedIsNotActive
        :param user: user to check, can be none if user not found, will try
         to create new user if none
        :param email: email of the user
        """
        auth_type = AuthType.REMOTE

        # INFO - G.M - 2018-12-12 - Do not authenticate user with auth_type
        # different from REMOTE
        if user and user.auth_type not in [auth_type, AuthType.UNKNOWN]:
                raise WrongAuthTypeForUser(
                    'User "{}" auth_type is {} not {}'.format(
                        email,
                        user.auth_type.value,
                        auth_type.value
                    )
                )

        # INFO - G.M - 2018-12-12 - Create new user
        if not user:
            groups = None
            self.create_user(
                email=email,
                groups=groups,
                auth_type=AuthType.REMOTE,
                do_save=True,
                do_notify=False
            )
            transaction.commit()
            # INFO - G.M - 2018-12-02 - get new created user
            user = self.get_one_by_email(email)

        if user.is_deleted:
            raise UserDoesNotExist('This user has been deleted')  # nopep8

        if not user.is_active:
            raise UserAuthenticatedIsNotActive('This user is not activated')  # nopep8

        if user.auth_type == AuthType.UNKNOWN :
            user.auth_type = auth_type
        return user
Exemple #47
0
    def notify_reset_password(self, user: User,
                              reset_password_token: str) -> None:
        """
        Reset password link for user
        :param user: user to notify
        :param reset_password_token: token for resetting password
        """
        logger.debug(self, "user: {}".format(user.user_id))
        logger.info(self,
                    "Generating reset password email to {}".format(user.email))
        translator = Translator(self.config, default_lang=user.lang)
        email_sender = EmailSender(self.config, self._smtp_config,
                                   self.config.EMAIL__NOTIFICATION__ACTIVATED)
        translated_subject = translator.get_translation(
            self.config.EMAIL__NOTIFICATION__RESET_PASSWORD_REQUEST__SUBJECT)
        subject = translated_subject.replace(EST.WEBSITE_TITLE,
                                             str(self.config.WEBSITE__TITLE))
        from_header = self._get_sender()
        to_header = EmailAddress(user.get_display_name(), user.email)

        html_template_file_path = (
            self.config.
            EMAIL__NOTIFICATION__RESET_PASSWORD_REQUEST__TEMPLATE__HTML)
        # TODO - G.M - 2018-08-17 - Generate token
        context = {
            "user":
            user,
            "logo_url":
            get_email_logo_frontend_url(self.config),
            "reset_password_url":
            get_reset_password_frontend_url(self.config,
                                            token=reset_password_token,
                                            email=user.email),
        }

        body_html = self._render_template(
            mako_template_filepath=html_template_file_path,
            context=context,
            translator=translator)
        message = EmailNotificationMessage(
            subject=subject,
            from_header=from_header,
            to_header=to_header,
            body_html=body_html,
            lang=translator.default_lang,
        )
        send_email_through(config=self.config,
                           sendmail_callable=email_sender.send_mail,
                           message=message)
Exemple #48
0
    def test_unit__validate_password__false__empty_password(self):
        """
        Check if validate_password failed if not password
        """
        name = 'Damien'
        email = '*****@*****.**'
        password = None

        user = User()
        user.display_name = name
        user.email = email
        user.password = password

        assert user.validate_password(password) is False
        assert user.validate_password('') is False
Exemple #49
0
    def reset_password_notification(self, user: User, do_save: bool=False) -> str:  # nopep8
        """
        Reset password notification
        :param user: User who want is password resetted
        :param do_save: save update ?
        :return: reset_password_token
        """
        self._check_user_auth_validity(user)
        self._check_password_modification_allowed(user)
        if not self._config.EMAIL_NOTIFICATION_ACTIVATED:
            raise NotificationDisabledCantResetPassword("cant reset password with notification disabled")  # nopep8
        token = user.generate_reset_password_token()
        try:
            email_manager = get_email_manager(self._config, self._session)
            email_manager.notify_reset_password(user, token)
        except SMTPException as exc:
            raise NotificationSendingFailed("SMTP error, can't send notification") from exc
        except EmailTemplateError as exc:
            raise exc

        if do_save:
            self.save(user)
        return token
Exemple #50
0
    def test_unit__reset_token__ok__nominal_case(self):
        email = '*****@*****.**'

        user = User()
        user.email = email
        assert user.auth_token is None
        with freeze_time("1999-12-31 23:59:59"):
            user.ensure_auth_token(validity_seconds=5)
            assert user.auth_token
            assert user.auth_token_created == datetime.now()
            token = user.auth_token
            token_time = user.auth_token_created

        with freeze_time("2003-12-31 23:59:59"):
            user.reset_tokens()
            assert user.auth_token != token
            assert user.auth_token_created != token_time
            assert user.auth_token_created == datetime.now()
Exemple #51
0
 def user_can_read(self, user: User) -> bool:
     role = user.get_role(self._related_object)
     return CALENDAR_PERMISSION_READ in self._workspace_rights[role]
Exemple #52
0
 def undelete(self, user: User, do_save=False):
     user.is_deleted = False
     if do_save:
         self.save(user)
Exemple #53
0
    def update(
            self,
            user: User,
            name: str=None,
            email: str=None,
            password: str=None,
            timezone: str=None,
            lang: str=None,
            auth_type: AuthType = None,
            groups: typing.Optional[typing.List[Group]]=None,
            do_save=True,
    ) -> User:
        validator = TracimValidator()
        validator.add_validator('name', name, user_public_name_validator)
        validator.add_validator('password', password, user_password_validator)
        validator.add_validator('email', email, user_email_validator)
        validator.add_validator('timezone', timezone, user_timezone_validator)
        validator.add_validator('lang', lang, user_lang_validator)
        validator.validate_all()

        if name is not None:
            user.display_name = name

        if auth_type is not None:
            if auth_type not in [AuthType.UNKNOWN, AuthType.REMOTE] and not auth_type in self._config.AUTH_TYPES:
                raise UserAuthTypeDisabled(
                    'Can\'t update user "{}" auth_type with unavailable value "{}".'.format(
                        user.email,
                        auth_type
                    )
                )
            user.auth_type = auth_type

        if email is not None and email != user.email:
            self._check_email_modification_allowed(user)
            self._check_email(email)
            user.email = email

        if password is not None:
            self._check_password_modification_allowed(user)
            user.password = password

        if timezone is not None:
            user.timezone = timezone

        if lang is not None:
            user.lang = lang

        if groups is not None:
            if self._user and self._user == user:
                raise UserCantChangeIsOwnProfile(
                    "User {} can't change is own profile".format(user.user_id)
                )
            # INFO - G.M - 2018-07-18 - Delete old groups
            for group in user.groups:
                if group not in groups:
                    user.groups.remove(group)
            # INFO - G.M - 2018-07-18 - add new groups
            for group in groups:
                if group not in user.groups:
                    user.groups.append(group)

        if do_save:
            self.save(user)

        return user
Exemple #54
0
 def enable(self, user: User, do_save=False):
     user.is_active = True
     if do_save:
         self.save(user)
Exemple #55
0
    def insert(self):
        g2 = self._session.query(Group).\
            filter(Group.group_name == 'trusted-users').one()

        lawrence = User()
        lawrence.display_name = 'Lawrence L.'
        lawrence.email = '*****@*****.**'
        lawrence.password = '******'
        self._session.add(lawrence)
        g2.users.append(lawrence)

        bob = User()
        bob.display_name = 'Bob i.'
        bob.email = '*****@*****.**'
        bob.password = '******'
        self._session.add(bob)
        g2.users.append(bob)

        g1 = self._session.query(Group).\
            filter(Group.group_name == 'users').one()
        reader = User()
        reader.display_name = 'John Reader'
        reader.email = '*****@*****.**'
        reader.password = '******'
        self._session.add(reader)
        g1.users.append(reader)