mirror of
https://github.com/bitwarden/android.git
synced 2024-12-18 23:31:52 +03:00
sync folders & added org id for ciphers/logins
This commit is contained in:
parent
458de2d2e0
commit
490d1775a2
10 changed files with 27 additions and 31 deletions
|
@ -6,7 +6,7 @@ namespace Bit.App.Abstractions
|
||||||
public interface ISyncService
|
public interface ISyncService
|
||||||
{
|
{
|
||||||
bool SyncInProgress { get; }
|
bool SyncInProgress { get; }
|
||||||
Task<bool> SyncAsync(string id);
|
Task<bool> SyncCipherAsync(string id);
|
||||||
Task<bool> SyncDeleteFolderAsync(string id, DateTime revisionDate);
|
Task<bool> SyncDeleteFolderAsync(string id, DateTime revisionDate);
|
||||||
Task<bool> SyncDeleteLoginAsync(string id);
|
Task<bool> SyncDeleteLoginAsync(string id);
|
||||||
Task<bool> FullSyncAsync(bool forceSync = false);
|
Task<bool> FullSyncAsync(bool forceSync = false);
|
||||||
|
|
|
@ -2,7 +2,8 @@
|
||||||
{
|
{
|
||||||
public enum CipherType : short
|
public enum CipherType : short
|
||||||
{
|
{
|
||||||
Folder = 0,
|
// Folder deprecated
|
||||||
|
//Folder = 0,
|
||||||
Login = 1
|
Login = 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
{
|
{
|
||||||
public LoginRequest(Login login)
|
public LoginRequest(Login login)
|
||||||
{
|
{
|
||||||
|
OrganizationId = login.OrganizationId;
|
||||||
FolderId = login.FolderId;
|
FolderId = login.FolderId;
|
||||||
Name = login.Name?.EncryptedString;
|
Name = login.Name?.EncryptedString;
|
||||||
Uri = login.Uri?.EncryptedString;
|
Uri = login.Uri?.EncryptedString;
|
||||||
|
@ -13,6 +14,7 @@
|
||||||
Favorite = login.Favorite;
|
Favorite = login.Favorite;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string OrganizationId { get; set; }
|
||||||
public string FolderId { get; set; }
|
public string FolderId { get; set; }
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
public string Uri { get; set; }
|
public string Uri { get; set; }
|
||||||
|
|
|
@ -8,6 +8,8 @@ namespace Bit.App.Models.Api
|
||||||
{
|
{
|
||||||
public string Id { get; set; }
|
public string Id { get; set; }
|
||||||
public string FolderId { get; set; }
|
public string FolderId { get; set; }
|
||||||
|
public string UserId { get; set; }
|
||||||
|
public string OrganizationId { get; set; }
|
||||||
public CipherType Type { get; set; }
|
public CipherType Type { get; set; }
|
||||||
public bool Favorite { get; set; }
|
public bool Favorite { get; set; }
|
||||||
public JObject Data { get; set; }
|
public JObject Data { get; set; }
|
||||||
|
|
|
@ -6,6 +6,8 @@ namespace Bit.App.Models.Api
|
||||||
{
|
{
|
||||||
public string Id { get; set; }
|
public string Id { get; set; }
|
||||||
public string FolderId { get; set; }
|
public string FolderId { get; set; }
|
||||||
|
public string UserId { get; set; }
|
||||||
|
public string OrganizationId { get; set; }
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
public string Uri { get; set; }
|
public string Uri { get; set; }
|
||||||
public string Username { get; set; }
|
public string Username { get; set; }
|
||||||
|
@ -13,8 +15,5 @@ namespace Bit.App.Models.Api
|
||||||
public string Notes { get; set; }
|
public string Notes { get; set; }
|
||||||
public bool Favorite { get; set; }
|
public bool Favorite { get; set; }
|
||||||
public DateTime RevisionDate { get; set; }
|
public DateTime RevisionDate { get; set; }
|
||||||
|
|
||||||
// Expandables
|
|
||||||
public FolderResponse Folder { get; set; }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,21 +26,6 @@ namespace Bit.App.Models.Data
|
||||||
RevisionDateTime = folder.RevisionDate;
|
RevisionDateTime = folder.RevisionDate;
|
||||||
}
|
}
|
||||||
|
|
||||||
public FolderData(CipherResponse cipher, string userId)
|
|
||||||
{
|
|
||||||
if(cipher.Type != Enums.CipherType.Folder)
|
|
||||||
{
|
|
||||||
throw new ArgumentException(nameof(cipher.Type));
|
|
||||||
}
|
|
||||||
|
|
||||||
var data = cipher.Data.ToObject<LoginDataModel>();
|
|
||||||
|
|
||||||
Id = cipher.Id;
|
|
||||||
UserId = userId;
|
|
||||||
Name = data.Name;
|
|
||||||
RevisionDateTime = cipher.RevisionDate;
|
|
||||||
}
|
|
||||||
|
|
||||||
[PrimaryKey]
|
[PrimaryKey]
|
||||||
public string Id { get; set; }
|
public string Id { get; set; }
|
||||||
[Indexed]
|
[Indexed]
|
||||||
|
|
|
@ -16,6 +16,7 @@ namespace Bit.App.Models.Data
|
||||||
Id = login.Id;
|
Id = login.Id;
|
||||||
FolderId = login.FolderId;
|
FolderId = login.FolderId;
|
||||||
UserId = userId;
|
UserId = userId;
|
||||||
|
OrganizationId = login.OrganizationId;
|
||||||
Name = login.Name?.EncryptedString;
|
Name = login.Name?.EncryptedString;
|
||||||
Uri = login.Uri?.EncryptedString;
|
Uri = login.Uri?.EncryptedString;
|
||||||
Username = login.Username?.EncryptedString;
|
Username = login.Username?.EncryptedString;
|
||||||
|
@ -29,6 +30,7 @@ namespace Bit.App.Models.Data
|
||||||
Id = login.Id;
|
Id = login.Id;
|
||||||
FolderId = login.FolderId;
|
FolderId = login.FolderId;
|
||||||
UserId = userId;
|
UserId = userId;
|
||||||
|
OrganizationId = login.OrganizationId;
|
||||||
Name = login.Name;
|
Name = login.Name;
|
||||||
Uri = login.Uri;
|
Uri = login.Uri;
|
||||||
Username = login.Username;
|
Username = login.Username;
|
||||||
|
@ -50,6 +52,7 @@ namespace Bit.App.Models.Data
|
||||||
Id = cipher.Id;
|
Id = cipher.Id;
|
||||||
FolderId = cipher.FolderId;
|
FolderId = cipher.FolderId;
|
||||||
UserId = userId;
|
UserId = userId;
|
||||||
|
OrganizationId = cipher.OrganizationId;
|
||||||
Name = data.Name;
|
Name = data.Name;
|
||||||
Uri = data.Uri;
|
Uri = data.Uri;
|
||||||
Username = data.Username;
|
Username = data.Username;
|
||||||
|
@ -64,6 +67,7 @@ namespace Bit.App.Models.Data
|
||||||
public string FolderId { get; set; }
|
public string FolderId { get; set; }
|
||||||
[Indexed]
|
[Indexed]
|
||||||
public string UserId { get; set; }
|
public string UserId { get; set; }
|
||||||
|
public string OrganizationId { get; set; }
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
public string Uri { get; set; }
|
public string Uri { get; set; }
|
||||||
public string Username { get; set; }
|
public string Username { get; set; }
|
||||||
|
|
|
@ -11,6 +11,8 @@ namespace Bit.App.Models
|
||||||
public Login(LoginData data)
|
public Login(LoginData data)
|
||||||
{
|
{
|
||||||
Id = data.Id;
|
Id = data.Id;
|
||||||
|
UserId = data.UserId;
|
||||||
|
OrganizationId = data.OrganizationId;
|
||||||
FolderId = data.FolderId;
|
FolderId = data.FolderId;
|
||||||
Name = data.Name != null ? new CipherString(data.Name) : null;
|
Name = data.Name != null ? new CipherString(data.Name) : null;
|
||||||
Uri = data.Uri != null ? new CipherString(data.Uri) : null;
|
Uri = data.Uri != null ? new CipherString(data.Uri) : null;
|
||||||
|
@ -23,6 +25,8 @@ namespace Bit.App.Models
|
||||||
public Login(LoginResponse response)
|
public Login(LoginResponse response)
|
||||||
{
|
{
|
||||||
Id = response.Id;
|
Id = response.Id;
|
||||||
|
UserId = response.UserId;
|
||||||
|
OrganizationId = response.OrganizationId;
|
||||||
FolderId = response.FolderId;
|
FolderId = response.FolderId;
|
||||||
Name = response.Name != null ? new CipherString(response.Name) : null;
|
Name = response.Name != null ? new CipherString(response.Name) : null;
|
||||||
Uri = response.Uri != null ? new CipherString(response.Uri) : null;
|
Uri = response.Uri != null ? new CipherString(response.Uri) : null;
|
||||||
|
@ -32,6 +36,8 @@ namespace Bit.App.Models
|
||||||
Favorite = response.Favorite;
|
Favorite = response.Favorite;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string UserId { get; set; }
|
||||||
|
public string OrganizationId { get; set; }
|
||||||
public string FolderId { get; set; }
|
public string FolderId { get; set; }
|
||||||
public CipherString Uri { get; set; }
|
public CipherString Uri { get; set; }
|
||||||
public CipherString Username { get; set; }
|
public CipherString Username { get; set; }
|
||||||
|
|
|
@ -64,7 +64,7 @@ namespace Bit.App.Services
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
_syncService.SyncAsync(createUpdateMessage.Id);
|
_syncService.SyncCipherAsync(createUpdateMessage.Id);
|
||||||
break;
|
break;
|
||||||
case Enums.PushType.SyncFolderDelete:
|
case Enums.PushType.SyncFolderDelete:
|
||||||
var folderDeleteMessage = values.ToObject<SyncCipherPushNotification>();
|
var folderDeleteMessage = values.ToObject<SyncCipherPushNotification>();
|
||||||
|
|
|
@ -50,7 +50,7 @@ namespace Bit.App.Services
|
||||||
|
|
||||||
public bool SyncInProgress { get; private set; }
|
public bool SyncInProgress { get; private set; }
|
||||||
|
|
||||||
public async Task<bool> SyncAsync(string id)
|
public async Task<bool> SyncCipherAsync(string id)
|
||||||
{
|
{
|
||||||
if(!_authService.IsAuthenticated)
|
if(!_authService.IsAuthenticated)
|
||||||
{
|
{
|
||||||
|
@ -77,10 +77,6 @@ namespace Bit.App.Services
|
||||||
{
|
{
|
||||||
switch(cipher.Result.Type)
|
switch(cipher.Result.Type)
|
||||||
{
|
{
|
||||||
case Enums.CipherType.Folder:
|
|
||||||
var folderData = new FolderData(cipher.Result, _authService.UserId);
|
|
||||||
await _folderRepository.UpsertAsync(folderData).ConfigureAwait(false);
|
|
||||||
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);
|
||||||
await _loginRepository.UpsertAsync(loginData).ConfigureAwait(false);
|
await _loginRepository.UpsertAsync(loginData).ConfigureAwait(false);
|
||||||
|
@ -172,6 +168,7 @@ namespace Bit.App.Services
|
||||||
|
|
||||||
var now = DateTime.UtcNow;
|
var now = DateTime.UtcNow;
|
||||||
var ciphers = await _cipherApiRepository.GetAsync().ConfigureAwait(false);
|
var ciphers = await _cipherApiRepository.GetAsync().ConfigureAwait(false);
|
||||||
|
var folders = await _folderApiRepository.GetAsync().ConfigureAwait(false);
|
||||||
var domains = await _settingsApiRepository.GetDomains(false).ConfigureAwait(false);
|
var domains = await _settingsApiRepository.GetDomains(false).ConfigureAwait(false);
|
||||||
|
|
||||||
if(!ciphers.Succeeded || !domains.Succeeded)
|
if(!ciphers.Succeeded || !domains.Succeeded)
|
||||||
|
@ -193,11 +190,11 @@ namespace Bit.App.Services
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
var logins = ciphers.Result.Data.Where(c => c.Type == Enums.CipherType.Login).ToDictionary(s => s.Id);
|
var loginsDict = 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 foldersDict = folders.Result.Data.ToDictionary(f => f.Id);
|
||||||
|
|
||||||
var loginTask = SyncLoginsAsync(logins);
|
var loginTask = SyncLoginsAsync(loginsDict);
|
||||||
var folderTask = SyncFoldersAsync(folders);
|
var folderTask = SyncFoldersAsync(foldersDict);
|
||||||
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);
|
||||||
|
|
||||||
|
@ -236,7 +233,7 @@ namespace Bit.App.Services
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task SyncFoldersAsync(IDictionary<string, CipherResponse> serverFolders)
|
private async Task SyncFoldersAsync(IDictionary<string, FolderResponse> serverFolders)
|
||||||
{
|
{
|
||||||
if(!_authService.IsAuthenticated)
|
if(!_authService.IsAuthenticated)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue