Проблема с ActiveSupport::MessageEncryptor::InvalidMessage в плагине

Обновление до версии 2.9.0.beta5 вызывает проблему с моим плагином панели управления. Что-то вызывает ошибку на одном из видов плагина:

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'

Похоже, что проблема возникает только в главном виде (index view) моего плагина, но не на других страницах плагина или в самом Discourse. Не уверен, куда смотреть. Так рад, что сначала обновил тестовый сайт!

Вышеизложенное наводит на мысль, что проблема связана с плагином чата, но это происходит на моём локальном окружении разработки, где чат даже не установлен.

Ого, а поиск в Google по запросу ActiveSupport::MessageEncryptor::InvalidMessage "fast_attributes" возвращает только эту тему!

Моя проблема, похоже, связана с config/master.key (https://stackoverflow.com/questions/54277392/rails-activesupportmessageencryptorinvalidmessage), но я не понимаю, почему она возникла именно при этом обновлении.

Мы обновились до Rails 7, поэтому, вероятно, это и есть причина.

Спасибо, @gerhard!

Итак, на странице Upgrading Ruby on Rails — Ruby on Rails Guides

я нахожу:

(но там сказано про Rails 7.1?)

Есть ли какой-то способ, о котором вы знаете с ходу, чтобы игнорировать это изменение в моём существующем плагине с помощью какой-то очевидной, когда знаешь, строки в моём plugin.rb?

Или, возможно, мне придётся разобраться, что это всё значит.

EDIT: но в ветке dev добавление этой строки в config/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:

Ох, черт. Нет, не в этом дело. Мой рабочий продакшн-сайт на версии 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, дают разные результаты, но тщательное изучение документации по обновлению (RTFM) сильно помогло. Спасибо, Герхард! Это был тот толчок, который мне был нужен.