Skip to content

Commit 7655cb6

Browse files
Gargronhiyuki2578
authored andcommitted
Fix acct URIs with IDN domains not being resolved (mastodon#11520)
Fix mastodon#11494
1 parent da03ed3 commit 7655cb6

3 files changed

Lines changed: 40 additions & 11 deletions

File tree

app/controllers/remote_interaction_controller.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ def set_status
3939
@status = Status.find(params[:id])
4040
authorize @status, :show?
4141
rescue Mastodon::NotPermittedError
42-
# Reraise in order to get a 404
4342
raise ActiveRecord::RecordNotFound
4443
end
4544

app/models/remote_follow.rb

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,21 @@
22

33
class RemoteFollow
44
include ActiveModel::Validations
5+
include RoutingHelper
56

67
attr_accessor :acct, :addressable_template
78

89
validates :acct, presence: true
910

10-
def initialize(attrs = nil)
11-
@acct = attrs[:acct].gsub(/\A@/, '').strip if !attrs.nil? && !attrs[:acct].nil?
11+
def initialize(attrs = {})
12+
@acct = normalize_acct(attrs[:acct])
1213
end
1314

1415
def valid?
1516
return false unless super
1617

17-
populate_template
18+
fetch_template!
19+
1820
errors.empty?
1921
end
2022

@@ -28,8 +30,30 @@ def interact_address_for(status)
2830

2931
private
3032

31-
def populate_template
32-
if acct.blank? || redirect_url_link.nil? || redirect_url_link.template.nil?
33+
def normalize_acct(value)
34+
return if value.blank?
35+
36+
username, domain = value.strip.gsub(/\A@/, '').split('@')
37+
38+
domain = begin
39+
if TagManager.instance.local_domain?(domain)
40+
nil
41+
else
42+
TagManager.instance.normalize_domain(domain)
43+
end
44+
end
45+
46+
[username, domain].compact.join('@')
47+
end
48+
49+
def fetch_template!
50+
return missing_resource if acct.blank?
51+
52+
_, domain = acct.split('@')
53+
54+
if domain.nil?
55+
@addressable_template = Addressable::Template.new("#{authorize_interaction_url}?uri={uri}")
56+
elsif redirect_url_link.nil? || redirect_url_link.template.nil?
3357
missing_resource_error
3458
else
3559
@addressable_template = Addressable::Template.new(redirect_uri_template)
@@ -45,7 +69,7 @@ def redirect_url_link
4569
end
4670

4771
def acct_resource
48-
@_acct_resource ||= Goldfinger.finger("acct:#{acct}")
72+
@acct_resource ||= Goldfinger.finger("acct:#{acct}")
4973
rescue Goldfinger::Error, HTTP::ConnectionError
5074
nil
5175
end

app/services/resolve_account_service.rb

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,17 +60,23 @@ def process_options!(uri, options)
6060
@account = uri
6161
@username = @account.username
6262
@domain = @account.domain
63-
@uri = [@username, @domain].compact.join('@')
6463
else
65-
@uri = uri
6664
@username, @domain = uri.split('@')
6765
end
6866

69-
@domain = nil if TagManager.instance.local_domain?(@domain)
67+
@domain = begin
68+
if TagManager.instance.local_domain?(@domain)
69+
nil
70+
else
71+
TagManager.instance.normalize_domain(@domain)
72+
end
73+
end
74+
75+
@uri = [@username, @domain].compact.join('@')
7076
end
7177

7278
def process_webfinger!(uri, redirected = false)
73-
@webfinger = Goldfinger.finger("acct:#{@uri}")
79+
@webfinger = Goldfinger.finger("acct:#{uri}")
7480
confirmed_username, confirmed_domain = @webfinger.subject.gsub(/\Aacct:/, '').split('@')
7581

7682
if confirmed_username.casecmp(@username).zero? && confirmed_domain.casecmp(@domain).zero?

0 commit comments

Comments
 (0)