diff --git a/android-client/PMA.VaultPatch.pas b/android-client/PMA.VaultPatch.pas
index 22f6c03..f7396ea 100644
--- a/android-client/PMA.VaultPatch.pas
+++ b/android-client/PMA.VaultPatch.pas
@@ -49,7 +49,7 @@ function NewEmptySnapshot(const AUsername: string): string;
///
/// Un uuid neuf, et lui seul : pas de tombstone, on ne supprime pas encore.
function AddEntry(const APlainJson, ATitle, ASite, AUsername, APassword,
- AKind, AFolder: string): string;
+ AKind, AFolder, ATotp: string): string;
/// Retire une entree de l'instantane et laisse une PIERRE TOMBALE a sa place.
///
@@ -532,7 +532,7 @@ begin
end;
function AddEntry(const APlainJson, ATitle, ASite, AUsername, APassword,
- AKind, AFolder: string): string;
+ AKind, AFolder, ATotp: string): string;
var
LRoot, LEntry: TJSONObject;
LEntries: TJSONArray;
@@ -560,7 +560,7 @@ begin
else LEntry.AddPair('folder', 'All');
EnsureFolder(LRoot, AFolder);
LEntry.AddPair('tags', TJSONArray.Create);
- LEntry.AddPair('totp_secret', '');
+ LEntry.AddPair('totp_secret', ATotp);
LEntry.AddPair('kind', AKind);
LEntry.AddPair('template', '');
LEntry.AddPair('custom_fields', TJSONArray.Create);
diff --git a/android-client/web/app.html b/android-client/web/app.html
index f34bd41..37d864b 100644
--- a/android-client/web/app.html
+++ b/android-client/web/app.html
@@ -1359,6 +1359,11 @@ function openNewEntry() {
// qu'aucune confirmation ne rattrape et qu'on ne peut relire nulle part.
+ '
Password
'
+ '
' + newBodyControl('login') + '
'
+ // LE SECRET, pas le code. Il manquait ici alors que l'editeur le portait
+ // deja : on pouvait poser un second facteur sur une entree existante, pas
+ // sur une entree qu'on venait de creer - il fallait enregistrer puis
+ // rouvrir. Meme intitule que l'editeur pour qu'on reconnaisse le champ.
+ + newField('nTotp', '2FA secret', 'nTotpRow')
+ ''
// flex:1 et non .wide : .wide ne regle que le rembourrage, et la largeur
// pleine vient d'etre etire dans son conteneur.
@@ -1388,6 +1393,7 @@ document.getElementById('fields').addEventListener('click', function (ev) {
// demander de remplir ce que rien n'affichera.
document.getElementById('nSiteRow').hidden = (kind === 'note');
document.getElementById('nUserRow').hidden = (kind === 'note');
+ document.getElementById('nTotpRow').hidden = (kind === 'note');
// Le corps d'une note EST son mot de passe cote stockage : meme champ,
// autre intitule, et rien a masquer - mais plusieurs lignes.
@@ -1418,6 +1424,7 @@ document.getElementById('fields').addEventListener('click', function (ev) {
+ '&s=' + encodeURIComponent(v('nSite'))
+ '&u=' + encodeURIComponent(v('nUser'))
+ '&p=' + encodeURIComponent(document.getElementById('nPwd').value)
+ + '&o=' + encodeURIComponent(v('nTotp'))
+ '&k=' + newKind);
});
document.getElementById('new').addEventListener('click', openNewEntry);
diff --git a/mainApk.pas b/mainApk.pas
index a76ba54..3a2b117 100644
--- a/mainApk.pas
+++ b/mainApk.pas
@@ -306,7 +306,7 @@ type
/// Ajoute une entree au coffre. Le mot de passe voyage par le pont,
/// comme 'setfield' - meme regle, meme journalisation muette.
procedure CreateEntry(const ATitle, ASite, AUser, APwd, AKind,
- AFolder: string);
+ AFolder, ATotp: string);
function UuidsFromIndexes(const AList: string): TArray;
/// Supprime des entrees, pierres tombales comprises. Sans retour.
/// Liste vide = l'entree ouverte.
@@ -1572,7 +1572,7 @@ begin
end;
procedure TForm8.CreateEntry(const ATitle, ASite, AUser, APwd, AKind,
- AFolder: string);
+ AFolder, ATotp: string);
begin
// Une entree sans rien pour la reconnaitre serait une ligne muette dans la
// liste, et rien ne permettrait de la retrouver pour la corriger.
@@ -1584,7 +1584,8 @@ begin
CommitChange('Added: ' + ATitle, 'new entry from phone', '',
function (APlain: string): string
begin
- Result := AddEntry(APlain, ATitle, ASite, AUser, APwd, AKind, AFolder);
+ Result := AddEntry(APlain, ATitle, ASite, AUser, APwd, AKind, AFolder,
+ ATotp);
end);
end;
@@ -1750,7 +1751,8 @@ begin
TNetEncoding.URL.Decode(Param('u')),
TNetEncoding.URL.Decode(Param('p')),
TNetEncoding.URL.Decode(Param('k')),
- TNetEncoding.URL.Decode(Param('d')))
+ TNetEncoding.URL.Decode(Param('d')),
+ TNetEncoding.URL.Decode(Param('o')))
else if LAction = 'history' then
ShowPasswordHistory