Bug(s) no tratamento do Discourse de URIs em conteúdo markdown

urn:records:test:3 é um URI válido RFC 3986.

O Discourse não o trata corretamente, não importa qual markdown seja usado.

  • Basta colá-lo, como um URI HTTP, e o Discourse ignora completamente o fato de ser um URI, como aqui: urn:records:test:3.

  • Envolva-o em <>, como <urn:records:test:3>, e o Discourse inverte os dois últimos segmentos, como aqui: urn:records:3:test. Clique com o botão direito e copie; você obterá urn:records ou test:3, dependendo exatamente da posição do cursor do mouse. Clique com o botão esquerdo e nada acontece, porque não é tratado completamente como um URI.

  • Coloque-o na marcação completa de link, ou seja, [texto sobre `urn:records:test:3`](urn:records:test:3), e o Discourse remove o último segmento do URI copiável com o botão direito — e novamente, não clicável ao vivo — URI, ao vivo aqui em texto sobre urn:records:test:3, onde um clique direito e cópia resultará em urn:records:test, ou como em [`urn:records:test:3`](urn:records:test:3), ao vivo aqui em urn:records:test:3, onde um clique direito e cópia resultará em urn:records:test ou 3, dependendo exatamente da posição do cursor do mouse.

Não realizei testes exaustivos de todas as construções de URI válidas. urn:records:test:3 simplesmente acontece de ser um exemplo local do mundo real.

3 curtidas

De fato, a configuração do site allowed_href_schemes só funciona com esquemas que usam o formato scheme://.

https://github.com/discourse/discourse/blob/master/app/assets/javascripts/pretty-text/addon/sanitizer.js#L59

4 curtidas

Não consigo dizer se isso está reconhecendo um bug ou dizendo “sim, esse é o comportamento esperado”…

Por favor, esclareça?

1 curtida

Isso é de fato um bug. É causado pelo nosso código de sanitização, que reconhece apenas esquemas de href que começam no formato scheme://.

5 curtidas

Acabei de encontrar esse bug com o URI geo, que se parece com geo:36.95733984,-122.0172856.

Vejo que há uma exceção para o URI tel:

    if (allowedHrefSchemes.includes("tel")) {
      extraHrefMatchers.push(new RegExp("^tel://\\+?[\\w\\.\\-]+", "i"));

Existe Uniform Resource Identifier (URI) Schemes, mas usei List of URI schemes - Wikipedia para verificar os esquemas, pois eles incluem exemplos. Estou olhando para o, hum, “sufixo” do nome do esquema, o :// (como se chama isso? “Formato do esquema”?).

De uma cuidadosa olhada, parece que só existem três padrões usados:

  • ://
  • :/
  • :

Meu cérebro está tendo dificuldade em acompanhar onde isso está acontecendo em relação à escrita do markdown e conversão para href, mas acho que, se conseguirmos descobrir como verificar esses três formatos, estaremos seguros para qualquer esquema adicionado pelo administrador.

Sem ideia de como validar por esquema… :thinking:


Meus nomes de código não oficiais para os formatos:

  • : “observando”
  • :/ “cético”
  • :// - “duplamente cético”
1 curtida

Copiando e colando o seguinte no Discourse:

Para mensagens seguras e chamadas, conecte-se comigo via Snikket/XMPP em xmpp:maiki@chat.v2.talkgroup.xyz.

Produz (com xmpp adicionado a allowed href schemes):

Para mensagens seguras e chamadas, conecte-se comigo via Snikket/XMPP em <a href="mailto:xmpp:maiki@chat.v2.talkgroup.xyz" dir="ltr">xmpp:maiki@chat.v2.talkgroup.xyz</a>.

O href="mailto:xmpp:maiki@chat.v2.talkgroup.xyz" é o problema neste caso. Registrando como um caso de uso para este bug. :slight_smile:

2 curtidas

Isso pode ser de alguma forma uma solução alternativa para URIs GEO? Não sou um desenvolvedor.