Usuário consegue editar título de post travado (ainda/novamente possível)

Este tópico foi fechado:

Mas na nossa instalação (versão mais recente do Discourse), isso ainda é/está novamente possível para usuários com nível TL3 ou superior.

TL3 pode alterar o título do OP, a categoria e as tags mesmo em tópicos bloqueados.

Admin bloqueia o tópico:

TL3 ainda pode editar/alterar o tópico bloqueado:

Isso está funcionando como previsto (espero que não) ou é um bug antigo que voltou a circular no código?

1 curtida

Se eu entendi corretamente, isso está funcionando conforme “previsto” pelo código, pelo menos:

Usuários de nível TL3 não podem editar apenas se o tópico estiver arquivado ou se for uma MP.

Acho que você pode alterar trusted_users_can_edit_others se quiser desativar esse comportamento. Pelo que sei, o padrão para trusted_users_can_edit_others não é false para manter a consistência com o comportamento anterior à introdução dessa configuração.

3 curtidas

Qual é então o propósito de travar posts? Não há nenhum. Ou eu não encontrei um, portanto, o recurso está obsoleto, defeituoso ou, pelo menos, confuso.

image

O texto diz claramente: “um membro da equipe travou este post para que não possa ser editado”. Se o travamento tiver um propósito completamente diferente de proteger o OP do post/tópico de ser editado, esse texto deve ser alterado.

Posts travados NÃO devem ser editáveis por usuários que não sejam da equipe, apesar da configuração que permite que usuários com alto nível de confiança editem posts (o que gostamos em geral, mas não para posts travados, é claro).

Pelo que parece no código abaixo, “travar” um post atualmente significa que APENAS o OP do post não pode mais editá-lo. Usuários TL3, TL4 (e da equipe) ainda podem editar um post travado (se habilitado nas configurações).

Isso limita muito o recurso de travamento a um caso de uso extremamente restrito.

Como protejo um anúncio oficial muito importante da administração contra a alteração por um usuário TL3 mal-intencionado para algo como “Este é um post do Mickey Mouse”, com a tag errada e movido para uma categoria não relevante, mas ainda assim quero que usuários TL3/TL4 tenham a capacidade de editar posts em geral?

Travado deve significar travado (ou seja, não editável) para todos, exceto para a equipe.

  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)

    # não é possível editar tópicos em categorias seguras onde você não tem permissão para criar tópicos
    # exceto para um pequeno caso limite em que o tópico está sem categoria e você está tentando
    # corrigi-lo, mas a categoria sem categoria está desabilitada
    if (
      SiteSetting.allow_uncategorized_topics ||
      topic.category_id != SiteSetting.uncategorized_category_id
    )
      return false if !can_create_topic_on_category?(topic.category)
    end

    # Usuários TL4 podem editar tópicos arquivados, mas não podem editar mensagens privadas
    return true if (
      SiteSetting.trusted_users_can_edit_others? &&
      topic.archived &&
      !topic.private_message? &&
      user.has_trust_level?(TrustLevel[4]) &&
      can_create_post?(topic)
    )

    # Usuários TL3 não podem editar tópicos arquivados e mensagens privadas
    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 curtidas

E fica ainda mais confuso…

O topic guardian permite que usuários TL3 e TL4 editem um tópico/post bloqueado (o post número 1), mas o post guardian (veja o código abaixo) impede que usuários TL3 e TL4 editem um post não-OP bloqueado:

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?

# É necessário ser staff para editar um post bloqueado
return false if post.locked? && !is_staff?

@eviltrout, é assim que deveria funcionar? Na minha opinião, seria mais lógico (e mais valioso como recurso de bloqueio) se o topic guardian funcionasse da mesma forma que o post guardian respeita o estado bloqueado. Como dito, estou feliz em permitir que TL3 e TL4 editem posts não bloqueados, mas não os bloqueados (isso inclui o primeiro post).

1 curtida

Vale a pena dar uma olhada nos arquivos rspec.

1 curtida

Já fiz isso. Mas apenas observar como os dois guardiões tratam o estado bloqueado já é confuso por si só.

Deveria ser da maneira como o guardião de post lida com o estado bloqueado, ou seja, # Deve ser staff para editar um post bloqueado.

Quero dizer, atualmente, posts não iniciais bloqueados estão realmente bloqueados (usuários TL3+ não podem editar/alterar), enquanto posts OP bloqueados não estão bloqueados de forma alguma (além do OP, usuários TL3+ ainda podem editar/alterar). Isso não faz sentido nenhum para mim, especialmente porque nem TL3 nem TL4 têm permissão para bloquear um post ou tópico.

Diante disso, os OPs bloqueados também deveriam estar realmente bloqueados para edição por usuários TL3+, apesar da configuração que permite que eles editem posts e tópicos (não bloqueados).

2 curtidas

Isso realmente parece ser um bug @j.jaffeux — um post bloqueado não deveria ser editável por ninguém além da equipe, caso contrário, qual seria o ponto?

5 curtidas

Obrigado por reconhecer isso, @codinghorror

Sim, é um bug e ambos os guardiões deveriam realmente bloquear uma postagem, independentemente da posição e da configuração que permite que TL3 e TL4 editem postagens. Fiz o meu melhor para explicar tudo em detalhes.

1 curtida

Você pode atribuir este a @eviltrout? O comportamento atual não parece correto para mim.

1 curtida

Abri um PR aqui

Mesclado, fechando este tópico.

5 curtidas