Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 76 additions & 0 deletions src/AcceptanceTests/When_sending_the_same_message_twice.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
namespace NServiceBus.Encryption.MessageProperty.AcceptanceTests;

using System.Collections.Generic;
using System.Threading.Tasks;
using AcceptanceTesting;
using NUnit.Framework;

public class When_sending_the_same_message_twice : NServiceBusAcceptanceTest
{
[Test]
public async Task Should_not_corrupt_encrypted_properties()
{
var secret = "betcha can't guess my secret";
var messageToReuse = new MessageWithSecretData
{
Secret = secret,
EncryptedString = secret,
SubProperty = new MySecretSubProperty { Secret = secret }
};

var context = await Scenario.Define<Context>()
.WithEndpoint<Endpoint>(b => b.When(async session =>
{
await session.SendLocal(messageToReuse);
await session.SendLocal(messageToReuse);
}))
.Done(c => c.MessagesReceived.Count == 2)
.Run();

Assert.Multiple(() =>
{
foreach (var message in context.MessagesReceived)
{
Assert.That(message.Secret.Value, Is.EqualTo(secret));
Assert.That(message.EncryptedString, Is.EqualTo(secret));
Assert.That(message.SubProperty.Secret.Value, Is.EqualTo(secret));
}
});
}

public class Context : ScenarioContext
{
public List<MessageWithSecretData> MessagesReceived { get; } = [];
}

public class Endpoint : EndpointConfigurationBuilder
{
public Endpoint() => EndpointSetup<DefaultServer>(config =>
{
var encryptionService = new AesEncryptionService("1st", new Dictionary<string, byte[]> { { "1st", "gdDbqRpqdRbTs3mhdZh9qCaDaxJXl+e6"u8.ToArray() } });
config.EnableMessagePropertyEncryption(encryptionService, property => property.Name.StartsWith("Encrypted") || property.PropertyType == typeof(EncryptedString));
});

public class Handler(Context testContext) : IHandleMessages<MessageWithSecretData>
{
public Task Handle(MessageWithSecretData message, IMessageHandlerContext context)
{
testContext.MessagesReceived.Add(message);

return Task.FromResult(0);
}
}
}

public class MessageWithSecretData : IMessage
{
public EncryptedString Secret { get; set; }
public MySecretSubProperty SubProperty { get; set; }
public string EncryptedString { get; set; }
}

public class MySecretSubProperty
{
public EncryptedString Secret { get; set; }
}
}
172 changes: 81 additions & 91 deletions src/AcceptanceTests/When_using_Aes_with_custom.cs
Original file line number Diff line number Diff line change
@@ -1,118 +1,108 @@
namespace NServiceBus.Encryption.MessageProperty.AcceptanceTests
namespace NServiceBus.Encryption.MessageProperty.AcceptanceTests;

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using AcceptanceTesting;
using NUnit.Framework;

public class When_using_Aes_with_custom : NServiceBusAcceptanceTest
{
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using AcceptanceTesting;
using NUnit.Framework;

public class When_using_Aes_with_custom : NServiceBusAcceptanceTest
[Test]
public async Task Should_receive_decrypted_message()
{
[Test]
public async Task Should_receive_decrypted_message()
var messageToSend = new MessageWithSecretData
{
var context = await Scenario.Define<Context>()
.WithEndpoint<Endpoint>(b => b.When(session => session.SendLocal(new MessageWithSecretData
Secret = "betcha can't guess my secret",
SubProperty = new MySecretSubProperty { Secret = "My sub secret" },
CreditCards =
[
new CreditCardDetails
{
ValidTo = DateTime.UtcNow.AddYears(1),
Number = "312312312312312"
},
new CreditCardDetails
{
Secret = "betcha can't guess my secret",
SubProperty = new MySecretSubProperty
{
Secret = "My sub secret"
},
CreditCards =
[
new CreditCardDetails
{
ValidTo = DateTime.UtcNow.AddYears(1),
Number = "312312312312312"
},
new CreditCardDetails
{
ValidTo = DateTime.UtcNow.AddYears(2),
Number = "543645546546456"
}
]
})))
.Done(c => c.GetTheMessage)
.Run();

Assert.AreEqual("betcha can't guess my secret", context.Secret);
Assert.AreEqual("My sub secret", context.SubPropertySecret);
CollectionAssert.AreEquivalent(new List<string>
ValidTo = DateTime.UtcNow.AddYears(2),
Number = "543645546546456"
}
]
};

var context = await Scenario.Define<Context>()
.WithEndpoint<Endpoint>(b => b.When(session => session.SendLocal(messageToSend)))
.Done(c => c.GetTheMessage)
.Run();

Assert.Multiple(() =>
{
Assert.That(context.Secret, Is.EqualTo(messageToSend.Secret.Value));
Assert.That(context.SubPropertySecret, Is.EqualTo(messageToSend.SubProperty.Secret.Value));
Assert.That(context.CreditCards, Is.EquivalentTo(new List<string>()
{
"312312312312312",
"543645546546456"
}, context.CreditCards);
}
}));
});
}

public class Context : ScenarioContext
{
public bool GetTheMessage { get; set; }
public class Context : ScenarioContext
{
public bool GetTheMessage { get; set; }

public string Secret { get; set; }
public string Secret { get; set; }

public string SubPropertySecret { get; set; }
public string SubPropertySecret { get; set; }

public List<string> CreditCards { get; set; }
}
public List<string> CreditCards { get; set; }
}

public class Endpoint : EndpointConfigurationBuilder
public class Endpoint : EndpointConfigurationBuilder
{
public Endpoint()
{
public Endpoint()
{
var keys = new Dictionary<string, byte[]>
{
{"1st", Encoding.ASCII.GetBytes("gdDbqRpqdRbTs3mhdZh9qCaDaxJXl+e6")}
};
var keys = new Dictionary<string, byte[]> { { "1st", "gdDbqRpqdRbTs3mhdZh9qCaDaxJXl+e6"u8.ToArray() } };

EndpointSetup<DefaultServer>(builder => builder.EnableMessagePropertyEncryption(new AesEncryptionService("1st", keys)));
}
EndpointSetup<DefaultServer>(builder => builder.EnableMessagePropertyEncryption(new AesEncryptionService("1st", keys)));
}

public class Handler : IHandleMessages<MessageWithSecretData>
public class Handler(Context testContext) : IHandleMessages<MessageWithSecretData>
{
public Task Handle(MessageWithSecretData message, IMessageHandlerContext context)
{
Context testContext;
testContext.Secret = message.Secret.Value;

public Handler(Context testContext)
{
this.testContext = testContext;
}

public Task Handle(MessageWithSecretData message, IMessageHandlerContext context)
{
testContext.Secret = message.Secret.Value;

testContext.SubPropertySecret = message.SubProperty.Secret.Value;
testContext.SubPropertySecret = message.SubProperty.Secret.Value;

testContext.CreditCards =
[
message.CreditCards[0].Number.Value,
message.CreditCards[1].Number.Value
];
testContext.CreditCards =
[
message.CreditCards[0].Number.Value,
message.CreditCards[1].Number.Value
];

testContext.GetTheMessage = true;
testContext.GetTheMessage = true;

return Task.FromResult(0);
}
return Task.FromResult(0);
}
}
}

public class MessageWithSecretData : IMessage
{
public EncryptedString Secret { get; set; }
public MySecretSubProperty SubProperty { get; set; }
public List<CreditCardDetails> CreditCards { get; set; }
}
public class MessageWithSecretData : IMessage
{
public EncryptedString Secret { get; set; }
public MySecretSubProperty SubProperty { get; set; }
public List<CreditCardDetails> CreditCards { get; set; }
}

public class CreditCardDetails
{
public DateTime ValidTo { get; set; }
public EncryptedString Number { get; set; }
}
public class CreditCardDetails
{
public DateTime ValidTo { get; set; }
public EncryptedString Number { get; set; }
}

public class MySecretSubProperty
{
public EncryptedString Secret { get; set; }
}
public class MySecretSubProperty
{
public EncryptedString Secret { get; set; }
}
}
Loading