406adfca27
* Fix 2FA/sign-in token sessions being valid after password change (#14802) If someone tries logging in to an account and is prompted for a 2FA code or sign-in token, even if the account's password or e-mail is updated in the meantime, the session will show the prompt and allow the login process to complete with a valid 2FA code or sign-in token * Fix Move handler not being triggered when failing to fetch target (#15107) When failing to fetch the target account, the ProcessingWorker fails as expected, but since it hasn't cleared the `move_in_progress` flag, the next attempt at processing skips the `Move` activity altogether. This commit changes it to clear the flag when encountering any unexpected error on fetching the target account. This is likely to occur because, of, e.g., a timeout, when many instances query the same actor at the same time. * Fix slow distinct queries where grouped queries are faster (#15287) About 2x speed-up on inboxes query * Fix possible inconsistencies in tag search (#14906) Do not downcase the queried tag before passing it to postgres when searching: - tags are not downcased on creation - `arel_table[:name].lower.matches(pattern)` generates an ILIKE anyway - if Postgres and Rails happen to use different case-folding rules, downcasing before query but not before insertion may mean that some tags with some casings are not searchable * Fix updating account counters when account_stat is not yet created (#15108) * Fix account processing failing because of large collections (#15027) Fixes #15025 * Fix downloading remote media files when server returns empty filename (#14867) Fixes #14817 * Fix webfinger redirect handling in ResolveAccountService (#15187) * Fix webfinger redirect handling in ResolveAccountService ResolveAccountService#process_webfinger! handled a one-step webfinger redirection, but only accepting the result if it matched the exact URI passed as input, defeating the point of a redirection check. Instead, use the same logic as in `ActivityPub::FetchRemoteAccountService`, updating the resulting `acct:` URI with the result of the first webfinger query. * Add tests * Remove dependency on unused and unmaintained http_parser.rb gem (#14574) It seems that years ago, the “http” gem dependend on the “http_parser.rb” gem (it now depends on the “http-parser” gem), and, still years ago, we pulled it from git in order to benefit from a bugfix that wasn't released yet (#7467). * Add tootctl maintenance fix-duplicates (#14860, #15201, #15264, #15349, #15359) * Fix old migration script not being able to run if it fails midway (#15361) * Fix old migration script not being able to run if it fails midway Improve the robustness of a migration script likely to fail because of database corruption so it can run again once database corruptions are fixed. * Display a specific error message in case of index corruption Co-authored-by: Eugen Rochko <eugen@zeonfederated.com> Co-authored-by: Claire <claire.github-309c@sitedethib.com> Co-authored-by: Eugen Rochko <eugen@zeonfederated.com> Co-authored-by: Claire <claire.github-309c@sitedethib.com>
55 lines
1.4 KiB
Ruby
55 lines
1.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Paperclip
|
|
class ResponseWithLimitAdapter < AbstractAdapter
|
|
def self.register
|
|
Paperclip.io_adapters.register self do |target|
|
|
target.is_a?(ResponseWithLimit)
|
|
end
|
|
end
|
|
|
|
def initialize(target, options = {})
|
|
super
|
|
cache_current_values
|
|
end
|
|
|
|
private
|
|
|
|
def cache_current_values
|
|
@original_filename = filename_from_content_disposition.presence || filename_from_path.presence || 'data'
|
|
@size = @target.response.content_length
|
|
@tempfile = copy_to_tempfile(@target)
|
|
@content_type = ContentTypeDetector.new(@tempfile.path).detect
|
|
end
|
|
|
|
def copy_to_tempfile(source)
|
|
bytes_read = 0
|
|
|
|
source.response.body.each do |chunk|
|
|
bytes_read += chunk.bytesize
|
|
|
|
destination.write(chunk)
|
|
chunk.clear
|
|
|
|
raise Mastodon::LengthValidationError if bytes_read > source.limit
|
|
end
|
|
|
|
destination.rewind
|
|
destination
|
|
rescue Mastodon::LengthValidationError
|
|
destination.close(true)
|
|
raise
|
|
ensure
|
|
source.response.connection.close
|
|
end
|
|
|
|
def filename_from_content_disposition
|
|
disposition = @target.response.headers['content-disposition']
|
|
disposition&.match(/filename="([^"]*)"/)&.captures&.first
|
|
end
|
|
|
|
def filename_from_path
|
|
@target.response.uri.path.split('/').last
|
|
end
|
|
end
|
|
end
|