Allow alternate domains for mastodon handlers (#3187)
This commit is contained in:
		
							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 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user