move TOTP button on keyboard to third position (after User/Pwd) and disable TOTP "internal fields"

closes #1341
closes #2394
closes #1844
This commit is contained in:
Philipp Crocoll
2024-01-04 19:09:24 +01:00
parent 059280efd0
commit 31255f0c52
6 changed files with 39 additions and 16 deletions

View File

@@ -39,11 +39,13 @@ namespace PluginTOTP
{
TotpData res = new TotpData();
string data;
if (!_entryFields.TryGetValue("otp", out data))
var otpKey = "otp";
if (!_entryFields.TryGetValue(otpKey, out data))
{
return res;
}
NameValueCollection parameters = ParseQueryString(data);
res.InternalFields.Add(otpKey);
if (parameters[KeyParameter] == null)
{

View File

@@ -16,6 +16,7 @@ namespace keepass2android
{
return res;
}
res.InternalFields.Add("otp");
string otpUriStart = "otpauth://totp/";

View File

@@ -13,14 +13,18 @@ namespace PluginTOTP
public TotpData GetTotpData(IDictionary<string, string> entryFields, Context ctx, bool muteWarnings)
{
TotpData res = new TotpData();
byte[] pbSecret = (GetOtpSecret(entryFields, "TimeOtp-") ?? MemUtil.EmptyByteArray);
byte[] pbSecret = (GetOtpSecret(entryFields, "TimeOtp-", out string secretFieldKey) ?? MemUtil.EmptyByteArray);
if (pbSecret.Length == 0)
return res;
res.InternalFields.Add(secretFieldKey);
string strPeriod;
uint uPeriod = 0;
if (entryFields.TryGetValue("TimeOtp-Period", out strPeriod))
{
res.InternalFields.Add("TimeOtp-Period");
uint.TryParse(strPeriod, out uPeriod);
}
@@ -33,6 +37,7 @@ namespace PluginTOTP
uint uLength = 0;
if (entryFields.TryGetValue("TimeOtp-Length", out strLength))
{
res.InternalFields.Add("TimeOtp-Length");
uint.TryParse(strLength, out uLength);
}
@@ -41,6 +46,8 @@ namespace PluginTOTP
string strAlg;
entryFields.TryGetValue("TimeOtp-Algorithm", out strAlg);
if (!string.IsNullOrEmpty(strAlg))
res.InternalFields.Add("TimeOtp-Algorithm");
res.HashAlgorithm = strAlg;
res.TotpSecret = pbSecret;
@@ -51,32 +58,37 @@ namespace PluginTOTP
}
private static byte[] GetOtpSecret(IDictionary<string, string> entryFields, string strPrefix)
private static byte[] GetOtpSecret(IDictionary<string, string> entryFields, string strPrefix, out string secretFieldKey)
{
try
{
string str;
entryFields.TryGetValue(strPrefix + "Secret", out str);
if (!string.IsNullOrEmpty(str))
secretFieldKey = strPrefix + "Secret";
entryFields.TryGetValue(secretFieldKey, out str);
if (!string.IsNullOrEmpty(str))
return StrUtil.Utf8.GetBytes(str);
entryFields.TryGetValue(strPrefix + "Secret-Hex", out str);
secretFieldKey = strPrefix + "Secret-Hex";
entryFields.TryGetValue(secretFieldKey, out str);
if (!string.IsNullOrEmpty(str))
return MemUtil.HexStringToByteArray(str);
entryFields.TryGetValue(strPrefix + "Secret-Base32", out str);
secretFieldKey = strPrefix + "Secret-Base32";
entryFields.TryGetValue(secretFieldKey, out str);
if (!string.IsNullOrEmpty(str))
return MemUtil.ParseBase32(str);
entryFields.TryGetValue(strPrefix + "Secret-Base64", out str);
secretFieldKey = strPrefix + "Secret-Base64";
entryFields.TryGetValue(secretFieldKey, out str);
if (!string.IsNullOrEmpty(str))
return Convert.FromBase64String(str);
}
catch (Exception e)
{
Kp2aLog.LogUnexpectedError(e);
}
secretFieldKey = null;
return null;
}
}

View File

@@ -31,12 +31,14 @@ namespace PluginTOTP
public string TimeCorrectionUrl { get; set; }
public string HashAlgorithm { get; set; }
public bool IsDefaultRfc6238
{
get { return Length == "6" && Duration == "30" && (HashAlgorithm == null || HashAlgorithm == HashSha1); }
}
public List<string> InternalFields { get; set; } = new List<string>();
public static TotpData MakeDefaultRfc6238()
{
return new TotpData()

View File

@@ -115,6 +115,8 @@ namespace PluginTOTP
{
bool NoTimeCorrection = false;
string[] Settings = SettingsGet(entryFields);
res.InternalFields.Add(SettingsFieldName);
res.InternalFields.Add(SeedFieldName);
res.Duration = Settings[0];
res.Length = Settings[1];
if (res.Length == "S")

View File

@@ -546,6 +546,7 @@ namespace keepass2android
return hadKeyboardData;
}
bool MakeAccessibleForKeyboard(PwEntryOutput entry, string searchUrl)
{
#if EXCLUDE_KEYBOARD
@@ -554,38 +555,41 @@ namespace keepass2android
bool hasData = false;
Keepass2android.Kbbridge.KeyboardDataBuilder kbdataBuilder = new Keepass2android.Kbbridge.KeyboardDataBuilder();
String[] keys = {PwDefs.UserNameField,
String[] standardKeys = {PwDefs.UserNameField,
PwDefs.PasswordField,
Kp2aTotp.TotpKey,
PwDefs.UrlField,
PwDefs.NotesField,
PwDefs.TitleField
};
int[] resIds = {Resource.String.entry_user_name,
Resource.String.entry_password,
0,
Resource.String.entry_url,
Resource.String.entry_comment,
Resource.String.entry_title };
//add standard fields:
int i = 0;
foreach (string key in keys)
foreach (string key in standardKeys)
{
String value = entry.OutputStrings.ReadSafe(key);
if (value.Length > 0)
{
kbdataBuilder.AddString(key, GetString(resIds[i]), value);
kbdataBuilder.AddString(key, resIds[i] > 0 ? GetString(resIds[i]) : key, value);
hasData = true;
}
i++;
}
//add additional fields:
var totpData = new Kp2aTotp().TryGetTotpData(entry);
foreach (var pair in entry.OutputStrings)
{
var key = pair.Key;
var value = pair.Value.ReadString();
if (!PwDefs.IsStandardField(key))
if (!standardKeys.Contains(key) && totpData?.InternalFields.Contains(key) != true)
{
kbdataBuilder.AddString(pair.Key, pair.Key, value);
hasData = true;