From c3e290465f2808e3d94cec0112ea6a263f704e20 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Wed, 16 Sep 2015 02:53:44 +0200 Subject: [PATCH] make alias and salmon-url optional to support redmatrix --- .../discovery/web_finger.rb | 14 +++--- .../validators/web_finger_validator.rb | 4 +- .../discovery/web_finger_spec.rb | 45 +++++++++++++++++++ .../validators/web_finger_validator_spec.rb | 35 ++++++++++++++- 4 files changed, 90 insertions(+), 8 deletions(-) diff --git a/lib/diaspora_federation/discovery/web_finger.rb b/lib/diaspora_federation/discovery/web_finger.rb index 75e7f1c..9a6729c 100644 --- a/lib/diaspora_federation/discovery/web_finger.rb +++ b/lib/diaspora_federation/discovery/web_finger.rb @@ -41,6 +41,7 @@ module DiasporaFederation property :acct_uri # @!attribute [r] alias_url + # @note could be nil # @return [String] link to the users profile property :alias_url @@ -68,6 +69,7 @@ module DiasporaFederation property :atom_url # @!attribute [r] salmon_url + # @note could be nil # @return [String] salmon endpoint url # @see http://salmon-protocol.googlecode.com/svn/trunk/draft-panzer-salmon-00.html#SMLR # Panzer draft for Salmon, paragraph 3.3 @@ -154,7 +156,7 @@ module DiasporaFederation new( acct_uri: data[:subject], - alias_url: clean_alias(data[:aliases].first), + alias_url: parse_alias(data[:aliases]), hcard_url: parse_link(links, REL_HCARD), seed_url: parse_link(links, REL_SEED), profile_url: parse_link(links, REL_PROFILE), @@ -176,7 +178,7 @@ module DiasporaFederation # @raise [InvalidData] if the given XML string is invalid or incomplete def self.parse_xml_and_validate(webfinger_xml) XrdDocument.xml_data(webfinger_xml).tap do |data| - valid = data.key?(:subject) && data.key?(:aliases) && data.key?(:links) + valid = data.key?(:subject) && data.key?(:links) raise InvalidData, "webfinger xml is incomplete" unless valid end end @@ -218,11 +220,13 @@ module DiasporaFederation end private_class_method :parse_link - # @deprecated remove this, when all pods use this gem for generation - def self.clean_alias(alias_string) + def self.parse_alias(aliases) + return nil unless aliases + alias_string = aliases.first + # Old pods had quotes around alias. Remove this, when all pods use this gem for generation alias_string.gsub(/\A"|"\Z/, "") end - private_class_method :parse_link + private_class_method :parse_alias end end end diff --git a/lib/diaspora_federation/validators/web_finger_validator.rb b/lib/diaspora_federation/validators/web_finger_validator.rb index ea64e01..98464df 100644 --- a/lib/diaspora_federation/validators/web_finger_validator.rb +++ b/lib/diaspora_federation/validators/web_finger_validator.rb @@ -9,12 +9,12 @@ module DiasporaFederation rule :acct_uri, :not_empty - rule :alias_url, [:not_nil, URI: %i(host path)] + rule :alias_url, URI: %i(host path) rule :hcard_url, [:not_nil, URI: %i(host path)] rule :seed_url, %i(not_nil URI) rule :profile_url, [:not_nil, URI: %i(host path)] rule :atom_url, [:not_nil, URI: %i(host path)] - rule :salmon_url, [:not_nil, URI: %i(host path)] + rule :salmon_url, URI: %i(host path) end end end diff --git a/spec/lib/diaspora_federation/discovery/web_finger_spec.rb b/spec/lib/diaspora_federation/discovery/web_finger_spec.rb index 5ce2722..9ee48dd 100644 --- a/spec/lib/diaspora_federation/discovery/web_finger_spec.rb +++ b/spec/lib/diaspora_federation/discovery/web_finger_spec.rb @@ -96,6 +96,51 @@ XML expect(wf.public_key).to eq(person.serialized_public_key) end + it "reads redmatrix XML" do + redmatrix_xml = <<-XML + + + + #{person.diaspora_id} + + + + + + + + + + + + + + + XML + + wf = Discovery::WebFinger.from_xml(redmatrix_xml) + expect(wf.acct_uri).to eq(person.diaspora_id) + expect(wf.alias_url).to be_nil + expect(wf.hcard_url).to eq(person.hcard_url) + expect(wf.seed_url).to eq(person.url) + expect(wf.profile_url).to eq(person.profile_url) + expect(wf.atom_url).to eq(person.atom_url) + expect(wf.salmon_url).to be_nil + + expect(wf.guid).to eq(person.guid) + expect(wf.public_key).to eq(person.serialized_public_key) + end + it "reads future XML without guid and public key" do future_xml = <<-XML diff --git a/spec/lib/diaspora_federation/validators/web_finger_validator_spec.rb b/spec/lib/diaspora_federation/validators/web_finger_validator_spec.rb index b9813c0..c2cc858 100644 --- a/spec/lib/diaspora_federation/validators/web_finger_validator_spec.rb +++ b/spec/lib/diaspora_federation/validators/web_finger_validator_spec.rb @@ -24,7 +24,7 @@ module DiasporaFederation end end - %i(alias_url hcard_url profile_url atom_url salmon_url).each do |prop| + %i(hcard_url profile_url atom_url).each do |prop| describe "##{prop}" do it_behaves_like "a url validator without path" do let(:property) { prop } @@ -36,6 +36,39 @@ module DiasporaFederation end end + # optional urls + %i(alias_url salmon_url).each do |prop| + describe "##{prop}" do + it "is allowed to be nil" do + validator = described_class.new(webfinger_stub(prop => nil)) + + expect(validator).to be_valid + expect(validator.errors).to be_empty + end + + it "must not be empty" do + validator = described_class.new(webfinger_stub(prop => "")) + + expect(validator).not_to be_valid + expect(validator.errors).to include(prop) + end + + it "fails for url with special chars" do + validator = described_class.new(webfinger_stub(prop => "https://asdf$%.com")) + + expect(validator).not_to be_valid + expect(validator.errors).to include(prop) + end + + it "fails for url without scheme" do + validator = described_class.new(webfinger_stub(prop => "example.com")) + + expect(validator).not_to be_valid + expect(validator.errors).to include(prop) + end + end + end + describe "#seed_url" do it_behaves_like "a url validator without path" do let(:property) { :seed_url }