@@ -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 |