Houmgaor
01b829d0e9
feat(savedata): add tier 2 integrity protections
...
Strengthen savedata persistence against corruption and race conditions:
- SHA-256 checksum: hash the decompressed blob on every save, store in
new savedata_hash column, verify on load to detect silent corruption.
Pre-existing characters with no hash are silently upgraded on next save.
- Atomic transactions: wrap character data + house data + hash + backup
into a single DB transaction via SaveCharacterDataAtomic, so a crash
mid-save never leaves partial state.
- Per-character save mutex: CharacterLocks (sync.Map of charID → Mutex)
serializes concurrent saves for the same character, preventing races
that could defeat corruption detection. Different characters remain
fully independent.
Migration 0008 adds the savedata_hash column to the characters table.
2026-03-17 19:21:55 +01:00
..
2026-03-17 19:03:43 +01:00
2026-02-27 17:29:32 +01:00
2026-02-27 17:29:32 +01:00
2026-03-17 19:21:55 +01:00
2026-03-01 18:56:52 +01:00
2026-03-05 18:00:30 +01:00
2026-03-05 18:00:30 +01:00
2026-03-17 19:21:55 +01:00
2026-02-27 13:45:56 +01:00
2026-03-17 19:21:55 +01:00
2026-03-17 19:21:55 +01:00
2026-03-05 18:00:30 +01:00
2026-03-05 18:00:30 +01:00
2026-03-10 11:28:11 +01:00
2026-03-10 11:19:22 +01:00
2026-03-05 16:39:15 +01:00
2026-03-02 19:43:11 +01:00
2026-03-02 19:43:11 +01:00
2026-03-05 18:00:30 +01:00
2026-03-06 00:15:53 +01:00
2026-03-05 18:00:30 +01:00
2026-03-03 18:04:33 +01:00
2026-03-06 00:15:53 +01:00
2026-03-05 18:00:30 +01:00
2026-03-05 16:39:15 +01:00
2026-03-17 19:03:43 +01:00
2026-03-02 20:12:39 +01:00
2026-03-02 20:12:39 +01:00
2026-03-01 18:41:59 +01:00
2026-02-27 17:29:32 +01:00
2026-03-17 19:11:59 +01:00
2026-03-05 16:39:15 +01:00
2026-03-17 19:03:43 +01:00
2026-03-05 23:05:55 +01:00
2026-03-05 23:05:55 +01:00
2026-03-05 23:05:55 +01:00
2026-03-05 23:05:55 +01:00
2026-03-05 23:05:55 +01:00
2026-03-17 19:21:55 +01:00
2026-03-05 23:05:55 +01:00
2026-03-05 23:05:55 +01:00
2026-03-05 23:05:55 +01:00
2026-03-05 23:05:55 +01:00
2026-03-05 23:05:55 +01:00
2026-03-05 23:05:55 +01:00
2026-03-05 23:05:55 +01:00
2026-03-05 23:05:55 +01:00
2026-03-16 00:07:46 +01:00
2026-03-10 11:28:11 +01:00
2026-03-05 23:05:55 +01:00
2026-03-05 23:05:55 +01:00
2026-03-02 19:43:11 +01:00
2026-03-05 23:05:55 +01:00
2026-03-05 23:05:55 +01:00
2026-03-05 23:05:55 +01:00
2026-03-05 23:05:55 +01:00
2026-03-17 19:21:55 +01:00
2026-03-05 23:05:55 +01:00
2026-03-05 23:05:55 +01:00
2026-03-05 23:05:55 +01:00
2026-03-05 23:05:55 +01:00
2026-03-05 23:05:55 +01:00
2026-03-05 23:05:55 +01:00
2026-03-17 19:21:55 +01:00
2026-03-05 23:05:55 +01:00
2026-03-05 23:05:55 +01:00
2026-03-05 23:05:55 +01:00
2026-03-05 23:05:55 +01:00
2026-03-05 23:05:55 +01:00
2026-03-05 23:05:55 +01:00
2026-03-05 23:05:55 +01:00
2026-03-05 23:05:55 +01:00
2026-03-05 23:05:55 +01:00
2026-03-05 23:05:55 +01:00
2026-03-05 23:05:55 +01:00
2026-03-05 23:05:55 +01:00
2026-03-05 23:05:55 +01:00
2026-03-05 23:05:55 +01:00
2026-03-05 23:05:55 +01:00
2026-03-10 11:28:11 +01:00
2026-03-10 11:28:11 +01:00
2026-03-02 20:12:39 +01:00
2026-03-17 19:21:55 +01:00
2026-03-06 00:15:53 +01:00
2026-03-05 23:05:55 +01:00