Discourse Signatures

Я что-то не в себе или вообще нет никакой валидации URL-адреса изображения подписи, введённого пользователем?
По сути, пользователь может ввести что угодно, и это будет отправлено другим пользователям?

Кроме того, почему размер поля базы данных для URL-адреса подписи установлен в 32_000?
Зачем кому-то может понадобиться 32 000 символов для 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|” (режим расширенных настроек я использовать не буду):

    # Validate the URL if not in advanced mode
    if !SiteSetting.signatures_advanced_mode && user.custom_fields["signature_url"]
      url = user.custom_fields["signature_url"]

      # Strict validation: only HTTPS, only certain image file types
      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. Ограничить максимальный размер изображений и текста в подписи, чтобы избежать спама?

Я думаю, вы можете использовать это:

Вы можете нажать правой кнопкой мыши > «Просмотреть код» (Inspect), чтобы получить ID или класс элемента, который нужно скрыть с помощью display:none. Боюсь, я сейчас на телефоне, поэтому не могу проверить классы/ID :sweat_smile: .

Привет, ребята.

Этот плагин всё ещё доступен?

Я не могу его найти …

Это не #включено-в-ядро, поэтому вам нужно установить его отдельно.

Спасибо. Я ужасно разбираюсь в таких вещах. Не представляю, как вообще это сделать. Должна быть настройка. Так было бы гораздо проще. Не понимаю, зачем какая-либо группа захочет разрешить подписи для всех. Также хотелось бы иметь возможность скрыть настройку «Включить подписи — См. подписи пользователей под сообщениями».

Также должна быть возможность ограничить количество символов в текстовой подписи и размер изображения для баннерной подписи.

Жаль, что я не знаю CSS, лол.

Хорошо, для тех, кто хочет, чтобы их подписи работали ещё эффективнее для их группы (особенно если вы хотите использовать опции для отображения подписи как часть платного обновления/подписки), вот код (и объяснение логики), который, на мой взгляд, делает всё значительно лучше и помогает стимулировать больше обновлений. Мне потребовалось множество попыток, но теперь это работает. Обращайте особое внимание на места, где нужно заменить части «XXXXX».

Я хотел достичь следующих двух целей:

A) Я хотел отключить возможность не отображать подписи. Это означает, что пользователи, которые сделали обновление, будут знать, что их подпись увидят все.

B) Я хотел, чтобы возможность создавать подпись была только у определённой группы.

  1. Перейдите в Администрирование > Внешний вид > Темы и компоненты > Компоненты > Установить > Создать новый

  2. Добавьте этот код во вкладку :

<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() === 'Включить подписи') {
                // Найдите основной контейнер, содержащий и метку, и флажок, и скройте его
                const controlGroup = label.closest('.control-group') || label.parentElement;
                if (controlGroup) {
                    controlGroup.style.display = 'none';
                }
            }
        });
    });

    // ТЕПЕРЬ начните наблюдать за телом документа, так как мы знаем, что оно существует
    observer.observe(document.body, { childList: true, subtree: true });
});
</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;
}


3. Добавьте этот код в тег <head> ниже первого блока (замените XXXXX на название вашей группы):


4. Добавьте этот код во вкладку CSS ниже первого блока (замените XXXXX на название вашей группы):

```css
/* Скрыть раздел подписей для всех */
.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 лайка