feat(android): un bouton pour jeter le coffre local, en debogage seulement

Il vit en bas des reglages, apres tout le reste, et demande deux appuis :
un effacement sans retour ne se declenche pas sur un doigt qui glisse.

Absent en release, et pas seulement cache : la commande du pont n'est pas
compilee et Delphi ne devoile la section que dans une version de
debogage. Le bouton ne peut donc pas reapparaitre par accident. Verifie -
Release compte 8060 lignes contre 8072 en debug, soit exactement ce bloc.

DropLocalVault efface le cache, le conteneur local et le drapeau
d'attente, chacun sous son propre try : un fichier absent ou verrouille
ne doit pas empecher les deux autres de partir. Les reglages du depot
restent - c'est le coffre qu'on jette, pas la facon d'aller le rechercher.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
r-zakarya
2026-08-28 21:47:53 +01:00
parent d43176576f
commit 85691bb2f1
3 changed files with 75 additions and 2 deletions
+18
View File
@@ -157,6 +157,14 @@ procedure ClearVault;
function HasLocalContainer: Boolean;
function LoadLocalContainer: string;
procedure SaveLocalContainer(const AContainer: string);
/// Efface TOUT ce que l'appareil detient du coffre : le cache, le conteneur
/// local et le drapeau d'attente. Ne touche pas aux reglages du depot - c'est
/// le coffre qu'on jette, pas la facon d'aller le rechercher.
///
/// SANS RETOUR, et sans garde ici : l'appelant est le seul a savoir si
/// quelqu'un l'a demande. Reserve au debogage.
procedure DropLocalVault;
/// Efface le conteneur local. A n'appeler QU'APRES avoir publie son contenu :
/// c'est le geste qui fait passer l'autorite au depot, et il est sans retour.
procedure DropLocalContainer;
@@ -290,6 +298,16 @@ begin
TFile.Delete(LocalContainerPath);
end;
procedure DropLocalVault;
begin
// Chacun sous son propre try : un fichier absent ou verrouille ne doit pas
// empecher les deux autres de partir - un effacement a moitie fait laisse
// l'appareil dans un etat que personne n'a voulu.
try if TFile.Exists(VaultPath) then TFile.Delete(VaultPath); except end;
try DropLocalContainer; except end;
try SetPendingFlag(False); except end;
end;
function PendingPath: string;
begin
Result := TPath.Combine(TPath.GetHomePath, PENDING_FILE);
+35
View File
@@ -605,6 +605,19 @@
atteignable depuis l'accueil comme depuis le coffre. -->
<pre id="log" hidden></pre>
<div class="note" id="sVersion"></div>
<!-- DEBOGAGE SEULEMENT. Delphi ne devoile cette section que dans une
version de debogage, et la commande qui l'accompagne n'est meme pas
compilee en release : le bouton ne peut donc pas reapparaitre par
accident dans une version publiee. En bas de l'ecran, apres tout le
reste, parce qu'on ne tombe pas dessus par megarde. -->
<div id="secDebug" hidden>
<h2>Debug</h2>
<button class="btn wide danger" id="sWipe">Delete the local vault</button>
<div class="note">Removes the cached vault and any vault created here,
along with anything not yet published. The repository is untouched -
Download vault brings it back.</div>
</div>
</div>
</div>
@@ -1606,6 +1619,24 @@ document.getElementById('sPinSet').addEventListener('click', function () {
send('pinset?c=' + encodeURIComponent(v));
document.getElementById('sPinNew').value = '';
});
document.getElementById('sWipe').addEventListener('click', function (ev) {
// DEUX APPUIS, comme pour retirer le code : un effacement sans retour ne se
// declenche pas sur un doigt qui glisse.
var b = ev.currentTarget;
if (b.getAttribute('data-armed') === null) {
b.setAttribute('data-armed', '1');
b.textContent = 'Really delete - tap again';
setTimeout(function () {
b.removeAttribute('data-armed');
b.textContent = 'Delete the local vault';
}, 4000);
return;
}
b.removeAttribute('data-armed');
b.textContent = 'Delete the local vault';
send('wipelocal');
closeSettings();
});
document.getElementById('sPinClear').addEventListener('click', function (ev) {
var b = ev.currentTarget;
if (b.getAttribute('data-armed') === null) {
@@ -1828,6 +1859,10 @@ var PM = {
document.body.classList.add('on-history');
send('state?view=history');
},
/// Version de debogage : Delphi le dit, la page l'affiche. Jamais l'inverse.
showDebug: function () {
document.getElementById('secDebug').hidden = false;
},
setVersion: function (v) {
document.getElementById('sVersion').textContent = v;
},
+22 -2
View File
@@ -446,6 +446,12 @@ begin
FPending := HasPendingFlag;
PushConfig;
WebCall('PM.setVersion("Coffre 1.0.0")');
{$IFDEF DEBUG}
// L'effacement du coffre local n'existe QUE dans les versions de debogage.
// La page ne montre le bouton que si Delphi le lui dit, et Delphi ne le dit
// qu'ici : une version publiee n'a donc ni le bouton ni la commande.
WebCall('PM.showDebug()');
{$ENDIF}
ShowUnlock;
{$IFNDEF DEBUG}
// Le journal quitte l'ecran d'accueil, sans quitter l'application : un appui
@@ -1743,6 +1749,22 @@ begin
else if LAction = 'icon' then
SetEntryIcon(Param('a') = 'fetch')
{$IFDEF DEBUG}
// JETER LE COFFRE LOCAL - debogage seulement, et absent a la compilation
// en release : la commande n'existe pas, pas plus que le bouton.
else if LAction = 'wipelocal' then
begin
LockVault;
DropLocalVault;
FPending := False;
FETag := '';
FVaultUnreadable := False;
Log('DEBUG: local vault dropped');
ShowUnlock;
WebCall('PM.toast("Local vault deleted")');
end
{$ENDIF}
else if LAction = 'pinset' then
SetUnlockCode(TNetEncoding.URL.Decode(Param('c')))
@@ -1983,8 +2005,6 @@ begin
procedure
var
LPlain, LOwner: string;
LKey, LSalt: TBytes;
LIters: Integer;
LDoc: TJSONObject;
begin
try