Пользователь может редактировать заголовок заблокированного поста (опять возможно)

Эта тема закрыта:

Но на нашей установке (самая свежая версия Discourse) это всё ещё/снова возможно для пользователей уровня TL3 и выше.

Пользователи TL3 могут изменять заголовок, категорию и теги оригинального сообщения даже в заблокированных темах.

Администратор блокирует сообщение:

Пользователь TL3 всё ещё может редактировать/изменять заблокированное сообщение:

Это работает по замыслу (надеюсь, что нет) или это старая ошибка, которая снова прокралась в код?

1 лайк

Если я правильно понимаю, это работает «как задумано» по крайней мере в коде:

Участники уровня TL3 не могут редактировать сообщения только если тема заархивирована или является личным сообщением.

Думаю, вы можете изменить параметр trusted_users_can_edit_others, если хотите отключить это поведение. Насколько мне известно, значение по умолчанию для trusted_users_can_edit_others не false, чтобы сохранить совместимость с тем, как всё работало до введения этой настройки.

3 лайка

В чем тогда смысл блокировки постов? Его нет. Или я его не нашел, следовательно, эта функция либо устарела, либо неисправна, либо по крайней мере запутанна.

image

В тексте четко сказано: «сотрудник заблокировал этот пост для редактирования». Если блокировка имеет совершенно другую цель, чем защита поста/темы от редактирования автором (OP), то этот текст следует изменить.

Заблокированные посты НЕ должны быть доступны для редактирования пользователями, не являющимися сотрудниками, несмотря на настройку, позволяющую пользователям с высоким уровнем доверия редактировать посты (что нам в целом нравится, но не для заблокированных постов, конечно).

Как следует из кода ниже, «блокировка» поста в настоящее время означает, что редактировать пост больше не может ТОЛЬКО автор (OP) этого поста. Пользователи TL3, TL4 (и сотрудники) по-прежнему могут редактировать заблокированный пост (если это разрешено в настройках).

Это сильно ограничивает функцию блокировки крайне узким случаем использования.

Как мне защитить очень важное официальное объявление администратора от того, чтобы какой-то один недобросовестный пользователь TL3 не изменил его на «Это пост Микки Мауса», не присвоил ему неверные теги и не переместил в нерелевантную категорию, но при этом хотел бы, чтобы пользователи TL3/TL4 могли редактировать посты в целом?

«Заблокированный» должен означать «заблокированный» (например, недоступный для редактирования) для всех, кроме сотрудников.

  def can_edit_topic?(topic)
    return false if Discourse.static_doc_topic_ids.include?(topic.id) && !is_admin?
    return false unless can_see?(topic)

    return true if is_admin?
    return true if is_moderator? && can_create_post?(topic)

    # нельзя редактировать темы в защищенных категориях, где у вас нет прав на создание тем
    # за исключением небольшого крайнего случая, когда тема не имеет категории, и вы пытаетесь
    # исправить это, но создание тем без категории отключено
    if (
      SiteSetting.allow_uncategorized_topics ||
      topic.category_id != SiteSetting.uncategorized_category_id
    )
      return false if !can_create_topic_on_category?(topic.category)
    end

    # Пользователи TL4 могут редактировать архивированные темы, но не могут редактировать личные сообщения
    return true if (
      SiteSetting.trusted_users_can_edit_others? &&
      topic.archived &&
      !topic.private_message? &&
      user.has_trust_level?(TrustLevel[4]) &&
      can_create_post?(topic)
    )

    # Пользователи TL3 не могут редактировать архивированные темы и личные сообщения
    return true if (
      SiteSetting.trusted_users_can_edit_others? &&
      !topic.archived &&
      !topic.private_message? &&
      user.has_trust_level?(TrustLevel[3]) &&
      can_create_post?(topic)
    )

    return false if topic.archived
    is_my_own?(topic) &&
      !topic.edit_time_limit_expired?(user) &&
      **!Post.where(topic_id: topic.id, post_number: 1).where.not(locked_by_id: nil).exists**
  end
2 лайка

И это становится ещё запутаннее…

Topic guardian позволяет пользователям TL3 и TL4 редактировать заблокированную тему/сообщение (первое сообщение), но post guardian (см. код ниже) запрещает пользователям TL3 и TL4 редактировать заблокированное сообщение, не являющееся первым:

def can_edit_post?(post)
  if Discourse.static_doc_topic_ids.include?(post.topic_id) && !is_admin?
    return false
  end

  return true if is_admin?

  # Must be staff to edit a locked post
  return false if post.locked? && !is_staff?

@eviltrout, так ли это задумано? На мой взгляд, было бы логичнее (и полезнее как функция блокировки), если бы topic guardian работал так же, как post guardian учитывает состояние блокировки. Как я уже сказал, я не против, чтобы пользователи TL3 и TL4 могли редактировать незаблокированные сообщения, но не заблокированные (включая первое сообщение).

1 лайк

Стоит посмотреть на файлы rspec.

1 лайк

Я уже сделал это. Но само по себе то, как оба стражника по-разному обрабатывают заблокированное состояние, вызывает путаницу.

Должно быть так, как обрабатывает заблокированное состояние стражник постов, то есть # Редактировать заблокированный пост могут только сотрудники.

Я имею в виду, что в настоящее время заблокированные посты (кроме первого) действительно заблокированы (пользователи TL3+ не могут их редактировать/изменять), а заблокированные исходные посты (OP) вообще не заблокированы (кроме как для самого автора OP, пользователи TL3+ всё ещё могут их редактировать/изменять). Это совершенно бессмысленно, особенно потому, что ни у TL3, ни у TL4 нет разрешения блокировать посты или темы.

В свете этого заблокированные исходные посты (OP) также должны быть действительно заблокированы для редактирования пользователями TL3+, несмотря на настройку, позволяющую им редактировать (незаблокированные) посты и темы.

2 лайка

Это действительно похоже на баг, @j.jaffeux — заблокированный пост не должен быть доступен для редактирования никому, кроме сотрудников, иначе в чём смысл?

5 лайков

Спасибо за подтверждение, @codinghorror

Да, это баг, и оба стража действительно должны блокировать пост независимо от позиции и настройки, позволяющей пользователям TL3 и TL4 редактировать посты. Я действительно приложил все усилия, чтобы объяснить это во всех подробностях.

1 лайк

Можешь назначить это @eviltrout? Текущее поведение, кажется, неправильное.

1 лайк

Я создал PR здесь

Объединено, закрываю эту тему.

5 лайков