fix(android): poser, changer et retirer le code exigent un coffre ouvert

Deux branches de l'ouverture posaient le code a partir de ce qui trainait
dans les champs.

La premiere appliquait un "nouveau code" depose par les reglages. Elle
n'exigeait rien de celui qui le deposait : n'importe qui tenant le
telephone deverrouille pouvait en poser un, et c'est le proprietaire qui,
en ouvrant son coffre, l'appliquait contre lui-meme.

La seconde rescellait sous le code tape des que le cache ne l'etait plus,
ce qui DEFAISAIT LE RETRAIT : on retirait le code, le champ le portait
encore, et l'ouverture suivante le reposait sans qu'un mot le dise. Le
premier octet du cache le disait - VER_PIN apres un retrait annonce
reussi.

Poser et changer passent maintenant par SetUnlockCode, jumeau de
ClearUnlockCode : geste explicite, coffre deja ouvert - donc code courant
connu - et effet immediat. Le champ de l'accueil ne veut plus dire qu'une
chose, "ouvre avec ceci", et ne parait que lorsqu'un code est pose.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
r-zakarya
2026-08-28 14:17:24 +01:00
parent 45564e7266
commit 900f5ba740
2 changed files with 95 additions and 69 deletions
+25 -33
View File
@@ -402,22 +402,6 @@
type="password" inputmode="numeric" autocomplete="off">
<div class="in-x" data-clear="pin">&#215;</div>
</div>
<!-- CHANGER LE CODE demande de connaitre l'actuel : le champ du dessus
doit ouvrir le coffre pour que celui-ci prenne effet. Sans cette
regle, toute ecriture du cache rescellait sous ce qui trainait dans
le champ - une synchronisation, qui ne demande pourtant aucun code,
suffisait a le changer sans qu'un mot le dise.
PLUS JAMAIS MONTRE. Les reglages posent et changent le code, et ce
champ y faisait doublon sur l'ecran ou l'on veut seulement ouvrir.
Il RESTE dans la page, cache : c'est lui que "Set this code" remplit
avant pushConfig, donc il porte toujours la valeur - il ne la
demande plus. -->
<div class="in-wrap" id="pin2wrap" hidden>
<input class="field-in" id="pin2" placeholder="new unlock code"
type="password" inputmode="numeric" autocomplete="off">
<div class="in-x" data-clear="pin2">&#215;</div>
</div>
</div>
<!-- UNE CROIX PAR CHAMP. Vider par la touche retour demande une quarantaine
d'appuis sur un jeton, et laisse facilement un caractere - ce qui donne
@@ -634,10 +618,9 @@ function pushConfig() {
send('cfg?u=' + encodeURIComponent(elUrl.value.trim())
+ '&t=' + encodeURIComponent(elTok.value.trim())
+ '&p=' + encodeURIComponent(elPwd.value)
+ '&c=' + encodeURIComponent(elPin.value)
+ '&c2=' + encodeURIComponent(document.getElementById('pin2').value));
+ '&c=' + encodeURIComponent(elPin.value));
}
[elUrl, elTok, elPwd, elPin, document.getElementById('pin2')].forEach(function (el) {
[elUrl, elTok, elPwd, elPin].forEach(function (el) {
el.addEventListener('change', pushConfig);
el.addEventListener('blur', pushConfig);
});
@@ -645,6 +628,18 @@ function pushConfig() {
// Le meme bouton dans les deux sens : creer un coffre et en ouvrir un ne
// different que par ce qui existe deja sur l'appareil, et Delphi le sait.
var authMode = 'open';
// LE CHAMP DU CODE NE SERT PLUS QU'A OUVRIR, donc il ne parait que lorsqu'un
// code est reellement pose. Il proposait aussi d'en poser un, et c'est ce
// double sens qui defaisait les retraits : le champ gardait une valeur, et la
// prochaine ouverture rescellait sous elle. On pose un code dans les reglages.
//
// DEUX ECRIVAINS, UNE SEULE REGLE : Delphi annonce l'un puis l'autre, et le
// dernier ecrasait le premier. Chacun met a jour sa variable, la fonction
// tranche.
var pinNeeded = false;
function syncPinbox() {
document.getElementById('pinbox').hidden = !pinNeeded || (authMode !== 'open');
}
document.getElementById('btnAuth').addEventListener('click', function () {
var u = document.getElementById('user').value.trim();
var p = document.getElementById('pass').value;
@@ -1489,12 +1484,11 @@ document.getElementById('sLog').addEventListener('click', function () {
document.getElementById('sPinSet').addEventListener('click', function () {
var v = document.getElementById('sPinNew').value;
if (!v) { toast('Type a code first'); return; }
// LE MEME CHEMIN QUE L'ACCUEIL : c'est l'ouverture du coffre qui pose ou
// change le sceau, et elle seule. Ici on ne fait que remplir le champ.
document.getElementById('pin2').value = v;
pushConfig();
closeSettings();
toast('Open the vault to apply the new code');
// DEMANDE EXPLICITE, EFFET IMMEDIAT. Le code ne se depose plus dans un champ
// que l'ouverture suivante appliquerait : Delphi refuse si le coffre n'est
// pas ouvert, ce qui prouve que le code courant est connu.
send('pinset?c=' + encodeURIComponent(v));
document.getElementById('sPinNew').value = '';
});
document.getElementById('sPinClear').addEventListener('click', function (ev) {
var b = ev.currentTarget;
@@ -1632,22 +1626,20 @@ var PM = {
authMode = mode;
var box = document.getElementById('authbox');
box.hidden = (mode === 'open');
document.getElementById('pinbox').hidden = (mode !== 'open');
syncPinbox();
document.getElementById('btnAuth').textContent =
(mode === 'register') ? 'Create vault' : 'Sign in';
},
setPinNeeded: function (on) {
document.getElementById('pin').placeholder =
on ? 'unlock code' : 'set an unlock code (optional)';
// pin2wrap n'est plus deplie : le champ du nouveau code vit dans les
// reglages, celui-ci n'en est que le porteur.
pinNeeded = on;
syncPinbox();
},
/// Le code vient d'etre change : le champ du nouveau n'a plus rien a dire,
/// et le laisser rempli le reproposerait a chaque ouverture.
/// Le code vient de changer : le champ d'ouverture n'a plus rien a dire, et
/// le laisser rempli rescellerait sous lui a la prochaine ecriture.
pinChanged: function () {
document.getElementById('pin2').value = '';
document.getElementById('pin').value = '';
pushConfig();
},
focusPin: function () { document.getElementById('pin').focus(); },
log: function (line) {