refactor webfinger

- add salmon private url for user
- rename upates_url to atom_url
This commit is contained in:
Benjamin Neff 2015-06-20 22:39:14 +02:00
parent 5ac7a14b1e
commit 5792afb427
2 changed files with 45 additions and 25 deletions

View file

@ -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

View file

@ -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
<Link rel="http://joindiaspora.com/seed_location" type="text/html" href="#{seed_url}"/>
<Link rel="http://joindiaspora.com/guid" type="text/html" href="#{guid}"/>
<Link rel="http://webfinger.net/rel/profile-page" type="text/html" href="#{profile_url}"/>
<Link rel="http://schemas.google.com/g/2010#updates-from" type="application/atom+xml" href="#{updates_url}"/>
<Link rel="http://schemas.google.com/g/2010#updates-from" type="application/atom+xml" href="#{atom_url}"/>
<Link rel="salmon" href="#{salmon_url}"/>
<Link rel="diaspora-public-key" type="RSA" href="#{pubkey}"/>
</XRD>
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
<Link rel="http://joindiaspora.com/guid" type = "text/html" href="#{guid}"/>
<Link rel="http://webfinger.net/rel/profile-page" type="text/html" href="#{profile_url}"/>
<Link rel="http://schemas.google.com/g/2010#updates-from" type="application/atom+xml" href="#{updates_url}"/>
<Link rel="http://schemas.google.com/g/2010#updates-from" type="application/atom+xml" href="#{atom_url}"/>
<Link rel="salmon" href="#{salmon_url}"/>
<Link rel="diaspora-public-key" type = "RSA" href="#{pubkey}"/>
</XRD>
@ -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)