Баг(и) в обработке URI в markdown-контенте в Discourse

urn:records:test:3 — это валидный URI по стандарту RFC 3986.

Discourse не обрабатывает его корректно, независимо от используемого markdown.

  • Просто вставьте его, как HTTP-URI, и Discourse полностью игнорирует тот факт, что это URI, как здесь: urn:records:test:3.

  • Оберните его в <>, как <urn:records:test:3>, и Discourse меняет местами последние два сегмента, как здесь: urn:records:3:test. При нажатии правой кнопки мыши и копировании вы получите либо urn:records, либо test:3, в зависимости от точного положения курсора мыши. При левом клике ничего не происходит, так как это не совсем корректно обрабатывается как URI.

  • Используйте полную разметку ссылки, например [текст над `urn:records:test:3`](urn:records:test:3), и Discourse опускает последний сегмент из копируемого при правой кнопке мыши — и снова некликабельного — URI. Вот пример вживую: текст над urn:records:test:3, где при копировании правой кнопкой мыши получится urn:records:test, или как в [`urn:records:test:3`](urn:records:test:3), вот пример вживую: urn:records:test:3, где при копировании правой кнопкой мыши получится urn:records:test или 3, в зависимости от точного положения курсора мыши.

Я не проводил исчерпывающего тестирования всех допустимых конструкций URI. urn:records:test:3 просто оказался реальным локальным примером.

3 лайка

Действительно, настройка сайта allowed_href_schemes работает только со схемами, использующими формат scheme://.

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

4 лайка

Не могу понять, признаётся ли здесь ошибка или говорится: «да, это ожидаемое поведение»…

Пожалуйста, уточните?

1 лайк

Это действительно ошибка. Она вызвана нашим кодом санитизации, который распознаёт только схемы href, начинающиеся с формата scheme://.

5 лайков

Я только что столкнулся с этой ошибкой с geo URI, которые выглядят как geo:36.95733984,-122.0172856.

Я вижу, что для tel URI есть исключение:

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

Есть Uniform Resource Identifier (URI) Schemes, но я использовал List of URI schemes - Wikipedia, чтобы проверить схемы, так как там есть примеры. Я смотрю на, э-э, «суффикс» названия схемы, :// (как это называется? «Формат схемы»?).

При тщательном визуальном осмотре кажется, что используются только три шаблона:

  • ://
  • :/
  • :

Мой мозг с трудом отслеживает, где именно это происходит в связи с написанием markdown и конвертацией в href, но я думаю, что если мы сможем понять, как проверять эти три формата, то будем в порядке для любой схемы, добавленной администратором.

Не знаю, как проводить валидацию по каждой схеме… :thinking:


Мои неофициальные кодовые названия для форматов:

  • : «наблюдающий»
  • :/ «скептически настроенный»
  • :// — «двойно скептически настроенный»
1 лайк

Копирование и вставка следующего текста в Discourse:

Для безопасного обмена сообщениями и звонков свяжитесь со мной через Snikket/XMPP по адресу xmpp:maiki@chat.v2.talkgroup.xyz.

даёт результат (при добавлении xmpp в allowed href schemes):

Для безопасного обмена сообщениями и звонков свяжитесь со мной через Snikket/XMPP по адресу <a href="mailto:xmpp:maiki@chat.v2.talkgroup.xyz" dir="ltr">xmpp:maiki@chat.v2.talkgroup.xyz</a>.

В данном случае проблема заключается в href="mailto:xmpp:maiki@chat.v2.talkgroup.xyz". Отмечаю это как пример использования для данной ошибки. :slight_smile:

2 лайка

Может ли это быть каким-то обходным путём для GEO URI? Я не разработчик.