require_dependency "diaspora_federation/application_controller" module DiasporaFederation # This controller handles all webfinger-specific requests. class WebfingerController < ApplicationController # Returns the host-meta xml # # example: # # # # # # GET /.well-known/host-meta def host_meta render xml: WebfingerController.host_meta_xml, content_type: "application/xrd+xml" end # Returns the webfinger as RFC 7033 JRD or XRD. # # 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 # http://localhost:3000/people/c8e87290f6a20132963908fbffceb188 # # # # # # # # 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}" 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 # Creates the host-meta xml with the configured server_uri and caches it # @return [String] XML string def self.host_meta_xml @host_meta_xml ||= Discovery::HostMeta.from_base_url(DiasporaFederation.server_uri.to_s).to_xml end private def find_person_webfinger(query) DiasporaFederation.callbacks.trigger(:fetch_person_for_webfinger, query.strip.downcase.sub("acct:", "")) end end end