예제 #1
0
    def create_user(self, context, request: TracimRequest, hapic_data=None):
        """
        Create new user
        """
        app_config = request.registry.settings["CFG"]  # type: CFG
        uapi = UserApi(
            current_user=request.current_user,
            session=request.dbsession,
            config=app_config  # User
        )
        gapi = GroupApi(
            current_user=request.current_user,
            session=request.dbsession,
            config=app_config  # User
        )
        groups = [gapi.get_one_with_name(hapic_data.body.profile)]
        password = hapic_data.body.password
        if not password and hapic_data.body.email_notification:
            password = password_generator()

        user = uapi.create_user(
            auth_type=AuthType.UNKNOWN,
            email=hapic_data.body.email,
            password=password,
            timezone=hapic_data.body.timezone,
            lang=hapic_data.body.lang,
            name=hapic_data.body.public_name,
            do_notify=hapic_data.body.email_notification,
            groups=groups,
            do_save=True,
        )
        uapi.execute_created_user_actions(user)
        return uapi.get_user_with_context(user)
예제 #2
0
    def create_user(self, context, request: TracimRequest, hapic_data=None):
        """
        Create new user. Note: One of username or email required.
        """
        app_config = request.registry.settings["CFG"]  # type: CFG
        uapi = UserApi(
            current_user=request.current_user, session=request.dbsession, config=app_config  # User
        )
        if hapic_data.body.profile:
            profile = Profile.get_profile_from_slug(hapic_data.body.profile)
        else:
            profile = None
        password = hapic_data.body.password
        if not password and hapic_data.body.email_notification:
            password = password_generator()

        user = uapi.create_user(
            auth_type=AuthType.UNKNOWN,
            email=hapic_data.body.email,
            password=password,
            timezone=hapic_data.body.timezone,
            lang=hapic_data.body.lang,
            name=hapic_data.body.public_name,
            username=hapic_data.body.username,
            do_notify=hapic_data.body.email_notification,
            allowed_space=hapic_data.body.allowed_space,
            profile=profile,
            do_save=True,
        )
        uapi.execute_created_user_actions(user)
        return uapi.get_user_with_context(user)
예제 #3
0
파일: event.py 프로젝트: grignards/tracim
 def create_event(
     self,
     entity_type: EntityType,
     operation: OperationType,
     additional_fields: Dict[str, JsonDict],
     context: TracimContext,
     entity_subtype: Optional[str] = None,
 ) -> Event:
     current_user = context.safe_current_user()
     user_api = UserApi(
         current_user=current_user,
         session=context.dbsession,
         config=self._config,
         show_deleted=True,
     )
     if current_user:
         author = self.user_schema.dump(
             user_api.get_user_with_context(current_user)).data
     else:
         author = None
     fields = {
         Event.AUTHOR_FIELD: author,
         Event.CLIENT_TOKEN_FIELD: context.client_token,
     }
     fields.update(additional_fields)
     event = Event(
         entity_type=entity_type,
         operation=operation,
         entity_subtype=entity_subtype,
         fields=fields,
     )
     context.dbsession.add(event)
     context.pending_events.append(event)
     return event
예제 #4
0
파일: event.py 프로젝트: grignards/tracim
 def _create_subscription_event(self, operation: OperationType,
                                subscription: WorkspaceSubscription,
                                context: TracimContext) -> None:
     current_user = context.safe_current_user()
     workspace_api = WorkspaceApi(
         session=context.dbsession,
         config=self._config,
         current_user=None,
     )
     workspace_in_context = workspace_api.get_workspace_with_context(
         workspace_api.get_one(subscription.workspace_id))
     user_api = UserApi(current_user,
                        context.dbsession,
                        self._config,
                        show_deleted=True)
     subscription_author_in_context = user_api.get_user_with_context(
         subscription.author)
     fields = {
         Event.WORKSPACE_FIELD:
         EventApi.workspace_schema.dump(workspace_in_context).data,
         Event.SUBSCRIPTION_FIELD:
         EventApi.workspace_subscription_schema.dump(subscription).data,
         Event.USER_FIELD:
         EventApi.user_schema.dump(subscription_author_in_context).data,
     }
     event_api = EventApi(current_user, context.dbsession, self._config)
     event_api.create_event(
         entity_type=EntityType.WORKSPACE_SUBSCRIPTION,
         operation=operation,
         additional_fields=fields,
         context=context,
     )
예제 #5
0
    def create_user(self, context, request: TracimRequest, hapic_data=None):
        """
        Create new user
        """
        app_config = request.registry.settings['CFG']
        uapi = UserApi(
            current_user=request.current_user,  # User
            session=request.dbsession,
            config=app_config,
        )
        gapi = GroupApi(
            current_user=request.current_user,  # User
            session=request.dbsession,
            config=app_config,
        )
        groups = [gapi.get_one_with_name(hapic_data.body.profile)]
        password = hapic_data.body.password
        if not password and hapic_data.body.email_notification:
            password = password_generator()

        user = uapi.create_user(
            auth_type=AuthType.UNKNOWN,
            email=hapic_data.body.email,
            password=password,
            timezone=hapic_data.body.timezone,
            lang=hapic_data.body.lang,
            name=hapic_data.body.public_name,
            do_notify=hapic_data.body.email_notification,
            groups=groups,
            do_save=True
        )
        return uapi.get_user_with_context(user)
예제 #6
0
 def create_user(self, context, request: TracimRequest, hapic_data=None):
     """
     Create new user
     """
     app_config = request.registry.settings['CFG']
     uapi = UserApi(
         current_user=request.current_user,  # User
         session=request.dbsession,
         config=app_config,
     )
     gapi = GroupApi(
         current_user=request.current_user,  # User
         session=request.dbsession,
         config=app_config,
     )
     groups = [gapi.get_one_with_name(hapic_data.body.profile)]
     user = uapi.create_user(email=hapic_data.body.email,
                             password=hapic_data.body.password,
                             timezone=hapic_data.body.timezone,
                             lang=hapic_data.body.lang,
                             name=hapic_data.body.public_name,
                             do_notify=hapic_data.body.email_notification,
                             groups=groups,
                             do_save=True)
     return uapi.get_user_with_context(user)
예제 #7
0
    def add_permission_to_workspace(
        self,
        workspace: Workspace,
        emails: typing.List[str],
        password: typing.Optional[str] = None,
        do_notify=False,
    ) -> typing.List[UploadPermission]:
        upload_permissions = []
        created = datetime.utcnow()
        upload_permission_group_uuid = str(uuid.uuid4().hex)
        for email in emails:
            upload_permission = UploadPermission(
                author=self._user,
                workspace_id=workspace.workspace_id,
                email=email.lower(),
                token=str(uuid.uuid4()),
                password=password,
                type=UploadPermissionType.EMAIL,
                created=created,
                upload_permission_group_uuid=upload_permission_group_uuid,
                enabled=True,
            )
            self.save(upload_permission)
            upload_permissions.append(upload_permission)
            self._session.flush()

        if do_notify:
            userlib = UserApi(config=self._config,
                              current_user=self._user,
                              session=self._session)
            workspace_lib = WorkspaceApi(config=self._config,
                                         current_user=self._user,
                                         session=self._session)
            try:
                email_manager = self._get_email_manager(
                    self._config, self._session)
                email_manager.notify_upload_permission(
                    emitter=userlib.get_user_with_context(self._user),
                    workspace_in_context=workspace_lib.
                    get_workspace_with_context(workspace),
                    upload_permission_receivers=self.
                    get_upload_permissions_in_context(upload_permissions),
                    upload_permission_password=password,
                )
            # FIXME - G.M - 2018-11-02 - hack: accept bad recipient user creation
            # this should be fixed to find a solution to allow "fake" email but
            # also have clear error case for valid mail.
            except SMTPRecipientsRefused:
                logger.warning(
                    self,
                    "Upload Permission initied by user {} but SMTP "
                    "server refuse to send notification".format(
                        self._user.login),
                )
            except SMTPException as exc:
                raise NotificationSendingFailed(
                    "Notification for Upload Permission can't be send "
                    "(SMTP error).") from exc
        return upload_permissions
예제 #8
0
 def user_disk_space(self, context, request: TracimRequest, hapic_data=None):
     """
     Get user space infos.
     """
     app_config = request.registry.settings["CFG"]  # type: CFG
     uapi = UserApi(
         current_user=request.current_user, session=request.dbsession, config=app_config  # User
     )
     return uapi.get_user_with_context(request.candidate_user)
예제 #9
0
 def user(self, context, request: TracimRequest, hapic_data=None):
     """
     Get user infos.
     """
     app_config = request.registry.settings['CFG']
     uapi = UserApi(
         current_user=request.current_user,  # User
         session=request.dbsession,
         config=app_config,
     )
     return uapi.get_user_with_context(request.candidate_user)
예제 #10
0
 def users(self, context, request: TracimRequest, hapic_data=None):
     """
     Get all users
     """
     app_config = request.registry.settings["CFG"]  # type: CFG
     uapi = UserApi(
         current_user=request.current_user, session=request.dbsession, config=app_config  # User
     )
     users = uapi.get_all()
     context_users = [uapi.get_user_with_context(user) for user in users]
     return context_users
예제 #11
0
 def account(self, context, request: TracimRequest, hapic_data=None):
     """
     Get user infos.
     """
     app_config = request.registry.settings['CFG']
     uapi = UserApi(
         current_user=request.current_user,  # User
         session=request.dbsession,
         config=app_config,
     )
     return uapi.get_user_with_context(request.current_user)
예제 #12
0
 def whoami(self, context, request: TracimRequest, hapic_data=None):
     """
     Return current logged-in user.
     If user is not authenticated or the session has expired, a 401 is returned.
     This is the recommanded way to check if the user is already authenticated
     """
     app_config = request.registry.settings["CFG"]  # type: CFG
     uapi = UserApi(request.current_user,
                    session=request.dbsession,
                    config=app_config)
     user = uapi.get_current_user()  # User
     return uapi.get_user_with_context(user)
예제 #13
0
 def whoami(self, context, request: TracimRequest, hapic_data=None):
     """
     Return current logged-in user.
     If user is not authenticated or the session has expired, a 401 is returned.
     This is the recommanded way to check if the user is already authenticated
     """
     app_config = request.registry.settings['CFG']
     uapi = UserApi(
         request.current_user,
         session=request.dbsession,
         config=app_config,
     )
     user = uapi.get_current_user()  # User
     return uapi.get_user_with_context(user)
예제 #14
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
예제 #15
0
 def set_user_username(self, context, request: TracimRequest, hapic_data=None):
     """
     Set user username
     """
     app_config = request.registry.settings["CFG"]  # type: CFG
     uapi = UserApi(
         current_user=request.current_user, session=request.dbsession, config=app_config  # User
     )
     user = uapi.set_username(
         request.candidate_user,
         hapic_data.body.loggedin_user_password,
         hapic_data.body.username,
         do_save=True,
     )
     return uapi.get_user_with_context(user)
예제 #16
0
 def set_user_email(self, context, request: TracimRequest, hapic_data=None):
     """
     Set user Email
     """
     app_config = request.registry.settings['CFG']
     uapi = UserApi(
         current_user=request.current_user,  # User
         session=request.dbsession,
         config=app_config,
     )
     user = uapi.set_email(request.candidate_user,
                           hapic_data.body.loggedin_user_password,
                           hapic_data.body.email,
                           do_save=True)
     return uapi.get_user_with_context(user)
예제 #17
0
 def users(self, context, request: TracimRequest, hapic_data=None):
     """
     Get all users
     """
     app_config = request.registry.settings['CFG']
     uapi = UserApi(
         current_user=request.current_user,  # User
         session=request.dbsession,
         config=app_config,
     )
     users = uapi.get_all()
     context_users = [
         uapi.get_user_with_context(user) for user in users
     ]
     return context_users
예제 #18
0
 def set_user_infos(self, context, request: TracimRequest, hapic_data=None):
     """
     Set user info data
     """
     app_config = request.registry.settings['CFG']
     uapi = UserApi(
         current_user=request.current_user,  # User
         session=request.dbsession,
         config=app_config,
     )
     user = uapi.update(request.candidate_user,
                        name=hapic_data.body.public_name,
                        timezone=hapic_data.body.timezone,
                        lang=hapic_data.body.lang,
                        do_save=True)
     return uapi.get_user_with_context(user)
예제 #19
0
파일: event.py 프로젝트: grignards/tracim
    def _create_role_event(self, operation: OperationType,
                           role: UserRoleInWorkspace,
                           context: TracimContext) -> None:
        current_user = context.safe_current_user()
        workspace_api = WorkspaceApi(
            session=context.dbsession,
            config=self._config,
            show_deleted=True,
            # INFO - G.M - 2020-17-09 - we do explicitly don't set user here to not
            # have filter on workspace, in some case we do want user create event on workspace
            # he doesn't have access: when he remove itself from workspace for example
            current_user=None,
        )
        workspace_in_context = workspace_api.get_workspace_with_context(
            workspace_api.get_one(role.workspace_id))
        user_api = UserApi(current_user,
                           context.dbsession,
                           self._config,
                           show_deleted=True)
        role_api = RoleApi(current_user=current_user,
                           session=context.dbsession,
                           config=self._config)
        try:
            user_field = EventApi.user_schema.dump(
                user_api.get_user_with_context(user_api.get_one(
                    role.user_id))).data
        except UserDoesNotExist:
            # It is possible to have an already deleted user when deleting his roles.
            user_field = None

        role_in_context = role_api.get_user_role_workspace_with_context(role)
        fields = {
            Event.USER_FIELD:
            user_field,
            Event.WORKSPACE_FIELD:
            EventApi.workspace_schema.dump(workspace_in_context).data,
            Event.MEMBER_FIELD:
            EventApi.workspace_user_role_schema.dump(role_in_context).data,
        }
        event_api = EventApi(current_user, context.dbsession, self._config)
        event_api.create_event(
            entity_type=EntityType.WORKSPACE_MEMBER,
            operation=operation,
            additional_fields=fields,
            context=context,
        )
예제 #20
0
 def set_account_email(self, context, request: TracimRequest, hapic_data=None):
     """
     Set user Email
     """
     app_config = request.registry.settings['CFG']
     uapi = UserApi(
         current_user=request.current_user,  # User
         session=request.dbsession,
         config=app_config,
     )
     user = uapi.set_email(
         request.current_user,
         hapic_data.body.loggedin_user_password,
         hapic_data.body.email,
         do_save=True
     )
     return uapi.get_user_with_context(user)
예제 #21
0
    def login(self, context, request: TracimRequest, hapic_data=None):
        """
        Logs the user into the system.
        In case of success, the JSON returned is the user profile.
        In that case, a cookie is created with a session_key and an expiration date.
        Eg. : `session_key=932d2ad68f3a094c2d4da563ccb921e6479729f5b5f707eba91d4194979df20831be48a0; expires=Mon, 22-Oct-2018 19:37:02 GMT; Path=/; SameSite=Lax`
        """

        login = hapic_data.body
        app_config = request.registry.settings["CFG"]  # type: CFG
        uapi = UserApi(None, session=request.dbsession, config=app_config)
        ldap_connector = None
        if AuthType.LDAP in app_config.AUTH_TYPES:
            ldap_connector = get_ldap_connector(request)
        user = uapi.authenticate(login.email, login.password, ldap_connector)
        remember(request, user.user_id)
        return uapi.get_user_with_context(user)
예제 #22
0
 def known_members(self, context, request: TracimRequest, hapic_data=None):
     """
     Get known users list
     """
     app_config = request.registry.settings['CFG']
     uapi = UserApi(
         current_user=request.candidate_user,  # User
         session=request.dbsession,
         config=app_config,
         show_deactivated=False,
     )
     users = uapi.get_known_user(
         acp=hapic_data.query.acp,
         exclude_user_ids=hapic_data.query.exclude_user_ids,
         exclude_workspace_ids=hapic_data.query.exclude_workspace_ids,
     )
     context_users = [uapi.get_user_with_context(user) for user in users]
     return context_users
예제 #23
0
 def set_account_infos(self, context, request: TracimRequest, hapic_data=None):
     """
     Set user info data
     """
     app_config = request.registry.settings['CFG']
     uapi = UserApi(
         current_user=request.current_user,  # User
         session=request.dbsession,
         config=app_config,
     )
     user = uapi.update(
         request.current_user,
         name=hapic_data.body.public_name,
         timezone=hapic_data.body.timezone,
         lang=hapic_data.body.lang,
         do_save=True
     )
     return uapi.get_user_with_context(user)
예제 #24
0
 def set_user_infos(self, context, request: TracimRequest, hapic_data=None):
     """
     Set user info data
     """
     app_config = request.registry.settings["CFG"]  # type: CFG
     uapi = UserApi(
         current_user=request.current_user, session=request.dbsession, config=app_config  # User
     )
     user = uapi.update(
         request.candidate_user,
         auth_type=request.candidate_user.auth_type,
         name=hapic_data.body.public_name,
         timezone=hapic_data.body.timezone,
         lang=hapic_data.body.lang,
         do_save=True,
     )
     uapi.execute_updated_user_actions(user)
     return uapi.get_user_with_context(user)
예제 #25
0
 def account_known_members(self, context, request: TracimRequest, hapic_data=None):
     """
     Get known users list
     """
     app_config = request.registry.settings['CFG']
     uapi = UserApi(
         current_user=request.current_user,  # User
         session=request.dbsession,
         config=app_config,
         show_deactivated=False,
     )
     users = uapi.get_known_user(
         acp=hapic_data.query.acp,
         exclude_user_ids=hapic_data.query.exclude_user_ids,
         exclude_workspace_ids=hapic_data.query.exclude_workspace_ids,
     )
     context_users = [
         uapi.get_user_with_context(user) for user in users
     ]
     return context_users
예제 #26
0
파일: event.py 프로젝트: grignards/tracim
 def _create_user_event(self, operation: OperationType, user: User,
                        context: TracimContext) -> None:
     current_user = context.safe_current_user()
     user_api = UserApi(
         current_user=current_user,
         session=context.dbsession,
         config=self._config,
         show_deleted=True,
     )
     fields = {
         Event.USER_FIELD:
         EventApi.user_schema.dump(
             user_api.get_user_with_context(user)).data
     }
     event_api = EventApi(current_user, context.dbsession, self._config)
     event_api.create_event(
         entity_type=EntityType.USER,
         operation=operation,
         additional_fields=fields,
         context=context,
     )
예제 #27
0
 def known_members(self, context, request: TracimRequest, hapic_data=None):
     """
     Get known users list
     """
     app_config = request.registry.settings["CFG"]  # type: CFG
     uapi = UserApi(
         current_user=request.candidate_user,  # User
         session=request.dbsession,
         config=app_config,
         show_deactivated=False,
     )
     users = uapi.get_known_users(
         acp=hapic_data.query.acp,
         exclude_user_ids=hapic_data.query.exclude_user_ids,
         exclude_workspace_ids=hapic_data.query.exclude_workspace_ids,
         include_workspace_ids=hapic_data.query.include_workspace_ids,
         limit=hapic_data.query.limit,
         filter_results=app_config.KNOWN_MEMBERS__FILTER,
     )
     context_users = [uapi.get_user_with_context(user) for user in users]
     return context_users
예제 #28
0
    def login(self, context, request: TracimRequest, hapic_data=None):
        """
        Logs the user into the system.
        In case of success, the JSON returned is the user profile.
        In that case, a cookie is created with a session_key and an expiration date.
        Eg. : `session_key=932d2ad68f3a094c2d4da563ccb921e6479729f5b5f707eba91d4194979df20831be48a0; expires=Mon, 22-Oct-2018 19:37:02 GMT; Path=/; SameSite=Lax`
        """

        login = hapic_data.body
        app_config = request.registry.settings['CFG']  # type: CFG
        uapi = UserApi(
            None,
            session=request.dbsession,
            config=app_config,
        )
        ldap_connector = None
        if AuthType.LDAP in app_config.AUTH_TYPES:
            ldap_connector = get_ldap_connector(request)
        user = uapi.authenticate(login.email, login.password, ldap_connector)
        remember(request, user.user_id)
        return uapi.get_user_with_context(user)
예제 #29
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][calendar] Should test this
     # with true value when those param will be available.
     assert new_user.avatar_url is None
     assert new_user.calendar_url is None