search packagename terms on android autofill

This commit is contained in:
Kyle Spearrin 2017-09-12 17:01:13 -04:00
parent 96588089ef
commit 4008fb3a53

View file

@ -13,6 +13,7 @@ namespace Bit.App.Services
{ {
public class LoginService : ILoginService public class LoginService : ILoginService
{ {
private readonly string[] _ignoredSearchTerms = new string[] { "com", "net", "org", "android" };
private readonly ILoginRepository _loginRepository; private readonly ILoginRepository _loginRepository;
private readonly IAttachmentRepository _attachmentRepository; private readonly IAttachmentRepository _attachmentRepository;
private readonly IAuthService _authService; private readonly IAuthService _authService;
@ -90,8 +91,10 @@ namespace Bit.App.Services
return null; return null;
} }
var mobileAppWebUriString = androidApp ? WebUriFromAndroidAppUri(uriString) : var mobileAppInfo = androidApp ? InfoFromAndroidAppUri(uriString) :
iosApp ? WebUriFromiOSAppUri(uriString) : null; iosApp ? InfoFromiOSAppUri(uriString) : null;
var mobileAppWebUriString = mobileAppInfo?.Item1;
var mobileAppSearchTerms = mobileAppInfo?.Item2;
var eqDomains = (await _settingsService.GetEquivalentDomainsAsync()).Select(d => d.ToArray()); var eqDomains = (await _settingsService.GetEquivalentDomainsAsync()).Select(d => d.ToArray());
var matchingDomains = new List<string>(); var matchingDomains = new List<string>();
var matchingFuzzyDomains = new List<string>(); var matchingFuzzyDomains = new List<string>();
@ -153,7 +156,7 @@ namespace Bit.App.Services
matchingFuzzyLogins.Add(new Login(login)); matchingFuzzyLogins.Add(new Login(login));
continue; continue;
} }
else if(!mobileApp && Array.IndexOf(matchingDomainsArray, WebUriFromAndroidAppUri(loginUriString)) >= 0) else if(!mobileApp && Array.IndexOf(matchingDomainsArray, InfoFromAndroidAppUri(loginUriString)) >= 0)
{ {
matchingFuzzyLogins.Add(new Login(login)); matchingFuzzyLogins.Add(new Login(login));
continue; continue;
@ -161,19 +164,49 @@ namespace Bit.App.Services
Uri loginUri; Uri loginUri;
string loginDomainName = null; string loginDomainName = null;
if(!Uri.TryCreate(loginUriString, UriKind.Absolute, out loginUri) if(Uri.TryCreate(loginUriString, UriKind.Absolute, out loginUri)
|| !DomainName.TryParseBaseDomain(loginUri.Host, out loginDomainName)) && DomainName.TryParseBaseDomain(loginUri.Host, out loginDomainName))
{ {
continue; loginDomainName = loginDomainName.ToLowerInvariant();
}
if(Array.IndexOf(matchingDomainsArray, loginDomainName) >= 0) if(Array.IndexOf(matchingDomainsArray, loginDomainName) >= 0)
{ {
matchingLogins.Add(new Login(login)); matchingLogins.Add(new Login(login));
continue;
} }
else if(mobileApp && Array.IndexOf(matchingFuzzyDomainsArray, loginDomainName) >= 0) else if(mobileApp && Array.IndexOf(matchingFuzzyDomainsArray, loginDomainName) >= 0)
{ {
matchingFuzzyLogins.Add(new Login(login)); matchingFuzzyLogins.Add(new Login(login));
continue;
}
}
if(mobileApp && mobileAppSearchTerms != null && mobileAppSearchTerms.Length > 0)
{
var addedFromSearchTerm = false;
var loginNameString = login.Name == null ? null :
new CipherString(login.Name).Decrypt(login.OrganizationId)?.ToLowerInvariant();
foreach(var term in mobileAppSearchTerms)
{
addedFromSearchTerm = (loginDomainName != null && loginDomainName.Contains(term)) ||
(loginNameString != null && loginNameString.Contains(term));
if(!addedFromSearchTerm)
{
addedFromSearchTerm = (loginDomainName != null && term.Contains(loginDomainName.Split('.')[0]))
|| (loginNameString != null && term.Contains(loginNameString));
}
if(addedFromSearchTerm)
{
matchingFuzzyLogins.Add(new Login(login));
break;
}
}
if(addedFromSearchTerm)
{
continue;
}
} }
} }
@ -307,7 +340,7 @@ namespace Bit.App.Services
return response; return response;
} }
private string WebUriFromAndroidAppUri(string androidAppUriString) private Tuple<string, string[]> InfoFromAndroidAppUri(string androidAppUriString)
{ {
if(!UriIsAndroidApp(androidAppUriString)) if(!UriIsAndroidApp(androidAppUriString))
{ {
@ -317,20 +350,24 @@ namespace Bit.App.Services
var androidUriParts = androidAppUriString.Replace(Constants.AndroidAppProtocol, string.Empty).Split('.'); var androidUriParts = androidAppUriString.Replace(Constants.AndroidAppProtocol, string.Empty).Split('.');
if(androidUriParts.Length >= 2) if(androidUriParts.Length >= 2)
{ {
return string.Join(".", androidUriParts[1], androidUriParts[0]); var webUri = string.Join(".", androidUriParts[1], androidUriParts[0]);
var searchTerms = androidUriParts.Where(p => !_ignoredSearchTerms.Contains(p))
.Select(p => p.ToLowerInvariant()).ToArray();
return new Tuple<string, string[]>(webUri, searchTerms);
} }
return null; return null;
} }
private string WebUriFromiOSAppUri(string iosAppUriString) private Tuple<string, string[]> InfoFromiOSAppUri(string iosAppUriString)
{ {
if(!UriIsiOSApp(iosAppUriString)) if(!UriIsiOSApp(iosAppUriString))
{ {
return null; return null;
} }
return iosAppUriString.Replace(Constants.iOSAppProtocol, string.Empty); var webUri = iosAppUriString.Replace(Constants.iOSAppProtocol, string.Empty);
return new Tuple<string, string[]>(webUri, null);
} }
private bool UriIsAndroidApp(string uriString) private bool UriIsAndroidApp(string uriString)