catch sql crashes in sync service
This commit is contained in:
parent
ac6e95c442
commit
82d4745da3
|
@ -73,36 +73,28 @@ namespace Bit.App.Services
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
switch(cipher.Result.Type)
|
switch(cipher.Result.Type)
|
||||||
{
|
{
|
||||||
case Enums.CipherType.Folder:
|
case Enums.CipherType.Folder:
|
||||||
var folderData = new FolderData(cipher.Result, _authService.UserId);
|
var folderData = new FolderData(cipher.Result, _authService.UserId);
|
||||||
var existingLocalFolder = _folderRepository.GetByIdAsync(id);
|
await _folderRepository.UpsertAsync(folderData).ConfigureAwait(false);
|
||||||
if(existingLocalFolder == null)
|
|
||||||
{
|
|
||||||
await _folderRepository.InsertAsync(folderData).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
await _folderRepository.UpdateAsync(folderData).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case Enums.CipherType.Login:
|
case Enums.CipherType.Login:
|
||||||
var loginData = new LoginData(cipher.Result, _authService.UserId);
|
var loginData = new LoginData(cipher.Result, _authService.UserId);
|
||||||
var existingLocalLogin = _loginRepository.GetByIdAsync(id);
|
await _loginRepository.UpsertAsync(loginData).ConfigureAwait(false);
|
||||||
if(existingLocalLogin == null)
|
|
||||||
{
|
|
||||||
await _loginRepository.InsertAsync(loginData).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
await _loginRepository.UpdateAsync(loginData).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
SyncCompleted(false);
|
SyncCompleted(false);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
catch(SQLite.SQLiteException)
|
||||||
|
{
|
||||||
|
SyncCompleted(false);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
SyncCompleted(true);
|
SyncCompleted(true);
|
||||||
return true;
|
return true;
|
||||||
|
@ -117,10 +109,18 @@ namespace Bit.App.Services
|
||||||
|
|
||||||
SyncStarted();
|
SyncStarted();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
await _folderRepository.DeleteWithLoginUpdateAsync(id, revisionDate).ConfigureAwait(false);
|
await _folderRepository.DeleteWithLoginUpdateAsync(id, revisionDate).ConfigureAwait(false);
|
||||||
SyncCompleted(true);
|
SyncCompleted(true);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
catch(SQLite.SQLiteException)
|
||||||
|
{
|
||||||
|
SyncCompleted(false);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public async Task<bool> SyncDeleteLoginAsync(string id)
|
public async Task<bool> SyncDeleteLoginAsync(string id)
|
||||||
{
|
{
|
||||||
|
@ -131,10 +131,18 @@ namespace Bit.App.Services
|
||||||
|
|
||||||
SyncStarted();
|
SyncStarted();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
await _loginRepository.DeleteAsync(id).ConfigureAwait(false);
|
await _loginRepository.DeleteAsync(id).ConfigureAwait(false);
|
||||||
SyncCompleted(true);
|
SyncCompleted(true);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
catch(SQLite.SQLiteException)
|
||||||
|
{
|
||||||
|
SyncCompleted(false);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public async Task<bool> FullSyncAsync(TimeSpan syncThreshold, bool forceSync = false)
|
public async Task<bool> FullSyncAsync(TimeSpan syncThreshold, bool forceSync = false)
|
||||||
{
|
{
|
||||||
|
@ -188,8 +196,8 @@ namespace Bit.App.Services
|
||||||
var logins = ciphers.Result.Data.Where(c => c.Type == Enums.CipherType.Login).ToDictionary(s => s.Id);
|
var logins = ciphers.Result.Data.Where(c => c.Type == Enums.CipherType.Login).ToDictionary(s => s.Id);
|
||||||
var folders = ciphers.Result.Data.Where(c => c.Type == Enums.CipherType.Folder).ToDictionary(f => f.Id);
|
var folders = ciphers.Result.Data.Where(c => c.Type == Enums.CipherType.Folder).ToDictionary(f => f.Id);
|
||||||
|
|
||||||
var loginTask = SyncLoginsAsync(logins, true);
|
var loginTask = SyncLoginsAsync(logins);
|
||||||
var folderTask = SyncFoldersAsync(folders, true);
|
var folderTask = SyncFoldersAsync(folders);
|
||||||
var domainsTask = SyncDomainsAsync(domains.Result);
|
var domainsTask = SyncDomainsAsync(domains.Result);
|
||||||
await Task.WhenAll(loginTask, folderTask, domainsTask).ConfigureAwait(false);
|
await Task.WhenAll(loginTask, folderTask, domainsTask).ConfigureAwait(false);
|
||||||
|
|
||||||
|
@ -228,7 +236,7 @@ namespace Bit.App.Services
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task SyncFoldersAsync(IDictionary<string, CipherResponse> serverFolders, bool deleteMissing)
|
private async Task SyncFoldersAsync(IDictionary<string, CipherResponse> serverFolders)
|
||||||
{
|
{
|
||||||
if(!_authService.IsAuthenticated)
|
if(!_authService.IsAuthenticated)
|
||||||
{
|
{
|
||||||
|
@ -245,31 +253,25 @@ namespace Bit.App.Services
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var existingLocalFolder = localFolders.ContainsKey(serverFolder.Key) ? localFolders[serverFolder.Key] : null;
|
try
|
||||||
if(existingLocalFolder == null)
|
|
||||||
{
|
{
|
||||||
var data = new FolderData(serverFolder.Value, _authService.UserId);
|
var data = new FolderData(serverFolder.Value, _authService.UserId);
|
||||||
await _folderRepository.InsertAsync(data).ConfigureAwait(false);
|
await _folderRepository.UpsertAsync(data).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
else if(existingLocalFolder.RevisionDateTime != serverFolder.Value.RevisionDate)
|
catch(SQLite.SQLiteException) { }
|
||||||
{
|
|
||||||
var data = new FolderData(serverFolder.Value, _authService.UserId);
|
|
||||||
await _folderRepository.UpdateAsync(data).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!deleteMissing)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach(var folder in localFolders.Where(localFolder => !serverFolders.ContainsKey(localFolder.Key)))
|
foreach(var folder in localFolders.Where(localFolder => !serverFolders.ContainsKey(localFolder.Key)))
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
await _folderRepository.DeleteAsync(folder.Value.Id).ConfigureAwait(false);
|
await _folderRepository.DeleteAsync(folder.Value.Id).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
catch(SQLite.SQLiteException) { }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task SyncLoginsAsync(IDictionary<string, CipherResponse> serverLogins, bool deleteMissing)
|
private async Task SyncLoginsAsync(IDictionary<string, CipherResponse> serverLogins)
|
||||||
{
|
{
|
||||||
if(!_authService.IsAuthenticated)
|
if(!_authService.IsAuthenticated)
|
||||||
{
|
{
|
||||||
|
@ -286,28 +288,22 @@ namespace Bit.App.Services
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var existingLocalLogin = localLogins.ContainsKey(serverLogin.Key) ? localLogins[serverLogin.Key] : null;
|
try
|
||||||
if(existingLocalLogin == null)
|
|
||||||
{
|
{
|
||||||
var data = new LoginData(serverLogin.Value, _authService.UserId);
|
var data = new LoginData(serverLogin.Value, _authService.UserId);
|
||||||
await _loginRepository.InsertAsync(data).ConfigureAwait(false);
|
await _loginRepository.UpsertAsync(data).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
else if(existingLocalLogin.RevisionDateTime != serverLogin.Value.RevisionDate)
|
catch(SQLite.SQLiteException) { }
|
||||||
{
|
|
||||||
var data = new LoginData(serverLogin.Value, _authService.UserId);
|
|
||||||
await _loginRepository.UpdateAsync(data).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!deleteMissing)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach(var login in localLogins.Where(localLogin => !serverLogins.ContainsKey(localLogin.Key)))
|
foreach(var login in localLogins.Where(localLogin => !serverLogins.ContainsKey(localLogin.Key)))
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
await _loginRepository.DeleteAsync(login.Value.Id).ConfigureAwait(false);
|
await _loginRepository.DeleteAsync(login.Value.Id).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
catch(SQLite.SQLiteException) { }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task SyncDomainsAsync(DomainsResponse serverDomains)
|
private async Task SyncDomainsAsync(DomainsResponse serverDomains)
|
||||||
|
@ -323,12 +319,16 @@ namespace Bit.App.Services
|
||||||
eqDomains.AddRange(serverDomains.GlobalEquivalentDomains.Select(d => d.Domains));
|
eqDomains.AddRange(serverDomains.GlobalEquivalentDomains.Select(d => d.Domains));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
await _settingsRepository.UpsertAsync(new SettingsData
|
await _settingsRepository.UpsertAsync(new SettingsData
|
||||||
{
|
{
|
||||||
Id = _authService.UserId,
|
Id = _authService.UserId,
|
||||||
EquivalentDomains = JsonConvert.SerializeObject(eqDomains)
|
EquivalentDomains = JsonConvert.SerializeObject(eqDomains)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
catch(SQLite.SQLiteException) { }
|
||||||
|
}
|
||||||
|
|
||||||
private void SyncStarted()
|
private void SyncStarted()
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue