From 2c662c428c4480895aa29144ce6228827d2bef7f Mon Sep 17 00:00:00 2001 From: Kyle Spearrin Date: Fri, 17 Nov 2017 22:47:08 -0500 Subject: [PATCH] better detection for username/passwords --- src/Android/Autofill/CipherFilledItem.cs | 15 ++++------- src/Android/Autofill/FieldCollection.cs | 29 +++++++++++++++++++-- src/Android/Autofill/Parser.cs | 33 +++++++++++++++++++----- 3 files changed, 59 insertions(+), 18 deletions(-) diff --git a/src/Android/Autofill/CipherFilledItem.cs b/src/Android/Autofill/CipherFilledItem.cs index 73fec5d68..ef53a865a 100644 --- a/src/Android/Autofill/CipherFilledItem.cs +++ b/src/Android/Autofill/CipherFilledItem.cs @@ -2,7 +2,6 @@ using Android.Service.Autofill; using Android.Views.Autofill; using System.Linq; -using Android.Text; using Bit.App.Models; using Bit.App.Enums; using Bit.App.Models.Page; @@ -61,23 +60,19 @@ namespace Bit.Android.Autofill if(Type == CipherType.Login) { - var passwordField = fieldCollection.PasswordFields.FirstOrDefault(); - if(passwordField == null) + if(!fieldCollection.PasswordFields.Any() || string.IsNullOrWhiteSpace(_password.Value)) { return false; } - if(string.IsNullOrWhiteSpace(_password.Value)) + foreach(var passwordField in fieldCollection.PasswordFields) { - return false; + datasetBuilder.SetValue(passwordField.AutofillId, AutofillValue.ForText(_password.Value)); } - datasetBuilder.SetValue(passwordField.AutofillId, AutofillValue.ForText(_password.Value)); - - var usernameField = fieldCollection.Fields.TakeWhile(f => f.Id != passwordField.Id).LastOrDefault(); - if(usernameField != null) + if(fieldCollection.UsernameFields.Any() && !string.IsNullOrWhiteSpace(Subtitle)) { - if(!string.IsNullOrWhiteSpace(Subtitle)) + foreach(var usernameField in fieldCollection.UsernameFields) { datasetBuilder.SetValue(usernameField.AutofillId, AutofillValue.ForText(Subtitle)); } diff --git a/src/Android/Autofill/FieldCollection.cs b/src/Android/Autofill/FieldCollection.cs index 637846d84..fccc74864 100644 --- a/src/Android/Autofill/FieldCollection.cs +++ b/src/Android/Autofill/FieldCollection.cs @@ -8,7 +8,8 @@ namespace Bit.Android.Autofill { public class FieldCollection { - private List _passwordFields; + private List _passwordFields = null; + private List _usernameFields = null; public HashSet Ids { get; private set; } = new HashSet(); public List AutofillIds { get; private set; } = new List(); @@ -40,7 +41,29 @@ namespace Bit.Android.Autofill } } - public bool FillableForLogin => PasswordFields.Any(); + public List UsernameFields + { + get + { + if(_usernameFields != null) + { + return _usernameFields; + } + + _usernameFields = new List(); + foreach(var passwordField in PasswordFields) + { + var usernameField = Fields.TakeWhile(f => f.Id != passwordField.Id).LastOrDefault(); + if(usernameField != null) + { + _usernameFields.Add(usernameField); + } + } + return _usernameFields; + } + } + + public bool FillableForLogin => UsernameFields.Any(f => f.Focused) || PasswordFields.Any(f => f.Focused); public void Add(Field field) { @@ -49,6 +72,8 @@ namespace Bit.Android.Autofill return; } + _passwordFields = _usernameFields = null; + Ids.Add(field.Id); Fields.Add(field); SaveType |= field.SaveType; diff --git a/src/Android/Autofill/Parser.cs b/src/Android/Autofill/Parser.cs index 2ff0046e5..67cdfce90 100644 --- a/src/Android/Autofill/Parser.cs +++ b/src/Android/Autofill/Parser.cs @@ -8,6 +8,7 @@ namespace Bit.Android.Autofill { private readonly AssistStructure _structure; private string _uri; + private string _packageName; public Parser(AssistStructure structure) { @@ -17,16 +18,36 @@ namespace Bit.Android.Autofill public FieldCollection FieldCollection { get; private set; } = new FieldCollection(); public string Uri { - get => _uri; + get + { + if(!string.IsNullOrWhiteSpace(_uri)) + { + return _uri; + } + + if(string.IsNullOrWhiteSpace(PackageName)) + { + _uri = null; + } + else + { + _uri = string.Concat(Constants.AndroidAppProtocol, PackageName); + } + + return _uri; + } + } + public string PackageName + { + get => _packageName; set { if(string.IsNullOrWhiteSpace(value)) { - _uri = null; - return; + _packageName = _uri = null; } - _uri = string.Concat(Constants.AndroidAppProtocol, value); + _packageName = value; } } @@ -45,9 +66,9 @@ namespace Bit.Android.Autofill var isEditText = node.ClassName == "android.widget.EditText"; if(isEditText || (hints?.Length ?? 0) > 0) { - if(Uri == null) + if(PackageName == null) { - Uri = node.IdPackage; + PackageName = node.IdPackage; } FieldCollection.Add(new Field(node)); }