20ba2438df
The detail screen showed site, username and password and silently dropped everything else - custom fields, notes, 2FA. It is now built per entry rather than from a fixed template: every row is a caption, a value, and whether it is secret, so reveal and copy exist once instead of once per kind of field. Two rows stay special on purpose. A note's body is stored in the password column, so it gets its own caption and no mask. The 2FA code is the only live row - refreshed every second, placed first, since it is what you pull a phone out for. PMA.Totp takes bare base32 or an otpauth:// URI; both travel in snapshots depending on how the entry was created. Checked against all six RFC 6238 vectors, including T=20000000000, which overflows 32 bits. The rows hold plaintext, so clearing them is part of locking, not of navigating away. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
22 lines
565 B
ObjectPascal
22 lines
565 B
ObjectPascal
program pmserverApk;
|
|
|
|
uses
|
|
System.StartUpCopy,
|
|
FMX.Forms,
|
|
mainApk in 'mainApk.pas' {Form8},
|
|
PMA.Crypto in 'android-client\PMA.Crypto.pas',
|
|
PMA.TestVector in 'android-client\PMA.TestVector.pas',
|
|
PMA.SyncClient in 'android-client\PMA.SyncClient.pas',
|
|
PMA.Store in 'android-client\PMA.Store.pas',
|
|
PMA.Biometric in 'android-client\PMA.Biometric.pas',
|
|
PMA.Vault in 'android-client\PMA.Vault.pas',
|
|
PMA.Totp in 'android-client\PMA.Totp.pas';
|
|
|
|
{$R *.res}
|
|
|
|
begin
|
|
Application.Initialize;
|
|
Application.CreateForm(TForm8, Form8);
|
|
Application.Run;
|
|
end.
|