diff --git a/src/Api/Tools/Controllers/ReceivesController.cs b/src/Api/Tools/Controllers/ReceivesController.cs index 72bafaf449c6..64fa79dc3462 100644 --- a/src/Api/Tools/Controllers/ReceivesController.cs +++ b/src/Api/Tools/Controllers/ReceivesController.cs @@ -5,6 +5,7 @@ using Bit.Core.Billing.Premium.Queries; using Bit.Core.Exceptions; using Bit.Core.Platform.Push; +using Bit.Core.Repositories; using Bit.Core.Services; using Bit.Core.Tools.ReceiveFeatures.Commands.Interfaces; using Bit.Core.Tools.ReceiveFeatures.Queries.Interfaces; @@ -22,6 +23,7 @@ public class ReceivesController : Controller private readonly IReceiveRepository _receiveRepository; private readonly IReceiveAuthorizationService _receiveAuthorizationService; private readonly IReceiveFileStorageService _receiveFileStorageService; + private readonly IUserRepository _userRepository; private readonly IReceiveValidationService _receiveValidationService; private readonly IUserService _userService; private readonly ILogger _logger; @@ -48,6 +50,7 @@ public ReceivesController( IUploadReceiveFileCommand uploadReceiveFileCommand, IHasPremiumAccessQuery hasPremiumAccessQuery, IReceiveOwnerQuery receiveOwnerQuery, + IUserRepository userRepository, IGetReceiveFileDownloadQuery getReceiveFileDownloadQuery ) { @@ -65,6 +68,7 @@ IGetReceiveFileDownloadQuery getReceiveFileDownloadQuery _uploadReceiveFileCommand = uploadReceiveFileCommand; _receiveOwnerQuery = receiveOwnerQuery; _getReceiveFileDownloadQuery = getReceiveFileDownloadQuery; + _userRepository = userRepository; } [Authorize(Policies.Application)] @@ -98,7 +102,8 @@ public async Task GetFileDownloadData(Guid public async Task GetShared(Guid id) { var receive = await GetReceiveWithSecretValidationAsync(id); - return new SharedReceiveResponseModel(receive); + var user = await _userRepository.GetByIdAsync(receive.UserId) ?? throw new NotFoundException(); + return new SharedReceiveResponseModel(receive, user.Email); } [AllowAnonymous] diff --git a/src/Api/Tools/Models/Response/SharedReceiveResponseModel.cs b/src/Api/Tools/Models/Response/SharedReceiveResponseModel.cs index ef8d1e8e8a07..f2ecb2c423ea 100644 --- a/src/Api/Tools/Models/Response/SharedReceiveResponseModel.cs +++ b/src/Api/Tools/Models/Response/SharedReceiveResponseModel.cs @@ -5,10 +5,11 @@ namespace Bit.Api.Tools.Models.Response; public class SharedReceiveResponseModel : ResponseModel { - public SharedReceiveResponseModel(Receive receive) : base("receiveShared") + public SharedReceiveResponseModel(Receive receive, string email) : base("receiveShared") { Name = receive.Name; ScekWrappedPublicKey = receive.ScekWrappedPublicKey; + OwnerEmail = email; } /// Label for the Receive. Encrypted. @@ -16,4 +17,9 @@ public SharedReceiveResponseModel(Receive receive) : base("receiveShared") /// Public key (SCEK-wrapped) used by uploaders to encrypt file content. public string ScekWrappedPublicKey { get; set; } + + /// + /// The Receive owner's email + /// + public string OwnerEmail { get; set; } } diff --git a/test/Api.Test/Tools/Controllers/ReceivesControllerTests.cs b/test/Api.Test/Tools/Controllers/ReceivesControllerTests.cs index 866181bf6525..cfe0f1e3f445 100644 --- a/test/Api.Test/Tools/Controllers/ReceivesControllerTests.cs +++ b/test/Api.Test/Tools/Controllers/ReceivesControllerTests.cs @@ -3,7 +3,9 @@ using Bit.Api.Tools.Controllers; using Bit.Api.Tools.Models.Request; using Bit.Api.Tools.Models.Response; +using Bit.Core.Entities; using Bit.Core.Exceptions; +using Bit.Core.Repositories; using Bit.Core.Tools.Entities; using Bit.Core.Tools.Models.Data; using Bit.Core.Tools.ReceiveFeatures.Commands.Interfaces; @@ -105,11 +107,14 @@ await Assert.ThrowsAsync( public async Task GetShared_ValidRequest_ReturnsSharedModel( Guid receiveId, Receive receive, + User user, SutProvider sutProvider) { receive.Secret = "correct-secret"; receive.Data = JsonSerializer.Serialize(new ReceiveData()); + user.Id = receive.UserId; SetupHttpContext(sutProvider, CoreHelpers.Base64UrlEncode(Encoding.UTF8.GetBytes(receive.Secret))); + sutProvider.GetDependency().GetByIdAsync(receive.UserId).Returns(user); sutProvider.GetDependency() .GetByIdAsync(receiveId) .Returns(receive); @@ -122,6 +127,7 @@ public async Task GetShared_ValidRequest_ReturnsSharedModel( Assert.IsType(result); Assert.Equal(receive.Name, result.Name); Assert.Equal(receive.ScekWrappedPublicKey, result.ScekWrappedPublicKey); + Assert.Equal(user.Email, result.OwnerEmail); } [Theory, BitAutoData]