code simplification and fix for Autofill not being able to save credentials, closes https://github.com/PhilippC/keepass2android/issues/2269
This commit is contained in:
@@ -134,10 +134,10 @@ namespace Kp2aAutofillParser
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class FilledAutofillFieldCollection<FieldT> where FieldT:InputField
|
public class FilledAutofillFieldCollection<FieldT> where FieldT:InputField
|
||||||
{
|
{
|
||||||
public Dictionary<string, FilledAutofillField<FieldT>> HintMap { get; }
|
public Dictionary<string, FilledAutofillField> HintMap { get; }
|
||||||
public string DatasetName { get; set; }
|
public string DatasetName { get; set; }
|
||||||
|
|
||||||
public FilledAutofillFieldCollection(Dictionary<string, FilledAutofillField<FieldT>> hintMap, string datasetName = "")
|
public FilledAutofillFieldCollection(Dictionary<string, FilledAutofillField> hintMap, string datasetName = "")
|
||||||
{
|
{
|
||||||
//recreate hint map making sure we compare case insensitive
|
//recreate hint map making sure we compare case insensitive
|
||||||
HintMap = BuildHintMap();
|
HintMap = BuildHintMap();
|
||||||
@@ -149,9 +149,9 @@ namespace Kp2aAutofillParser
|
|||||||
public FilledAutofillFieldCollection() : this(BuildHintMap())
|
public FilledAutofillFieldCollection() : this(BuildHintMap())
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
private static Dictionary<string, FilledAutofillField<FieldT>> BuildHintMap()
|
private static Dictionary<string, FilledAutofillField> BuildHintMap()
|
||||||
{
|
{
|
||||||
return new Dictionary<string, FilledAutofillField<FieldT>>(StringComparer.OrdinalIgnoreCase);
|
return new Dictionary<string, FilledAutofillField>(StringComparer.OrdinalIgnoreCase);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -159,7 +159,7 @@ namespace Kp2aAutofillParser
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns>The add.</returns>
|
/// <returns>The add.</returns>
|
||||||
/// <param name="filledAutofillField">Filled autofill field.</param>
|
/// <param name="filledAutofillField">Filled autofill field.</param>
|
||||||
public void Add(FilledAutofillField<FieldT> filledAutofillField)
|
public void Add(FilledAutofillField filledAutofillField)
|
||||||
{
|
{
|
||||||
foreach (string hint in filledAutofillField.AutofillHints)
|
foreach (string hint in filledAutofillField.AutofillHints)
|
||||||
{
|
{
|
||||||
@@ -572,7 +572,7 @@ namespace Kp2aAutofillParser
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class FilledAutofillField<FieldT> where FieldT : InputField
|
public class FilledAutofillField
|
||||||
{
|
{
|
||||||
private string[] _autofillHints;
|
private string[] _autofillHints;
|
||||||
public string TextValue { get; set; }
|
public string TextValue { get; set; }
|
||||||
@@ -611,13 +611,13 @@ namespace Kp2aAutofillParser
|
|||||||
public FilledAutofillField()
|
public FilledAutofillField()
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
public FilledAutofillField(FieldT inputField)
|
public FilledAutofillField(InputField inputField)
|
||||||
: this(inputField, inputField.AutofillHints)
|
: this(inputField, inputField.AutofillHints)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public FilledAutofillField(FieldT inputField, string[] hints)
|
public FilledAutofillField(InputField inputField, string[] hints)
|
||||||
{
|
{
|
||||||
|
|
||||||
string[] rawHints = AutofillHintsHelper.FilterForSupportedHints(hints);
|
string[] rawHints = AutofillHintsHelper.FilterForSupportedHints(hints);
|
||||||
@@ -665,6 +665,7 @@ namespace Kp2aAutofillParser
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
AutofillHints = AutofillHintsHelper.ConvertToCanonicalLowerCaseHints(hintList.ToArray()).ToArray();
|
AutofillHints = AutofillHintsHelper.ConvertToCanonicalLowerCaseHints(hintList.ToArray()).ToArray();
|
||||||
|
inputField.FillFilledAutofillValue(this);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -679,7 +680,7 @@ namespace Kp2aAutofillParser
|
|||||||
if (this == obj) return true;
|
if (this == obj) return true;
|
||||||
if (obj == null || GetType() != obj.GetType()) return false;
|
if (obj == null || GetType() != obj.GetType()) return false;
|
||||||
|
|
||||||
FilledAutofillField<FieldT> that = (FilledAutofillField<FieldT>)obj;
|
FilledAutofillField that = (FilledAutofillField)obj;
|
||||||
|
|
||||||
if (!TextValue?.Equals(that.TextValue) ?? that.TextValue != null)
|
if (!TextValue?.Equals(that.TextValue) ?? that.TextValue != null)
|
||||||
return false;
|
return false;
|
||||||
@@ -717,6 +718,8 @@ namespace Kp2aAutofillParser
|
|||||||
public string HtmlInfoTag { get; set; }
|
public string HtmlInfoTag { get; set; }
|
||||||
public string HtmlInfoTypeAttribute { get; set; }
|
public string HtmlInfoTypeAttribute { get; set; }
|
||||||
|
|
||||||
|
public abstract void FillFilledAutofillValue(FilledAutofillField filledField);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -18,6 +18,9 @@ namespace Kp2aAutofillParserTest
|
|||||||
class TestInputField: InputField
|
class TestInputField: InputField
|
||||||
{
|
{
|
||||||
public string[] ExpectedAssignedHints { get; set; }
|
public string[] ExpectedAssignedHints { get; set; }
|
||||||
|
public override void FillFilledAutofillValue(FilledAutofillField filledField)
|
||||||
|
{
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|||||||
@@ -142,7 +142,7 @@ namespace keepass2android.services.AutofillBase
|
|||||||
{
|
{
|
||||||
foreach (AutofillFieldMetadata autofillFieldMetadata in autofillFieldMetadataCollection.GetFieldsForHint(hint))
|
foreach (AutofillFieldMetadata autofillFieldMetadata in autofillFieldMetadataCollection.GetFieldsForHint(hint))
|
||||||
{
|
{
|
||||||
FilledAutofillField<ViewNodeInputField> filledAutofillField;
|
FilledAutofillField filledAutofillField;
|
||||||
if (!filledAutofillFieldCollection.HintMap.TryGetValue(hint, out filledAutofillField) || (filledAutofillField == null))
|
if (!filledAutofillFieldCollection.HintMap.TryGetValue(hint, out filledAutofillField) || (filledAutofillField == null))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ namespace keepass2android.services.AutofillBase
|
|||||||
[JsonIgnore]
|
[JsonIgnore]
|
||||||
public AssistStructure.ViewNode ViewNode { get; set; }
|
public AssistStructure.ViewNode ViewNode { get; set; }
|
||||||
|
|
||||||
public void FillFilledAutofillValue(FilledAutofillField<ViewNodeInputField> filledField)
|
public override void FillFilledAutofillValue(FilledAutofillField filledField)
|
||||||
{
|
{
|
||||||
AutofillValue autofillValue = ViewNode.AutofillValue;
|
AutofillValue autofillValue = ViewNode.AutofillValue;
|
||||||
if (autofillValue != null)
|
if (autofillValue != null)
|
||||||
@@ -159,8 +159,12 @@ namespace keepass2android.services.AutofillBase
|
|||||||
|
|
||||||
protected override AutofillTargetId Parse(bool forFill, bool isManualRequest, AutofillView<ViewNodeInputField> autofillView)
|
protected override AutofillTargetId Parse(bool forFill, bool isManualRequest, AutofillView<ViewNodeInputField> autofillView)
|
||||||
{
|
{
|
||||||
|
if (autofillView == null)
|
||||||
|
Kp2aLog.Log("Received null autofill view!");
|
||||||
var result = base.Parse(forFill, isManualRequest, autofillView);
|
var result = base.Parse(forFill, isManualRequest, autofillView);
|
||||||
|
|
||||||
|
Kp2aLog.Log("Parsing done");
|
||||||
|
|
||||||
if (forFill)
|
if (forFill)
|
||||||
{
|
{
|
||||||
foreach (var p in FieldsMappedToHints)
|
foreach (var p in FieldsMappedToHints)
|
||||||
@@ -168,8 +172,9 @@ namespace keepass2android.services.AutofillBase
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
ClientFormData = new FilledAutofillFieldCollection<ViewNodeInputField>();
|
||||||
foreach (var p in FieldsMappedToHints)
|
foreach (var p in FieldsMappedToHints)
|
||||||
ClientFormData.Add(new FilledAutofillField<ViewNodeInputField>(p.Key, p.Value));
|
ClientFormData.Add(new FilledAutofillField(p.Key, p.Value));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -61,8 +61,8 @@ namespace keepass2android.services.Kp2aAutofill
|
|||||||
foreach (string key in pwEntryOutput.OutputStrings.GetKeys())
|
foreach (string key in pwEntryOutput.OutputStrings.GetKeys())
|
||||||
{
|
{
|
||||||
|
|
||||||
FilledAutofillField<ViewNodeInputField> field =
|
FilledAutofillField field =
|
||||||
new FilledAutofillField<ViewNodeInputField>
|
new FilledAutofillField
|
||||||
{
|
{
|
||||||
AutofillHints = GetCanonicalHintsFromKp2aField(key).ToArray(),
|
AutofillHints = GetCanonicalHintsFromKp2aField(key).ToArray(),
|
||||||
TextValue = pwEntryOutput.OutputStrings.ReadSafe(key)
|
TextValue = pwEntryOutput.OutputStrings.ReadSafe(key)
|
||||||
@@ -73,8 +73,8 @@ namespace keepass2android.services.Kp2aAutofill
|
|||||||
if (IsCreditCard(pwEntry, context) && pwEntry.Expires)
|
if (IsCreditCard(pwEntry, context) && pwEntry.Expires)
|
||||||
{
|
{
|
||||||
DateTime expTime = pwEntry.ExpiryTime;
|
DateTime expTime = pwEntry.ExpiryTime;
|
||||||
FilledAutofillField<ViewNodeInputField> field =
|
FilledAutofillField field =
|
||||||
new FilledAutofillField<ViewNodeInputField>
|
new FilledAutofillField
|
||||||
{
|
{
|
||||||
AutofillHints = new[] {View.AutofillHintCreditCardExpirationDate},
|
AutofillHints = new[] {View.AutofillHintCreditCardExpirationDate},
|
||||||
DateValue = (long) (1000 * TimeUtil.SerializeUnix(expTime))
|
DateValue = (long) (1000 * TimeUtil.SerializeUnix(expTime))
|
||||||
@@ -82,7 +82,7 @@ namespace keepass2android.services.Kp2aAutofill
|
|||||||
fieldCollection.Add(field);
|
fieldCollection.Add(field);
|
||||||
|
|
||||||
field =
|
field =
|
||||||
new FilledAutofillField<ViewNodeInputField>
|
new FilledAutofillField
|
||||||
{
|
{
|
||||||
AutofillHints = new[] {View.AutofillHintCreditCardExpirationDay},
|
AutofillHints = new[] {View.AutofillHintCreditCardExpirationDay},
|
||||||
TextValue = expTime.Day.ToString()
|
TextValue = expTime.Day.ToString()
|
||||||
@@ -90,7 +90,7 @@ namespace keepass2android.services.Kp2aAutofill
|
|||||||
fieldCollection.Add(field);
|
fieldCollection.Add(field);
|
||||||
|
|
||||||
field =
|
field =
|
||||||
new FilledAutofillField<ViewNodeInputField>
|
new FilledAutofillField
|
||||||
{
|
{
|
||||||
AutofillHints = new[] {View.AutofillHintCreditCardExpirationMonth},
|
AutofillHints = new[] {View.AutofillHintCreditCardExpirationMonth},
|
||||||
TextValue = expTime.Month.ToString()
|
TextValue = expTime.Month.ToString()
|
||||||
@@ -98,7 +98,7 @@ namespace keepass2android.services.Kp2aAutofill
|
|||||||
fieldCollection.Add(field);
|
fieldCollection.Add(field);
|
||||||
|
|
||||||
field =
|
field =
|
||||||
new FilledAutofillField<ViewNodeInputField>
|
new FilledAutofillField
|
||||||
{
|
{
|
||||||
AutofillHints = new[] {View.AutofillHintCreditCardExpirationYear},
|
AutofillHints = new[] {View.AutofillHintCreditCardExpirationYear},
|
||||||
TextValue = expTime.Year.ToString()
|
TextValue = expTime.Year.ToString()
|
||||||
|
|||||||
Reference in New Issue
Block a user