Babble: Administradores não conseguem ver um grupo definido como `group owner` com visibilidade restrita

Acabei de encontrar isso em um fórum que administro. Passos para reproduzir:

  1. Crie um novo grupo como administrador
  2. Defina a visibilidade para “proprietários do grupo”
  3. Crie o grupo
  4. Volte para /g
  5. O grupo não aparecerá

Se você verificar o console usando Group.find_by(name: <nome>), ele retorna corretamente. Alterar a visibilidade para “Proprietários do grupo e equipe” faz com que a visibilidade seja retornada.

A menos que isso seja intencional, minha suposição é de que até mesmo administradores deveriam ver grupos nesse nível de visibilidade (embora moderadores não).

Não percebi esse comportamento até fazer a atualização para a versão 2.4.0.beta2 ontem.

Recarregar ajuda?

Não, e até mesmo ao buscar no endpoint JSON, o grupo não aparece como administrador.

Trabalhei nisso recentemente, vou dar uma olhada.

É. Não parecia o tipo de coisa que você deixaria passar, mas era tudo o que eu tinha. :wink:

Não consigo reproduzir isso, @justin. Testei localmente e em uma instância hospedada na DO, e também tentei criar um grupo a partir de duas contas de administrador diferentes. Em todos os casos, os administradores veem todos os grupos.

Estranho – vou ter que tentar fazer isso em uma instalação limpa. Posso confirmar o problema em uma instância de produção que tenho. Vou tentar atualizá-la e ver o que acontece.

Testei em uma instalação limpa e obtive os mesmos resultados que você, @pmusaraj. Acho que é um plugin que estou usando. Se descobrir o que está acontecendo, volto a dar um retorno.

Eu também encontrei esse problema…

Você também está usando plugins? Quais (focando naqueles que o Discourse não cria e não envia por padrão)… ou você está dizendo que isso é uma nova regressão, @justin?

Olá, acabei de alterar a visibilidade de um grupo de “Proprietários do grupo” para “Proprietários e membros do grupo” e ele ficou visível novamente. Gostaria de saber se há algo estranho no código da configuração de visibilidade de um grupo quando ela é restrita a “Proprietários do grupo”?

@outofthebox Você por acaso tem o plugin de chat Babble instalado? Parece ser uma regressão relacionada a isso depois que eu o removi da minha instância. Desinstalar esse plugin e reconstruir trouxe de volta a visibilidade do grupo.

Ótima descoberta, @justin. Dei uma olhada rápida no código-fonte do Babble e parece haver um conflito com minhas atualizações nos grupos do núcleo. O Babble adiciona uma regra hardcoded para visibility_level: 4, que agora entra em conflito com o grupo owners no núcleo.

Espero que @gdpelican possa ter tempo para dar uma olhada.

Como corrigir isso para a versão atual do Discourse?
Devo excluir este código? .where.not(visibility_level: 4)

  @@visible_group_scope = method(:visible_groups).clone
  scope :visible_groups, ->(user, order = nil, opts = {}) {
    @@visible_group_scope.call(user, order, opts)
  }
end

Ok, então mergulhei um pouco mais fundo nessa questão.

Parece que o babble atribuiu seu próprio visibility_level para uso próprio e pegou a próxima constante não utilizada (4).

Algumas semanas atrás, o código principal do Discourse também adicionou um novo visibility_level e pegou a próxima constante não utilizada, que também era 4. Isso causou o uso duplicado dessa constante.

Portanto, uma correção consistiria em duas partes:

  • alterar o visibility_level usado pelo babble. Isso seria fácil. Se quiséssemos fazer isso de forma muito organizada, cada plugin registraria seu próprio BASE_VISIBILITY_LEVEL para evitar conflitos futuros. Mas, por enquanto, poderíamos simplesmente escolher algo (por exemplo, 1001).
  • alterar os grupos com visibility_level 4 para a nova constante — mas apenas os grupos que eram usados pelo babble.
    Essa consulta selecionaria os grupos corretos, @gdpelican?
UPDATE groups 
SET visibility_level = 1001 
WHERE id IN (
  SELECT g.id 
  FROM topics t 
  LEFT JOIN topic_allowed_groups tag ON tag.topic_id = t.id 
  LEFT JOIN groups g ON g.id = tag.group_id 
  WHERE t.archetype='chat');

Oi, desculpe. Vou dar uma olhada nisso nos próximos dias, mas seu esboço geral da correção está perfeito. O backport será a parte complicada; vou examinar mais de perto em breve.

Certo, apliquei uma correção para isso. Me avise se você notar qualquer outra coisa estranha?

Encontrei um problema: parece que a funcionalidade do Backfiller não possui suporte para multisite (é necessário iterar pelas conexões disponíveis).

@RGJ Você topa abrir um PR para isso? Posso mesclar, mas terei conectividade limitada nos próximos dias.

Claro, conseguirei fazer isso neste fim de semana.