diff --git a/src/Api/Tools/Models/Request/SendRequestModel.cs b/src/Api/Tools/Models/Request/SendRequestModel.cs index a68ea28c54..660ff41e3a 100644 --- a/src/Api/Tools/Models/Request/SendRequestModel.cs +++ b/src/Api/Tools/Models/Request/SendRequestModel.cs @@ -110,6 +110,19 @@ public class SendRequestModel "and try again."); } } + if (ExpirationDate.HasValue) + { + if (ExpirationDate.Value <= nowPlus1Minute) + { + throw new BadRequestException("You cannot have a Send with an expiration date in the past. " + + "Adjust the expiration date and try again."); + } + if (ExpirationDate.Value > DeletionDate.Value) + { + throw new BadRequestException("You cannot have a Send with an expiration date greater than the deletion date. " + + "Adjust the expiration date and try again."); + } + } } private Send ToSendBase(Send existingSend, ISendService sendService) diff --git a/test/Api.Test/Tools/Models/Request/SendRequestModelTests.cs b/test/Api.Test/Tools/Models/Request/SendRequestModelTests.cs index 99c4b929e0..59fb35d32e 100644 --- a/test/Api.Test/Tools/Models/Request/SendRequestModelTests.cs +++ b/test/Api.Test/Tools/Models/Request/SendRequestModelTests.cs @@ -1,6 +1,7 @@ using System.Text.Json; using Bit.Api.Tools.Models; using Bit.Api.Tools.Models.Request; +using Bit.Core.Exceptions; using Bit.Core.Tools.Enums; using Bit.Core.Tools.Services; using Bit.Test.Common.Helpers; @@ -55,4 +56,63 @@ public class SendRequestModelTests var name = AssertHelper.AssertJsonProperty(root, "Name", JsonValueKind.String).GetString(); Assert.Equal("encrypted_name", name); } + + [Fact] + public void ValidateEdit_DeletionDateInPast_ThrowsBadRequestException() + { + var send = new SendRequestModel + { + DeletionDate = DateTime.UtcNow.AddMinutes(-5) + }; + + Assert.Throws(() => send.ValidateEdit()); + } + + [Fact] + public void ValidateEdit_DeletionDateTooFarInFuture_ThrowsBadRequestException() + { + var send = new SendRequestModel + { + DeletionDate = DateTime.UtcNow.AddDays(32) + }; + + Assert.Throws(() => send.ValidateEdit()); + } + + [Fact] + public void ValidateEdit_ExpirationDateInPast_ThrowsBadRequestException() + { + var send = new SendRequestModel + { + ExpirationDate = DateTime.UtcNow.AddMinutes(-5) + }; + + Assert.Throws(() => send.ValidateEdit()); + } + + [Fact] + public void ValidateEdit_ExpirationDateGreaterThanDeletionDate_ThrowsBadRequestException() + { + var send = new SendRequestModel + { + DeletionDate = DateTime.UtcNow.AddDays(1), + ExpirationDate = DateTime.UtcNow.AddDays(2) + }; + + Assert.Throws(() => send.ValidateEdit()); + } + + [Fact] + public void ValidateEdit_ValidDates_Success() + { + var send = new SendRequestModel + { + DeletionDate = DateTime.UtcNow.AddDays(10), + ExpirationDate = DateTime.UtcNow.AddDays(5) + }; + + Exception ex = Record.Exception(() => send.ValidateEdit()); + + Assert.Null(ex); + } }