Discourse Signatures

제가 이상한가요, 아니면 사용자 입력된 서명 이미지 URL에 대한 검증이 전혀 없나요?
결국 사용자가 아무 내용을 입력해도 다른 사용자에게 그대로 노출된다는 뜻인가요?

그리고 왜 URL 서명 DB 크기가 32_000으로 설정되어 있나요?
이미지 URL에 32,000자나 필요할 이유가 있을까요?

무서워요 :ghost:

최대 높이를 고정하기 위해 CSS를 이렇게 수정했습니다.

.signature-img {
  max-width: 600px;
  max-height: 100px;
  width: auto;
  height: auto;
  display: block;
  margin: 5px 0;
}

plugin.rb에서 서명 URL 최대 크기를 250으로 변경했습니다.

  register_user_custom_field_type("signature_url", :string, max_length: 250)
  register_user_custom_field_type("signature_raw", :string, max_length: 250)

plugin.rb의 “on(:user_updated) do |user|” 블록 아래에 이 코드를 추가했습니다. (고급 모드는 사용하지 않을 예정입니다)

    # 고급 모드가 아닌 경우 URL 검증
    if !SiteSetting.signatures_advanced_mode && user.custom_fields["signature_url"]
      url = user.custom_fields["signature_url"]

      # 엄격한 검증: HTTPS만 허용, 특정 이미지 파일 형식만 허용
      unless url =~ /\Ahttps:\/\/[a-zA-Z0-9.\-\/_]+\.(png|jpe?g|gif|webp)(\?[a-zA-Z0-9=&]+)?\z/
        Rails.logger.warn("[discourse-signatures] Rejected invalid signature_url for user #{user.id}: #{url.inspect}")
        user.custom_fields["signature_url"] = nil
        user.save
      end
    end

여기서 제가 잘못한 부분이 있다면 (Discourse를 처음 사용해 봅니다) 알려주시고, 올바른 방법을 보여주세요.

1개의 좋아요

250자로는 부족하니까요…

이것이 서명의 핵심 아이디어입니다. 포럼도 마찬가지예요. 사람들이 내용을 입력하면 다른 사람들이 그 내용을 보게 되죠. 미친 세상이지 않나요?

5개의 좋아요

Discourse를 3.5.0.beta8(또는 3.5.0.beta9-dev)으로 업그레이드하면, 사용자가 서명을 수정해도 저장되지 않는 문제가 발생합니다. 화면에는 저장되었다고 표시되지만 실제로는 반영되지 않습니다. 3.5.0.beta7에서는 정상적으로 작동합니다. beta7부터 beta8까지의 많은 플러그인이 내장되어 있으므로, 이 문제가 조속히 수정되기를 바랍니다.

2개의 좋아요

서명(signature)에 대해 특정 사용 사례가 있어, 몇 가지 변경 사항이 비교적 쉽게 적용될 수 있을지 궁금합니다.

  1. UI에서 특정 그룹에 대해서만 서명을 표시하는 것이 좋겠다는 데 동의합니다. 저는 CSS에 익숙하지 않습니다.
  2. 저희는 Discourse를 커뮤니티 공간이자 지원 티켓 시스템으로 동시에 사용하고 있습니다. "특정 카테고리에서만 서명을 표시한다"는 설정을 추가할 수 있는 방법이 있을까요?

대부분의 상호작용이 이메일을 통해 이루어지는 지원 섹션에서만 서명이 실제로 필요합니다.

3개의 좋아요

4개의 게시물이 새 주제로 분리되었습니다: 기능 요청: 이메일 알림에 서명 포함

CSS에 잘하시는 분이 계시다면, 아래 두 가지 방법을 알려주실 수 있을까요?

  1. 특정 그룹(들)에만 서명 사용 권한을 부여하는 방법
  2. 스팸성 서명을 줄이기 위해 서명 내 이미지와 텍스트의 최대 크기를 제한하는 방법

이것을 사용할 수 있다고 생각합니다:

우클릭 > 검사(Inspect)를 통해 숨길 요소의 id/클래스를 확인한 후 display:none을 적용할 수 있습니다. 지금은 휴대폰을 사용하고 있어서 클래스/ID를 확인할 수 없습니다 :sweat_smile: .

여러분, 안녕하세요.

이 플러그인은 아직 사용 가능한 건가요?

어딘가에 있는 것 같은데 찾을 수가 없네요 …

이것은 코어에 포함되어 있지 않으므로 별도로 설치해야 합니다.

감사합니다. 이런 걸 알아내는 건 정말 못합니다. 어떻게 해야 할지 전혀 감이 안 잡히네요. 설정으로 처리되는 게 훨씬 쉬울 텐데, 왜 어떤 그룹은 모든 사용자에게 서명을 허용하고 싶은지 이해가 안 됩니다. 또한 “서명 활성화 - 게시물 아래 사용자 서명 보기”라는 설정을 숨길 수 있는 옵션이 있으면 좋겠습니다.

텍스트 서명의 글자 수를 제한하고 배너 서명의 이미지 크기를 제한할 수 있는 옵션도 있으면 좋겠습니다.

css를 알았으면 좋았을 텐데 ㅋㅋ

자, 서명을 그룹에 맞게 더 잘 작동하게 만들고 싶은 분들을 위해 (특히 유료 업그레이드/구독의 일부로 서명을 사용하려는 경우), 훨씬 더 나은 결과를 내어 업그레이드를 더 많이 유도할 수 있다고 생각하는 코드(그리고 그 배경)를 공유합니다. 여러 번 시도해야 했지만, 지금은 잘 작동하고 있습니다. “XXXXX” 부분을 대체해야 할 위치를 주의 깊게 확인하세요.

저는 다음 두 가지를 달성하고 싶었습니다:

A) 서명을 비활성화할 수 있는 기능을 제거하고 싶었습니다. 즉, 업그레이드를 한 사용자는 자신의 서명이 모든 사람에게 보일 것이라는 점을 알게 됩니다.

B) 서명을 생성할 수 있는 권한을 특정 그룹에만 부여하고 싶었습니다.

  1. 관리자 > 외관 > 테마 및 컴포넌트 > 컴포넌트 > 설치 > 새로 만들기로 이동하세요.

  2. < head > 탭에 다음 코드를 추가하세요:

<script>
// 먼저 기본 페이지 구조가 로드되기를 기다립니다
document.addEventListener("DOMContentLoaded", function() {
    
    // 관찰자 설정
    const observer = new MutationObserver(function(mutations) {
        // 페이지의 모든 제어 레이블 찾기
        const labels = document.querySelectorAll('label.control-label');
        
        labels.forEach(label => {
            // 특정 서명 레이블 찾기
            if (label.textContent.trim() === 'Enable Signatures') {
                // 레이블과 체크박스를 모두 포함하는 메인 컨테이너를 찾아 숨기기
                const controlGroup = label.closest('.control-group') || label.parentElement;
                if (controlGroup) {
                    controlGroup.style.display = 'none';
                }
            }
        });
    });

    // 이제 body가 존재한다는 것을 알기 때문에 관찰 시작
    observer.observe(document.body, { childList: true, subtree: true });
});
</script>

3. css 탭에 다음 코드를 추가하세요 (XXXXX를 그룹 이름으로 대체하세요):

/* 모든 사용자에게 서명 섹션을 숨김 */
.user-preferences .control-group.signatures,
.user-preferences .signature-preferences,
.user-preferences div[data-setting-name="user_card_badge"] + .control-group {
    display: none !important;
}

/* body에 'user-is-XXXXX' 클래스가 존재할 경우에만 표시 */
body.user-is-XXXXX .user-preferences .control-group.signatures,
body.user-is-XXXXX .user-preferences .signature-preferences,
body.user-is-XXXXX .user-preferences div[data-setting-name="user_card_badge"] + .control-group {
    display: block !important;
}
  1. 위에서 언급한 첫 번째 블록 아래에 < head > 태그에 다음 코드를 추가하세요 (XXXXX를 그룹 이름으로 대체하세요):
<script>
(function() {
  const checkAccess = () => {
    // Discourse는 현재 사용자의 그룹을 이 전역 객체에 저장합니다
    const user = window.Discourse && window.Discourse.User && window.Discourse.User.current();
    
    if (user && user.groups) {
      // 그룹 이름 중 "XXXXX"와 일치하는 것이 있는지 확인
      const is XXXXX = user.groups.some(g => g.name === 'XXXXX');
      
      if (isXXXXX) {
        document.body.classList.add('user-is-XXXXX');
      }
    }
  };

  // 즉시 실행
  checkAccess();

  // 사용자가 페이지 사이를 이동할 때마다 실행
  document.addEventListener('discourse-ready', checkAccess);
  
  // 백업: 느린 로드를 잡기 위해 1초 후 다시 실행
  setTimeout(checkAccess, 1000);
})();
</script>
  1. 위에서 언급한 첫 번째 블록 아래에 css 탭에 다음 코드를 추가하세요 (XXXXX를 그룹 이름으로 대체하세요):
/* 모든 사용자에게 서명 섹션을 숨김 */
.user-preferences .control-group.signatures,
.user-preferences .signature-preferences,
.user-preferences div[data-setting-name="user_card_badge"] + .control-group {
    display: none !important;
}

/* body에 'user-is-XXXXX' 클래스가 존재할 경우에만 표시 */
body.user-is-XXXXX .user-preferences .control-group.signatures,
body.user-is-XXXXX .user-preferences .signature-preferences,
body.user-is-XXXXX .user-preferences div[data-setting-name="user_card_badge"] + .control-group {
    display: block !important;
}

완료.

저는 개발자가 아닙니다. 제가 아는 것은 제 사이트에서 이 코드가 100% 잘 작동한다는 것뿐입니다.

또한, 플러그인 개발자에게 드리는 말씀입니다 – 서명 문자 수를 제한할 수 있는 기능이 있으면 좋겠습니다. 많은 시도를 해봤지만 아무것도 작동하지 않았습니다.

1개의 좋아요

가장 많이 요청된 기능들을 플러그인의 브랜치에 추가했습니다.

이 브랜치를 테스트해 보시고 피드백을 주시면, 다음 주에 머지하겠습니다.

3개의 좋아요

다음 주에 업그레이드를 진행한다면, 어떻게 진행되나요? :slight_smile:

이걸 어떻게 테스트하나요? 초보적인 질문이라 죄송합니다. 위에서 제가 생각해 낸 방법보다는 이 방법을 선호합니다. 또한, 이미지 서명을 끄고 텍스트 기반 서명만 허용할 수 있는 옵션을 추가할 수 있을까요? 감사합니다!

롱님, 안녕하세요! 디스코र्स 사이트를 셀프호스팅하고 계신가요? 그렇다면 첫 번째 게시글에 링크된 설명서를 참고하여 플러그인을 설치할 수 있습니다.

개인적으로는 팔코의 브랜치가 최종 확정되고 병합될 때까지 기다리는 것을 추천합니다.

네, 셀프 호스팅입니다. 플러그인은 이미 설치해 두었어요. 해당 브랜치가 최종 확정되고 병합되면 자동으로 업데이트되나요? 감사합니다!

1개의 좋아요

app.yml 파일의 플러그인 줄을 다음과 같이 변경합니다.

- sudo -E -u discourse git clone -b feature/group-category-restrictions git@github.com:discourse/discourse-signatures.git

감사합니다. 업데이트된 플러그인을 기다리겠습니다. 그건 제가 실수할 가능성이 낮을 것 같아요 :rofl:

어리석은 질문일 수도 있지만, 업데이트가 병합되면 플러그인이 자동으로 업데이트되고 설정에서 새 옵션을 볼 수 있을까요?

아니요, 수동으로 업데이트해야 할 것 같습니다.

2개의 좋아요