diff --git a/lib/diaspora_federation/validators/rules/diaspora_id.rb b/lib/diaspora_federation/validators/rules/diaspora_id.rb index 8dfd9a9..42bcc0b 100644 --- a/lib/diaspora_federation/validators/rules/diaspora_id.rb +++ b/lib/diaspora_federation/validators/rules/diaspora_id.rb @@ -4,6 +4,9 @@ module Validation # # A simple rule to validate the base structure of diaspora* IDs. class DiasporaId + # Maximum length of a full diaspora* ID + DIASPORA_ID_MAX_LENGTH = 255 + # The Regex for a valid diaspora* ID DIASPORA_ID_REGEX = begin username = "[[:lower:]\\d\\-\\.\\_]+" @@ -29,7 +32,10 @@ module Validation # Determines if value is a valid diaspora* ID def valid_value?(value) - value.is_a?(String) && value =~ DIASPORA_ID + return false unless value.is_a?(String) + return false if value.length > DIASPORA_ID_MAX_LENGTH + + value =~ DIASPORA_ID end # This rule has no params. diff --git a/spec/lib/diaspora_federation/validators/rules/diaspora_id_spec.rb b/spec/lib/diaspora_federation/validators/rules/diaspora_id_spec.rb index 15b0240..a796530 100644 --- a/spec/lib/diaspora_federation/validators/rules/diaspora_id_spec.rb +++ b/spec/lib/diaspora_federation/validators/rules/diaspora_id_spec.rb @@ -99,6 +99,14 @@ describe Validation::Rule::DiasporaId do expect(validator.errors).to include(:diaspora_id) end + it "fails if the diaspora* ID is longer than 255 characters" do + validator = Validation::Validator.new(OpenStruct.new(diaspora_id: "#{'a' * 244}@example.com")) + validator.rule(:diaspora_id, :diaspora_id) + + expect(validator).not_to be_valid + expect(validator.errors).to include(:diaspora_id) + end + it "fails for nil and empty" do [nil, ""].each do |val| validator = Validation::Validator.new(OpenStruct.new(diaspora_id: val))