diff --git a/app/models/comment.rb b/app/models/comment.rb index 233736824..493dbeb1c 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -1,4 +1,5 @@ class Comment < ActiveRecord::Base + acts_as_paranoid column: :hidden_at include ActsAsParanoidAliases acts_as_votable @@ -10,6 +11,8 @@ class Comment < ActiveRecord::Base validates :user, presence: true validates_inclusion_of :commentable_type, in: ["Debate"] + validate :validate_body_length + belongs_to :commentable, -> { with_hidden }, polymorphic: true, counter_cache: true belongs_to :user, -> { with_hidden } @@ -93,4 +96,17 @@ class Comment < ActiveRecord::Base self.commentable.try(:after_commented) end + def self.body_max_length + 1000 + end + + private + + def validate_body_length + validator = ActiveModel::Validations::LengthValidator.new( + attributes: :body, + maximum: Comment.body_max_length) + validator.validate(self) + end + end diff --git a/app/models/debate.rb b/app/models/debate.rb index 4dfb7b51f..fdf9cb6b9 100644 --- a/app/models/debate.rb +++ b/app/models/debate.rb @@ -1,7 +1,6 @@ require 'numeric' class Debate < ActiveRecord::Base apply_simple_captcha - TITLE_LENGTH = Debate.columns.find { |c| c.name == 'title' }.limit acts_as_votable acts_as_taggable @@ -16,6 +15,9 @@ class Debate < ActiveRecord::Base validates :description, presence: true validates :author, presence: true + validate :validate_title_length + validate :validate_description_length + validates :terms_of_service, acceptance: { allow_nil: false }, on: :create before_validation :sanitize_description @@ -144,13 +146,40 @@ class Debate < ActiveRecord::Base cached_votes_up/flags_count.to_f < 5 end + def self.title_max_length + @@title_max_length ||= self.columns.find { |c| c.name == 'title' }.limit + end + + def self.description_max_length + 6000 + end + protected - def sanitize_description - self.description = WYSIWYGSanitizer.new.sanitize(description) - end + def sanitize_description + self.description = WYSIWYGSanitizer.new.sanitize(description) + end + + def sanitize_tag_list + self.tag_list = TagSanitizer.new.sanitize_tag_list(self.tag_list) + end + + private + + def validate_description_length + validator = ActiveModel::Validations::LengthValidator.new( + attributes: :description, + minimum: 10, + maximum: Debate.description_max_length) + validator.validate(self) + end + + def validate_title_length + validator = ActiveModel::Validations::LengthValidator.new( + attributes: :title, + minimum: 4, + maximum: Debate.title_max_length) + validator.validate(self) + end - def sanitize_tag_list - self.tag_list = TagSanitizer.new.sanitize_tag_list(self.tag_list) - end end diff --git a/app/models/organization.rb b/app/models/organization.rb index 2962724a6..dc340b08c 100644 --- a/app/models/organization.rb +++ b/app/models/organization.rb @@ -2,6 +2,8 @@ class Organization < ActiveRecord::Base belongs_to :user, touch: true validates :name, presence: true + validates :name, uniqueness: true + validate :validate_name_length delegate :email, :phone_number, to: :user @@ -31,4 +33,17 @@ class Organization < ActiveRecord::Base text.present? ? joins(:user).where("users.email = ? OR users.phone_number = ? OR organizations.name ILIKE ?", text, text, "%#{text}%") : none end + def self.name_max_length + @@name_max_length ||= self.columns.find { |c| c.name == 'name' }.limit + end + + private + + def validate_name_length + validator = ActiveModel::Validations::LengthValidator.new( + attributes: :name, + maximum: Organization.name_max_length) + validator.validate(self) + end + end diff --git a/app/models/user.rb b/app/models/user.rb index f0cf9d6fb..1099bc6c4 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,9 +1,9 @@ class User < ActiveRecord::Base - include Verification - OMNIAUTH_EMAIL_PREFIX = 'omniauth@participacion' OMNIAUTH_EMAIL_REGEX = /\A#{OMNIAUTH_EMAIL_PREFIX}/ + include Verification + apply_simple_captcha devise :database_authenticatable, :registerable, :confirmable, :recoverable, :rememberable, :trackable, :validatable, :omniauthable, :async @@ -23,6 +23,8 @@ class User < ActiveRecord::Base validates :username, presence: true, unless: :organization? validates :username, uniqueness: true, unless: :organization? + validate :validate_username_length + validates :official_level, inclusion: {in: 0..5} validates_format_of :email, without: OMNIAUTH_EMAIL_REGEX, on: :update validates :terms_of_service, acceptance: { allow_nil: false }, on: :create @@ -126,17 +128,30 @@ class User < ActiveRecord::Base Comment.hide_all comments_ids end + def email_provided? + !!(email && email !~ OMNIAUTH_EMAIL_REGEX) || + !!(unconfirmed_email && unconfirmed_email !~ OMNIAUTH_EMAIL_REGEX) + end + def self.search(term) term.present? ? where("email = ? OR username ILIKE ?", term, "%#{term}%") : none end - def email_provided? - !!(email && email !~ OMNIAUTH_EMAIL_REGEX) || - !!(unconfirmed_email && unconfirmed_email !~ OMNIAUTH_EMAIL_REGEX) + def self.username_max_length + @@username_max_length ||= self.columns.find { |c| c.name == 'username' }.limit end def show_welcome_screen? sign_in_count == 1 && unverified? && !organization end + private + + def validate_username_length + validator = ActiveModel::Validations::LengthValidator.new( + attributes: :username, + maximum: User.username_max_length) + validator.validate(self) + end + end diff --git a/app/views/account/show.html.erb b/app/views/account/show.html.erb index 5fe455a6f..413a0e892 100644 --- a/app/views/account/show.html.erb +++ b/app/views/account/show.html.erb @@ -32,12 +32,12 @@
This is
' fill_in 'debate_captcha', with: correct_captcha_text check 'debate_terms_of_service' @@ -146,7 +146,7 @@ feature 'Debates' do click_button 'Start a debate' expect(page).to have_content 'Debate was successfully created.' - expect(page).to have_content 'A test' + expect(page).to have_content 'Testing an attack' expect(page.html).to include 'This is alert("an attack");
' expect(page.html).to_not include '' expect(page.html).to_not include '<p>This is' @@ -186,8 +186,8 @@ feature 'Debates' do scenario 'using dangerous strings' do visit new_debate_path - fill_in 'debate_title', with: 'A test' - fill_in 'debate_description', with: 'A test' + fill_in 'debate_title', with: 'A test of dangerous strings' + fill_in 'debate_description', with: 'A description suitable for this test' fill_in 'debate_captcha', with: correct_captcha_text check 'debate_terms_of_service' @@ -233,14 +233,14 @@ feature 'Debates' do expect(current_path).to eq(edit_debate_path(debate)) fill_in 'debate_title', with: "End child poverty" - fill_in 'debate_description', with: "Let's..." + fill_in 'debate_description', with: "Let's do something to end child poverty" fill_in 'debate_captcha', with: correct_captcha_text click_button "Save changes" expect(page).to have_content "Debate was successfully updated." expect(page).to have_content "End child poverty" - expect(page).to have_content "Let's..." + expect(page).to have_content "Let's do something to end child poverty" end scenario 'Errors on update' do @@ -266,7 +266,7 @@ feature 'Debates' do click_button "Save changes" expect(page).to_not have_content "Debate was successfully updated." - expect(page).to have_content "1 error" + expect(page).to have_content "error" fill_in 'debate_captcha', with: correct_captcha_text click_button "Save changes" @@ -288,7 +288,7 @@ feature 'Debates' do click_button "Save changes" expect(page).to_not have_content "Debate was successfully updated." - expect(page).to have_content "1 error" + expect(page).to have_content "error" within(".tags") do expect(page).to have_content featured_tag.name expect(page).to_not have_content tag.name @@ -438,7 +438,7 @@ feature 'Debates' do scenario 'Debate index search' do debate1 = create(:debate, title: "Show me what you got") debate2 = create(:debate, title: "Get Schwifty") - debate3 = create(:debate, description: "Unity") + debate3 = create(:debate) debate4 = create(:debate, description: "Schwifty in here") visit debates_path diff --git a/spec/lib/tag_sanitizer_spec.rb b/spec/lib/tag_sanitizer_spec.rb index e1fd6499b..f33b771b8 100644 --- a/spec/lib/tag_sanitizer_spec.rb +++ b/spec/lib/tag_sanitizer_spec.rb @@ -12,6 +12,12 @@ describe TagSanitizer do it 'filters out dangerous strings' do expect(subject.sanitize_tag('user_id=1')).to eq('user_id1') end + + it 'sets up a max length for each tag' do + long_tag = '1' * (TagSanitizer.tag_max_length + 100) + + expect(subject.sanitize_tag(long_tag).size).to eq(TagSanitizer.tag_max_length) + end end describe '#sanitize_tag_list' do