话语签名

我是在这里疯了,还是用户输入的签名图片 URL 根本没有验证?
基本上,用户可以输入任何他们想要的东西,然后会被推送到其他用户?

另外,为什么 URL 签名数据库大小设置为 32_000?
谁需要 32000 个字符的图片 URL?

太诡异了 :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 个赞

我们有一个关于签名的特定用例,我想知道进行一些更改是否相对容易。

  1. 我同意我希望在用户界面中只看到特定组的签名,我对 CSS 不太了解。
  2. 我们将 Discourse 同时用作社区和支持票务系统。是否可以设置一个选项来“仅在 X 类别中显示签名”?

我们实际上只需要在支持部分显示签名,因为我们的大部分互动都是通过电子邮件进行的。

3 个赞

4 个帖子被拆分到新主题:功能请求:在电子邮件通知中包含签名

有谁懂 CSS 吗,知道如何:

  1. 限制只有特定群组才能使用签名?

  2. 限制签名的最大图片尺寸和文本大小,以使其不那么垃圾信息

我相信您可以使用这个:

您可以右键单击 > 检查以获取元素的 ID/类,然后使用 display:none 来隐藏它。恐怕我现在在手机上,所以无法检查类/ID :sweat_smile:

大家好。

这个插件还在吗?

我好像找不到它了……

它不#included-in-core,所以你需要单独安装它

谢谢。我太不擅长弄清楚这些东西了。完全不知道我该怎么做。应该有个设置。那样会简单得多。不明白为什么任何群组会想允许所有人使用签名。还希望有个选项可以隐藏“启用签名 - 在帖子下方查看用户签名”这个设置。

还应该有一个选项来限制文本签名的字符数,并限制横幅签名的图片大小。

要是懂 CSS 就好了哈哈

好的,对于那些希望真正改善其群组签名的用户(特别是如果您想使用将签名作为付费升级/订阅一部分的选项),这里有一些我认为效果好得多的代码(以及背后的原因),可以帮助您推动更多升级。我尝试了很多次,但它奏效了。请注意您需要替换“XXXXX”部分的位置。

我希望实现以下 2 件事:

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 isXXXXX = 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:

我们如何测试这个?抱歉问了个新手问题。我更喜欢这个而不是我上面想出来的方案。另外,是否有可能添加一个选项来关闭图片签名,只允许基于文本的签名?谢谢!

嗨,Long!您是在自托管您的 Discourse 站点吗?如果是,您可以使用第一篇帖子中链接的说明来安装插件。

我个人建议等到 Falco 的分支定稿并合并后再安装。

是的,自托管。我已经安装了插件。一旦该分支最终确定并合并,它会自动更新吗?谢谢!

1 个赞

您将 app.yml 中的插件行更改为如下所示

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

谢谢。我将等待更新后的插件。我不太可能搞砸那个 :rofl:

这可能是一个愚蠢的问题,但是当更新合并后,插件会自动更新,我们会在设置中看到新选项吗?

不,我认为你需要手动更新它。

2 个赞