Allow alternate domains for mastodon handlers (#3187)
parent
9d04de1c8d
commit
a94c152fd3
|
@ -20,6 +20,11 @@ LOCAL_HTTPS=true
|
||||||
# DO *NOT* USE THIS UNLESS YOU KNOW *EXACTLY* WHAT YOU ARE DOING.
|
# DO *NOT* USE THIS UNLESS YOU KNOW *EXACTLY* WHAT YOU ARE DOING.
|
||||||
# WEB_DOMAIN=mastodon.example.com
|
# WEB_DOMAIN=mastodon.example.com
|
||||||
|
|
||||||
|
# Use this if you want to have several aliases handler@example1.com
|
||||||
|
# handler@example2.com etc. for the same user. LOCAL_DOMAIN should not
|
||||||
|
# be added. Comma separated values
|
||||||
|
# ALTERNATE_DOMAINS=example1.com,example2.com
|
||||||
|
|
||||||
# Application secrets
|
# Application secrets
|
||||||
# Generate each with the `rake secret` task (`docker-compose run --rm web rake secret` if you use docker compose)
|
# Generate each with the `rake secret` task (`docker-compose run --rm web rake secret` if you use docker compose)
|
||||||
PAPERCLIP_SECRET=
|
PAPERCLIP_SECRET=
|
||||||
|
|
|
@ -23,7 +23,14 @@ module WellKnown
|
||||||
private
|
private
|
||||||
|
|
||||||
def username_from_resource
|
def username_from_resource
|
||||||
WebfingerResource.new(resource_param).username
|
resource_user = resource_param
|
||||||
|
|
||||||
|
username, domain = resource_user.split('@')
|
||||||
|
if Rails.configuration.x.alternate_domains.include?(domain)
|
||||||
|
resource_user = "#{username}@#{Rails.configuration.x.local_domain}"
|
||||||
|
end
|
||||||
|
|
||||||
|
WebfingerResource.new(resource_user).username
|
||||||
end
|
end
|
||||||
|
|
||||||
def pem_to_magic_key(public_key)
|
def pem_to_magic_key(public_key)
|
||||||
|
|
|
@ -5,12 +5,16 @@ host = ENV.fetch('LOCAL_DOMAIN') { "localhost:#{port}" }
|
||||||
web_host = ENV.fetch('WEB_DOMAIN') { host }
|
web_host = ENV.fetch('WEB_DOMAIN') { host }
|
||||||
https = ENV['LOCAL_HTTPS'] == 'true'
|
https = ENV['LOCAL_HTTPS'] == 'true'
|
||||||
|
|
||||||
|
alternate_domains = ENV.fetch('ALTERNATE_DOMAINS') { "" }
|
||||||
|
|
||||||
Rails.application.configure do
|
Rails.application.configure do
|
||||||
config.x.local_domain = host
|
config.x.local_domain = host
|
||||||
config.x.web_domain = web_host
|
config.x.web_domain = web_host
|
||||||
config.x.use_https = https
|
config.x.use_https = https
|
||||||
config.x.use_s3 = ENV['S3_ENABLED'] == 'true'
|
config.x.use_s3 = ENV['S3_ENABLED'] == 'true'
|
||||||
|
|
||||||
|
config.x.alternate_domains = alternate_domains.split(/\s*,\s*/)
|
||||||
|
|
||||||
config.action_mailer.default_url_options = { host: web_host, protocol: https ? 'https://' : 'http://', trailing_slash: false }
|
config.action_mailer.default_url_options = { host: web_host, protocol: https ? 'https://' : 'http://', trailing_slash: false }
|
||||||
config.x.streaming_api_base_url = 'ws://localhost:4000'
|
config.x.streaming_api_base_url = 'ws://localhost:4000'
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,12 @@ describe WellKnown::WebfingerController, type: :controller do
|
||||||
describe 'GET #show' do
|
describe 'GET #show' do
|
||||||
let(:alice) { Fabricate(:account, username: 'alice') }
|
let(:alice) { Fabricate(:account, username: 'alice') }
|
||||||
|
|
||||||
|
around(:each) do |example|
|
||||||
|
before = Rails.configuration.x.alternate_domains
|
||||||
|
example.run
|
||||||
|
Rails.configuration.x.alternate_domains = before
|
||||||
|
end
|
||||||
|
|
||||||
it 'returns http success when account can be found' do
|
it 'returns http success when account can be found' do
|
||||||
get :show, params: { resource: alice.to_webfinger_s }, format: :json
|
get :show, params: { resource: alice.to_webfinger_s }, format: :json
|
||||||
|
|
||||||
|
@ -17,5 +23,23 @@ describe WellKnown::WebfingerController, type: :controller do
|
||||||
|
|
||||||
expect(response).to have_http_status(:not_found)
|
expect(response).to have_http_status(:not_found)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'returns http success when account can be found with alternate domains' do
|
||||||
|
Rails.configuration.x.alternate_domains = ["foo.org"]
|
||||||
|
username, domain = alice.to_webfinger_s.split("@")
|
||||||
|
|
||||||
|
get :show, params: { resource: "#{username}@foo.org" }, format: :json
|
||||||
|
|
||||||
|
expect(response).to have_http_status(:success)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns http not found when account can not be found with alternate domains' do
|
||||||
|
Rails.configuration.x.alternate_domains = ["foo.org"]
|
||||||
|
username, domain = alice.to_webfinger_s.split("@")
|
||||||
|
|
||||||
|
get :show, params: { resource: "#{username}@bar.org" }, format: :json
|
||||||
|
|
||||||
|
expect(response).to have_http_status(:not_found)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Reference in New Issue