Skip to content

Commit 2e14a46

Browse files
[PM-22344] - fix Error: Cannot Decrypt when moving a vault item to a collection (#5911)
* use ToCipher instead of casting * return ListResponseModel * fix test * remove ToArray * have ShareManyAsync return CipherDetails * fix test * fix tests * fix test * fix test
1 parent 812fe94 commit 2e14a46

File tree

5 files changed

+46
-24
lines changed

5 files changed

+46
-24
lines changed

src/Api/Vault/Controllers/CiphersController.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1064,7 +1064,7 @@ public async Task MoveMany([FromBody] CipherBulkMoveRequestModel model)
10641064

10651065
[HttpPut("share")]
10661066
[HttpPost("share")]
1067-
public async Task<CipherMiniResponseModel[]> PutShareMany([FromBody] CipherBulkShareRequestModel model)
1067+
public async Task<ListResponseModel<CipherMiniResponseModel>> PutShareMany([FromBody] CipherBulkShareRequestModel model)
10681068
{
10691069
var organizationId = new Guid(model.Ciphers.First().OrganizationId);
10701070
if (!await _currentContext.OrganizationUser(organizationId))
@@ -1086,7 +1086,7 @@ public async Task<CipherMiniResponseModel[]> PutShareMany([FromBody] CipherBulkS
10861086
}
10871087
}
10881088

1089-
var shareCiphers = new List<(Cipher, DateTime?)>();
1089+
var shareCiphers = new List<(CipherDetails, DateTime?)>();
10901090
foreach (var cipher in model.Ciphers)
10911091
{
10921092
if (!ciphersDict.TryGetValue(cipher.Id.Value, out var existingCipher))
@@ -1096,7 +1096,7 @@ public async Task<CipherMiniResponseModel[]> PutShareMany([FromBody] CipherBulkS
10961096

10971097
ValidateClientVersionForFido2CredentialSupport(existingCipher);
10981098

1099-
shareCiphers.Add(((Cipher)existingCipher, cipher.LastKnownRevisionDate));
1099+
shareCiphers.Add((cipher.ToCipherDetails(existingCipher), cipher.LastKnownRevisionDate));
11001100
}
11011101

11021102
var updated = await _cipherService.ShareManyAsync(
@@ -1106,7 +1106,8 @@ public async Task<CipherMiniResponseModel[]> PutShareMany([FromBody] CipherBulkS
11061106
userId
11071107
);
11081108

1109-
return updated.Select(c => new CipherMiniResponseModel(c, _globalSettings, false)).ToArray();
1109+
var response = updated.Select(c => new CipherMiniResponseModel(c, _globalSettings, c.OrganizationUseTotp));
1110+
return new ListResponseModel<CipherMiniResponseModel>(response);
11101111
}
11111112

11121113
[HttpPost("purge")]

src/Core/Vault/Services/ICipherService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ Task CreateAttachmentShareAsync(Cipher cipher, Stream stream, string fileName, s
2424
Task DeleteFolderAsync(Folder folder);
2525
Task ShareAsync(Cipher originalCipher, Cipher cipher, Guid organizationId, IEnumerable<Guid> collectionIds,
2626
Guid userId, DateTime? lastKnownRevisionDate);
27-
Task<IEnumerable<Cipher>> ShareManyAsync(IEnumerable<(Cipher cipher, DateTime? lastKnownRevisionDate)> ciphers, Guid organizationId,
27+
Task<IEnumerable<CipherDetails>> ShareManyAsync(IEnumerable<(CipherDetails cipher, DateTime? lastKnownRevisionDate)> ciphers, Guid organizationId,
2828
IEnumerable<Guid> collectionIds, Guid sharingUserId);
2929
Task SaveCollectionsAsync(Cipher cipher, IEnumerable<Guid> collectionIds, Guid savingUserId, bool orgAdmin);
3030
Task SoftDeleteAsync(CipherDetails cipherDetails, Guid deletingUserId, bool orgAdmin = false);

src/Core/Vault/Services/Implementations/CipherService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -625,7 +625,7 @@ await _attachmentStorageService.RollbackShareAttachmentAsync(cipher.Id, organiza
625625
await _pushService.PushSyncCipherUpdateAsync(cipher, collectionIds);
626626
}
627627

628-
public async Task<IEnumerable<Cipher>> ShareManyAsync(IEnumerable<(Cipher cipher, DateTime? lastKnownRevisionDate)> cipherInfos,
628+
public async Task<IEnumerable<CipherDetails>> ShareManyAsync(IEnumerable<(CipherDetails cipher, DateTime? lastKnownRevisionDate)> cipherInfos,
629629
Guid organizationId, IEnumerable<Guid> collectionIds, Guid sharingUserId)
630630
{
631631
var cipherIds = new List<Guid>();

test/Api.Test/Vault/Controllers/CiphersControllerTests.cs

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System.Security.Claims;
22
using System.Text.Json;
33
using Bit.Api.Vault.Controllers;
4+
using Bit.Api.Vault.Models;
45
using Bit.Api.Vault.Models.Request;
56
using Bit.Api.Vault.Models.Response;
67
using Bit.Core;
@@ -1774,16 +1775,16 @@ public async Task PutShareMany_ShouldShareCiphersAndReturnRevisionDateMap(
17741775
Id = Guid.NewGuid(),
17751776
UserId = userId,
17761777
OrganizationId = organizationId,
1777-
Type = CipherType.SecureNote,
1778-
Data = JsonSerializer.Serialize(new CipherSecureNoteData()),
1778+
Type = CipherType.Login,
1779+
Data = JsonSerializer.Serialize(new CipherLoginData()),
17791780
RevisionDate = oldDate2
17801781
};
17811782
var preloadedDetails = new List<CipherDetails> { detail1, detail2 };
17821783

17831784
var newDate1 = oldDate1.AddMinutes(5);
17841785
var newDate2 = oldDate2.AddMinutes(5);
1785-
var updatedCipher1 = new Cipher { Id = detail1.Id, RevisionDate = newDate1, Type = detail1.Type, Data = detail1.Data };
1786-
var updatedCipher2 = new Cipher { Id = detail2.Id, RevisionDate = newDate2, Type = detail2.Type, Data = detail2.Data };
1786+
var updatedCipher1 = new CipherDetails { Id = detail1.Id, RevisionDate = newDate1, Type = detail1.Type, Data = detail1.Data };
1787+
var updatedCipher2 = new CipherDetails { Id = detail2.Id, RevisionDate = newDate2, Type = detail2.Type, Data = detail2.Data };
17871788

17881789
sutProvider.GetDependency<ICurrentContext>()
17891790
.OrganizationUser(organizationId)
@@ -1801,19 +1802,39 @@ public async Task PutShareMany_ShouldShareCiphersAndReturnRevisionDateMap(
18011802

18021803
sutProvider.GetDependency<ICipherService>()
18031804
.ShareManyAsync(
1804-
Arg.Any<IEnumerable<(Cipher, DateTime?)>>(),
1805+
Arg.Any<IEnumerable<(CipherDetails, DateTime?)>>(),
18051806
organizationId,
18061807
Arg.Any<IEnumerable<Guid>>(),
18071808
userId
18081809
)
1809-
.Returns(Task.FromResult<IEnumerable<Cipher>>(new[] { updatedCipher1, updatedCipher2 }));
1810+
.Returns(Task.FromResult<IEnumerable<CipherDetails>>(new[] { updatedCipher1, updatedCipher2 }));
18101811

1811-
var cipherRequests = preloadedDetails.Select(d => new CipherWithIdRequestModel
1812+
var cipherRequests = preloadedDetails.Select(d =>
18121813
{
1813-
Id = d.Id,
1814-
OrganizationId = d.OrganizationId!.Value.ToString(),
1815-
LastKnownRevisionDate = d.RevisionDate,
1816-
Type = d.Type
1814+
var m = new CipherWithIdRequestModel
1815+
{
1816+
Id = d.Id,
1817+
OrganizationId = d.OrganizationId!.Value.ToString(),
1818+
LastKnownRevisionDate = d.RevisionDate,
1819+
Type = d.Type,
1820+
};
1821+
1822+
if (d.Type == CipherType.Login)
1823+
{
1824+
m.Login = new CipherLoginModel
1825+
{
1826+
Username = "",
1827+
Password = "",
1828+
Uris = [],
1829+
};
1830+
m.Name = "";
1831+
m.Notes = "";
1832+
m.Fields = Array.Empty<CipherFieldModel>();
1833+
m.PasswordHistory = Array.Empty<CipherPasswordHistoryModel>();
1834+
}
1835+
1836+
// similar for SecureNote, Card, etc., if you ever hit those branches
1837+
return m;
18171838
}).ToList();
18181839

18191840
var model = new CipherBulkShareRequestModel
@@ -1824,15 +1845,15 @@ public async Task PutShareMany_ShouldShareCiphersAndReturnRevisionDateMap(
18241845

18251846
var result = await sutProvider.Sut.PutShareMany(model);
18261847

1827-
Assert.Equal(2, result.Length);
1828-
var revisionDates = result.Select(r => r.RevisionDate).ToList();
1848+
Assert.Equal(2, result.Data.Count());
1849+
var revisionDates = result.Data.Select(x => x.RevisionDate).ToList();
18291850
Assert.Contains(newDate1, revisionDates);
18301851
Assert.Contains(newDate2, revisionDates);
18311852

18321853
await sutProvider.GetDependency<ICipherService>()
18331854
.Received(1)
18341855
.ShareManyAsync(
1835-
Arg.Is<IEnumerable<(Cipher, DateTime?)>>(list =>
1856+
Arg.Is<IEnumerable<(CipherDetails, DateTime?)>>(list =>
18361857
list.Select(x => x.Item1.Id).OrderBy(id => id)
18371858
.SequenceEqual(new[] { detail1.Id, detail2.Id }.OrderBy(id => id))
18381859
),

test/Core.Test/Vault/Services/CipherServiceTests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public async Task ShareAsync_WrongRevisionDate_Throws(SutProvider<CipherService>
7272

7373
[Theory, BitAutoData]
7474
public async Task ShareManyAsync_WrongRevisionDate_Throws(SutProvider<CipherService> sutProvider,
75-
IEnumerable<Cipher> ciphers, Guid organizationId, List<Guid> collectionIds)
75+
IEnumerable<CipherDetails> ciphers, Guid organizationId, List<Guid> collectionIds)
7676
{
7777
sutProvider.GetDependency<IOrganizationRepository>().GetByIdAsync(organizationId)
7878
.Returns(new Organization
@@ -651,7 +651,7 @@ await attachmentStorageService.Received().RollbackShareAttachmentAsync(cipher.Id
651651
[BitAutoData("")]
652652
[BitAutoData("Correct Time")]
653653
public async Task ShareManyAsync_CorrectRevisionDate_Passes(string revisionDateString,
654-
SutProvider<CipherService> sutProvider, IEnumerable<Cipher> ciphers, Organization organization, List<Guid> collectionIds)
654+
SutProvider<CipherService> sutProvider, IEnumerable<CipherDetails> ciphers, Organization organization, List<Guid> collectionIds)
655655
{
656656
sutProvider.GetDependency<IOrganizationRepository>().GetByIdAsync(organization.Id)
657657
.Returns(new Organization
@@ -1173,7 +1173,7 @@ await sutProvider.GetDependency<IPushNotificationService>()
11731173

11741174
[Theory, BitAutoData]
11751175
public async Task ShareManyAsync_FreeOrgWithAttachment_Throws(SutProvider<CipherService> sutProvider,
1176-
IEnumerable<Cipher> ciphers, Guid organizationId, List<Guid> collectionIds)
1176+
IEnumerable<CipherDetails> ciphers, Guid organizationId, List<Guid> collectionIds)
11771177
{
11781178
sutProvider.GetDependency<IOrganizationRepository>().GetByIdAsync(organizationId).Returns(new Organization
11791179
{
@@ -1194,7 +1194,7 @@ public async Task ShareManyAsync_FreeOrgWithAttachment_Throws(SutProvider<Cipher
11941194

11951195
[Theory, BitAutoData]
11961196
public async Task ShareManyAsync_PaidOrgWithAttachment_Passes(SutProvider<CipherService> sutProvider,
1197-
IEnumerable<Cipher> ciphers, Guid organizationId, List<Guid> collectionIds)
1197+
IEnumerable<CipherDetails> ciphers, Guid organizationId, List<Guid> collectionIds)
11981198
{
11991199
sutProvider.GetDependency<IOrganizationRepository>().GetByIdAsync(organizationId)
12001200
.Returns(new Organization

0 commit comments

Comments
 (0)