Markdown 콘텐츠에서 URI 처리 관련 Discourse 버그

urn:records:test:3은 RFC 3986 URI로 유효합니다.

Discourse는 어떤 마크다운을 사용하더라도 이를 제대로 처리하지 않습니다.

  • HTTP URI처럼 단순히 붙여넣으면, Discourse는 이것이 URI라는 사실을 완전히 무시합니다. 예: urn:records:test:3.

  • <>로 감싸서 <urn:records:test:3>처럼 작성하면, Discourse는 마지막 두 세그먼트를 뒤집습니다. 예: urn:records:3:test. 우클릭하여 복사하면 마우스 커서의 정확한 위치에 따라 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:36.95733984,-122.0172856과 같은 형태의 geo URI에서 이 버그를 마주하게 되었습니다.

tel URI에 대한 예외 처리가 있다는 것을 확인했습니다:

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

Uniform Resource Identifier (URI) Schemes 가 있지만, 예시가 포함되어 있어 List of URI schemes - Wikipedia 를 참고하여 스킴을 확인했습니다. 저는 그, 음, 스킴 이름의 “접미어” 부분, 즉 :// (이걸 뭐라고 부르는 걸까요? “스킴 형식”?)을 보고 있습니다.

주의 깊게 눈으로 확인해 본 결과, 사용된 패턴은 단 세 가지인 것 같습니다:

  • ://
  • :/
  • :

마크다운을 작성하고 href로 변환하는 과정에서 이것이 어디에서 일어나는지를 파악하는 데 제 머리가 좀 버거워지지만, 이 세 가지 형식을 확인하는 방법을 알아낸다면 관리자によって 추가된 어떤 스킴이든 문제없이 처리할 수 있을 것이라고 생각합니다.

스킴별로 어떻게 검증해야 할지 전혀 감이 오지 않습니다… :thinking:


저의 비공식적인 형식 코드 이름들:

  • : “관찰(observing)”
  • :/ “의심(skeptical)”
  • :// - “더 강한 의심(double skeptical)”
1개의 좋아요

다음 내용을 Discourse에 복사하여 붙여넣으면:

안전한 메시징과 통화를 위해 Snikket/XMPP(xmpp:maiki@chat.v2.talkgroup.xyz)로 연락해 주세요.

allowed href schemes에 xmpp를 추가한 경우 다음과 같이 표시됩니다:

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에 대한某种의 우회책일 수 있나요? 개발자가 아닙니다.