commit: 137100dcf38c0da0fe7044a4c92aa06eae02c420
parent: 3a9eb81a8006af0306e8abc54bd8aca8381eee25
Author: Matt Jankowski <mjankowski@thoughtbot.com>
Date: Thu, 13 Apr 2017 07:09:07 -0400
Clean up well-known routes/controllers (#1649)
* 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 controllers
Diffstat:
12 files changed, 119 insertions(+), 83 deletions(-)
diff --git a/app/controllers/well_known/host_meta_controller.rb b/app/controllers/well_known/host_meta_controller.rb
@@ -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
diff --git a/app/controllers/well_known/webfinger_controller.rb b/app/controllers/well_known/webfinger_controller.rb
@@ -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
diff --git a/app/controllers/xrd_controller.rb b/app/controllers/xrd_controller.rb
@@ -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
diff --git a/app/views/xrd/host_meta.xml.ruby b/app/views/well_known/host_meta/show.xml.ruby
diff --git a/app/views/xrd/webfinger.json.rabl b/app/views/well_known/webfinger/show.json.rabl
diff --git a/app/views/xrd/webfinger.xml.ruby b/app/views/well_known/webfinger/show.xml.ruby
diff --git a/config/routes.rb b/config/routes.rb
@@ -15,8 +15,8 @@ Rails.application.routes.draw do
controllers authorizations: 'oauth/authorizations', authorized_applications: 'oauth/authorized_applications'
end
- get '.well-known/host-meta', to: 'xrd#host_meta', as: :host_meta
- get '.well-known/webfinger', to: 'xrd#webfinger', as: :webfinger, defaults: { format: 'json' }
+ get '.well-known/host-meta', to: 'well_known/host_meta#show', as: :host_meta, defaults: { format: 'xml' }
+ get '.well-known/webfinger', to: 'well_known/webfinger#show', as: :webfinger, defaults: { format: 'json' }
devise_for :users, path: 'auth', controllers: {
sessions: 'auth/sessions',
diff --git a/spec/controllers/well_known/host_meta_controller_spec.rb b/spec/controllers/well_known/host_meta_controller_spec.rb
@@ -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
diff --git a/spec/controllers/well_known/webfinger_controller_spec.rb b/spec/controllers/well_known/webfinger_controller_spec.rb
@@ -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
diff --git a/spec/controllers/xrd_controller_spec.rb b/spec/controllers/xrd_controller_spec.rb
@@ -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
diff --git a/spec/requests/host_meta_request_spec.rb b/spec/requests/host_meta_request_spec.rb
@@ -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
diff --git a/spec/routing/well_known_routes_spec.rb b/spec/routing/well_known_routes_spec.rb
@@ -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