]> source.dussan.org Git - redmine.git/commitdiff
Ensure that ActiveRecord::Base objects are fully serialized for mail sending (#26791).
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sat, 6 Oct 2018 13:10:22 +0000 (13:10 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sat, 6 Oct 2018 13:10:22 +0000 (13:10 +0000)
Patch by Holger Just.

git-svn-id: http://svn.redmine.org/redmine/trunk@17585 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/models/mailer.rb

index 4427d333dcaeef78dde48c2e5c2249d117c37d14..ab1a6cf4c962130dd1bef1e9c211737c846cfc74 100644 (file)
@@ -107,11 +107,48 @@ class Mailer < ActionMailer::Base
           "method*, or 3. use a custom Active Job instead of #deliver_later."
       else
         args = 'Mailer', @action.to_s, delivery_method.to_s, *@args
-        ::ActionMailer::DeliveryJob.set(options).perform_later(*args)
+        DeliveryJob.set(options).perform_later(*args)
       end
     end
   end
 
+  class DeliveryJob < ActionMailer::DeliveryJob
+    module Arguments
+      extend ActiveJob::Arguments
+      extend self
+
+      private
+
+      def serialize_argument(argument)
+        # Ensure that ActiveRecord::Base objects are fully serialized for mail
+        # sending. This circumvents the globalid gem for this job.
+        if argument.is_a?(ActiveRecord::Base)
+          argument.to_yaml
+        else
+          super
+        end
+      end
+
+      def deserialize_argument(argument)
+        if argument.is_a?(ActiveRecord::Base)
+          argument
+        else
+          super
+        end
+      end
+    end
+
+    private
+
+    def serialize_arguments(serialized_args)
+      Arguments.serialize(serialized_args)
+    end
+
+    def deserialize_arguments(serialized_args)
+      Arguments.deserialize(serialized_args)
+    end
+  end
+
   def process(action, *args)
     user = args.shift
     raise ArgumentError, "First argument has to be a user, was #{user.inspect}" unless user.is_a?(User)