Problema con ActiveSupport::MessageEncryptor::InvalidMessage nel plugin

L’aggiornamento a 2.9.0.beta5 sta causando un problema con il mio plugin della dashboard. Qualcosa sta generando un errore in una visualizzazione del plugin:

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'

Sembra che questo accada solo nella visualizzazione index del mio plugin, non in altre pagine del plugin o di Discourse. Non sono sicuro di dove cercare. Sono contento di aver eseguito l’aggiornamento prima sul mio sito di staging!

Quanto sopra mi ha suggerito che questo ha a che fare con il plugin di chat, ma sta accadendo sulla mia istanza di sviluppo senza chat installata.

Wow, e cercare su Google ActiveSupport::MessageEncryptor::InvalidMessage "fast_attributes" restituisce solo questo argomento!

1 Mi Piace

Il mio problema sembra avere a che fare con config/master.key (https://stackoverflow.com/questions/54277392/rails-activesupportmessageencryptorinvalidmessage), ma non capisco perché abbia iniziato a verificarsi con questo aggiornamento.

1 Mi Piace

Abbiamo aggiornato a Rails 7, quindi probabilmente è questa la causa.

1 Mi Piace

Grazie, @gerhard!

Quindi, su Upgrading Ruby on Rails — Ruby on Rails Guides

trovo

(ma questo dice Rails 7.1?)

C’è un modo che conosci a memoria per ignorare questa modifica nel mio plugin esistente con una riga ovvia una volta che la conosci nel mio plugin.rb?

O forse dovrò capire cosa significa.

MODIFICA: ma su dev l’aggiunta di quella riga a config/application.rb non è una soluzione magica.

Scusa. Ho letto un po’ oltre:

Quindi forse questo risolverà il mio problema immediato. Grazie ancora per il tuo aiuto! Forse stavolta ci riuscirò.


Bene, la chiave che genero sia per rails 6 che per rails 7 appare così:

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

ma crittografano le cose in modo diverso. Speravo che hash_digest_class fosse il problema, ma almeno sembra che sia lo stesso su entrambi, ma la stringa crittografata è diversa. :crying_cat_face:

1 Mi Piace

Oh. Dannazione. No, non è quello. Il mio sito di produzione che funziona è su 7.0.3 e il sito di staging che non funziona è anch’esso su 7.0.3. Sta crittografando le cose in modo diverso. Non riesco a capire, e non so come capire, se è il serializzatore ad essere diverso o il cifrario ad essere diverso.

Nel frattempo, ho appreso che 7.0 supporta la crittografia dei campi, il che mi permetterà di eliminare del codice personalizzato se solo riuscissi a capire come accedere alle mie chiavi API crittografate. O forse le eliminerò e le rigenererò.

Al momento sto ottenendo crittografie come
=> "SUNBZlRURThEZjdVUG8wTzV1eWk0dz09LS1uRGVSQWtPRU9rc1ZCa1Y1d2pyeU5nPT0=--43eab316e6a9ebafc72d4982347abd9c7f6605db"

con 2.9.0.beta4 assomigliano a "FwL/GGvrDHOpQ1bnGiI=--kCLbUxMf/XeMaeWF--/feRN+/l1q3EFdKgyIo+7Q=="

Ho dovuto aggiungere la vecchia cifratura qui:

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

Ancora non capisco perché le due istanze che affermano entrambe di eseguire la 7.0.3 abbiano risultati diversi, ma una buona lettura della documentazione di aggiornamento è stata di grande aiuto. Grazie, Gerhard! Era la spinta di cui avevo bisogno.

1 Mi Piace