1
0
mirror of https://github.com/bitwarden/server.git synced 2024-12-22 16:57:36 +01:00

fix bumping AccountRevisionDate when creating and updating ciphers (#2634)

When the user is not part of an organization,
`UserBumpAccountRevisionDateByCipherIdQuery` doesn't work. In that case
we have to use `UserBumpAccountRevisionDateAsync` instead.

This was already done by most parts of the code but a few more were
missing.

Fixes #2615
This commit is contained in:
Michael Zimmermann 2023-02-02 15:33:35 +01:00 committed by GitHub
parent 28a3d4ad92
commit e019f0191d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 37 additions and 18 deletions

View File

@ -29,7 +29,7 @@ public class CipherRepository : Repository<Core.Entities.Cipher, Cipher, Guid>,
var dbContext = GetDatabaseContext(scope); var dbContext = GetDatabaseContext(scope);
if (cipher.OrganizationId.HasValue) if (cipher.OrganizationId.HasValue)
{ {
await dbContext.UserBumpAccountRevisionDateByCipherIdAsync(cipher.Id, cipher.OrganizationId); await dbContext.UserBumpAccountRevisionDateByCipherIdAsync(cipher.Id, cipher.OrganizationId.Value);
} }
else if (cipher.UserId.HasValue) else if (cipher.UserId.HasValue)
{ {
@ -59,7 +59,7 @@ public class CipherRepository : Repository<Core.Entities.Cipher, Cipher, Guid>,
await OrganizationUpdateStorage(cipherInfo.OrganizationId.Value); await OrganizationUpdateStorage(cipherInfo.OrganizationId.Value);
} }
await dbContext.UserBumpAccountRevisionDateByCipherIdAsync(cipher.Id, cipherInfo.OrganizationId); await dbContext.UserBumpAccountRevisionDateByCipherIdAsync(cipher.Id, cipherInfo.OrganizationId.Value);
} }
else if (cipherInfo?.UserId != null) else if (cipherInfo?.UserId != null)
{ {
@ -107,7 +107,16 @@ public class CipherRepository : Repository<Core.Entities.Cipher, Cipher, Guid>,
null; null;
var entity = Mapper.Map<Cipher>((Core.Entities.Cipher)cipher); var entity = Mapper.Map<Cipher>((Core.Entities.Cipher)cipher);
await dbContext.AddAsync(entity); await dbContext.AddAsync(entity);
await dbContext.UserBumpAccountRevisionDateByCipherIdAsync(cipher.Id, cipher.OrganizationId.GetValueOrDefault());
if (cipher.OrganizationId.HasValue)
{
await dbContext.UserBumpAccountRevisionDateByCipherIdAsync(cipher.Id, cipher.OrganizationId.Value);
}
else if (cipher.UserId.HasValue)
{
await dbContext.UserBumpAccountRevisionDateAsync(cipher.UserId.Value);
}
await dbContext.SaveChangesAsync(); await dbContext.SaveChangesAsync();
} }
return cipher; return cipher;
@ -458,7 +467,16 @@ public class CipherRepository : Repository<Core.Entities.Cipher, Cipher, Guid>,
} }
var mappedEntity = Mapper.Map<Cipher>((Core.Entities.Cipher)cipher); var mappedEntity = Mapper.Map<Cipher>((Core.Entities.Cipher)cipher);
dbContext.Entry(entity).CurrentValues.SetValues(mappedEntity); dbContext.Entry(entity).CurrentValues.SetValues(mappedEntity);
await dbContext.UserBumpAccountRevisionDateByCipherIdAsync(cipher.Id, cipher.OrganizationId.GetValueOrDefault());
if (cipher.OrganizationId.HasValue)
{
await dbContext.UserBumpAccountRevisionDateByCipherIdAsync(cipher.Id, cipher.OrganizationId.Value);
}
else if (cipher.UserId.HasValue)
{
await dbContext.UserBumpAccountRevisionDateAsync(cipher.UserId.Value);
}
await dbContext.SaveChangesAsync(); await dbContext.SaveChangesAsync();
} }
} }
@ -566,7 +584,15 @@ public class CipherRepository : Repository<Core.Entities.Cipher, Cipher, Guid>,
} }
} }
await dbContext.UserBumpAccountRevisionDateByCipherIdAsync(cipher.Id, cipher.OrganizationId.GetValueOrDefault()); if (cipher.OrganizationId.HasValue)
{
await dbContext.UserBumpAccountRevisionDateByCipherIdAsync(cipher.Id, cipher.OrganizationId.Value);
}
else if (cipher.UserId.HasValue)
{
await dbContext.UserBumpAccountRevisionDateAsync(cipher.UserId.Value);
}
await dbContext.SaveChangesAsync(); await dbContext.SaveChangesAsync();
return true; return true;
} }
@ -677,7 +703,7 @@ public class CipherRepository : Repository<Core.Entities.Cipher, Cipher, Guid>,
if (attachment.OrganizationId.HasValue) if (attachment.OrganizationId.HasValue)
{ {
await OrganizationUpdateStorage(cipher.OrganizationId.Value); await OrganizationUpdateStorage(cipher.OrganizationId.Value);
await dbContext.UserBumpAccountRevisionDateByCipherIdAsync(cipher.Id, cipher.OrganizationId); await dbContext.UserBumpAccountRevisionDateByCipherIdAsync(cipher.Id, cipher.OrganizationId.Value);
} }
else if (attachment.UserId.HasValue) else if (attachment.UserId.HasValue)
{ {

View File

@ -34,7 +34,7 @@ public static class DatabaseContextExtensions
UpdateUserRevisionDate(users); UpdateUserRevisionDate(users);
} }
public static async Task UserBumpAccountRevisionDateByCipherIdAsync(this DatabaseContext context, Guid cipherId, Guid? organizationId) public static async Task UserBumpAccountRevisionDateByCipherIdAsync(this DatabaseContext context, Guid cipherId, Guid organizationId)
{ {
var query = new UserBumpAccountRevisionDateByCipherIdQuery(cipherId, organizationId); var query = new UserBumpAccountRevisionDateByCipherIdQuery(cipherId, organizationId);
var users = await query.Run(context).ToListAsync(); var users = await query.Run(context).ToListAsync();

View File

@ -1,5 +1,4 @@
using Bit.Core.Entities; using Bit.Core.Enums;
using Bit.Core.Enums;
using User = Bit.Infrastructure.EntityFramework.Models.User; using User = Bit.Infrastructure.EntityFramework.Models.User;
namespace Bit.Infrastructure.EntityFramework.Repositories.Queries; namespace Bit.Infrastructure.EntityFramework.Repositories.Queries;
@ -7,15 +6,9 @@ namespace Bit.Infrastructure.EntityFramework.Repositories.Queries;
public class UserBumpAccountRevisionDateByCipherIdQuery : IQuery<User> public class UserBumpAccountRevisionDateByCipherIdQuery : IQuery<User>
{ {
private readonly Guid _cipherId; private readonly Guid _cipherId;
private readonly Guid? _organizationId; private readonly Guid _organizationId;
public UserBumpAccountRevisionDateByCipherIdQuery(Cipher cipher) public UserBumpAccountRevisionDateByCipherIdQuery(Guid cipherId, Guid organizationId)
{
_cipherId = cipher.Id;
_organizationId = cipher.OrganizationId;
}
public UserBumpAccountRevisionDateByCipherIdQuery(Guid cipherId, Guid? organizationId)
{ {
_cipherId = cipherId; _cipherId = cipherId;
_organizationId = organizationId; _organizationId = organizationId;

View File

@ -159,7 +159,7 @@ public class CipherRepositoryTests
var postEfCipher = await sut.CreateAsync(cipher); var postEfCipher = await sut.CreateAsync(cipher);
sut.ClearChangeTracking(); sut.ClearChangeTracking();
var query = new UserBumpAccountRevisionDateByCipherIdQuery(cipher); var query = new UserBumpAccountRevisionDateByCipherIdQuery(cipher, cipher.OrganizationId.Value);
var modifiedUsers = await sut.Run(query).ToListAsync(); var modifiedUsers = await sut.Run(query).ToListAsync();
Assert.True(modifiedUsers Assert.True(modifiedUsers
.All(u => u.AccountRevisionDate.ToShortDateString() == .All(u => u.AccountRevisionDate.ToShortDateString() ==