- Adopt a new X3DH session (install into self.sessions + persist) only after the first message decrypts successfully. Previously _process_x3dh_header saved the candidate session immediately, so a replayed/forged X3DH header permanently overwrote a working ratchet. - Advance the incremental-sync watermark (__last_server_ts) only across the prefix of messages settled in the cache. An undecryptable message (e.g. sender key not yet received) is re-fetched and retried up to _MAX_DECRYPT_RETRIES=3 times instead of being silently lost forever. Watermark is no longer touched on offset>0 pages and never regresses. - Fix NameError in the proof-of-work registration path (logger -> self._logger) and run _solve_pow in an executor so it does not block the event loop. - Persist the rotated RSA login key only after the server confirmed rotate_keys; writing private.pem first bricked the account when the request failed. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
166 KiB
166 KiB