diff --git a/src/Api/Controllers/CiphersController.cs b/src/Api/Controllers/CiphersController.cs index 5a2f1a380f..637fd09c84 100644 --- a/src/Api/Controllers/CiphersController.cs +++ b/src/Api/Controllers/CiphersController.cs @@ -255,7 +255,8 @@ namespace Bit.Api.Controllers public async Task MoveMany([FromBody]CipherBulkMoveRequestModel model) { var userId = _userService.GetProperUserId(User).Value; - await _cipherService.MoveManyAsync(model.Ids.Select(i => new Guid(i)), new Guid(model.FolderId), userId); + await _cipherService.MoveManyAsync(model.Ids.Select(i => new Guid(i)), + string.IsNullOrWhiteSpace(model.FolderId) ? (Guid?)null : new Guid(model.FolderId), userId); } } } diff --git a/src/Core/Models/Api/Request/CipherRequestModel.cs b/src/Core/Models/Api/Request/CipherRequestModel.cs index 10433277d1..f2f92b2d38 100644 --- a/src/Core/Models/Api/Request/CipherRequestModel.cs +++ b/src/Core/Models/Api/Request/CipherRequestModel.cs @@ -100,7 +100,6 @@ namespace Bit.Core.Models.Api { [Required] public IEnumerable Ids { get; set; } - [Required] public string FolderId { get; set; } } } diff --git a/src/Core/Repositories/ICipherRepository.cs b/src/Core/Repositories/ICipherRepository.cs index c7e93c3f8c..07b82c76ce 100644 --- a/src/Core/Repositories/ICipherRepository.cs +++ b/src/Core/Repositories/ICipherRepository.cs @@ -20,7 +20,7 @@ namespace Bit.Core.Repositories Task ReplaceAsync(Cipher obj, IEnumerable collectionIds); Task UpdatePartialAsync(Guid id, Guid userId, Guid? folderId, bool favorite); Task DeleteAsync(IEnumerable ids, Guid userId); - Task MoveAsync(IEnumerable ids, Guid folderId, Guid userId); + Task MoveAsync(IEnumerable ids, Guid? folderId, Guid userId); Task UpdateUserKeysAndCiphersAsync(User user, IEnumerable ciphers, IEnumerable folders); Task CreateAsync(IEnumerable ciphers, IEnumerable folders); } diff --git a/src/Core/Repositories/SqlServer/CipherRepository.cs b/src/Core/Repositories/SqlServer/CipherRepository.cs index 84254eb514..97f4ed5762 100644 --- a/src/Core/Repositories/SqlServer/CipherRepository.cs +++ b/src/Core/Repositories/SqlServer/CipherRepository.cs @@ -187,7 +187,7 @@ namespace Bit.Core.Repositories.SqlServer } } - public async Task MoveAsync(IEnumerable ids, Guid folderId, Guid userId) + public async Task MoveAsync(IEnumerable ids, Guid? folderId, Guid userId) { using(var connection = new SqlConnection(ConnectionString)) { diff --git a/src/Core/Services/ICipherService.cs b/src/Core/Services/ICipherService.cs index 37cd1aa226..9c59e23378 100644 --- a/src/Core/Services/ICipherService.cs +++ b/src/Core/Services/ICipherService.cs @@ -12,7 +12,7 @@ namespace Bit.Core.Services Task SaveDetailsAsync(CipherDetails cipher, Guid savingUserId); Task DeleteAsync(Cipher cipher, Guid deletingUserId, bool orgAdmin = false); Task DeleteManyAsync(IEnumerable cipherIds, Guid deletingUserId); - Task MoveManyAsync(IEnumerable cipherIds, Guid destinationFolderId, Guid movingUserId); + Task MoveManyAsync(IEnumerable cipherIds, Guid? destinationFolderId, Guid movingUserId); Task SaveFolderAsync(Folder folder); Task DeleteFolderAsync(Folder folder); Task ShareAsync(Cipher cipher, Guid organizationId, IEnumerable collectionIds, Guid userId); diff --git a/src/Core/Services/Implementations/CipherService.cs b/src/Core/Services/Implementations/CipherService.cs index abe35d3717..1510dc5112 100644 --- a/src/Core/Services/Implementations/CipherService.cs +++ b/src/Core/Services/Implementations/CipherService.cs @@ -106,8 +106,17 @@ namespace Bit.Core.Services await _pushService.PushSyncCiphersAsync(deletingUserId); } - public async Task MoveManyAsync(IEnumerable cipherIds, Guid destinationFolderId, Guid movingUserId) + public async Task MoveManyAsync(IEnumerable cipherIds, Guid? destinationFolderId, Guid movingUserId) { + if(destinationFolderId.HasValue) + { + var folder = await _folderRepository.GetByIdAsync(destinationFolderId.Value); + if(folder == null || folder.UserId != movingUserId) + { + throw new BadRequestException("Invalid folder."); + } + } + await _cipherRepository.MoveAsync(cipherIds, destinationFolderId, movingUserId); // push await _pushService.PushSyncCiphersAsync(movingUserId);