MarkdownコンテンツにおけるURIのDiscourseでの処理に関するバグ

urn:records:test:3 は有効な RFC 3986 URI です。

どのような Markdown を使用しても、Discourse はこれを正しく処理しません。

  • HTTP URI のようにそのまま貼り付けると、Discourse はそれが URI であることを完全に無視します。例:urn:records:test:3。
  • \u003c\u003e で囲んで \u003curn:records:test:3\u003e とすると、Discourse は最後の 2 つのセグメントを反転させてしまいます。例:\u003curn:records:test:3\u003e。右クリックしてコピーすると、マウスカーソルの位置によって urn:records または test:3 のどちらかが取得されます。左クリックしても何も起こりません。これは完全に URI として扱われていないためです。
  • 完全なリンク記法、つまり [text over `urn:records:test:3`](urn:records:test:3) のように記述すると、Discourse は右クリックでコピー可能な(しかし依然としてクリック不能な)URI から最後のセグメントを削除してしまいます。実際の動作は text over 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

確かにバグです。これは、scheme:// 形式で始まる href スキームのみを認識する当社のサニタイザーコードが原因です。

「いいね!」 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 を使いました。私は、ええと、スキーム名の「接尾辞」、つまり :// に注目しています(あれは何と呼ぶのでしょうか?「スキーム形式」?)。

慎重に見てみると、使われているパターンは以下の 3 つだけのように思えます:

  • ://
  • :/
  • :

Markdown の記述と href への変換のどこでこの処理が行われているのか、私の頭では追いきれていませんが、もしこの 3 つの形式をチェックする方法が分かれば、管理者が追加する任意のスキームに対応できるはずです。

スキームごとの検証方法についてはわかりません… :thinking:


私が勝手に名付けた形式のコードネーム:

  • : 「観察」
  • :/ 「懐疑的」
  • :// 「二重の懐疑的」
「いいね!」 1

Discourse に以下のテキストをコピー&ペーストすると:

安全なメッセージングや通話については、Snikket/XMPP で xmpp:maiki@chat.v2.talkgroup.xyz までご連絡ください。

allowed href schemesxmpp を追加した状態で以下のように生成されます:

For secure messaging and calls connect with me over Snikket/XMPP at <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の回避策として機能しますか?開発者ではありません。