Skip to content

Commit

Permalink
Allow to generate WebFinger with additional data
Browse files Browse the repository at this point in the history
This allows projects to use this library to generate the WebFinger
document when they already need WebFinger for other elements.

Also removed the explicit alias_url, aliases can now be added with
{aliases: [alias_url]} as second parameter.
  • Loading branch information
SuperTux88 committed May 2, 2017
1 parent 5fef763 commit 1b9dfc8
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 26 deletions.
40 changes: 23 additions & 17 deletions lib/diaspora_federation/discovery/web_finger.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ module Discovery
# @example Creating a WebFinger document from a person hash
# wf = WebFinger.new(
# acct_uri: "acct:user@server.example",
# alias_url: "https://server.example/people/0123456789abcdef",
# hcard_url: "https://server.example/hcard/users/user",
# seed_url: "https://server.example/",
# profile_url: "https://server.example/u/user",
Expand All @@ -35,11 +34,6 @@ class WebFinger < Entity
# @return [String]
property :acct_uri, :string

# @!attribute [r] alias_url
# @note could be nil
# @return [String] link to the users profile
property :alias_url, :string, default: nil

# @!attribute [r] hcard_url
# @return [String] link to the +hCard+
property :hcard_url, :string
Expand Down Expand Up @@ -93,12 +87,31 @@ class WebFinger < Entity
# +subscribe_url+ link relation
REL_SUBSCRIBE = "http://ostatus.org/schema/1.0/subscribe".freeze

# Additional WebFinger data
# @return [Hash] additional elements
attr_reader :additional_data

# Initializes a new WebFinger Entity
#
# @param [Hash] data WebFinger data
# @param [Hash] additional_data additional WebFinger data
# @option additional_data [Array<String>] :aliases additional aliases
# @option additional_data [Hash] :properties properties
# @option additional_data [Array<Hash>] :links additional link elements
# @see DiasporaFederation::Entity#initialize
def initialize(data, additional_data={})
@additional_data = additional_data
super(data)
end

# Creates the XML string from the current WebFinger instance
# @return [String] XML string
def to_xml
doc = XrdDocument.new

doc.subject = acct_uri
doc.aliases << alias_url
doc.aliases.concat(additional_data[:aliases]) if additional_data[:aliases]
doc.properties.merge!(additional_data[:properties]) if additional_data[:properties]

add_links_to(doc)

Expand All @@ -116,7 +129,7 @@ def self.from_xml(webfinger_xml)

new(
acct_uri: data[:subject],
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),
Expand Down Expand Up @@ -151,6 +164,8 @@ def add_links_to(doc)
doc.links << {rel: REL_SEED, type: "text/html", href: seed_url}

add_optional_links_to(doc)

doc.links.concat(additional_data[:links]) if additional_data[:links]
end

def add_optional_links_to(doc)
Expand All @@ -174,15 +189,6 @@ def add_optional_links_to(doc)
element = find_link(links, rel)
element ? element[:template] : nil
end

# This method is used to parse the alias_url from the XML.
# * redmatrix has sometimes no alias, return nil
# * old pods had quotes around the alias url, this can be removed later
# * friendica has two aliases and the first is with "acct:": return only an URL starting with http (or https)
private_class_method def self.parse_alias(aliases)
return nil unless aliases
aliases.find {|a| a.start_with?("http") }
end
end
end
end
1 change: 0 additions & 1 deletion lib/diaspora_federation/validators/web_finger_validator.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ class WebFingerValidator < Validation::Validator

rule :acct_uri, :not_empty

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, URI: %i(host path)
Expand Down
45 changes: 38 additions & 7 deletions spec/lib/diaspora_federation/discovery/web_finger_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,7 @@ module DiasporaFederation

let(:data) {
{
acct_uri: "acct:#{person.diaspora_id}",
alias_url: person.alias_url,
acct_uri: acct,
hcard_url: person.hcard_url,
seed_url: person.url,
profile_url: person.profile_url,
Expand Down Expand Up @@ -46,25 +45,59 @@ module DiasporaFederation

context "generation" do
it "creates a nice XML document" do
wf = Discovery::WebFinger.new(data)
wf = Discovery::WebFinger.new(data, aliases: [person.alias_url])
expect(wf.to_xml).to eq(xml)
end

it "creates minimal XML document" do
wf = Discovery::WebFinger.new(
acct_uri: "acct:#{person.diaspora_id}",
acct_uri: acct,
hcard_url: person.hcard_url,
seed_url: person.url
)
expect(wf.to_xml).to eq(minimal_xml)
end

it "creates XML document with additional data" do
xml_with_additional_data = <<-XML
<?xml version="1.0" encoding="UTF-8"?>
<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0">
<Subject>#{acct}</Subject>
<Alias>#{person.alias_url}</Alias>
<Alias>#{person.profile_url}</Alias>
<Property type="http://webfinger.example/ns/name">Bob Smith</Property>
<Link rel="http://microformats.org/profile/hcard" type="text/html" href="#{person.hcard_url}"/>
<Link rel="http://joindiaspora.com/seed_location" type="text/html" href="#{person.url}"/>
<Link rel="http://portablecontacts.net/spec/1.0" href="https://pod.example.tld/poco/trouble"/>
<Link rel="http://webfinger.net/rel/avatar" type="image/jpeg" href="http://localhost:3000/assets/user/default.png"/>
</XRD>
XML

wf = Discovery::WebFinger.new(
{
acct_uri: acct,
hcard_url: person.hcard_url,
seed_url: person.url
},
aliases: [person.alias_url, person.profile_url],
properties: {"http://webfinger.example/ns/name" => "Bob Smith"},
links: [
{rel: "http://portablecontacts.net/spec/1.0", href: "https://pod.example.tld/poco/trouble"},
{
rel: "http://webfinger.net/rel/avatar",
type: "image/jpeg",
href: "http://localhost:3000/assets/user/default.png"
}
]
)
expect(wf.to_xml).to eq(xml_with_additional_data)
end
end

context "parsing" do
it "reads its own output" do
wf = Discovery::WebFinger.from_xml(xml)
expect(wf.acct_uri).to eq(acct)
expect(wf.alias_url).to eq(person.alias_url)
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)
Expand Down Expand Up @@ -134,7 +167,6 @@ module DiasporaFederation

wf = Discovery::WebFinger.from_xml(friendica_xml)
expect(wf.acct_uri).to eq(acct)
expect(wf.alias_url).to eq(person.alias_url)
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)
Expand Down Expand Up @@ -177,7 +209,6 @@ module DiasporaFederation

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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ module DiasporaFederation
end

# optional urls
%i(alias_url salmon_url profile_url atom_url).each do |prop|
%i(salmon_url profile_url atom_url).each do |prop|
describe "##{prop}" do
it_behaves_like "a property with a value validation/restriction" do
let(:property) { prop }
Expand Down

0 comments on commit 1b9dfc8

Please sign in to comment.