about summary refs log tree commit diff
path: root/lib/mastodon
diff options
context:
space:
mode:
authorThibaut Girka <thib@sitedethib.com>2020-05-20 18:22:42 +0200
committerThibaut Girka <thib@sitedethib.com>2020-05-20 18:22:42 +0200
commit27b5143dc4289fa87481899f6658f927e833ff9e (patch)
treec7f4b75274ae46db55b585a39ca427940d8fc218 /lib/mastodon
parentb7e178d2e4102bdaa1ea41dfd8ed50093cf3f60a (diff)
parent50524d13278806573a4a685e428a6c9f3d7a74e5 (diff)
Merge branch 'master' into glitch-soc/merge-upstream
Diffstat (limited to 'lib/mastodon')
-rw-r--r--lib/mastodon/media_cli.rb17
-rw-r--r--lib/mastodon/upgrade_cli.rb41
2 files changed, 45 insertions, 13 deletions
diff --git a/lib/mastodon/media_cli.rb b/lib/mastodon/media_cli.rb
index 2b1653335..c95f3410a 100644
--- a/lib/mastodon/media_cli.rb
+++ b/lib/mastodon/media_cli.rb
@@ -88,6 +88,11 @@ module Mastodon
             path_segments = object.key.split('/')
             path_segments.delete('cache')
 
+            if path_segments.size != 7
+              progress.log(pastel.yellow("Unrecognized file found: #{object.key}"))
+              next
+            end
+
             model_name      = path_segments.first.classify
             attachment_name = path_segments[1].singularize
             record_id       = path_segments[2..-2].join.to_i
@@ -127,6 +132,11 @@ module Mastodon
           path_segments = key.split(File::SEPARATOR)
           path_segments.delete('cache')
 
+          if path_segments.size != 7
+            progress.log(pastel.yellow("Unrecognized file found: #{key}"))
+            next
+          end
+
           model_name      = path_segments.first.classify
           record_id       = path_segments[2..-2].join.to_i
           attachment_name = path_segments[1].singularize
@@ -246,6 +256,11 @@ module Mastodon
       path_segments = path.split('/')[2..-1]
       path_segments.delete('cache')
 
+      if path_segments.size != 7
+        say('Not a media URL', :red)
+        exit(1)
+      end
+
       model_name = path_segments.first.classify
       record_id  = path_segments[2..-2].join.to_i
 
@@ -294,6 +309,8 @@ module Mastodon
         segments = object.key.split('/')
         segments.delete('cache')
 
+        next if segments.size != 7
+
         model_name = segments.first.classify
         record_id  = segments[2..-2].join.to_i
 
diff --git a/lib/mastodon/upgrade_cli.rb b/lib/mastodon/upgrade_cli.rb
index 779462a4f..570b7e6fa 100644
--- a/lib/mastodon/upgrade_cli.rb
+++ b/lib/mastodon/upgrade_cli.rb
@@ -41,23 +41,32 @@ module Mastodon
         klass.find_each do |record|
           attachment_names.each do |attachment_name|
             attachment = record.public_send(attachment_name)
+            upgraded   = false
 
             next if attachment.blank? || attachment.storage_schema_version >= CURRENT_STORAGE_SCHEMA_VERSION
 
-            attachment.styles.each_key do |style|
-              case Paperclip::Attachment.default_options[:storage]
-              when :s3
-                upgrade_storage_s3(progress, attachment, style)
-              when :fog
-                upgrade_storage_fog(progress, attachment, style)
-              when :filesystem
-                upgrade_storage_filesystem(progress, attachment, style)
+            styles = attachment.styles.keys
+
+            styles << :original unless styles.include?(:original)
+
+            styles.each do |style|
+              success = begin
+                case Paperclip::Attachment.default_options[:storage]
+                when :s3
+                  upgrade_storage_s3(progress, attachment, style)
+                when :fog
+                  upgrade_storage_fog(progress, attachment, style)
+                when :filesystem
+                  upgrade_storage_filesystem(progress, attachment, style)
+                end
               end
 
+              upgraded = true if style == :original && success
+
               progress.increment
             end
 
-            attachment.instance_write(:storage_schema_version, CURRENT_STORAGE_SCHEMA_VERSION)
+            attachment.instance_write(:storage_schema_version, CURRENT_STORAGE_SCHEMA_VERSION) if upgraded
           end
 
           if record.changed?
@@ -78,18 +87,20 @@ module Mastodon
     def upgrade_storage_s3(progress, attachment, style)
       previous_storage_schema_version = attachment.storage_schema_version
       object                          = attachment.s3_object(style)
+      success                         = true
 
       attachment.instance_write(:storage_schema_version, CURRENT_STORAGE_SCHEMA_VERSION)
 
-      upgraded_path = attachment.path(style)
+      new_object = attachment.s3_object(style)
 
-      if upgraded_path != object.key && object.exists?
-        progress.log("Moving #{object.key} to #{upgraded_path}") if options[:verbose]
+      if new_object.key != object.key && object.exists?
+        progress.log("Moving #{object.key} to #{new_object.key}") if options[:verbose]
 
         begin
-          object.move_to(upgraded_path) unless dry_run?
+          object.move_to(new_object, acl: attachment.s3_permissions(style)) unless dry_run?
         rescue => e
           progress.log(pastel.red("Error processing #{object.key}: #{e}"))
+          success = false
         end
       end
 
@@ -97,6 +108,7 @@ module Mastodon
       # previous version at the end. The upgrade will be recorded after
       # all styles are updated
       attachment.instance_write(:storage_schema_version, previous_storage_schema_version)
+      success
     end
 
     def upgrade_storage_fog(_progress, _attachment, _style)
@@ -107,6 +119,7 @@ module Mastodon
     def upgrade_storage_filesystem(progress, attachment, style)
       previous_storage_schema_version = attachment.storage_schema_version
       previous_path                   = attachment.path(style)
+      success                         = true
 
       attachment.instance_write(:storage_schema_version, CURRENT_STORAGE_SCHEMA_VERSION)
 
@@ -128,6 +141,7 @@ module Mastodon
           end
         rescue => e
           progress.log(pastel.red("Error processing #{previous_path}: #{e}"))
+          success = false
 
           unless dry_run?
             begin
@@ -143,6 +157,7 @@ module Mastodon
       # previous version at the end. The upgrade will be recorded after
       # all styles are updated
       attachment.instance_write(:storage_schema_version, previous_storage_schema_version)
+      success
     end
   end
 end