From 1c107575d858d053334d211392a991318c7efb47 Mon Sep 17 00:00:00 2001 From: Jeremy Kescher Date: Fri, 12 Aug 2022 21:38:35 +0200 Subject: [PATCH] Update poll validation to allow one-option polls if configured --- .env.production.catcatnya | 1 + .env.production.sample | 3 +++ app/validators/poll_validator.rb | 5 +++-- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.env.production.catcatnya b/.env.production.catcatnya index 6d572f5310..6e180d08b0 100644 --- a/.env.production.catcatnya +++ b/.env.production.catcatnya @@ -37,6 +37,7 @@ MAX_BIO_CHARS=6942 MAX_PROFILE_FIELDS=10 MAX_PINNED_TOOTS=10 MAX_DISPLAY_NAME_CHARS=50 +MIN_POLL_OPTIONS=1 MAX_POLL_OPTIONS=20 MAX_SEARCH_RESULTS=1000 MAX_REMOTE_EMOJI_SIZE=1048576 diff --git a/.env.production.sample b/.env.production.sample index ad058b2b79..98fa676129 100644 --- a/.env.production.sample +++ b/.env.production.sample @@ -263,6 +263,9 @@ MAX_PROFILE_FIELDS=4 # Maximum allowed display name characters MAX_DISPLAY_NAME_CHARS=30 +# Minimum allowed poll options. (Minimum of 1) +MIN_POLL_OPTIONS=2 + # Maximum allowed poll options MAX_POLL_OPTIONS=5 diff --git a/app/validators/poll_validator.rb b/app/validators/poll_validator.rb index 1aaf5a5d02..da7bf3daff 100644 --- a/app/validators/poll_validator.rb +++ b/app/validators/poll_validator.rb @@ -1,7 +1,8 @@ # frozen_string_literal: true class PollValidator < ActiveModel::Validator - MAX_OPTIONS = (ENV['MAX_POLL_OPTIONS'] || 5).to_i + MIN_OPTIONS = [1, (ENV['MIN_POLL_OPTIONS'] || 2).to_i].max + MAX_OPTIONS = [MIN_OPTIONS, (ENV['MAX_POLL_OPTIONS'] || 5).to_i].max MAX_OPTION_CHARS = (ENV['MAX_POLL_OPTION_CHARS'] || 100).to_i MAX_EXPIRATION = 1.month.freeze MIN_EXPIRATION = 5.minutes.freeze @@ -9,7 +10,7 @@ class PollValidator < ActiveModel::Validator def validate(poll) current_time = Time.now.utc - poll.errors.add(:options, I18n.t('polls.errors.too_few_options')) unless poll.options.size > 1 + poll.errors.add(:options, I18n.t('polls.errors.too_few_options')) unless poll.options.size >= MIN_OPTIONS poll.errors.add(:options, I18n.t('polls.errors.too_many_options', max: MAX_OPTIONS)) if poll.options.size > MAX_OPTIONS poll.errors.add(:options, I18n.t('polls.errors.over_character_limit', max: MAX_OPTION_CHARS)) if poll.options.any? { |option| option.mb_chars.grapheme_length > MAX_OPTION_CHARS } poll.errors.add(:options, I18n.t('polls.errors.duplicate_options')) unless poll.options.uniq.size == poll.options.size