Chiffrement : les résultats d'outils et les images du fil suivent la mémoire

Les deux reprises d'AJEAN arrivées en parallèle du chiffrement écrivaient
en clair à côté de discussions chiffrées.

- Résultats complets des outils (« voir plus ») : bucket toolres ajouté à
  encryptedBuckets, écrits et relus par putStoreBytes / getStoreBytesErr.
  Mémoire verrouillée : rien n'est écrit, le flux porte le résultat entier.
  Le nettoyage des orphelins ne tourne plus quand la mémoire est
  verrouillée : l'index des discussions revenait vide et TOUT passait pour
  orphelin.
- Images du fil (chatimg/) : même enveloppe que les pages mémoire ;
  verrouillée, l'image reste en base64 dans le message. Elles n'étaient
  jamais effacées : comme un fil rechargé perd ses images (stripImageParts),
  celles de plus de 24 h partent au démarrage et à chaque bascule de
  discussion.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
MichaelandClaude Opus 5.5 committed 2026-10-02 23:10:56 +02:00
1 parent ae0e181711
commit 58c2da1302
6 files changed
+133 -7

No files matched your search

+11 -3
View File
@@ -10,7 +10,8 @@ import (
)
// tool_results.go — résultats COMPLETS des outils, pour le bouton « voir plus ».
// Repris d'AJEAN 0.15.5 / 0.15.7, sans le chiffrement (Loki n'en a pas).
// Repris d'AJEAN 0.15.5 / 0.15.7. Chiffré comme les discussions quand le
// chiffrement mémoire est actif (bkToolRes figure dans encryptedBuckets).
//
// Le flux n'envoie à l'UI qu'un aperçu (toolPreviewChars) ; le reste se charge
// au clic. Il ne peut pas être cherché dans conv.Messages : pendant un tour
@@ -46,7 +47,9 @@ func toolResID(sid string) string {
// entier dans le flux).
func saveToolResult(result string) string {
id := toolResID(getStr(bkChat, ckActive))
if id == "" || putBytes(bkToolRes, id, []byte(result)) != nil {
// Chiffrement actif mais mémoire verrouillée : putStoreBytes refuse d'écrire
// en clair, et l'appelant envoie alors le résultat entier dans le flux.
if id == "" || putStoreBytes(bkToolRes, id, []byte(result)) != nil {
return ""
}
if toolResWrites.Add(1)%toolResPruneGap == 0 {
@@ -60,7 +63,7 @@ func loadToolResult(id string) (string, bool) {
if strings.ContainsAny(id, "/\\") {
return "", false
}
b, err := getBytesErr(bkToolRes, id)
b, err := getStoreBytesErr(bkToolRes, id)
if err != nil || b == nil {
return "", false
}
@@ -90,6 +93,11 @@ func deleteToolResultsFor(sid string) {
// pruneToolResults supprime les résultats de discussions qui n'existent plus.
func pruneToolResults() {
// Mémoire verrouillée : l'index des discussions est illisible et reviendrait
// vide — tout passerait pour orphelin. On attend le déverrouillage.
if memEncActive() && !memUnlocked() {
return
}
alive := map[string]bool{getStr(bkChat, ckActive): true}
for _, m := range convIndex() {
alive[m.ID] = true