Add OpenSSL::SSL::SSLError to http connection errors wrapper (#32307)
				
					
				
			This commit is contained in:
		@@ -32,7 +32,7 @@ class ApplicationController < ActionController::Base
 | 
			
		||||
  rescue_from ActionController::InvalidAuthenticityToken, with: :unprocessable_entity
 | 
			
		||||
  rescue_from Mastodon::RateLimitExceededError, with: :too_many_requests
 | 
			
		||||
 | 
			
		||||
  rescue_from(*Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError, with: :internal_server_error)
 | 
			
		||||
  rescue_from(*Mastodon::HTTP_CONNECTION_ERRORS, with: :internal_server_error)
 | 
			
		||||
  rescue_from Mastodon::RaceConditionError, Stoplight::Error::RedLight, ActiveRecord::SerializationFailure, with: :service_unavailable
 | 
			
		||||
 | 
			
		||||
  rescue_from Seahorse::Client::NetworkingError do |e|
 | 
			
		||||
 
 | 
			
		||||
@@ -80,7 +80,7 @@ module SignatureVerification
 | 
			
		||||
    fail_with! "Verification failed for #{actor.to_log_human_identifier} #{actor.uri} using rsa-sha256 (RSASSA-PKCS1-v1_5 with SHA-256)", signed_string: compare_signed_string, signature: signature_params['signature']
 | 
			
		||||
  rescue SignatureVerificationError => e
 | 
			
		||||
    fail_with! e.message
 | 
			
		||||
  rescue *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError => e
 | 
			
		||||
  rescue *Mastodon::HTTP_CONNECTION_ERRORS => e
 | 
			
		||||
    fail_with! "Failed to fetch remote data: #{e.message}"
 | 
			
		||||
  rescue Mastodon::UnexpectedResponseError
 | 
			
		||||
    fail_with! 'Failed to fetch remote data (got unexpected reply from server)'
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,7 @@ class MediaProxyController < ApplicationController
 | 
			
		||||
  rescue_from ActiveRecord::RecordInvalid, with: :not_found
 | 
			
		||||
  rescue_from Mastodon::UnexpectedResponseError, with: :not_found
 | 
			
		||||
  rescue_from Mastodon::NotPermittedError, with: :not_found
 | 
			
		||||
  rescue_from(*Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError, with: :internal_server_error)
 | 
			
		||||
  rescue_from(*Mastodon::HTTP_CONNECTION_ERRORS, with: :internal_server_error)
 | 
			
		||||
 | 
			
		||||
  def show
 | 
			
		||||
    with_redis_lock("media_download:#{params[:id]}") do
 | 
			
		||||
 
 | 
			
		||||
@@ -199,7 +199,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
 | 
			
		||||
    return if account.nil?
 | 
			
		||||
 | 
			
		||||
    @mentions << Mention.new(account: account, silent: false)
 | 
			
		||||
  rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError
 | 
			
		||||
  rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS
 | 
			
		||||
    @unresolved_mentions << tag['href']
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
@@ -250,7 +250,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
 | 
			
		||||
        media_attachment.download_file!
 | 
			
		||||
        media_attachment.download_thumbnail!
 | 
			
		||||
        media_attachment.save
 | 
			
		||||
      rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError
 | 
			
		||||
      rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS
 | 
			
		||||
        RedownloadMediaWorker.perform_in(rand(30..600).seconds, media_attachment.id)
 | 
			
		||||
      rescue Seahorse::Client::NetworkingError => e
 | 
			
		||||
        Rails.logger.warn "Error storing media attachment: #{e}"
 | 
			
		||||
 
 | 
			
		||||
@@ -35,7 +35,7 @@ class AccountAlias < ApplicationRecord
 | 
			
		||||
  def set_uri
 | 
			
		||||
    target_account = ResolveAccountService.new.call(acct)
 | 
			
		||||
    self.uri       = ActivityPub::TagManager.instance.uri_for(target_account) unless target_account.nil?
 | 
			
		||||
  rescue Webfinger::Error, *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError, Mastodon::Error
 | 
			
		||||
  rescue Webfinger::Error, *Mastodon::HTTP_CONNECTION_ERRORS, Mastodon::Error
 | 
			
		||||
    # Validation will take care of it
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -61,7 +61,7 @@ class AccountMigration < ApplicationRecord
 | 
			
		||||
 | 
			
		||||
  def set_target_account
 | 
			
		||||
    self.target_account = ResolveAccountService.new.call(acct, skip_cache: true)
 | 
			
		||||
  rescue Webfinger::Error, *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError, Mastodon::Error, Addressable::URI::InvalidURIError
 | 
			
		||||
  rescue Webfinger::Error, *Mastodon::HTTP_CONNECTION_ERRORS, Mastodon::Error, Addressable::URI::InvalidURIError
 | 
			
		||||
    # Validation will take care of it
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,7 @@ module Remotable
 | 
			
		||||
 | 
			
		||||
            public_send(:"#{attachment_name}=", ResponseWithLimit.new(response, limit))
 | 
			
		||||
          end
 | 
			
		||||
        rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError => e
 | 
			
		||||
        rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS => e
 | 
			
		||||
          Rails.logger.debug { "Error fetching remote #{attachment_name}: #{e}" }
 | 
			
		||||
          public_send(:"#{attachment_name}=", nil) if public_send(:"#{attachment_name}_file_name").present?
 | 
			
		||||
          raise e unless suppress_errors
 | 
			
		||||
 
 | 
			
		||||
@@ -32,7 +32,7 @@ class Form::Redirect
 | 
			
		||||
 | 
			
		||||
  def set_target_account
 | 
			
		||||
    @target_account = ResolveAccountService.new.call(acct, skip_cache: true)
 | 
			
		||||
  rescue Webfinger::Error, *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError, Mastodon::Error, Addressable::URI::InvalidURIError
 | 
			
		||||
  rescue Webfinger::Error, *Mastodon::HTTP_CONNECTION_ERRORS, Mastodon::Error, Addressable::URI::InvalidURIError
 | 
			
		||||
    # Validation will take care of it
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -127,13 +127,13 @@ class ActivityPub::ProcessAccountService < BaseService
 | 
			
		||||
    begin
 | 
			
		||||
      @account.avatar_remote_url = image_url('icon') || '' unless skip_download?
 | 
			
		||||
      @account.avatar = nil if @account.avatar_remote_url.blank?
 | 
			
		||||
    rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError
 | 
			
		||||
    rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS
 | 
			
		||||
      RedownloadAvatarWorker.perform_in(rand(30..600).seconds, @account.id)
 | 
			
		||||
    end
 | 
			
		||||
    begin
 | 
			
		||||
      @account.header_remote_url = image_url('image') || '' unless skip_download?
 | 
			
		||||
      @account.header = nil if @account.header_remote_url.blank?
 | 
			
		||||
    rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError
 | 
			
		||||
    rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS
 | 
			
		||||
      RedownloadHeaderWorker.perform_in(rand(30..600).seconds, @account.id)
 | 
			
		||||
    end
 | 
			
		||||
    @account.statuses_count    = outbox_total_items    if outbox_total_items.present?
 | 
			
		||||
@@ -276,7 +276,7 @@ class ActivityPub::ProcessAccountService < BaseService
 | 
			
		||||
    total_items = collection.is_a?(Hash) && collection['totalItems'].present? && collection['totalItems'].is_a?(Numeric) ? collection['totalItems'] : nil
 | 
			
		||||
    has_first_page = collection.is_a?(Hash) && collection['first'].present?
 | 
			
		||||
    @collections[type] = [total_items, has_first_page]
 | 
			
		||||
  rescue *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError, Mastodon::LengthValidationError
 | 
			
		||||
  rescue *Mastodon::HTTP_CONNECTION_ERRORS, Mastodon::LengthValidationError
 | 
			
		||||
    @collections[type] = [nil, nil]
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -109,7 +109,7 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
 | 
			
		||||
      media_attachment.download_file! if media_attachment.remote_url_previously_changed?
 | 
			
		||||
      media_attachment.download_thumbnail! if media_attachment.thumbnail_remote_url_previously_changed?
 | 
			
		||||
      media_attachment.save
 | 
			
		||||
    rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError
 | 
			
		||||
    rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS
 | 
			
		||||
      RedownloadMediaWorker.perform_in(rand(30..600).seconds, media_attachment.id)
 | 
			
		||||
    rescue Seahorse::Client::NetworkingError => e
 | 
			
		||||
      Rails.logger.warn "Error storing media attachment: #{e}"
 | 
			
		||||
 
 | 
			
		||||
@@ -29,7 +29,7 @@ class FetchLinkCardService < BaseService
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    attach_card if @card&.persisted?
 | 
			
		||||
  rescue *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError, Addressable::URI::InvalidURIError, Mastodon::HostValidationError, Mastodon::LengthValidationError, Encoding::UndefinedConversionError, ActiveRecord::RecordInvalid => e
 | 
			
		||||
  rescue *Mastodon::HTTP_CONNECTION_ERRORS, Addressable::URI::InvalidURIError, Mastodon::HostValidationError, Mastodon::LengthValidationError, Encoding::UndefinedConversionError, ActiveRecord::RecordInvalid => e
 | 
			
		||||
    Rails.logger.debug { "Error fetching link #{@original_url}: #{e}" }
 | 
			
		||||
    nil
 | 
			
		||||
  end
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@ class FetchResourceService < BaseService
 | 
			
		||||
    return if url.blank?
 | 
			
		||||
 | 
			
		||||
    process(url)
 | 
			
		||||
  rescue *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError, Addressable::URI::InvalidURIError, Mastodon::HostValidationError, Mastodon::LengthValidationError => e
 | 
			
		||||
  rescue *Mastodon::HTTP_CONNECTION_ERRORS, Addressable::URI::InvalidURIError, Mastodon::HostValidationError, Mastodon::LengthValidationError => e
 | 
			
		||||
    Rails.logger.debug { "Error fetching resource #{@url}: #{e}" }
 | 
			
		||||
    nil
 | 
			
		||||
  end
 | 
			
		||||
 
 | 
			
		||||
@@ -115,7 +115,7 @@ class ImportService < BaseService
 | 
			
		||||
      next if status.nil? && ActivityPub::TagManager.instance.local_uri?(uri)
 | 
			
		||||
 | 
			
		||||
      status || ActivityPub::FetchRemoteStatusService.new.call(uri)
 | 
			
		||||
    rescue *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError, Mastodon::UnexpectedResponseError
 | 
			
		||||
    rescue *Mastodon::HTTP_CONNECTION_ERRORS, Mastodon::UnexpectedResponseError
 | 
			
		||||
      nil
 | 
			
		||||
    rescue => e
 | 
			
		||||
      Rails.logger.warn "Unexpected error when importing bookmark: #{e}"
 | 
			
		||||
 
 | 
			
		||||
@@ -44,7 +44,7 @@ class ProcessMentionsService < BaseService
 | 
			
		||||
      if mention_undeliverable?(mentioned_account)
 | 
			
		||||
        begin
 | 
			
		||||
          mentioned_account = ResolveAccountService.new.call(Regexp.last_match(1))
 | 
			
		||||
        rescue Webfinger::Error, *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError, Mastodon::UnexpectedResponseError
 | 
			
		||||
        rescue Webfinger::Error, *Mastodon::HTTP_CONNECTION_ERRORS, Mastodon::UnexpectedResponseError
 | 
			
		||||
          mentioned_account = nil
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,7 @@ class SoftwareUpdateCheckService < BaseService
 | 
			
		||||
    Request.new(:get, "#{api_url}?version=#{version}").add_headers('Accept' => 'application/json', 'User-Agent' => 'Mastodon update checker').perform do |res|
 | 
			
		||||
      return Oj.load(res.body_with_limit, mode: :strict) if res.code == 200
 | 
			
		||||
    end
 | 
			
		||||
  rescue *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError, Oj::ParseError
 | 
			
		||||
  rescue *Mastodon::HTTP_CONNECTION_ERRORS, Oj::ParseError
 | 
			
		||||
    nil
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,7 @@ class VerifyLinkService < BaseService
 | 
			
		||||
    return unless link_back_present?
 | 
			
		||||
 | 
			
		||||
    field.mark_verified!
 | 
			
		||||
  rescue OpenSSL::SSL::SSLError, *Mastodon::HTTP_CONNECTION_ERRORS, Addressable::URI::InvalidURIError, Mastodon::HostValidationError, Mastodon::LengthValidationError, IPAddr::AddressFamilyError => e
 | 
			
		||||
  rescue *Mastodon::HTTP_CONNECTION_ERRORS, Addressable::URI::InvalidURIError, Mastodon::HostValidationError, Mastodon::LengthValidationError, IPAddr::AddressFamilyError => e
 | 
			
		||||
    Rails.logger.debug { "Error fetching link #{@url}: #{e}" }
 | 
			
		||||
    nil
 | 
			
		||||
  end
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,7 @@ class RefollowWorker
 | 
			
		||||
      # Schedule re-follow
 | 
			
		||||
      begin
 | 
			
		||||
        FollowService.new.call(follower, target_account, reblogs: reblogs, notify: notify, languages: languages, bypass_limit: true)
 | 
			
		||||
      rescue Mastodon::NotPermittedError, ActiveRecord::RecordNotFound, Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError
 | 
			
		||||
      rescue Mastodon::NotPermittedError, ActiveRecord::RecordNotFound, Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS
 | 
			
		||||
        next
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 
 | 
			
		||||
@@ -41,5 +41,6 @@ module Mastodon
 | 
			
		||||
    HTTP::ConnectionError,
 | 
			
		||||
    HTTP::Error,
 | 
			
		||||
    HTTP::TimeoutError,
 | 
			
		||||
    OpenSSL::SSL::SSLError,
 | 
			
		||||
  ].freeze
 | 
			
		||||
end
 | 
			
		||||
 
 | 
			
		||||
@@ -305,7 +305,7 @@ module Mastodon::CLI
 | 
			
		||||
 | 
			
		||||
        begin
 | 
			
		||||
          code = Request.new(:head, account.uri).perform(&:code)
 | 
			
		||||
        rescue *Mastodon::HTTP_CONNECTION_ERRORS, OpenSSL::SSL::SSLError, Mastodon::PrivateNetworkAddressError
 | 
			
		||||
        rescue *Mastodon::HTTP_CONNECTION_ERRORS, Mastodon::PrivateNetworkAddressError
 | 
			
		||||
          skip_domains << account.domain
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user