mirror of
https://github.com/bitwarden/server.git
synced 2025-05-28 23:04:50 -05:00
push nots. for ciphers, folders, keys, & settings
This commit is contained in:
parent
62e35f0a1a
commit
f34c28128d
@ -6,6 +6,13 @@
|
|||||||
SyncCipherCreate = 1,
|
SyncCipherCreate = 1,
|
||||||
SyncLoginDelete = 2,
|
SyncLoginDelete = 2,
|
||||||
SyncFolderDelete = 3,
|
SyncFolderDelete = 3,
|
||||||
SyncCiphers = 4
|
SyncCiphers = 4,
|
||||||
|
|
||||||
|
SyncVault = 5,
|
||||||
|
SyncOrgKeys = 6,
|
||||||
|
SyncFolderCreate = 7,
|
||||||
|
SyncFolderUpdate = 8,
|
||||||
|
SyncCipherDelete = 9,
|
||||||
|
SyncSettings = 10
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,12 @@ namespace Bit.Core.Services
|
|||||||
Task PushSyncCipherCreateAsync(Cipher cipher);
|
Task PushSyncCipherCreateAsync(Cipher cipher);
|
||||||
Task PushSyncCipherUpdateAsync(Cipher cipher);
|
Task PushSyncCipherUpdateAsync(Cipher cipher);
|
||||||
Task PushSyncCipherDeleteAsync(Cipher cipher);
|
Task PushSyncCipherDeleteAsync(Cipher cipher);
|
||||||
|
Task PushSyncFolderCreateAsync(Folder folder);
|
||||||
|
Task PushSyncFolderUpdateAsync(Folder folder);
|
||||||
|
Task PushSyncFolderDeleteAsync(Folder folder);
|
||||||
Task PushSyncCiphersAsync(Guid userId);
|
Task PushSyncCiphersAsync(Guid userId);
|
||||||
|
Task PushSyncVaultAsync(Guid userId);
|
||||||
|
Task PushSyncOrgKeysAsync(Guid userId);
|
||||||
|
Task PushSyncSettingsAsync(Guid userId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -53,7 +53,7 @@ namespace Bit.Core.Services
|
|||||||
await _cipherRepository.CreateAsync(cipher);
|
await _cipherRepository.CreateAsync(cipher);
|
||||||
|
|
||||||
// push
|
// push
|
||||||
//await _pushService.PushSyncCipherCreateAsync(cipher);
|
await _pushService.PushSyncCipherCreateAsync(cipher);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -61,7 +61,7 @@ namespace Bit.Core.Services
|
|||||||
await _cipherRepository.ReplaceAsync(cipher);
|
await _cipherRepository.ReplaceAsync(cipher);
|
||||||
|
|
||||||
// push
|
// push
|
||||||
//await _pushService.PushSyncCipherUpdateAsync(cipher);
|
await _pushService.PushSyncCipherUpdateAsync(cipher);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -75,7 +75,7 @@ namespace Bit.Core.Services
|
|||||||
await _cipherRepository.DeleteAsync(cipher);
|
await _cipherRepository.DeleteAsync(cipher);
|
||||||
|
|
||||||
// push
|
// push
|
||||||
//await _pushService.PushSyncCipherDeleteAsync(cipher);
|
await _pushService.PushSyncCipherDeleteAsync(cipher);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task SaveFolderAsync(Folder folder)
|
public async Task SaveFolderAsync(Folder folder)
|
||||||
@ -85,7 +85,7 @@ namespace Bit.Core.Services
|
|||||||
await _folderRepository.CreateAsync(folder);
|
await _folderRepository.CreateAsync(folder);
|
||||||
|
|
||||||
// push
|
// push
|
||||||
//await _pushService.PushSyncCipherCreateAsync(cipher);
|
await _pushService.PushSyncFolderCreateAsync(folder);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -93,7 +93,7 @@ namespace Bit.Core.Services
|
|||||||
await _folderRepository.UpsertAsync(folder);
|
await _folderRepository.UpsertAsync(folder);
|
||||||
|
|
||||||
// push
|
// push
|
||||||
//await _pushService.PushSyncCipherUpdateAsync(cipher);
|
await _pushService.PushSyncFolderUpdateAsync(folder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -102,7 +102,7 @@ namespace Bit.Core.Services
|
|||||||
await _folderRepository.DeleteAsync(folder);
|
await _folderRepository.DeleteAsync(folder);
|
||||||
|
|
||||||
// push
|
// push
|
||||||
//await _pushService.PushSyncCipherDeleteAsync(cipher);
|
await _pushService.PushSyncFolderDeleteAsync(folder);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task ShareAsync(Cipher cipher, Guid organizationId, IEnumerable<Guid> subvaultIds, Guid sharingUserId)
|
public async Task ShareAsync(Cipher cipher, Guid organizationId, IEnumerable<Guid> subvaultIds, Guid sharingUserId)
|
||||||
@ -129,7 +129,7 @@ namespace Bit.Core.Services
|
|||||||
await _cipherRepository.ReplaceAsync(cipher, subvaultIds);
|
await _cipherRepository.ReplaceAsync(cipher, subvaultIds);
|
||||||
|
|
||||||
// push
|
// push
|
||||||
//await _pushService.PushSyncCipherUpdateAsync(cipher);
|
await _pushService.PushSyncCipherUpdateAsync(cipher);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task SaveSubvaultsAsync(Cipher cipher, IEnumerable<Guid> subvaultIds, Guid savingUserId, bool orgAdmin)
|
public async Task SaveSubvaultsAsync(Cipher cipher, IEnumerable<Guid> subvaultIds, Guid savingUserId, bool orgAdmin)
|
||||||
@ -156,7 +156,7 @@ namespace Bit.Core.Services
|
|||||||
}
|
}
|
||||||
|
|
||||||
// push
|
// push
|
||||||
//await _pushService.PushSyncCipherUpdateAsync(cipher);
|
await _pushService.PushSyncCipherUpdateAsync(cipher);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task ImportCiphersAsync(
|
public async Task ImportCiphersAsync(
|
||||||
@ -202,7 +202,7 @@ namespace Bit.Core.Services
|
|||||||
var userId = folders.FirstOrDefault()?.UserId ?? ciphers.FirstOrDefault()?.UserId;
|
var userId = folders.FirstOrDefault()?.UserId ?? ciphers.FirstOrDefault()?.UserId;
|
||||||
if(userId.HasValue)
|
if(userId.HasValue)
|
||||||
{
|
{
|
||||||
await _pushService.PushSyncCiphersAsync(userId.Value);
|
await _pushService.PushSyncVaultAsync(userId.Value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,6 +23,7 @@ namespace Bit.Core.Services
|
|||||||
private readonly IUserRepository _userRepository;
|
private readonly IUserRepository _userRepository;
|
||||||
private readonly IDataProtector _dataProtector;
|
private readonly IDataProtector _dataProtector;
|
||||||
private readonly IMailService _mailService;
|
private readonly IMailService _mailService;
|
||||||
|
private readonly IPushService _pushService;
|
||||||
|
|
||||||
public OrganizationService(
|
public OrganizationService(
|
||||||
IOrganizationRepository organizationRepository,
|
IOrganizationRepository organizationRepository,
|
||||||
@ -31,7 +32,8 @@ namespace Bit.Core.Services
|
|||||||
ISubvaultUserRepository subvaultUserRepository,
|
ISubvaultUserRepository subvaultUserRepository,
|
||||||
IUserRepository userRepository,
|
IUserRepository userRepository,
|
||||||
IDataProtectionProvider dataProtectionProvider,
|
IDataProtectionProvider dataProtectionProvider,
|
||||||
IMailService mailService)
|
IMailService mailService,
|
||||||
|
IPushService pushService)
|
||||||
{
|
{
|
||||||
_organizationRepository = organizationRepository;
|
_organizationRepository = organizationRepository;
|
||||||
_organizationUserRepository = organizationUserRepository;
|
_organizationUserRepository = organizationUserRepository;
|
||||||
@ -40,6 +42,7 @@ namespace Bit.Core.Services
|
|||||||
_userRepository = userRepository;
|
_userRepository = userRepository;
|
||||||
_dataProtector = dataProtectionProvider.CreateProtector("OrganizationServiceDataProtector");
|
_dataProtector = dataProtectionProvider.CreateProtector("OrganizationServiceDataProtector");
|
||||||
_mailService = mailService;
|
_mailService = mailService;
|
||||||
|
_pushService = pushService;
|
||||||
}
|
}
|
||||||
public async Task<OrganizationBilling> GetBillingAsync(Organization organization)
|
public async Task<OrganizationBilling> GetBillingAsync(Organization organization)
|
||||||
{
|
{
|
||||||
@ -747,7 +750,7 @@ namespace Bit.Core.Services
|
|||||||
orgUser.Email = null;
|
orgUser.Email = null;
|
||||||
await _organizationUserRepository.ReplaceAsync(orgUser);
|
await _organizationUserRepository.ReplaceAsync(orgUser);
|
||||||
|
|
||||||
// TODO: send notification emails to org admins
|
// TODO: send notification emails to org admins and accepting user?
|
||||||
|
|
||||||
return orgUser;
|
return orgUser;
|
||||||
}
|
}
|
||||||
@ -774,6 +777,9 @@ namespace Bit.Core.Services
|
|||||||
await _mailService.SendOrganizationConfirmedEmailAsync(org.Name, user.Email);
|
await _mailService.SendOrganizationConfirmedEmailAsync(org.Name, user.Email);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// push
|
||||||
|
await _pushService.PushSyncOrgKeysAsync(orgUser.UserId.Value);
|
||||||
|
|
||||||
return orgUser;
|
return orgUser;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -54,9 +54,6 @@ namespace Bit.Core.Services
|
|||||||
{
|
{
|
||||||
switch(cipher.Type)
|
switch(cipher.Type)
|
||||||
{
|
{
|
||||||
//case CipherType.Folder:
|
|
||||||
// await PushCipherAsync(cipher, PushType.SyncFolderDelete);
|
|
||||||
// break;
|
|
||||||
case CipherType.Login:
|
case CipherType.Login:
|
||||||
await PushCipherAsync(cipher, PushType.SyncLoginDelete);
|
await PushCipherAsync(cipher, PushType.SyncLoginDelete);
|
||||||
break;
|
break;
|
||||||
@ -65,13 +62,35 @@ namespace Bit.Core.Services
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task PushSyncFolderCreateAsync(Folder folder)
|
||||||
|
{
|
||||||
|
await PushFolderAsync(folder, PushType.SyncCipherCreate);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task PushSyncFolderUpdateAsync(Folder folder)
|
||||||
|
{
|
||||||
|
await PushFolderAsync(folder, PushType.SyncFolderUpdate);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task PushSyncFolderDeleteAsync(Folder folder)
|
||||||
|
{
|
||||||
|
await PushFolderAsync(folder, PushType.SyncFolderDelete);
|
||||||
|
}
|
||||||
|
|
||||||
private async Task PushCipherAsync(Cipher cipher, PushType type)
|
private async Task PushCipherAsync(Cipher cipher, PushType type)
|
||||||
{
|
{
|
||||||
|
if(!cipher.UserId.HasValue)
|
||||||
|
{
|
||||||
|
// No push for org ciphers at the moment.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var message = new SyncCipherPushNotification
|
var message = new SyncCipherPushNotification
|
||||||
{
|
{
|
||||||
Type = type,
|
Type = type,
|
||||||
Id = cipher.Id,
|
Id = cipher.Id,
|
||||||
UserId = cipher.UserId.Value,
|
UserId = cipher.UserId,
|
||||||
|
OrganizationId = cipher.OrganizationId,
|
||||||
RevisionDate = cipher.RevisionDate,
|
RevisionDate = cipher.RevisionDate,
|
||||||
Aps = new PushNotification.AppleData { ContentAvailable = 1 }
|
Aps = new PushNotification.AppleData { ContentAvailable = 1 }
|
||||||
};
|
};
|
||||||
@ -85,11 +104,51 @@ namespace Bit.Core.Services
|
|||||||
await PushToAllUserDevicesAsync(cipher.UserId.Value, JObject.FromObject(message), excludedTokens);
|
await PushToAllUserDevicesAsync(cipher.UserId.Value, JObject.FromObject(message), excludedTokens);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task PushFolderAsync(Folder folder, PushType type)
|
||||||
|
{
|
||||||
|
var message = new SyncFolderPushNotification
|
||||||
|
{
|
||||||
|
Type = type,
|
||||||
|
Id = folder.Id,
|
||||||
|
UserId = folder.UserId,
|
||||||
|
RevisionDate = folder.RevisionDate,
|
||||||
|
Aps = new PushNotification.AppleData { ContentAvailable = 1 }
|
||||||
|
};
|
||||||
|
|
||||||
|
var excludedTokens = new List<string>();
|
||||||
|
if(!string.IsNullOrWhiteSpace(_currentContext.DeviceIdentifier))
|
||||||
|
{
|
||||||
|
excludedTokens.Add(_currentContext.DeviceIdentifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
await PushToAllUserDevicesAsync(folder.UserId, JObject.FromObject(message), excludedTokens);
|
||||||
|
}
|
||||||
|
|
||||||
public async Task PushSyncCiphersAsync(Guid userId)
|
public async Task PushSyncCiphersAsync(Guid userId)
|
||||||
{
|
{
|
||||||
var message = new SyncCiphersPushNotification
|
await PushSyncUserAsync(userId, PushType.SyncCiphers);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task PushSyncVaultAsync(Guid userId)
|
||||||
|
{
|
||||||
|
await PushSyncUserAsync(userId, PushType.SyncVault);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task PushSyncOrgKeysAsync(Guid userId)
|
||||||
|
{
|
||||||
|
await PushSyncUserAsync(userId, PushType.SyncOrgKeys);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task PushSyncSettingsAsync(Guid userId)
|
||||||
|
{
|
||||||
|
await PushSyncUserAsync(userId, PushType.SyncSettings);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task PushSyncUserAsync(Guid userId, PushType type)
|
||||||
|
{
|
||||||
|
var message = new SyncUserPushNotification
|
||||||
{
|
{
|
||||||
Type = PushType.SyncCiphers,
|
Type = PushType.SyncOrgKeys,
|
||||||
UserId = userId,
|
UserId = userId,
|
||||||
Date = DateTime.UtcNow,
|
Date = DateTime.UtcNow,
|
||||||
Aps = new PushNotification.AppleData { ContentAvailable = 1 }
|
Aps = new PushNotification.AppleData { ContentAvailable = 1 }
|
||||||
@ -296,19 +355,24 @@ namespace Bit.Core.Services
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private abstract class SyncPushNotification : PushNotification
|
private class SyncCipherPushNotification : PushNotification
|
||||||
{
|
|
||||||
public Guid UserId { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
private class SyncCipherPushNotification : SyncPushNotification
|
|
||||||
{
|
{
|
||||||
public Guid Id { get; set; }
|
public Guid Id { get; set; }
|
||||||
|
public Guid? UserId { get; set; }
|
||||||
|
public Guid? OrganizationId { get; set; }
|
||||||
public DateTime RevisionDate { get; set; }
|
public DateTime RevisionDate { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
private class SyncCiphersPushNotification : SyncPushNotification
|
private class SyncFolderPushNotification : PushNotification
|
||||||
{
|
{
|
||||||
|
public Guid Id { get; set; }
|
||||||
|
public Guid UserId { get; set; }
|
||||||
|
public DateTime RevisionDate { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
private class SyncUserPushNotification : PushNotification
|
||||||
|
{
|
||||||
|
public Guid UserId { get; set; }
|
||||||
public DateTime Date { get; set; }
|
public DateTime Date { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@ namespace Bit.Core.Services
|
|||||||
private readonly IUserRepository _userRepository;
|
private readonly IUserRepository _userRepository;
|
||||||
private readonly ICipherRepository _cipherRepository;
|
private readonly ICipherRepository _cipherRepository;
|
||||||
private readonly IMailService _mailService;
|
private readonly IMailService _mailService;
|
||||||
|
private readonly IPushService _pushService;
|
||||||
private readonly IdentityErrorDescriber _identityErrorDescriber;
|
private readonly IdentityErrorDescriber _identityErrorDescriber;
|
||||||
private readonly IdentityOptions _identityOptions;
|
private readonly IdentityOptions _identityOptions;
|
||||||
private readonly IPasswordHasher<User> _passwordHasher;
|
private readonly IPasswordHasher<User> _passwordHasher;
|
||||||
@ -29,6 +30,7 @@ namespace Bit.Core.Services
|
|||||||
IUserRepository userRepository,
|
IUserRepository userRepository,
|
||||||
ICipherRepository cipherRepository,
|
ICipherRepository cipherRepository,
|
||||||
IMailService mailService,
|
IMailService mailService,
|
||||||
|
IPushService pushService,
|
||||||
IUserStore<User> store,
|
IUserStore<User> store,
|
||||||
IOptions<IdentityOptions> optionsAccessor,
|
IOptions<IdentityOptions> optionsAccessor,
|
||||||
IPasswordHasher<User> passwordHasher,
|
IPasswordHasher<User> passwordHasher,
|
||||||
@ -53,6 +55,7 @@ namespace Bit.Core.Services
|
|||||||
_userRepository = userRepository;
|
_userRepository = userRepository;
|
||||||
_cipherRepository = cipherRepository;
|
_cipherRepository = cipherRepository;
|
||||||
_mailService = mailService;
|
_mailService = mailService;
|
||||||
|
_pushService = pushService;
|
||||||
_identityOptions = optionsAccessor?.Value ?? new IdentityOptions();
|
_identityOptions = optionsAccessor?.Value ?? new IdentityOptions();
|
||||||
_identityErrorDescriber = errors;
|
_identityErrorDescriber = errors;
|
||||||
_passwordHasher = passwordHasher;
|
_passwordHasher = passwordHasher;
|
||||||
@ -125,6 +128,9 @@ namespace Bit.Core.Services
|
|||||||
|
|
||||||
user.RevisionDate = user.AccountRevisionDate = DateTime.UtcNow;
|
user.RevisionDate = user.AccountRevisionDate = DateTime.UtcNow;
|
||||||
await _userRepository.ReplaceAsync(user);
|
await _userRepository.ReplaceAsync(user);
|
||||||
|
|
||||||
|
// push
|
||||||
|
await _pushService.PushSyncSettingsAsync(user.Id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IdentityResult> RegisterUserAsync(User user, string masterPassword)
|
public async Task<IdentityResult> RegisterUserAsync(User user, string masterPassword)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user