Тысячный разделитель беззвучно портит введенное значение в настройках

Впереди история ужасов.

К нам обратился менеджер сообщества, потому что заметил, что количество пользователей на его форуме растёт не так быстро, как раньше.

После некоторого исследования мы выяснили, что многие только что зарегистрировавшиеся пользователи удалялись, так как считались неактивными.

Оказалось, что это произошло из-за того, что настройка clean_up_inactive_users_after_days была установлена в значение 1 :scream:

Поэтому я нажал на значок истории и увидел, что настройка была изменена с 730 (два года) на 1,095 (три года) более года назад.

Да, друзья, когда вы вводите запятую (или точку, как это принято в странах, где не говорят на английском) в качестве разделителя групп цифр в числовом параметре сайта, всё, что стоит после первого разделителя, тихо(!) отбрасывается. Чтобы усугубить ситуацию, это становится заметно только после полной перезагрузки страницы.

12 лайков

Интересно, затронуты ли таким же образом и другие настройки, использующие высокие числовые значения? :thinking:

6 лайков

Ну, да.
Затрагиваются все числовые настройки, и их очень много: дни, минуты и общие настройки с высокими значениями.

imap_polling_old_emails:1000
decompressed_theme_max_file_size_mb:1000
topic_views_heat_low:1000
secure_uploads_max_email_embed_image_size_kb:1024
maximum_session_age:1440
post_edit_time_limit:1440
composer_media_optimization_image_resize_dimensions_threshold:1920
composer_media_optimization_image_resize_width_target:1920
max_bookmarks_per_user:2000
topic_views_heat_medium:2000
default_other_new_topic_duration_minutes:2880
polling_interval:3000
topic_views_heat_high:3500
max_image_size_kb:4096
max_attachment_size_kb:4096
min_topic_views_for_delete_confirm:5000
max_form_template_content_length:5000
invite_link_max_redemptions_limit:5000
sitemap_page_size:10000
max_notifications_per_user:10000
short_progress_text_threshold:10000
auto_close_topics_post_count:10000
max_drafts_per_user:10000
anonymous_account_duration_minutes:10080
default_email_digest_frequency:10080
tl3_requires_posts_read_cap:20000
anon_polling_interval:25000
max_post_length:32000
tl2_post_edit_time_limit:43200
max_export_file_size_kb:50000
max_bulk_invites:50000
background_polling_interval:60000
decompressed_backup_max_file_size_mb:100000
search_enable_recent_regular_posts_offset_size:200000
default_other_auto_track_topics_after_msecs:300000
max_draft_length:400000
composer_media_optimization_image_bytes_optimization_threshold:524288

  suggested_topics_unread_max_days_old:
  suggested_topics_max_days_old:
  pending_users_reminder_delay_minutes:
  invite_expiry_days:
  purge_unactivated_users_grace_period_days:
  anonymous_account_duration_minutes:
  ignored_users_message_gap_days:
  clean_up_inactive_users_after_days:
  clean_up_unused_staged_users_after_days:
  show_time_gap_days:
  old_post_notice_days:
  returning_users_days:
  suppress_digest_email_after_days:
  disallow_reply_by_email_after_days:
  delete_email_logs_after_days:
  reset_bounce_score_after_days:
  delete_rejected_email_after_days:
  purge_deleted_uploads_grace_period_days:
  tl2_requires_days_visited:
  tl3_requires_days_visited:
  invalidate_inactive_admin_email_after_days:
  send_old_credential_reminder_days:
  search_query_log_max_retention_days:
  cold_age_days_low:
  cold_age_days_medium:
  cold_age_days_high:
  delete_drafts_older_than_n_days:
  delete_merged_stub_topics_after_days:
  default_other_new_topic_duration_minutes:
  retain_web_hook_events_period_days:
  revoke_api_keys_unused_days:
  revoke_api_keys_maxlife_days:
  revoke_user_api_keys_unused_days:
  revoke_user_api_keys_maxlife_days:
7 лайков

Спасибо за отчёт, @RGJ! :pray:

Это действительно пугающая ситуация. Мы исправили это здесь, во-первых, разрешив в интерфейсе только числовой ввод, а во-вторых, удалив все символы, кроме цифр, на стороне сервера для дополнительной безопасности.

11 лайков

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

  • Перейдите в Администрирование → Настройки → Базовая настройка → предлагаемые темы

Firefox на рабочем столе

  • Введите 5.0, сохраните (ошибки нет) и обновите страницу → обнаружено, что значение установлено как 50
  • Введите 5,0, сохраните (ошибки нет) и обновите страницу → обнаружено, что значение установлено как 0

Safari на iOS

  • Введите 5.0, сохраните (ошибки нет) и обновите страницу → обнаружено, что значение установлено как 50
  • Введите 5,0, сохраните (ошибки нет) и обновите страницу → обнаружено, что значение установлено как 50
4 лайка

Спасибо, Ричард, за сообщение. Я точно могу воспроизвести эту проблему.

2 лайка

Спасибо за отчет, Ричард! Я также смог воспроизвести описанную вами проблему. На сегодняшний день всё работает «как задумано», за исключением случая, когда 5,0 в Firefox превращается в 0 — это баг. Странная штука.

Похоже, нам нужно ещё раз пройти по этому вопросу, чтобы хотя бы обновить то, что видит администратор, сделав это корректным и без разделителей. В данный момент вам приходится обновлять веб-браузер после сохранения изменений, чтобы увидеть результат.

Но я думаю, мы можем сделать ещё больше, чтобы помочь администратору избегать таких ошибок и не путаться в них. Мне кажется неправильным, что можно ввести «364.5 days» для suggested topics max days old, и это превратится в 3645 дней. Возможно, стоит просто не разрешать ввод нечисловых значений в поля такого типа.

6 лайков

Исправлено в FIX: Do not allow , or . in site setting integer input by martin-brennan · Pull Request #27618 · discourse/discourse · GitHub. Теперь в эти поля можно вводить только цифры. Разделители , или . больше не допускаются.

Ранее мы выполняли санитизацию ввода для целочисленных настроек сайта только на стороне сервера, что вызывало путаницу, когда пользователи вводили, например, 100.5, и получали 1005, не видя этого изменения в интерфейсе.

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

6 лайков

Эта тема была автоматически закрыта через 3 дня. Новые ответы больше не принимаются.