mirror of
https://github.com/bitwarden/mobile
synced 2025-12-25 20:53:25 +00:00
Added equivalent domain checks to autofill listing filter. centralized logic in login service.
This commit is contained in:
@@ -15,15 +15,18 @@ namespace Bit.App.Services
|
||||
private readonly ILoginRepository _loginRepository;
|
||||
private readonly IAuthService _authService;
|
||||
private readonly ILoginApiRepository _loginApiRepository;
|
||||
private readonly ISettingsService _settingsService;
|
||||
|
||||
public LoginService(
|
||||
ILoginRepository loginRepository,
|
||||
IAuthService authService,
|
||||
ILoginApiRepository loginApiRepository)
|
||||
ILoginApiRepository loginApiRepository,
|
||||
ISettingsService settingsService)
|
||||
{
|
||||
_loginRepository = loginRepository;
|
||||
_authService = authService;
|
||||
_loginApiRepository = loginApiRepository;
|
||||
_settingsService = settingsService;
|
||||
}
|
||||
|
||||
public async Task<Login> GetByIdAsync(string id)
|
||||
@@ -52,6 +55,80 @@ namespace Bit.App.Services
|
||||
return logins;
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<Login>> GetAllAsync(string uriString)
|
||||
{
|
||||
if(string.IsNullOrWhiteSpace(uriString))
|
||||
{
|
||||
return new List<Login>();
|
||||
}
|
||||
|
||||
Uri uri = null;
|
||||
DomainName domainName = null;
|
||||
var androidApp = false;
|
||||
|
||||
if(!Uri.TryCreate(uriString, UriKind.Absolute, out uri) || !DomainName.TryParse(uri.Host, out domainName))
|
||||
{
|
||||
if(domainName == null)
|
||||
{
|
||||
androidApp = uriString.StartsWith(Constants.AndroidAppProtocol);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(!androidApp && domainName == null)
|
||||
{
|
||||
return new List<Login>();
|
||||
}
|
||||
|
||||
var eqDomains = (await _settingsService.GetEquivalentDomainsAsync()).Select(d => d.ToArray());
|
||||
var matchingDomains = eqDomains
|
||||
.Where(d => (androidApp && Array.IndexOf(d, uriString) >= 0) ||
|
||||
(!androidApp && Array.IndexOf(d, domainName.BaseDomain) >= 0))
|
||||
.SelectMany(d => d).ToList();
|
||||
if(!matchingDomains.Any())
|
||||
{
|
||||
matchingDomains.Add(androidApp ? uriString : domainName.BaseDomain);
|
||||
}
|
||||
|
||||
var matchingDomainsArray = matchingDomains.ToArray();
|
||||
var matchingLogins = new List<Login>();
|
||||
var logins = await _loginRepository.GetAllByUserIdAsync(_authService.UserId);
|
||||
foreach(var login in logins)
|
||||
{
|
||||
if(string.IsNullOrWhiteSpace(login.Uri))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var loginUriString = new CipherString(login.Uri).Decrypt();
|
||||
if(string.IsNullOrWhiteSpace(loginUriString))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if(androidApp && Array.IndexOf(matchingDomainsArray, loginUriString) >= 0)
|
||||
{
|
||||
matchingLogins.Add(new Login(login));
|
||||
continue;
|
||||
}
|
||||
|
||||
Uri loginUri;
|
||||
DomainName loginDomainName;
|
||||
if(!Uri.TryCreate(loginUriString, UriKind.Absolute, out loginUri)
|
||||
|| !DomainName.TryParse(loginUri.Host, out loginDomainName))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if(Array.IndexOf(matchingDomainsArray, loginDomainName.BaseDomain) >= 0)
|
||||
{
|
||||
matchingLogins.Add(new Login(login));
|
||||
}
|
||||
}
|
||||
|
||||
return matchingLogins;
|
||||
}
|
||||
|
||||
public async Task<ApiResult<LoginResponse>> SaveAsync(Login login)
|
||||
{
|
||||
ApiResult<LoginResponse> response = null;
|
||||
@@ -79,7 +156,7 @@ namespace Bit.App.Services
|
||||
await _loginRepository.UpdateAsync(data);
|
||||
}
|
||||
}
|
||||
else if(response.StatusCode == System.Net.HttpStatusCode.Forbidden
|
||||
else if(response.StatusCode == System.Net.HttpStatusCode.Forbidden
|
||||
|| response.StatusCode == System.Net.HttpStatusCode.Unauthorized)
|
||||
{
|
||||
MessagingCenter.Send(Application.Current, "Logout", (string)null);
|
||||
|
||||
Reference in New Issue
Block a user