mirror of
https://github.com/lunaisnotaboy/mastodon.git
synced 2024-08-28 15:25:41 +00:00
If the first link to be verified contains a rel=me link with a SSL error, the VerifyAccountLinksWorker will fail and not try the following links. This rescues the SSL error when fetching the link, avoiding this issue.
48 lines
1.3 KiB
Ruby
48 lines
1.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class VerifyLinkService < BaseService
|
|
def call(field)
|
|
@link_back = ActivityPub::TagManager.instance.url_for(field.account)
|
|
@url = field.value_for_verification
|
|
|
|
perform_request!
|
|
|
|
return unless link_back_present?
|
|
|
|
field.mark_verified!
|
|
rescue OpenSSL::SSL::SSLError, HTTP::Error, Addressable::URI::InvalidURIError, Mastodon::HostValidationError, Mastodon::LengthValidationError => e
|
|
Rails.logger.debug "Error fetching link #{@url}: #{e}"
|
|
nil
|
|
end
|
|
|
|
private
|
|
|
|
def perform_request!
|
|
@body = Request.new(:get, @url).add_headers('Accept' => 'text/html').perform do |res|
|
|
res.code != 200 ? nil : res.body_with_limit
|
|
end
|
|
end
|
|
|
|
def link_back_present?
|
|
return false if @body.blank?
|
|
|
|
links = Nokogiri::HTML(@body).xpath('//a[contains(concat(" ", normalize-space(@rel), " "), " me ")]|//link[contains(concat(" ", normalize-space(@rel), " "), " me ")]')
|
|
|
|
if links.any? { |link| link['href'] == @link_back }
|
|
true
|
|
elsif links.empty?
|
|
false
|
|
else
|
|
link_redirects_back?(links.first['href'])
|
|
end
|
|
end
|
|
|
|
def link_redirects_back?(test_url)
|
|
redirect_to_url = Request.new(:head, test_url, follow: false).perform do |res|
|
|
res.headers['Location']
|
|
end
|
|
|
|
redirect_to_url == @link_back
|
|
end
|
|
end
|