プラグインでの ActiveSupport::MessageEncryptor::InvalidMessage の問題

2.9.0.beta5 へのアップデートにより、ダッシュボードプラグインに問題が発生しています。プラグインの 1 つのビューでエラーが発生しているようです。

Started GET "/pfaffmanager/servers" for 73.147.117.173 at 2022-06-14 17:53:31 +0000
Processing by Pfaffmanager::ServersController#index as HTML
  Rendered default/empty.html.erb within layouts/application (Duration: 0.1ms | Allocations: 29)
  Rendered layout layouts/application.html.erb (Duration: 21.6ms | Allocations: 7109)
Completed 200 OK in 142ms (Views: 23.0ms | ActiveRecord: 0.0ms | Allocations: 37464)
Started GET "/chat/chat_channels.json" for 73.147.117.173 at 2022-06-14 17:53:31 +0000
Processing by DiscourseChat::ChatChannelsController#index as JSON
Started GET "/presence/get?channels%5B%5D=%2Fchat-user%2Fchat%2F1&channels%5B%5D=%2Fchat-user%2Fcore%2F1" for 73.147.117.173 at 2022-06-14 17:53:31 +0000
Processing by PresenceController#get as JSON
  Parameters: {"channels"=>["/chat-user/chat/1", "/chat-user/core/1"]}
Completed 200 OK in 44ms (Views: 1.9ms | ActiveRecord: 0.0ms | Allocations: 5134)
Started GET "/pfaffmanager/servers" for 73.147.117.173 at 2022-06-14 17:53:31 +0000
Completed 200 OK in 94ms (Views: 0.3ms | ActiveRecord: 0.0ms | Allocations: 22124)
Processing by Pfaffmanager::ServersController#index as JSON
Completed 500 Internal Server Error in 113ms (ActiveRecord: 0.0ms | Allocations: 15487)
ActiveSupport::MessageEncryptor::InvalidMessage (ActiveSupport::MessageEncryptor::InvalidMessage)
(eval):9:in `_fast_attributes'
app/controllers/application_controller.rb:543:in `render_json_dump'
app/controllers/application_controller.rb:415:in `block in with_resolved_locale'
app/controllers/application_controller.rb:415:in `with_resolved_locale'
lib/middleware/omniauth_bypass_middleware.rb:71:in `call'
lib/content_security_policy/middleware.rb:12:in `call'
lib/middleware/anonymous_cache.rb:368:in `call'
config/initializers/008-rack-cors.rb:25:in `call'
config/initializers/100-quiet_logger.rb:23:in `call'
config/initializers/100-silence_logger.rb:31:in `call'
lib/middleware/enforce_hostname.rb:23:in `call'
lib/middleware/request_tracker.rb:202:in `call'

これはプラグインのインデックスビューでのみ発生しており、プラグインの他のページや Discourse 自体では発生していないようです。どこを見ればよいか分かりません。ステージングサイトでアップグレードを実行しておいて本当に良かったです!

上記はチャットプラグインに関連していることを示唆していましたが、チャットがインストールされていない開発インスタンスでも発生しています。

すごい、Google で ActiveSupport::MessageEncryptor::InvalidMessage "fast_attributes" を検索すると、このトピックしか見つかりません!

「いいね!」 1

問題は config/master.key に関係しているようですが(https://stackoverflow.com/questions/54277392/rails-activesupportmessageencryptorinvalidmessage)、なぜこのアップグレードで発生し始めたのか理解できません。

「いいね!」 1

Rails 7にアップデートしたので、おそらくそれが原因でしょう。

「いいね!」 1

ありがとうございます、@gerhard さん!

(でも、これは Rails 7.1 のことですよね?)

私の既存のプラグインで、plugin.rb に「知っていれば明白な」一行を追加することで、この変更を無視する方法をご存知ですか?

それとも、これを理解するために自分で調べる必要があるのでしょうか。

編集:しかし、devconfig/application.rb にその行を追加しても、魔法のような解決にはなりませんでした。

すみません。もう少し読みました。

なので、これが私の当面の問題を解決してくれるかもしれません。改めてご協力ありがとうございます!今度こそ理解できるかもしれません。


さて、Rails 6 と Rails 7 の両方で生成したキーは次のようになります。

#<ActiveSupport::KeyGenerator:0x000055870212d4f8 @hash_digest_class=OpenSSL::Digest::SHA1, @iterations=65536, @secret="my-big-secret">

しかし、それらは異なる方法で暗号化されます。hash_digest_class が問題だと思っていたのですが、少なくとも両方で同じように見えますが、暗号化された文字列は異なります。:crying_cat_face:

「いいね!」 1

ああ、しまった。いや、それは違います。動作している本番サイトは7.0.3で、動作していないステージングサイトも7.0.3です。暗号化の方法が異なります。シリアライザーが違うのか、それとも暗号が違うのか、私にはわかりませんし、どうすればわかるのかもわかりません。

その間、7.0はフィールドの暗号化をサポートしていることを学びました。もし暗号化されたAPIキーにアクセスする方法がわかれば、カスタムコードの一部を削除できます。あるいは、単に破棄して再生成するかもしれません。

最新の状態では、次のような暗号化を取得しています。
=> "SUNBZlRURThEZjdVUG8wTzV1eWk0dz09LS1uRGVSQWtPRU9rc1ZCa1Y1d2pyeU5nPT0=--43eab316e6a9ebafc72d4982347abd9c7f6605db"

2.9.0.beta4では、"FwL/GGvrDHOpQ1bnGiI=--kCLbUxMf/XeMaeWF--/feRN+/l1q3EFdKgyIo+7Q=="のようになります。

古い暗号をここに追加する必要がありました。

k = ActiveSupport::MessageEncryptor.new(KEY,  cipher: "aes-256-cbc")

両方とも 7.0.3 を実行していると主張する 2 つのインスタンスで結果が異なる理由がまだわかりませんが、アップグレード ドキュメントの適切な RTFM が大いに役立ちました。Gerhard、ありがとう!それは私が必要としていたきっかけでした。

「いいね!」 1