3a43422065
The Olm account pickle key is derived from the account ID plus the configured device ID (acct:device_id). If the crypto store's account was created before MATRIX_DEVICE_ID was set — e.g. the very first password login, where the device ID is only known after connecting — it gets pickled under "<acct>:default". Setting MATRIX_DEVICE_ID afterwards (a reasonable thing to do once you know the device ID you want to pin) changes the derived pickle key, and every subsequent unpickle attempt fails with BAD_ACCOUNT_KEY. In optional-E2EE mode that failure is swallowed and encryption silently stays disabled instead of surfacing an actionable error. _migrate_legacy_crypto_pickle() detects the BAD_ACCOUNT_KEY failure, tries the known legacy pickle keys, and re-pickles the account (plus every stored olm/megolm session — sessions share the same pickle key, so migrating only the account would leave them unreadable on the next decrypt and silently break key sharing with peers) under the current key. It only reports failure when no known key can unpickle the account, with a log message pointing at what changed. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>