mirror of
https://github.com/discourse/discourse.git
synced 2024-11-22 14:03:22 +08:00
FIX: allow upload recovery to recover uploads with sha mismatch
Filename on disk may mismatch sha of file in some old 1X setups. This will attempt to recover file even if sha1 mismatches. We had an old bug that caused this. This also adds `uploads:fix_relative_upload_links` which attempts to replace urls of the format `/upload/default/...` with `upload://`
This commit is contained in:
parent
f772ecc597
commit
ebcb571de7
|
@ -886,3 +886,36 @@ task "uploads:recover" => :environment do
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
def inline_uploads(post)
|
||||
replaced = false
|
||||
|
||||
original_raw = post.raw
|
||||
|
||||
post.raw = post.raw.gsub(/(\((\/uploads\S+).*\))/) do
|
||||
upload = Upload.find_by(url: $2)
|
||||
result = $1
|
||||
|
||||
if upload&.id
|
||||
result.sub!($2, upload.short_url)
|
||||
replaced = true
|
||||
else
|
||||
puts "Upload not found #{$2} in Post #{post.id} - #{post.url}"
|
||||
end
|
||||
result
|
||||
end
|
||||
|
||||
if replaced
|
||||
puts "Corrected image urls in #{post.url} raw backup stored in custom field"
|
||||
post.custom_fields["BACKUP_POST_RAW"] = original_raw
|
||||
post.save_custom_fields
|
||||
post.save!
|
||||
post.rebake!
|
||||
end
|
||||
end
|
||||
|
||||
task "uploads:fix_relative_upload_links" => :environment do
|
||||
Post.where('raw like ?', '%](/uploads%').find_each do |post|
|
||||
inline_uploads(post)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -63,15 +63,27 @@ class UploadRecovery
|
|||
end
|
||||
end
|
||||
|
||||
def ensure_upload!(post:, sha1:, upload:)
|
||||
return if !upload.persisted?
|
||||
|
||||
if upload.sha1 != sha1
|
||||
STDERR.puts "Warning #{post.url} had an incorrect sha, remapping #{sha1} to #{upload.sha1}"
|
||||
post.raw = post.raw.gsub(sha1, upload.sha1)
|
||||
post.save!
|
||||
end
|
||||
|
||||
post.rebake!
|
||||
end
|
||||
|
||||
def recover_post_upload_from_local(post:, sha1:)
|
||||
recover_from_local(sha1: sha1, user_id: post.user_id) do |upload|
|
||||
post.rebake! if upload.persisted?
|
||||
ensure_upload!(post: post, sha1: sha1, upload: upload)
|
||||
end
|
||||
end
|
||||
|
||||
def recover_post_upload_from_s3(post:, sha1:)
|
||||
recover_from_s3(sha1: sha1, user_id: post.user_id) do |upload|
|
||||
post.rebake! if upload.persisted?
|
||||
ensure_upload!(post: post, sha1: sha1, upload: upload)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user