fix(android): Sync ouvre le coffre des qu'il y en a un, pas seulement sous code

Le garde ne couvrait que le cache scelle par un code. Depuis que les deux
secrets sont separes, la reconciliation a besoin de celui du conteneur
local - qui ne se pose qu'a l'ouverture - donc un coffre ne ici refusait
aussi, avec "open vault first", et ouvrir ensuite ne relancait rien : le
bouton Sync ne vit que sur l'accueil, et le coffre ouvert on est sur la
liste.

Un seul garde desormais : s'il y a un cache lisible et que le coffre
n'est pas ouvert, on ouvre et on reprend la synchronisation. Un appareil
sans cache n'est pas concerne - c'est le premier telechargement.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
r-zakarya
2026-08-28 16:07:25 +01:00
parent dd44a164f6
commit af28788a0a
+15 -21
View File
@@ -2259,30 +2259,24 @@ begin
end;
WebCall('PM.clearLog()');
// MEME PORTE QUE L'OUVERTURE, LE CODE DE DEVERROUILLAGE COMPRIS.
// SYNCHRONISER DEMANDE UN COFFRE OUVERT DES QU'IL Y EN A UN SUR L'APPAREIL.
//
// Le garde suivant ne couvre que l'empreinte, et les deux protections
// s'excluent : un cache scelle par un code porte VER_PIN, donc VaultNeedsAuth
// y est FAUX et rien ne s'y opposait. Synchroniser reconstruisait alors le
// coffre depuis le depot et l'affichait sans que le code soit demande - il ne
// gardait qu'un bouton sur deux.
// Deux raisons, et elles se rejoignent : la reconciliation a besoin du secret
// qui ouvre le conteneur local, et un cache scelle par un code exige que ce
// code ait ete verifie. Ni l'un ni l'autre ne s'obtient sans ouvrir - seul
// LoadVault sait si le code est bon, et seul le cache rend le secret.
//
// ET C'EST L'OUVERTURE QUI VERIFIE, PAS CE GARDE. Un code tape ici ne serait
// confronte a rien : le depot est scelle par le mot de passe de sync, pas par
// le code. Se contenter d'exiger un champ rempli laisserait donc passer
// n'importe quelle frappe. Seul LoadVault sait si le code est le bon, et
// c'est "Open vault" qui l'appelle - d'ou le renvoi vers lui plutot qu'une
// verification recopiee ici.
if VaultNeedsPin and (FVault.Count = 0) then
// NE PAS SE CONTENTER DE REFUSER. Le bouton Sync ne vit que sur l'accueil, et
// une fois le coffre ouvert on est sur la liste, ou il n'existe pas :
// repondre "ouvre d'abord" fermait la seule porte, et l'ouverture qui suivait
// ne relancait rien. On ouvre donc, et OpenLocalNow reprend la
// synchronisation la ou elle s'est arretee.
//
// Un appareil SANS cache n'est pas concerne : c'est le premier
// telechargement, et il n'y a rien a ouvrir.
if HasVault and (not FVaultUnreadable) and (FVault.Count = 0) then
begin
// NE PAS S'ARRETER LA. Refuser tout court fermait la seule porte : le
// bouton Sync ne vit que sur l'accueil, et une fois le coffre ouvert on est
// sur la liste, ou il n'existe pas. Synchroniser devenait impossible des
// qu'un code etait pose.
//
// On ouvre donc - ce qui verifie le code, seul LoadVault le peut - et
// OpenLocalNow reprend la synchronisation la ou elle s'est arretee.
if FPin = '' then
if VaultNeedsPin and (FPin = '') then
begin
Status('Unlock code required');
WebCall('PM.focusPin()');