fix(apk): un faux mot de passe de synchro n'ouvre plus le depot, et il se verifie a l'enregistrement
- OpenContainer reutilisait la cle de l'ancien mot de passe : jamais tant qu'un nouveau n'est pas verifie - un essai rate vidait FKey (parametres out TBytes) : derivation dans des locales, rangee seulement apres succes - Save coffre ouvert : verification immediate (DoSync), le bon mot de passe est range dans le coffre scelle ; coffre ferme, le champ est grise Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -162,6 +162,7 @@
|
|||||||
.btn.wide { padding: 13px 18px; font-size: 15px; }
|
.btn.wide { padding: 13px 18px; font-size: 15px; }
|
||||||
.btn.main { background: var(--accent); }
|
.btn.main { background: var(--accent); }
|
||||||
.btn:disabled { opacity: .45; }
|
.btn:disabled { opacity: .45; }
|
||||||
|
.field-in:disabled { opacity: .5; }
|
||||||
/* Rouge sourd : assez pour qu'on ne le confonde pas avec Copy, pas assez
|
/* Rouge sourd : assez pour qu'on ne le confonde pas avec Copy, pas assez
|
||||||
pour attirer l'oeil sur la seule action irreversible de l'ecran. */
|
pour attirer l'oeil sur la seule action irreversible de l'ecran. */
|
||||||
.btn.danger { background: rgba(220, 80, 80, .30); }
|
.btn.danger { background: rgba(220, 80, 80, .30); }
|
||||||
@@ -1669,6 +1670,15 @@ function openSettings() {
|
|||||||
document.getElementById('sPinNew').value = '';
|
document.getElementById('sPinNew').value = '';
|
||||||
document.getElementById('secCode').hidden = !vaultOpen;
|
document.getElementById('secCode').hidden = !vaultOpen;
|
||||||
document.getElementById('sRepoErr').hidden = true;
|
document.getElementById('sRepoErr').hidden = true;
|
||||||
|
// UN COFFRE EXISTE MAIS EST FERME : le mot de passe de synchro ne se change
|
||||||
|
// pas d'ici. Il ne vit que dans le coffre scelle, et seul un coffre ouvert
|
||||||
|
// permet de le verifier puis de l'y ranger - tape coffre ferme, il etait
|
||||||
|
// perdu a la fermeture de l'app.
|
||||||
|
var sp = document.getElementById('sPwd'),
|
||||||
|
locked = (authMode === 'open' || authMode === 'login') && !vaultOpen;
|
||||||
|
sp.disabled = locked;
|
||||||
|
sp.placeholder = locked ? 'sync password - open the vault to change it'
|
||||||
|
: 'sync password';
|
||||||
cfgBase = cfgNow();
|
cfgBase = cfgNow();
|
||||||
syncSaveBtn(false);
|
syncSaveBtn(false);
|
||||||
// La section n'existe que coffre ouvert : le dire tant qu'elle manque, et se
|
// La section n'existe que coffre ouvert : le dire tant qu'elle manque, et se
|
||||||
|
|||||||
+27
-7
@@ -972,12 +972,15 @@ end;
|
|||||||
/// oublier trois fois - a l'editeur, puis au formulaire de creation.
|
/// oublier trois fois - a l'editeur, puis au formulaire de creation.
|
||||||
function TForm8.OpenContainer(const AContainer, APwd: string): string;
|
function TForm8.OpenContainer(const AContainer, APwd: string): string;
|
||||||
var
|
var
|
||||||
LSalt: TBytes;
|
LSalt, LNewKey, LNewSalt: TBytes;
|
||||||
LIters: Integer;
|
LIters, LNewIters: Integer;
|
||||||
LSw: TStopwatch;
|
LSw: TStopwatch;
|
||||||
begin
|
begin
|
||||||
LSw := TStopwatch.StartNew;
|
LSw := TStopwatch.StartNew;
|
||||||
if (FKey <> nil) and ContainerKdfParams(AContainer, LSalt, LIters)
|
// LA CLE EN MAIN EST CELLE DE L'ANCIEN MOT DE PASSE. La reutiliser quand
|
||||||
|
// l'utilisateur vient d'en enregistrer un autre ouvrait le depot sans jamais
|
||||||
|
// essayer celui-ci : un mot de passe faux passait pour bon.
|
||||||
|
if (not FPwdUserSet) and (FKey <> nil) and ContainerKdfParams(AContainer, LSalt, LIters)
|
||||||
and (LIters = FKeyIters) and (Length(LSalt) = Length(FKeySalt))
|
and (LIters = FKeyIters) and (Length(LSalt) = Length(FKeySalt))
|
||||||
and CompareMem(Pointer(LSalt), Pointer(FKeySalt), Length(LSalt)) then
|
and CompareMem(Pointer(LSalt), Pointer(FKeySalt), Length(LSalt)) then
|
||||||
begin
|
begin
|
||||||
@@ -986,7 +989,14 @@ begin
|
|||||||
[LSw.ElapsedMilliseconds]));
|
[LSw.ElapsedMilliseconds]));
|
||||||
Exit;
|
Exit;
|
||||||
end;
|
end;
|
||||||
Result := DecryptContainerEx(AContainer, APwd, FKey, FKeySalt, FKeyIters);
|
// DANS DES LOCALES, rangees seulement apres un dechiffrement reussi : les
|
||||||
|
// parametres `out` de type TBytes sont vides des l'appel, et un essai rate
|
||||||
|
// effacait la bonne cle - la publication suivante aurait alors re-derive
|
||||||
|
// avec le mauvais mot de passe.
|
||||||
|
Result := DecryptContainerEx(AContainer, APwd, LNewKey, LNewSalt, LNewIters);
|
||||||
|
FKey := LNewKey;
|
||||||
|
FKeySalt := LNewSalt;
|
||||||
|
FKeyIters := LNewIters;
|
||||||
Log(Format(' key derived in %d ms', [LSw.ElapsedMilliseconds]));
|
Log(Format(' key derived in %d ms', [LSw.ElapsedMilliseconds]));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@@ -1798,7 +1808,16 @@ begin
|
|||||||
FUrl := TNetEncoding.URL.Decode(Param('u')).Trim;
|
FUrl := TNetEncoding.URL.Decode(Param('u')).Trim;
|
||||||
FToken := TNetEncoding.URL.Decode(Param('t')).Trim;
|
FToken := TNetEncoding.URL.Decode(Param('t')).Trim;
|
||||||
FPwd := TNetEncoding.URL.Decode(Param('p'));
|
FPwd := TNetEncoding.URL.Decode(Param('p'));
|
||||||
if FPwd <> FPwdShown then FPwdUserSet := True;
|
if FPwd <> FPwdShown then
|
||||||
|
begin
|
||||||
|
FPwdUserSet := True;
|
||||||
|
FPwdShown := FPwd;
|
||||||
|
// COFFRE OUVERT : on verifie tout de suite (DoSync retelecharge et
|
||||||
|
// dechiffre sous ce mot de passe), et un bon mot de passe est range
|
||||||
|
// dans le coffre scelle - le seul endroit ou il survit a la fermeture.
|
||||||
|
if (FPlain <> '') and (FUrl <> '') and (FToken <> '') and (FPwd <> '') then
|
||||||
|
TThread.ForceQueue(nil, procedure begin DoSync(nil); end);
|
||||||
|
end;
|
||||||
FPin := TNetEncoding.URL.Decode(Param('c'));
|
FPin := TNetEncoding.URL.Decode(Param('c'));
|
||||||
// L'empreinte du mot de passe AUSSI : si une saisie destinee au jeton
|
// L'empreinte du mot de passe AUSSI : si une saisie destinee au jeton
|
||||||
// atterrit dans le champ voisin - les deux sont masques - c'est celle-ci
|
// atterrit dans le champ voisin - les deux sont masques - c'est celle-ci
|
||||||
@@ -2276,8 +2295,9 @@ begin
|
|||||||
else if FPwdUserSet then
|
else if FPwdUserSet then
|
||||||
begin
|
begin
|
||||||
// L'utilisateur a enregistre un autre mot de passe de synchro depuis :
|
// L'utilisateur a enregistre un autre mot de passe de synchro depuis :
|
||||||
// c'est lui qui sert, bon ou mauvais - la synchro le dira.
|
// il RESTE dans les reglages (FPwd), mais seul celui du cache - verifie -
|
||||||
FSyncPwd := FPwd;
|
// sert au rafraichissement de fond. Le nouveau se verifie par Sync.
|
||||||
|
FSyncPwd := LPwd;
|
||||||
Log(' sync password set in Settings kept over the cached one');
|
Log(' sync password set in Settings kept over the cached one');
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
|
|||||||
Reference in New Issue
Block a user