Skip to content
This repository has been archived by the owner on Dec 21, 2023. It is now read-only.

Commit

Permalink
Fix webfinger returning wrong status code on malformed or missing par…
Browse files Browse the repository at this point in the history
  • Loading branch information
ClearlyClaire authored May 14, 2020
1 parent c9dcc2d commit 71fce71
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 3 deletions.
7 changes: 6 additions & 1 deletion app/controllers/well_known/webfinger_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ class WebfingerController < ActionController::Base
before_action :set_account
before_action :check_account_suspension

rescue_from ActiveRecord::RecordNotFound, ActionController::ParameterMissing, with: :not_found
rescue_from ActiveRecord::RecordNotFound, with: :not_found
rescue_from ActionController::ParameterMissing, WebfingerResource::InvalidRequest, with: :bad_request

def show
expires_in 3.days, public: true
Expand Down Expand Up @@ -37,6 +38,10 @@ def check_account_suspension
expires_in(3.minutes, public: true) && gone if @account.suspended?
end

def bad_request
head 400
end

def not_found
head 404
end
Expand Down
4 changes: 3 additions & 1 deletion app/lib/webfinger_resource.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
class WebfingerResource
attr_reader :resource

class InvalidRequest < StandardError; end

def initialize(resource)
@resource = resource
end
Expand All @@ -14,7 +16,7 @@ def username
when /\@/
username_from_acct
else
raise(ActiveRecord::RecordNotFound)
raise InvalidRequest
end
end

Expand Down
10 changes: 10 additions & 0 deletions spec/controllers/well_known/webfinger_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -84,5 +84,15 @@

expect(response).to have_http_status(:not_found)
end

it 'returns http bad request when not given a resource parameter' do
get :show, params: { }, format: :json
expect(response).to have_http_status(:bad_request)
end

it 'returns http bad request when given a nonsense parameter' do
get :show, params: { resource: 'df/:dfkj' }
expect(response).to have_http_status(:bad_request)
end
end
end
12 changes: 11 additions & 1 deletion spec/lib/webfinger_resource_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@

expect {
WebfingerResource.new(resource).username
}.to raise_error(ActiveRecord::RecordNotFound)
}.to raise_error(WebfingerResource::InvalidRequest)
end

it 'finds the username in a valid https route' do
Expand Down Expand Up @@ -123,5 +123,15 @@
expect(result).to eq 'alice'
end
end

describe 'with a nonsense resource' do
it 'raises InvalidRequest' do
resource = 'df/:dfkj'

expect {
WebfingerResource.new(resource).username
}.to raise_error(WebfingerResource::InvalidRequest)
end
end
end
end

0 comments on commit 71fce71

Please sign in to comment.