diff --git a/lib/diaspora_federation/web_finger/web_finger.rb b/lib/diaspora_federation/web_finger/web_finger.rb
index 2fc39e7..f8c4571 100644
--- a/lib/diaspora_federation/web_finger/web_finger.rb
+++ b/lib/diaspora_federation/web_finger/web_finger.rb
@@ -16,7 +16,8 @@ module DiasporaFederation
# hcard_url: "https://server.example/hcard/users/user",
# seed_url: "https://server.example/",
# profile_url: "https://server.example/u/user",
- # updates_url: "https://server.example/public/user.atom",
+ # atom_url: "https://server.example/public/user.atom",
+ # salmon_url: "https://server.example/receive/users/0123456789abcdef",
# guid: "0123456789abcdef",
# pubkey: "ABCDEF=="
# })
@@ -36,7 +37,7 @@ module DiasporaFederation
class WebFinger
private_class_method :new
- attr_reader :acct_uri, :alias_url, :hcard_url, :seed_url, :profile_url, :updates_url
+ attr_reader :acct_uri, :alias_url, :hcard_url, :seed_url, :profile_url, :atom_url, :salmon_url
# @deprecated Either convert these to +Property+ elements or move to the
# +hCard+, which actually has fields for an +UID+ and +KEY+ defined in
@@ -60,7 +61,10 @@ module DiasporaFederation
REL_PROFILE = "http://webfinger.net/rel/profile-page"
# Atom feed link relation
- REL_UPDATES = "http://schemas.google.com/g/2010#updates-from"
+ REL_ATOM = "http://schemas.google.com/g/2010#updates-from"
+
+ # +salmon+ endpoint link relation
+ REL_SALMON = "salmon"
# @deprecated This should be a +Property+ or moved to the +hcard+, but +Link+
# is inappropriate according to the specification (will affect older
@@ -85,7 +89,7 @@ module DiasporaFederation
# @return [WebFinger] WebFinger instance
# @raise [InvalidData] if the given data Hash is invalid or incomplete
def self.from_account(data)
- raise InvalidData unless account_data_complete?(data)
+ raise InvalidData, "account data incomplete" unless account_data_complete?(data)
wf = allocate
wf.instance_eval {
@@ -94,7 +98,8 @@ module DiasporaFederation
@hcard_url = data[:hcard_url]
@seed_url = data[:seed_url]
@profile_url = data[:profile_url]
- @updates_url = data[:updates_url]
+ @atom_url = data[:atom_url]
+ @salmon_url = data[:salmon_url]
# TODO: change me! #########
@guid = data[:guid]
@@ -111,7 +116,7 @@ module DiasporaFederation
def self.from_xml(webfinger_xml)
data = parse_xml_and_validate(webfinger_xml)
- hcard_url, seed_url, guid, profile_url, updates_url, pubkey = parse_links(data)
+ hcard_url, seed_url, guid, profile_url, atom_url, salmon_url, pubkey = parse_links(data)
wf = allocate
wf.instance_eval {
@@ -120,7 +125,8 @@ module DiasporaFederation
@hcard_url = hcard_url
@seed_url = seed_url
@profile_url = profile_url
- @updates_url = updates_url
+ @atom_url = atom_url
+ @salmon_url = salmon_url
# TODO: change me! ##########
@guid = guid
@@ -136,11 +142,11 @@ module DiasporaFederation
# @param [Hash] data account data
# @return [Boolean] validation result
def self.account_data_complete?(data)
- !data.nil? && data.instance_of?(Hash) &&
- data.key?(:acct_uri) && data.key?(:alias_url) &&
- data.key?(:hcard_url) && data.key?(:seed_url) &&
- data.key?(:guid) && data.key?(:profile_url) &&
- data.key?(:updates_url) && data.key?(:pubkey)
+ data.instance_of?(Hash) && data.key?(:acct_uri) &&
+ data.key?(:alias_url) && data.key?(:hcard_url) &&
+ data.key?(:seed_url) && data.key?(:guid) &&
+ data.key?(:profile_url) && data.key?(:atom_url) &&
+ data.key?(:salmon_url) && data.key?(:pubkey)
end
private_class_method :account_data_complete?
@@ -151,7 +157,8 @@ module DiasporaFederation
# @raise [InvalidData] if the given XML string is invalid or incomplete
def self.parse_xml_and_validate(webfinger_xml)
data = XrdDocument.xml_data(webfinger_xml)
- raise InvalidData unless data.key?(:subject) && data.key?(:aliases) && data.key?(:links)
+ valid = data.key?(:subject) && data.key?(:aliases) && data.key?(:links)
+ raise InvalidData, "webfinger xml is incomplete" unless valid
data
end
private_class_method :parse_xml_and_validate
@@ -173,9 +180,11 @@ module DiasporaFederation
doc.links << {rel: REL_PROFILE,
type: "text/html",
href: @profile_url}
- doc.links << {rel: REL_UPDATES,
+ doc.links << {rel: REL_ATOM,
type: "application/atom+xml",
- href: @updates_url}
+ href: @atom_url}
+ doc.links << {rel: REL_SALMON,
+ href: @salmon_url}
# TODO: change me! ##############
doc.links << {rel: REL_PUBKEY,
@@ -190,10 +199,11 @@ module DiasporaFederation
seed = parse_link(links, REL_SEED)
guid = parse_link(links, REL_GUID)
profile = parse_link(links, REL_PROFILE)
- updates = parse_link(links, REL_UPDATES)
+ atom = parse_link(links, REL_ATOM)
+ salmon = parse_link(links, REL_SALMON)
pubkey = parse_link(links, REL_PUBKEY)
- raise InvalidData unless [hcard, seed, guid, profile, updates, pubkey].all?
- [hcard[:href], seed[:href], guid[:href], profile[:href], updates[:href], pubkey[:href]]
+ raise InvalidData, "webfinger xml is incomplete" unless [hcard, seed, guid, profile, atom, salmon, pubkey].all?
+ [hcard[:href], seed[:href], guid[:href], profile[:href], atom[:href], salmon[:href], pubkey[:href]]
end
private_class_method :parse_links
diff --git a/spec/lib/web_finger/web_finger_spec.rb b/spec/lib/web_finger/web_finger_spec.rb
index ba3d23a..2da8e16 100644
--- a/spec/lib/web_finger/web_finger_spec.rb
+++ b/spec/lib/web_finger/web_finger_spec.rb
@@ -6,7 +6,8 @@ module DiasporaFederation
seed_url = "https://pod.geraspora.de/"
guid = "abcdef0123456789"
profile_url = "https://pod.example.tld/u/user"
- updates_url = "https://pod.example.tld/public/user.atom"
+ atom_url = "https://pod.example.tld/public/user.atom"
+ salmon_url = "https://pod.example.tld/receive/users/abcdef0123456789"
pubkey = "AAAAAA=="
xml = <<-XML
@@ -18,7 +19,8 @@ module DiasporaFederation
-
+
+
XML
@@ -35,7 +37,8 @@ XML
hcard_url: hcard_url,
seed_url: seed_url,
profile_url: profile_url,
- updates_url: updates_url,
+ atom_url: atom_url,
+ salmon_url: salmon_url,
guid: guid,
pubkey: pubkey
)
@@ -52,9 +55,13 @@ XML
}.to raise_error(WebFinger::InvalidData)
end
- it "fails if nothing was given" do
+ it "fails if empty was given" do
expect { WebFinger::WebFinger.from_account({}) }.to raise_error(WebFinger::InvalidData)
end
+
+ it "fails if nil was given" do
+ expect { WebFinger::WebFinger.from_account(nil) }.to raise_error(WebFinger::InvalidData)
+ end
end
context "parsing" do
@@ -65,7 +72,8 @@ XML
expect(wf.hcard_url).to eq(hcard_url)
expect(wf.seed_url).to eq(seed_url)
expect(wf.profile_url).to eq(profile_url)
- expect(wf.updates_url).to eq(updates_url)
+ expect(wf.atom_url).to eq(atom_url)
+ expect(wf.salmon_url).to eq(salmon_url)
expect(wf.guid).to eq(guid)
expect(wf.pubkey).to eq(pubkey)
@@ -82,7 +90,8 @@ XML
-
+
+
@@ -94,7 +103,8 @@ XML
expect(wf.hcard_url).to eq(hcard_url)
expect(wf.seed_url).to eq(seed_url)
expect(wf.profile_url).to eq(profile_url)
- expect(wf.updates_url).to eq(updates_url)
+ expect(wf.atom_url).to eq(atom_url)
+ expect(wf.salmon_url).to eq(salmon_url)
expect(wf.guid).to eq(guid)
expect(wf.pubkey).to eq(pubkey)