sync domain settings

This commit is contained in:
Kyle Spearrin 2017-02-08 22:04:07 -05:00
parent 2c1ebc0439
commit 2a1bd92e1a
7 changed files with 64 additions and 20 deletions

View file

@ -1,11 +1,10 @@
using System.Threading.Tasks;
using Bit.App.Models.Api;
using Bit.App.Models.Api.Response;
namespace Bit.App.Abstractions
{
public interface ISettingsApiRepository
{
Task<ApiResult<DomainsReponse>> GetDomains(bool excluded = false);
Task<ApiResult<DomainsResponse>> GetDomains(bool excluded = false);
}
}

View file

@ -1,9 +1,10 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using Bit.App.Models.Data;
namespace Bit.App.Abstractions
{
public interface ISettingsRepository
public interface ISettingsRepository : IRepository<SettingsData, string>
{
Task<IEnumerable<IEnumerable<string>>> GetEquivablentDomains(string userId);
}

View file

@ -108,7 +108,7 @@ namespace Bit.App
if(string.IsNullOrWhiteSpace(_uri))
{
var lastBuild = _settings.GetValueOrDefault<string>(LastBuildKey);
if(lastBuild == null || lastBuild != _appInfoService.Build)
if(InDebugMode() || lastBuild == null || lastBuild != _appInfoService.Build)
{
_settings.AddOrUpdateValue(LastBuildKey, _appInfoService.Build);
_databaseService.CreateTables();
@ -160,6 +160,15 @@ namespace Bit.App
}
}
private bool InDebugMode()
{
#if DEBUG
return true;
#else
return false;
#endif
}
private void SetMainPageFromAutofill()
{
if(Device.OS != TargetPlatform.Android || string.IsNullOrWhiteSpace(_uri))

View file

@ -94,7 +94,7 @@
<Compile Include="Models\Api\Request\TokenRequest.cs" />
<Compile Include="Models\Api\Response\CipherHistoryResponse.cs" />
<Compile Include="Models\Api\Response\CipherResponse.cs" />
<Compile Include="Models\Api\Response\DomainsReponse.cs" />
<Compile Include="Models\Api\Response\DomainsResponse.cs" />
<Compile Include="Models\Api\Response\ErrorResponse.cs" />
<Compile Include="Models\Api\Response\FolderResponse.cs" />
<Compile Include="Models\Api\Response\ListResponse.cs" />

View file

@ -1,8 +1,8 @@
using System.Collections.Generic;
namespace Bit.App.Models.Api.Response
namespace Bit.App.Models.Api
{
public class DomainsReponse
public class DomainsResponse
{
public IEnumerable<IEnumerable<string>> EquivalentDomains { get; set; }
public IEnumerable<GlobalDomains> GlobalEquivalentDomains { get; set; }

View file

@ -4,7 +4,6 @@ using System.Threading.Tasks;
using Bit.App.Abstractions;
using Bit.App.Models.Api;
using Plugin.Connectivity.Abstractions;
using Bit.App.Models.Api.Response;
using Newtonsoft.Json;
namespace Bit.App.Repositories
@ -20,14 +19,14 @@ namespace Bit.App.Repositories
protected override string ApiRoute => "settings";
public virtual async Task<ApiResult<DomainsReponse>> GetDomains(bool excluded = false)
public virtual async Task<ApiResult<DomainsResponse>> GetDomains(bool excluded = false)
{
if(!Connectivity.IsConnected)
{
return HandledNotConnected<DomainsReponse>();
return HandledNotConnected<DomainsResponse>();
}
var tokenStateResponse = await HandleTokenStateAsync<DomainsReponse>();
var tokenStateResponse = await HandleTokenStateAsync<DomainsResponse>();
if(!tokenStateResponse.Succeeded)
{
return tokenStateResponse;
@ -47,16 +46,16 @@ namespace Bit.App.Repositories
var response = await client.SendAsync(requestMessage).ConfigureAwait(false);
if(!response.IsSuccessStatusCode)
{
return await HandleErrorAsync<DomainsReponse>(response).ConfigureAwait(false);
return await HandleErrorAsync<DomainsResponse>(response).ConfigureAwait(false);
}
var responseContent = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
var responseObj = JsonConvert.DeserializeObject<DomainsReponse>(responseContent);
return ApiResult<DomainsReponse>.Success(responseObj, response.StatusCode);
var responseObj = JsonConvert.DeserializeObject<DomainsResponse>(responseContent);
return ApiResult<DomainsResponse>.Success(responseObj, response.StatusCode);
}
catch
{
return HandledWebException<DomainsReponse>();
return HandledWebException<DomainsResponse>();
}
}
}

View file

@ -7,6 +7,7 @@ using Plugin.Settings.Abstractions;
using Bit.App.Models.Api;
using System.Collections.Generic;
using Xamarin.Forms;
using Newtonsoft.Json;
namespace Bit.App.Services
{
@ -16,8 +17,10 @@ namespace Bit.App.Services
private readonly IFolderApiRepository _folderApiRepository;
private readonly ILoginApiRepository _loginApiRepository;
private readonly IAccountsApiRepository _accountsApiRepository;
private readonly ISettingsApiRepository _settingsApiRepository;
private readonly IFolderRepository _folderRepository;
private readonly ILoginRepository _loginRepository;
private readonly ISettingsRepository _settingsRepository;
private readonly IAuthService _authService;
private readonly ISettings _settings;
@ -26,8 +29,10 @@ namespace Bit.App.Services
IFolderApiRepository folderApiRepository,
ILoginApiRepository loginApiRepository,
IAccountsApiRepository accountsApiRepository,
ISettingsApiRepository settingsApiRepository,
IFolderRepository folderRepository,
ILoginRepository loginRepository,
ISettingsRepository settingsRepository,
IAuthService authService,
ISettings settings)
{
@ -35,8 +40,10 @@ namespace Bit.App.Services
_folderApiRepository = folderApiRepository;
_loginApiRepository = loginApiRepository;
_accountsApiRepository = accountsApiRepository;
_settingsApiRepository = settingsApiRepository;
_folderRepository = folderRepository;
_loginRepository = loginRepository;
_settingsRepository = settingsRepository;
_authService = authService;
_settings = settings;
}
@ -157,12 +164,20 @@ namespace Bit.App.Services
var now = DateTime.UtcNow;
var ciphers = await _cipherApiRepository.GetAsync().ConfigureAwait(false);
if(!ciphers.Succeeded)
var domains = await _settingsApiRepository.GetDomains(false).ConfigureAwait(false);
if(!ciphers.Succeeded || !domains.Succeeded)
{
SyncCompleted(false);
if(Application.Current == null)
{
return false;
}
if(Application.Current != null && (ciphers.StatusCode == System.Net.HttpStatusCode.Forbidden
|| ciphers.StatusCode == System.Net.HttpStatusCode.Unauthorized))
if(ciphers.StatusCode == System.Net.HttpStatusCode.Forbidden ||
ciphers.StatusCode == System.Net.HttpStatusCode.Unauthorized ||
domains.StatusCode == System.Net.HttpStatusCode.Forbidden ||
domains.StatusCode == System.Net.HttpStatusCode.Unauthorized)
{
MessagingCenter.Send(Application.Current, "Logout", (string)null);
}
@ -175,9 +190,10 @@ namespace Bit.App.Services
var loginTask = SyncLoginsAsync(logins, true);
var folderTask = SyncFoldersAsync(folders, true);
await Task.WhenAll(loginTask, folderTask).ConfigureAwait(false);
var domainsTask = SyncDomainsAsync(domains.Result);
await Task.WhenAll(loginTask, folderTask, domainsTask).ConfigureAwait(false);
if(folderTask.Exception != null || loginTask.Exception != null)
if(folderTask.Exception != null || loginTask.Exception != null || domainsTask.Exception != null)
{
SyncCompleted(false);
return false;
@ -294,6 +310,26 @@ namespace Bit.App.Services
}
}
private async Task SyncDomainsAsync(DomainsResponse serverDomains)
{
var eqDomains = new List<IEnumerable<string>>();
if(serverDomains.EquivalentDomains != null)
{
eqDomains.AddRange(serverDomains.EquivalentDomains);
}
if(serverDomains.GlobalEquivalentDomains != null)
{
eqDomains.AddRange(serverDomains.GlobalEquivalentDomains.Select(d => d.Domains));
}
await _settingsRepository.UpsertAsync(new SettingsData
{
Id = _authService.UserId,
EquivalentDomains = JsonConvert.SerializeObject(eqDomains)
});
}
private void SyncStarted()
{
if(Application.Current == null)