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를 처음 사용해 봅니다) 알려주시고, 올바른 방법을 보여주세요.
Discourse를 3.5.0.beta8(또는 3.5.0.beta9-dev)으로 업그레이드하면, 사용자가 서명을 수정해도 저장되지 않는 문제가 발생합니다. 화면에는 저장되었다고 표시되지만 실제로는 반영되지 않습니다. 3.5.0.beta7에서는 정상적으로 작동합니다. beta7부터 beta8까지의 많은 플러그인이 내장되어 있으므로, 이 문제가 조속히 수정되기를 바랍니다.
감사합니다. 이런 걸 알아내는 건 정말 못합니다. 어떻게 해야 할지 전혀 감이 안 잡히네요. 설정으로 처리되는 게 훨씬 쉬울 텐데, 왜 어떤 그룹은 모든 사용자에게 서명을 허용하고 싶은지 이해가 안 됩니다. 또한 “서명 활성화 - 게시물 아래 사용자 서명 보기”라는 설정을 숨길 수 있는 옵션이 있으면 좋겠습니다.
텍스트 서명의 글자 수를 제한하고 배너 서명의 이미지 크기를 제한할 수 있는 옵션도 있으면 좋겠습니다.
자, 서명을 그룹에 맞게 더 잘 작동하게 만들고 싶은 분들을 위해 (특히 유료 업그레이드/구독의 일부로 서명을 사용하려는 경우), 훨씬 더 나은 결과를 내어 업그레이드를 더 많이 유도할 수 있다고 생각하는 코드(그리고 그 배경)를 공유합니다. 여러 번 시도해야 했지만, 지금은 잘 작동하고 있습니다. “XXXXX” 부분을 대체해야 할 위치를 주의 깊게 확인하세요.
저는 다음 두 가지를 달성하고 싶었습니다:
A) 서명을 비활성화할 수 있는 기능을 제거하고 싶었습니다. 즉, 업그레이드를 한 사용자는 자신의 서명이 모든 사람에게 보일 것이라는 점을 알게 됩니다.
B) 서명을 생성할 수 있는 권한을 특정 그룹에만 부여하고 싶었습니다.
관리자 > 외관 > 테마 및 컴포넌트 > 컴포넌트 > 설치 > 새로 만들기로 이동하세요.
< 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;
}
위에서 언급한 첫 번째 블록 아래에 < 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>
위에서 언급한 첫 번째 블록 아래에 css 탭에 다음 코드를 추가하세요 (XXXXX를 그룹 이름으로 대체하세요):