diff --git a/app/controllers/diaspora_federation/webfinger_controller.rb b/app/controllers/diaspora_federation/webfinger_controller.rb index 0e755cd..542eb8f 100644 --- a/app/controllers/diaspora_federation/webfinger_controller.rb +++ b/app/controllers/diaspora_federation/webfinger_controller.rb @@ -8,7 +8,8 @@ module DiasporaFederation # example: # # - # + # # # # GET /.well-known/host-meta @@ -16,9 +17,47 @@ module DiasporaFederation render xml: WebfingerController.host_meta_xml, content_type: "application/xrd+xml" end - # @deprecated This is the pre RFC 7033 webfinger. + # Returns the webfinger as RFC 7033 JRD or XRD. # - # example: + # JSON example: + # { + # "subject": "acct:alice@localhost:3000", + # "aliases": [ + # "http://localhost:3000/people/c8e87290f6a20132963908fbffceb188" + # ], + # "links": [ + # { + # "rel": "http://microformats.org/profile/hcard", + # "type": "text/html", + # "href": "http://localhost:3000/hcard/users/c8e87290f6a20132963908fbffceb188" + # }, + # { + # "rel": "http://joindiaspora.com/seed_location", + # "type": "text/html", + # "href": "http://localhost:3000/" + # }, + # { + # "rel": "http://webfinger.net/rel/profile-page", + # "type": "text/html", + # "href": "http://localhost:3000/u/alice" + # }, + # { + # "rel": "http://schemas.google.com/g/2010#updates-from", + # "type": "application/atom+xml", + # "href": "http://localhost:3000/public/alice.atom" + # }, + # { + # "rel": "salmon", + # "href": "http://localhost:3000/receive/users/c8e87290f6a20132963908fbffceb188" + # }, + # { + # "rel": "http://ostatus.org/schema/1.0/subscribe", + # "template": "http://localhost:3000/people?q={uri}" + # } + # ] + # } + # + # XML example: # # # acct:alice@localhost:3000 @@ -26,22 +65,30 @@ module DiasporaFederation # # - # # # # - # # - # GET /webfinger?q= - def legacy_webfinger - person_wf = find_person_webfinger(params[:q]) if params[:q] + # + # GET /.well-known/webfinger?resource= + def webfinger + person_wf = find_person_webfinger(params.require(:resource)) if person_wf.nil? head :not_found else logger.info "webfinger profile request for: #{person_wf.acct_uri}" - render xml: person_wf.to_xml, content_type: "application/xrd+xml" + + respond_to do |format| + format.any(:jrd, :json, :html) do + headers["Access-Control-Allow-Origin"] = "*" + render json: JSON.pretty_generate(person_wf.to_json), content_type: "application/jrd+json" + end + format.any(:xrd, :xml) do + render xml: person_wf.to_xml, content_type: "application/xrd+xml" + end + end end end diff --git a/config/initializers/mime_types.rb b/config/initializers/mime_types.rb new file mode 100644 index 0000000..10cadb2 --- /dev/null +++ b/config/initializers/mime_types.rb @@ -0,0 +1,3 @@ +# mime types for webfinger +Mime::Type.register "application/jrd+json", :jrd +Mime::Type.register "application/xrd+xml", :xrd diff --git a/config/routes.rb b/config/routes.rb index cffd505..5e7086f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -9,8 +9,8 @@ DiasporaFederation::Engine.routes.draw do end controller :webfinger do - get ".well-known/host-meta" => :host_meta, :as => "host_meta" - get "webfinger" => :legacy_webfinger, :as => "legacy_webfinger" + get ".well-known/host-meta" => :host_meta, :as => "host_meta" + get ".well-known/webfinger" => :webfinger, :as => "webfinger" end controller :h_card do diff --git a/docs/discovery/webfinger.md b/docs/discovery/webfinger.md index 75a157e..b2044f2 100644 --- a/docs/discovery/webfinger.md +++ b/docs/discovery/webfinger.md @@ -6,7 +6,7 @@ diaspora\* uses an old draft of [WebFinger][webfinger-draft] to discover users f {% include warning_box.html title="Old WebFinger" - content="

diaspora* doesn't yet support the RFC 7033 WebFinger!

" + content="

diaspora* doesn't yet fully support the RFC 7033 WebFinger!

" %} ## WebFinger endpoint discovery @@ -54,7 +54,7 @@ Content-Type: application/xrd+xml; charset=utf-8 ~~~xml - + ~~~ @@ -70,7 +70,7 @@ of the searched person. #### Example ~~~ -GET /webfinger?q=acct:alice@example.org +GET /.well-known/webfinger.xml?resource=acct:alice@example.org Host: example.org ~~~ @@ -117,6 +117,7 @@ Content-Type: application/xrd+xml; charset=utf-8 * [RFC 6415: Web Host Metadata][host-meta] * [WebFinger draft][webfinger-draft] * [Extensible Resource Descriptor (XRD) Version 1.0][xrd] +* [RFC 7033: WebFinger][webfinger-rfc] [host-meta]: https://tools.ietf.org/html/rfc6415 [webfinger-draft]: https://tools.ietf.org/html/draft-jones-appsawg-webfinger-06 diff --git a/lib/diaspora_federation/discovery/host_meta.rb b/lib/diaspora_federation/discovery/host_meta.rb index 0c2f8fc..076306f 100644 --- a/lib/diaspora_federation/discovery/host_meta.rb +++ b/lib/diaspora_federation/discovery/host_meta.rb @@ -26,7 +26,7 @@ module DiasporaFederation end # URL fragment to append to the base URL - WEBFINGER_SUFFIX = "/webfinger?q={uri}".freeze + WEBFINGER_SUFFIX = "/.well-known/webfinger.xml?resource={uri}".freeze # Returns the WebFinger URL that was used to build this instance (either from # xml or by giving a base URL). diff --git a/lib/diaspora_federation/discovery/web_finger.rb b/lib/diaspora_federation/discovery/web_finger.rb index f6c1f0e..70f13f1 100644 --- a/lib/diaspora_federation/discovery/web_finger.rb +++ b/lib/diaspora_federation/discovery/web_finger.rb @@ -107,15 +107,11 @@ module DiasporaFederation # Creates the XML string from the current WebFinger instance # @return [String] XML string def to_xml - doc = XrdDocument.new + to_xrd.to_xml + end - doc.subject = acct_uri - doc.aliases.concat(additional_data[:aliases]) if additional_data[:aliases] - doc.properties.merge!(additional_data[:properties]) if additional_data[:properties] - - add_links_to(doc) - - doc.to_xml + def to_json + to_xrd.to_json end # Creates a WebFinger instance from the given XML string @@ -159,6 +155,16 @@ module DiasporaFederation end end + def to_xrd + XrdDocument.new.tap do |xrd| + xrd.subject = acct_uri + xrd.aliases.concat(additional_data[:aliases]) if additional_data[:aliases] + xrd.properties.merge!(additional_data[:properties]) if additional_data[:properties] + + add_links_to(xrd) + end + end + def add_links_to(doc) doc.links << {rel: REL_HCARD, type: "text/html", href: hcard_url} doc.links << {rel: REL_SEED, type: "text/html", href: seed_url} diff --git a/lib/diaspora_federation/discovery/xrd_document.rb b/lib/diaspora_federation/discovery/xrd_document.rb index 09b0721..a888064 100644 --- a/lib/diaspora_federation/discovery/xrd_document.rb +++ b/lib/diaspora_federation/discovery/xrd_document.rb @@ -69,9 +69,9 @@ module DiasporaFederation def to_xml Nokogiri::XML::Builder.new(encoding: "UTF-8") {|xml| xml.XRD("xmlns" => XMLNS) { - xml.Expires(@expires.strftime(DATETIME_FORMAT)) if @expires.instance_of?(DateTime) + xml.Expires(expires.strftime(DATETIME_FORMAT)) if expires.instance_of?(DateTime) - xml.Subject(@subject) if !@subject.nil? && !@subject.empty? + xml.Subject(subject) if !subject.nil? && !subject.empty? add_aliases_to(xml) add_properties_to(xml) @@ -80,6 +80,16 @@ module DiasporaFederation }.to_xml end + def to_json + { + subject: subject, + expires: expires, + aliases: (aliases if aliases.any?), + links: (links if links.any?), + properties: (properties if properties.any?) + }.reject {|_, v| v.nil? } + end + # Parse the XRD document from the given string and create a hash containing # the extracted data. # @@ -107,23 +117,26 @@ module DiasporaFederation private + attr_reader :expires + attr_reader :subject + NS = {xrd: XMLNS}.freeze def add_aliases_to(xml) - @aliases.each do |a| + aliases.each do |a| next if !a.instance_of?(String) || a.empty? xml.Alias(a.to_s) end end def add_properties_to(xml) - @properties.each do |type, val| + properties.each do |type, val| xml.Property(val.to_s, type: type) end end def add_links_to(xml) - @links.each do |l| + links.each do |l| attrs = {} LINK_ATTRS.each do |attr| attrs[attr.to_s] = l[attr] if l.key?(attr) diff --git a/spec/controllers/diaspora_federation/rails4_spec.rb b/spec/controllers/diaspora_federation/rails4_spec.rb index 4d506b5..7225c9a 100644 --- a/spec/controllers/diaspora_federation/rails4_spec.rb +++ b/spec/controllers/diaspora_federation/rails4_spec.rb @@ -17,13 +17,13 @@ module DiasporaFederation public_key: alice.serialized_public_key ).to_xml - get :legacy_webfinger, q: alice.diaspora_id + get :webfinger, format: :xml, resource: alice.diaspora_id expect(response).to be_success expect(response.body).to eq(webfinger_xrd) end it "404s when the person does not exist" do - get :legacy_webfinger, q: "me@mydiaspora.pod.com" + get :webfinger, format: :xml, resource: "me@mydiaspora.pod.com" expect(response).to be_not_found end end diff --git a/spec/controllers/diaspora_federation/webfinger_controller_spec.rb b/spec/controllers/diaspora_federation/webfinger_controller_spec.rb index e26ceeb..862a7fb 100644 --- a/spec/controllers/diaspora_federation/webfinger_controller_spec.rb +++ b/spec/controllers/diaspora_federation/webfinger_controller_spec.rb @@ -15,7 +15,7 @@ module DiasporaFederation it "contains the webfinger-template" do get :host_meta - expect(response.body).to include "template=\"http://localhost:3000/webfinger?q={uri}\"" + expect(response.body).to include "template=\"http://localhost:3000/.well-known/webfinger.xml?resource={uri}\"" end it "returns a application/xrd+xml" do @@ -35,31 +35,88 @@ module DiasporaFederation end end - describe "GET #legacy_webfinger", rails: 5 do - it "succeeds when the person exists" do - get :legacy_webfinger, params: {q: alice.diaspora_id} + describe "GET #webfinger", rails: 5 do + it "uses the JRD format as default" do + get :webfinger, params: {resource: alice.diaspora_id} expect(response).to be_success + expect(response.header["Content-Type"]).to include "application/jrd+json" end - it "succeeds with 'acct:' in the query when the person exists" do - get :legacy_webfinger, params: {q: "acct:#{alice.diaspora_id}"} - expect(response).to be_success + context "json", exceptions: :catch do + it "succeeds when the person exists" do + get :webfinger, format: :json, params: {resource: alice.diaspora_id} + expect(response).to be_success + end + + it "succeeds with 'acct:' in the query when the person exists" do + get :webfinger, format: :json, params: {resource: "acct:#{alice.diaspora_id}"} + expect(response).to be_success + end + + it "contains the diaspora* ID" do + get :webfinger, format: :json, params: {resource: "acct:#{alice.diaspora_id}"} + expect(response.body).to include "\"subject\": \"acct:alice@localhost:3000\"" + end + + it "returns a application/jrd+json" do + get :webfinger, format: :json, params: {resource: "acct:#{alice.diaspora_id}"} + expect(response.header["Content-Type"]).to include "application/jrd+json" + end + + it "adds a Access-Control-Allow-Origin header" do + get :webfinger, format: :json, params: {resource: "acct:#{alice.diaspora_id}"} + expect(response.header["Access-Control-Allow-Origin"]).to eq("*") + end + + it "404s when the person does not exist" do + get :webfinger, format: :json, params: {resource: "me@mydiaspora.pod.com"} + expect(response).to be_not_found + end + + it "raises when the resource parameter is missing" do + expect { + get :webfinger, format: :json + }.to raise_error ActionController::ParameterMissing, "param is missing or the value is empty: resource" + end + + it "calls the fetch_person_for_webfinger callback" do + expect_callback(:fetch_person_for_webfinger, "alice@localhost:3000").and_call_original + + get :webfinger, format: :json, params: {resource: "acct:alice@localhost:3000"} + end end - it "contains the diaspora* ID" do - get :legacy_webfinger, params: {q: "acct:#{alice.diaspora_id}"} - expect(response.body).to include "acct:alice@localhost:3000" - end + context "xml" do + it "succeeds when the person exists" do + get :webfinger, format: :json, params: {resource: alice.diaspora_id} + expect(response).to be_success + end - it "404s when the person does not exist" do - get :legacy_webfinger, params: {q: "me@mydiaspora.pod.com"} - expect(response).to be_not_found - end + it "succeeds with 'acct:' in the query when the person exists" do + get :webfinger, format: :xml, params: {resource: "acct:#{alice.diaspora_id}"} + expect(response).to be_success + end - it "calls the fetch_person_for_webfinger callback" do - expect_callback(:fetch_person_for_webfinger, "alice@localhost:3000").and_call_original + it "contains the diaspora* ID" do + get :webfinger, format: :xml, params: {resource: "acct:#{alice.diaspora_id}"} + expect(response.body).to include "acct:alice@localhost:3000" + end - get :legacy_webfinger, params: {q: "acct:alice@localhost:3000"} + it "returns a application/xrd+xml" do + get :webfinger, format: :xml, params: {resource: "acct:#{alice.diaspora_id}"} + expect(response.header["Content-Type"]).to include "application/xrd+xml" + end + + it "404s when the person does not exist" do + get :webfinger, format: :xml, params: {resource: "me@mydiaspora.pod.com"} + expect(response).to be_not_found + end + + it "calls the fetch_person_for_webfinger callback" do + expect_callback(:fetch_person_for_webfinger, "alice@localhost:3000").and_call_original + + get :webfinger, format: :xml, params: {resource: "acct:alice@localhost:3000"} + end end end end diff --git a/spec/lib/diaspora_federation/discovery/discovery_spec.rb b/spec/lib/diaspora_federation/discovery/discovery_spec.rb index a9a36b3..5c380ac 100644 --- a/spec/lib/diaspora_federation/discovery/discovery_spec.rb +++ b/spec/lib/diaspora_federation/discovery/discovery_spec.rb @@ -49,7 +49,7 @@ module DiasporaFederation it "fetches the userdata and returns a person object" do stub_request(:get, "https://localhost:3000/.well-known/host-meta") .to_return(status: 200, body: host_meta_xrd) - stub_request(:get, "http://localhost:3000/webfinger?q=acct:#{account}") + stub_request(:get, "http://localhost:3000/.well-known/webfinger.xml?resource=acct:#{account}") .to_return(status: 200, body: webfinger_xrd) stub_request(:get, "http://localhost:3000/hcard/users/#{alice.guid}") .to_return(status: 200, body: hcard_html) @@ -76,7 +76,7 @@ module DiasporaFederation it "fetches the userdata and saves the person object via callback" do stub_request(:get, "https://localhost:3000/.well-known/host-meta") .to_return(status: 200, body: host_meta_xrd) - stub_request(:get, "http://localhost:3000/webfinger?q=acct:#{account}") + stub_request(:get, "http://localhost:3000/.well-known/webfinger.xml?resource=acct:#{account}") .to_return(status: 200, body: webfinger_xrd) stub_request(:get, "http://localhost:3000/hcard/users/#{alice.guid}") .to_return(status: 200, body: hcard_html) @@ -96,7 +96,7 @@ module DiasporaFederation .to_return(status: 404) stub_request(:get, "http://localhost:3000/.well-known/host-meta") .to_return(status: 200, body: host_meta_xrd) - stub_request(:get, "http://localhost:3000/webfinger?q=acct:#{account}") + stub_request(:get, "http://localhost:3000/.well-known/webfinger.xml?resource=acct:#{account}") .to_return(status: 200, body: webfinger_xrd) stub_request(:get, "http://localhost:3000/hcard/users/#{alice.guid}") .to_return(status: 200, body: hcard_html) @@ -113,7 +113,7 @@ module DiasporaFederation .to_raise(OpenSSL::SSL::SSLError) stub_request(:get, "http://localhost:3000/.well-known/host-meta") .to_return(status: 200, body: host_meta_xrd) - stub_request(:get, "http://localhost:3000/webfinger?q=acct:#{account}") + stub_request(:get, "http://localhost:3000/.well-known/webfinger.xml?resource=acct:#{account}") .to_return(status: 200, body: webfinger_xrd) stub_request(:get, "http://localhost:3000/hcard/users/#{alice.guid}") .to_return(status: 200, body: hcard_html) @@ -130,7 +130,7 @@ module DiasporaFederation stub_request(:get, "https://localhost:3000/.well-known/host-meta") .to_return(status: 200, body: host_meta_xrd) - stub_request(:get, "http://localhost:3000/webfinger?q=acct:#{account}") + stub_request(:get, "http://localhost:3000/.well-known/webfinger.xml?resource=acct:#{account}") .to_return(status: 200, body: modified_webfinger) expect { Discovery::Discovery.new(account).fetch_and_save }.to raise_error Discovery::DiscoveryError @@ -139,7 +139,7 @@ module DiasporaFederation it "fails if the diaspora* ID was not found" do stub_request(:get, "https://localhost:3000/.well-known/host-meta") .to_return(status: 200, body: host_meta_xrd) - stub_request(:get, "http://localhost:3000/webfinger?q=acct:#{account}") + stub_request(:get, "http://localhost:3000/.well-known/webfinger.xml?resource=acct:#{account}") .to_return(status: 404) expect { Discovery::Discovery.new(account).fetch_and_save }.to raise_error Discovery::DiscoveryError diff --git a/spec/lib/diaspora_federation/discovery/host_meta_spec.rb b/spec/lib/diaspora_federation/discovery/host_meta_spec.rb index 65f4d47..aeb6fa6 100644 --- a/spec/lib/diaspora_federation/discovery/host_meta_spec.rb +++ b/spec/lib/diaspora_federation/discovery/host_meta_spec.rb @@ -4,7 +4,7 @@ module DiasporaFederation let(:xml) { <<-XML } - + XML @@ -36,7 +36,7 @@ XML context "parsing" do it "parses its own output" do hm = Discovery::HostMeta.from_xml(xml) - expect(hm.webfinger_template_url).to eq("#{base_url}webfinger?q={uri}") + expect(hm.webfinger_template_url).to eq("#{base_url}.well-known/webfinger.xml?resource={uri}") end it "also reads old-style XML" do diff --git a/spec/lib/diaspora_federation/discovery/web_finger_spec.rb b/spec/lib/diaspora_federation/discovery/web_finger_spec.rb index fbd6763..ce2a612 100644 --- a/spec/lib/diaspora_federation/discovery/web_finger_spec.rb +++ b/spec/lib/diaspora_federation/discovery/web_finger_spec.rb @@ -44,22 +44,36 @@ XML it_behaves_like "an Entity subclass" context "generation" do - it "creates a nice XML document" do - wf = Discovery::WebFinger.new(data, aliases: [person.alias_url]) - expect(wf.to_xml).to eq(xml) - end + let(:minimal_data) { {acct_uri: acct, hcard_url: person.hcard_url, seed_url: person.url} } + let(:additional_data) { + { + 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" + }, + {rel: "http://openid.net/specs/connect/1.0/issuer", href: "https://pod.example.tld/"} + ] + } + } - it "creates minimal XML document" do - wf = Discovery::WebFinger.new( - acct_uri: acct, - hcard_url: person.hcard_url, - seed_url: person.url - ) - expect(wf.to_xml).to eq(minimal_xml) - end + context "xml" do + it "creates a nice XML document" do + wf = Discovery::WebFinger.new(data, aliases: [person.alias_url]) + expect(wf.to_xml).to eq(xml) + end - it "creates XML document with additional data" do - xml_with_additional_data = <<-XML + it "creates minimal XML document" do + wf = Discovery::WebFinger.new(minimal_data) + expect(wf.to_xml).to eq(minimal_xml) + end + + it "creates XML document with additional data" do + xml_with_additional_data = <<-XML #{acct} @@ -70,27 +84,123 @@ XML + 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) + wf = Discovery::WebFinger.new(minimal_data, additional_data) + expect(wf.to_xml).to eq(xml_with_additional_data) + end + end + + context "json" do + it "creates a nice JSON document" do + json = <<-JSON +{ + "subject": "#{acct}", + "aliases": [ + "#{person.alias_url}" + ], + "links": [ + { + "rel": "http://microformats.org/profile/hcard", + "type": "text/html", + "href": "#{person.hcard_url}" + }, + { + "rel": "http://joindiaspora.com/seed_location", + "type": "text/html", + "href": "#{person.url}" + }, + { + "rel": "http://webfinger.net/rel/profile-page", + "type": "text/html", + "href": "#{person.profile_url}" + }, + { + "rel": "http://schemas.google.com/g/2010#updates-from", + "type": "application/atom+xml", + "href": "#{person.atom_url}" + }, + { + "rel": "salmon", + "href": "#{person.salmon_url}" + }, + { + "rel": "http://ostatus.org/schema/1.0/subscribe", + "template": "http://somehost:3000/people?q={uri}" + } + ] +} +JSON + wf = Discovery::WebFinger.new(data, aliases: [person.alias_url]) + expect(JSON.pretty_generate(wf.to_json)).to eq(json.strip) + end + + it "creates minimal JSON document" do + minimal_json = <<-JSON +{ + "subject": "#{acct}", + "links": [ + { + "rel": "http://microformats.org/profile/hcard", + "type": "text/html", + "href": "#{person.hcard_url}" + }, + { + "rel": "http://joindiaspora.com/seed_location", + "type": "text/html", + "href": "#{person.url}" + } + ] +} +JSON + wf = Discovery::WebFinger.new(minimal_data) + expect(JSON.pretty_generate(wf.to_json)).to eq(minimal_json.strip) + end + + it "creates JSON document with additional data" do + json_with_additional_data = <<-JSON +{ + "subject": "#{acct}", + "aliases": [ + "#{person.alias_url}", + "#{person.profile_url}" + ], + "links": [ + { + "rel": "http://microformats.org/profile/hcard", + "type": "text/html", + "href": "#{person.hcard_url}" + }, + { + "rel": "http://joindiaspora.com/seed_location", + "type": "text/html", + "href": "#{person.url}" + }, + { + "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" + }, + { + "rel": "http://openid.net/specs/connect/1.0/issuer", + "href": "https://pod.example.tld/" + } + ], + "properties": { + "http://webfinger.example/ns/name": "Bob Smith" + } +} +JSON + + wf = Discovery::WebFinger.new(minimal_data, additional_data) + expect(JSON.pretty_generate(wf.to_json)).to eq(json_with_additional_data.strip) + end end end diff --git a/spec/lib/diaspora_federation/discovery/xrd_document_spec.rb b/spec/lib/diaspora_federation/discovery/xrd_document_spec.rb index e646767..6f0eca0 100644 --- a/spec/lib/diaspora_federation/discovery/xrd_document_spec.rb +++ b/spec/lib/diaspora_federation/discovery/xrd_document_spec.rb @@ -45,9 +45,8 @@ XML } } - context "generation" do - it "creates the xml document" do - doc = Discovery::XrdDocument.new + let(:doc) { + Discovery::XrdDocument.new.tap do |doc| doc.expires = data[:expires] doc.subject = data[:subject] @@ -62,15 +61,25 @@ XML data[:links].each do |h| doc.links << h end + end + } + describe "#to_xml" do + it "creates the xml document" do expect(doc.to_xml).to eq(xml) end end - context "parsing" do + describe "#to_json" do + it "provides the hash for json" do + expect(doc.to_json).to eq(data) + end + end + + describe ".xml_data" do it "reads the xml document" do - doc = Discovery::XrdDocument.xml_data(xml) - expect(doc).to eq(data) + hash = Discovery::XrdDocument.xml_data(xml) + expect(hash).to eq(data) end it "raises InvalidDocument if the xml is empty" do diff --git a/spec/routing/webfinger_routing_spec.rb b/spec/routing/webfinger_routing_spec.rb index be2f48c..11f845a 100644 --- a/spec/routing/webfinger_routing_spec.rb +++ b/spec/routing/webfinger_routing_spec.rb @@ -9,10 +9,10 @@ module DiasporaFederation ) end - it "routes GET legacy webfinger" do - expect(get: "/webfinger").to route_to( + it "routes GET webfinger" do + expect(get: "/.well-known/webfinger").to route_to( controller: "diaspora_federation/webfinger", - action: "legacy_webfinger" + action: "webfinger" ) end end