ソースを参照

Fix acct URIs with IDN domains not being resolved (#11520)

Fix #11494
master^2
Eugen Rochko 4年前
committed by GitHub
コミット
f51c7c105f
この署名に対応する既知のキーがデータベースに存在しません GPGキーID: 4AEE18F83AFDEB23
3個のファイルの変更40行の追加11行の削除
  1. +0
    -1
      app/controllers/remote_interaction_controller.rb
  2. +30
    -6
      app/models/remote_follow.rb
  3. +10
    -4
      app/services/resolve_account_service.rb

+ 0
- 1
app/controllers/remote_interaction_controller.rb ファイルの表示

@@ -39,7 +39,6 @@ class RemoteInteractionController < ApplicationController
@status = Status.find(params[:id])
authorize @status, :show?
rescue Mastodon::NotPermittedError
# Reraise in order to get a 404
raise ActiveRecord::RecordNotFound
end



+ 30
- 6
app/models/remote_follow.rb ファイルの表示

@@ -2,19 +2,21 @@

class RemoteFollow
include ActiveModel::Validations
include RoutingHelper

attr_accessor :acct, :addressable_template

validates :acct, presence: true

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

def valid?
return false unless super

populate_template
fetch_template!

errors.empty?
end

@@ -28,8 +30,30 @@ class RemoteFollow

private

def populate_template
if acct.blank? || redirect_url_link.nil? || redirect_url_link.template.nil?
def normalize_acct(value)
return if value.blank?

username, domain = value.strip.gsub(/\A@/, '').split('@')

domain = begin
if TagManager.instance.local_domain?(domain)
nil
else
TagManager.instance.normalize_domain(domain)
end
end

[username, domain].compact.join('@')
end

def fetch_template!
return missing_resource if acct.blank?

_, domain = acct.split('@')

if domain.nil?
@addressable_template = Addressable::Template.new("#{authorize_interaction_url}?uri={uri}")
elsif redirect_url_link.nil? || redirect_url_link.template.nil?
missing_resource_error
else
@addressable_template = Addressable::Template.new(redirect_uri_template)
@@ -45,7 +69,7 @@ class RemoteFollow
end

def acct_resource
@_acct_resource ||= Goldfinger.finger("acct:#{acct}")
@acct_resource ||= Goldfinger.finger("acct:#{acct}")
rescue Goldfinger::Error, HTTP::ConnectionError
nil
end


+ 10
- 4
app/services/resolve_account_service.rb ファイルの表示

@@ -60,17 +60,23 @@ class ResolveAccountService < BaseService
@account = uri
@username = @account.username
@domain = @account.domain
@uri = [@username, @domain].compact.join('@')
else
@uri = uri
@username, @domain = uri.split('@')
end

@domain = nil if TagManager.instance.local_domain?(@domain)
@domain = begin
if TagManager.instance.local_domain?(@domain)
nil
else
TagManager.instance.normalize_domain(@domain)
end
end

@uri = [@username, @domain].compact.join('@')
end

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

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


読み込み中…
キャンセル
保存