Кнопка «New topic» работает неправильно

Когда я нажимаю кнопку «Новая тема», форма создания новой темы не появляется сразу. Вместо этого форма отображается только после выбора одной из веток на форуме. При этом создаётся новая тема, но в фоновом режиме. Как только вы откроете любую существующую тему, новая тема, которую вы пытались создать, появится (всё работает корректно, то есть для того форума, в который вы планировали опубликовать, даже если ветка, которую вы открыли, находится в другом форуме).

Это происходит только на одном сайте (https://discussions.scouting.org/), поэтому я предполагаю, что проблема в неправильной конфигурации с их стороны. Я уже обращался с этой проблемой туда, но безрезультатно.

Это происходит в безопасном режиме?

Это не воспроизводится в безопасном режиме. Проблема вызвана пользовательской темой или CSS.

Администраторы добавили кастомизацию CSS, которая выглядит следующим образом:

body:not([class*="category-council-"]):not(.staff).closed-topic .reply, 
body:not([class*="category-council-"]):not(.staff).closed-topic #topic-footer-buttons .create, 
body:not([class*="category-council-"]):not(.staff).closed-topic .timeline-container .create, 
body:not([class*="category-council-"]):not(.staff).closed-topic #reply-control {
  display: none !important;
}

На первый взгляд это кажется приемлемым, но затем я вижу, что класс body.closed-topic применяется к списку тем… что действительно не имеет смысла.

Этого класса нет в Discourse по умолчанию, поэтому нужно найти другую кастомизацию, которая его добавляет…

<script type="text/discourse-plugin" version="0.8">
const container = Discourse.__container__;
const controller = container.lookup("controller:topic");
const currentUser = api.getCurrentUser();

api.onPageChange(() => {

  if (!currentUser || currentUser.admin || currentUser.moderator || currentUser.trust_level != 4 ) {
    return;
  } else {
    let model = controller.get("model");
    
    document.querySelector("body").classList.add("closed-topic");
    
    if (model) {
      if (!model.closed) {
        document.querySelector("body").classList.remove("closed-topic");
      }
    }
  }

});
</script>

Здесь, если вы вошли в систему, не являетесь администратором, не являетесь модератором и имеете уровень доверия 4, то к элементу <body> страницы добавляется класс closed-topic.

Этот класс удаляется только если model.closed равно false, что означает… что если тема не закрыта (или даже если это вообще не тема), класс closed-topic будет применён.

Эту строку:

document.querySelector("body").classList.add("closed-topic");

следовало бы, вероятно, поместить внутрь условия if (model), поскольку в противном случае она выполняется даже при отсутствии модели (например, когда вы находитесь не внутри темы)…

Похоже, что целью было предотвратить возможность ответа на закрытые темы для пользователей с уровнем доверия 4, но это правило применяется слишком широко.

Большое спасибо, это именно то, что я искал.

Хех, интересно, не я ли стал причиной этого изменения. Я обнаружил эту уязвимость и использовал её без ограничений. Мне так и не стал понятен смысл требования создавать новую тему, когда у тебя есть дополнительная информация к старой.