* Add request spec for host meta route returning xml * Add routing spec for xrd routes * Update well-known routes * Move webfinger and host-meta actions to their own controllersclosed-social-glitch-2
@ -0,0 +1,13 @@ | |||||
# frozen_string_literal: true | |||||
module WellKnown | |||||
class HostMetaController < ApplicationController | |||||
def show | |||||
@webfinger_template = "#{webfinger_url}?resource={uri}" | |||||
respond_to do |format| | |||||
format.xml { render content_type: 'application/xrd+xml' } | |||||
end | |||||
end | |||||
end | |||||
end |
@ -0,0 +1,43 @@ | |||||
# frozen_string_literal: true | |||||
module WellKnown | |||||
class WebfingerController < ApplicationController | |||||
def show | |||||
@account = Account.find_local!(username_from_resource) | |||||
@canonical_account_uri = @account.to_webfinger_s | |||||
@magic_key = pem_to_magic_key(@account.keypair.public_key) | |||||
respond_to do |format| | |||||
format.xml { render content_type: 'application/xrd+xml' } | |||||
format.json { render content_type: 'application/jrd+json' } | |||||
end | |||||
rescue ActiveRecord::RecordNotFound | |||||
head 404 | |||||
end | |||||
private | |||||
def username_from_resource | |||||
WebfingerResource.new(resource_param).username | |||||
end | |||||
def pem_to_magic_key(public_key) | |||||
modulus, exponent = [public_key.n, public_key.e].map do |component| | |||||
result = [] | |||||
until component.zero? | |||||
result << [component % 256].pack('C') | |||||
component >>= 8 | |||||
end | |||||
result.reverse.join | |||||
end | |||||
(['RSA'] + [modulus, exponent].map { |n| Base64.urlsafe_encode64(n) }).join('.') | |||||
end | |||||
def resource_param | |||||
params.require(:resource) | |||||
end | |||||
end | |||||
end |
@ -1,55 +0,0 @@ | |||||
# frozen_string_literal: true | |||||
class XrdController < ApplicationController | |||||
before_action :set_default_format_xml, only: :host_meta | |||||
def host_meta | |||||
@webfinger_template = "#{webfinger_url}?resource={uri}" | |||||
respond_to do |format| | |||||
format.xml { render content_type: 'application/xrd+xml' } | |||||
end | |||||
end | |||||
def webfinger | |||||
@account = Account.find_local!(username_from_resource) | |||||
@canonical_account_uri = @account.to_webfinger_s | |||||
@magic_key = pem_to_magic_key(@account.keypair.public_key) | |||||
respond_to do |format| | |||||
format.xml { render content_type: 'application/xrd+xml' } | |||||
format.json { render content_type: 'application/jrd+json' } | |||||
end | |||||
rescue ActiveRecord::RecordNotFound | |||||
head 404 | |||||
end | |||||
private | |||||
def set_default_format_xml | |||||
request.format = 'xml' if request.headers['HTTP_ACCEPT'].nil? && params[:format].nil? | |||||
end | |||||
def username_from_resource | |||||
WebfingerResource.new(resource_param).username | |||||
end | |||||
def pem_to_magic_key(public_key) | |||||
modulus, exponent = [public_key.n, public_key.e].map do |component| | |||||
result = [] | |||||
until component.zero? | |||||
result << [component % 256].pack('C') | |||||
component >>= 8 | |||||
end | |||||
result.reverse.join | |||||
end | |||||
(['RSA'] + [modulus, exponent].map { |n| Base64.urlsafe_encode64(n) }).join('.') | |||||
end | |||||
def resource_param | |||||
params.require(:resource) | |||||
end | |||||
end |
@ -0,0 +1,13 @@ | |||||
require 'rails_helper' | |||||
describe WellKnown::HostMetaController, type: :controller do | |||||
render_views | |||||
describe 'GET #show' do | |||||
it 'returns http success' do | |||||
get :show, format: :xml | |||||
expect(response).to have_http_status(:success) | |||||
end | |||||
end | |||||
end |
@ -0,0 +1,21 @@ | |||||
require 'rails_helper' | |||||
describe WellKnown::WebfingerController, type: :controller do | |||||
render_views | |||||
describe 'GET #show' do | |||||
let(:alice) { Fabricate(:account, username: 'alice') } | |||||
it 'returns http success when account can be found' do | |||||
get :show, params: { resource: alice.to_webfinger_s }, format: :json | |||||
expect(response).to have_http_status(:success) | |||||
end | |||||
it 'returns http not found when account cannot be found' do | |||||
get :show, params: { resource: 'acct:not@existing.com' }, format: :json | |||||
expect(response).to have_http_status(:not_found) | |||||
end | |||||
end | |||||
end |
@ -1,26 +0,0 @@ | |||||
require 'rails_helper' | |||||
RSpec.describe XrdController, type: :controller do | |||||
render_views | |||||
describe 'GET #host_meta' do | |||||
it 'returns http success' do | |||||
get :host_meta | |||||
expect(response).to have_http_status(:success) | |||||
end | |||||
end | |||||
describe 'GET #webfinger' do | |||||
let(:alice) { Fabricate(:account, username: 'alice') } | |||||
it 'returns http success when account can be found' do | |||||
get :webfinger, params: { resource: alice.to_webfinger_s }, format: :json | |||||
expect(response).to have_http_status(:success) | |||||
end | |||||
it 'returns http not found when account cannot be found' do | |||||
get :webfinger, params: { resource: 'acct:not@existing.com' }, format: :json | |||||
expect(response).to have_http_status(:not_found) | |||||
end | |||||
end | |||||
end |
@ -0,0 +1,12 @@ | |||||
require "rails_helper" | |||||
describe "The host_meta route" do | |||||
describe "requested without accepts headers" do | |||||
it "returns an xml response" do | |||||
get host_meta_url | |||||
expect(response).to have_http_status(:success) | |||||
expect(response.content_type).to eq "application/xrd+xml" | |||||
end | |||||
end | |||||
end |
@ -0,0 +1,15 @@ | |||||
require 'rails_helper' | |||||
describe 'the host-meta route' do | |||||
it 'routes to correct place with xml format' do | |||||
expect(get('/.well-known/host-meta')). | |||||
to route_to('well_known/host_meta#show', format: 'xml') | |||||
end | |||||
end | |||||
describe 'the webfinger route' do | |||||
it 'routes to correct place with json format' do | |||||
expect(get('/.well-known/webfinger')). | |||||
to route_to('well_known/webfinger#show', format: 'json') | |||||
end | |||||
end |