Skip to content

Commit 60c3f44

Browse files
authored
Merge pull request #2380 from tiksn/replace-bond-with-protobuf
Replace Microsoft Bond with Google Protobuf
2 parents a463d77 + 817607b commit 60c3f44

22 files changed

+137
-313
lines changed

Directory.Packages.props

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@
77
<PackageVersion Include="Autofac.Extensions.DependencyInjection" Version="10.0.0" />
88
<PackageVersion Include="Azure.Data.Tables" Version="12.11.0" />
99
<PackageVersion Include="Azure.Storage.Blobs" Version="12.24.0" />
10-
<PackageVersion Include="Bond.CSharp" Version="13.0.2" />
1110
<PackageVersion Include="coverlet.collector" Version="6.0.4" />
1211
<PackageVersion Include="FluentValidation" Version="12.0.0" />
12+
<PackageVersion Include="Google.Protobuf" Version="3.31.1" />
13+
<PackageVersion Include="Grpc.Tools" Version="2.72.0" />
1314
<PackageVersion Include="IdGen" Version="3.0.7" />
1415
<PackageVersion Include="LanguageExt.Core" Version="4.4.9" />
1516
<PackageVersion Include="LanguageExt.FSharp" Version="4.4.9" />

TIKSN.Framework.Core.Tests/Licensing/TestEntitlementsConverter.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
using System.Collections.Generic;
2+
using System.Linq;
3+
using Google.Protobuf;
24
using LanguageExt;
35
using LanguageExt.Common;
46
using TIKSN.Licensing;
@@ -61,7 +63,7 @@ public Validation<Error, TestLicenseEntitlements> Convert(
6163
}
6264
else
6365
{
64-
result.Salt = entitlements.Salt.ToArray();
66+
result.Salt = ByteString.CopyFrom([.. entitlements.Salt]);
6567
}
6668
}
6769

@@ -104,7 +106,7 @@ public Validation<Error, TestEntitlements> Convert(
104106
errors.Add(Error.New(314894957, "EmployeeId is invalid"));
105107
}
106108

107-
if (entitlementsData.Salt.Count == 0)
109+
if (entitlementsData.Salt.Length == 0)
108110
{
109111
errors.Add(Error.New(139152695, "Salt is missing"));
110112
}

TIKSN.Framework.Core.Tests/Licensing/schema.bond

Lines changed: 0 additions & 11 deletions
This file was deleted.
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
syntax = "proto3";
2+
3+
option csharp_namespace = "TIKSN.Tests.Licensing";
4+
5+
message TestLicenseEntitlements {
6+
string Name = 1;
7+
int32 Quantity = 2;
8+
bytes Salt = 3;
9+
int64 CompanyId = 4;
10+
int64 EmployeeId = 5;
11+
}

TIKSN.Framework.Core.Tests/TIKSN.Framework.Core.Tests.csproj

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@
1010
<RootNamespace>TIKSN.Tests</RootNamespace>
1111
</PropertyGroup>
1212
<ItemGroup>
13-
<PackageReference Include="Bond.CSharp" />
13+
<PackageReference Include="Grpc.Tools">
14+
<PrivateAssets>all</PrivateAssets>
15+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
16+
</PackageReference>
1417
<PackageReference Include="Microsoft.Extensions.Hosting" />
1518
<PackageReference Include="Microsoft.Extensions.TimeProvider.Testing" />
1619
<PackageReference Include="Microsoft.NET.Test.Sdk" />
@@ -44,4 +47,7 @@
4447
<CustomToolNamespace>TIKSN.Tests.Licensing</CustomToolNamespace>
4548
</EmbeddedResource>
4649
</ItemGroup>
50+
<ItemGroup>
51+
<Protobuf Include="Licensing\schema.proto" GrpcServices="None" />
52+
</ItemGroup>
4753
</Project>

TIKSN.Framework.Core/DependencyInjection/ServiceCollectionExtensions.cs

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
using TIKSN.Licensing;
1616
using TIKSN.Network;
1717
using TIKSN.Serialization;
18-
using TIKSN.Serialization.Bond;
1918
using TIKSN.Serialization.MessagePack;
2019
using TIKSN.Serialization.Numerics;
2120
using TIKSN.Shell;
@@ -48,25 +47,15 @@ public static IServiceCollection AddFrameworkCore(this IServiceCollection servic
4847
services.TryAddSingleton<IKnownFolders, KnownFolders>();
4948
services.TryAddSingleton<INetworkConnectivityService, NetworkConnectivityService>();
5049

51-
services.TryAddSingleton<CompactBinaryBondDeserializer>();
52-
services.TryAddSingleton<CompactBinaryBondSerializer>();
5350
services.TryAddSingleton<DotNetXmlDeserializer>();
5451
services.TryAddSingleton<DotNetXmlSerializer>();
55-
services.TryAddSingleton<FastBinaryBondDeserializer>();
56-
services.TryAddSingleton<FastBinaryBondSerializer>();
5752
services.TryAddSingleton<ICustomDeserializer<byte[], BigInteger>, UnsignedBigIntegerBinaryDeserializer>();
5853
services.TryAddSingleton<ICustomSerializer<byte[], BigInteger>, UnsignedBigIntegerBinarySerializer>();
5954
services.TryAddSingleton<IRestRequester, RestRequester>();
6055
services.TryAddSingleton<JsonDeserializer>();
6156
services.TryAddSingleton<JsonSerializer>();
6257
services.TryAddSingleton<MessagePackDeserializer>();
6358
services.TryAddSingleton<MessagePackSerializer>();
64-
services.TryAddSingleton<SimpleBinaryBondDeserializer>();
65-
services.TryAddSingleton<SimpleBinaryBondSerializer>();
66-
services.TryAddSingleton<SimpleJsonBondDeserializer>();
67-
services.TryAddSingleton<SimpleJsonBondSerializer>();
68-
services.TryAddSingleton<SimpleXmlBondDeserializer>();
69-
services.TryAddSingleton<SimpleXmlBondSerializer>();
7059
services.TryAddSingleton<IIdentityGenerator<long>, IdGenIdentityGenerator>();
7160
services.TryAddScoped<IShellCommandContext, ShellCommandContext>();
7261
services.TryAddSingleton(MessageBus.Current);

TIKSN.Framework.Core/Licensing/ILicenseFactory.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
using System.Security.Cryptography.X509Certificates;
2+
using Google.Protobuf;
23
using LanguageExt;
34
using LanguageExt.Common;
45

56
namespace TIKSN.Licensing;
67

7-
#pragma warning disable S2326 // Unused type parameters should be removed
8-
9-
public interface ILicenseFactory<TEntitlements, TEntitlementsData>
10-
#pragma warning restore S2326 // Unused type parameters should be removed
8+
public interface ILicenseFactory<TEntitlements, TEntitlementsData> where TEntitlementsData : IMessage<TEntitlementsData>
119
{
1210
Validation<Error, License<TEntitlements>> Create(
1311
LicenseTerms terms,

TIKSN.Framework.Core/Licensing/LicenseFactory.cs

Lines changed: 20 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,25 @@
11
using System.Security.Cryptography.X509Certificates;
2+
using Google.Protobuf;
23
using LanguageExt;
34
using LanguageExt.Common;
45
using Microsoft.Extensions.DependencyInjection;
5-
using TIKSN.Serialization.Bond;
66
using static LanguageExt.Prelude;
77

88
namespace TIKSN.Licensing;
99

10-
public class LicenseFactory<TEntitlements, TEntitlementsData> : ILicenseFactory<TEntitlements, TEntitlementsData>
10+
public class LicenseFactory<TEntitlements, TEntitlementsData> : ILicenseFactory<TEntitlements, TEntitlementsData> where TEntitlementsData : IMessage<TEntitlementsData>
1111
{
12-
private readonly CompactBinaryBondDeserializer deserializer;
1312
private readonly IEntitlementsConverter<TEntitlements, TEntitlementsData> entitlementsConverter;
1413
private readonly ILicenseDescriptor<TEntitlements> licenseDescriptor;
15-
private readonly CompactBinaryBondSerializer serializer;
1614
private readonly IServiceProvider serviceProvider;
1715
private readonly TimeProvider timeProvider;
1816

1917
public LicenseFactory(
20-
CompactBinaryBondSerializer serializer,
21-
CompactBinaryBondDeserializer deserializer,
2218
ILicenseDescriptor<TEntitlements> licenseDescriptor,
2319
IEntitlementsConverter<TEntitlements, TEntitlementsData> entitlementsConverter,
2420
TimeProvider timeProvider,
2521
IServiceProvider serviceProvider)
2622
{
27-
this.serializer = serializer ?? throw new ArgumentNullException(nameof(serializer));
28-
this.deserializer = deserializer ?? throw new ArgumentNullException(nameof(deserializer));
2923
this.licenseDescriptor = licenseDescriptor ?? throw new ArgumentNullException(nameof(licenseDescriptor));
3024
this.entitlementsConverter = entitlementsConverter ?? throw new ArgumentNullException(nameof(entitlementsConverter));
3125
this.timeProvider = timeProvider ?? throw new ArgumentNullException(nameof(timeProvider));
@@ -49,8 +43,7 @@ public Validation<Error, License<TEntitlements>> Create(
4943

5044
_ = this.entitlementsConverter.Convert(entitlements)
5145
.Match(
52-
succ => envelope.Message.Entitlements =
53-
new ArraySegment<byte>(this.serializer.Serialize(succ)),
46+
succ => envelope.Message.Entitlements = succ.ToByteString(),
5447
fail => errors.AddRange(fail));
5548

5649
if (!privateCertificate.HasPrivateKey)
@@ -63,15 +56,15 @@ public Validation<Error, License<TEntitlements>> Create(
6356
return errors.ToSeq();
6457
}
6558

66-
var messageData = this.serializer.Serialize(envelope.Message);
59+
var messageData = envelope.Message.ToByteString();
6760

6861
var keyAlgorithm = privateCertificate.GetKeyAlgorithm();
6962
envelope.SignatureAlgorithm = keyAlgorithm;
7063
var signatureService = this.serviceProvider.GetRequiredKeyedService<ICertificateSignatureService>(keyAlgorithm);
71-
var signature = signatureService.Sign(messageData, privateCertificate);
72-
envelope.Signature = new ArraySegment<byte>(signature);
64+
var signature = signatureService.Sign(messageData.ToByteArray(), privateCertificate);
65+
envelope.Signature = ByteString.CopyFrom(signature);
7366

74-
var envelopeData = this.serializer.Serialize(envelope);
67+
var envelopeData = envelope.ToByteString();
7568

7669
return new License<TEntitlements>(
7770
terms,
@@ -93,10 +86,14 @@ public Validation<Error, License<TEntitlements>> Create(
9386
return errors.ToSeq();
9487
}
9588

96-
var envelope = this.deserializer.Deserialize<LicenseEnvelope>([.. data]);
89+
var envelope = LicenseEnvelope.Parser.ParseFrom([.. data]);
9790

9891
var licenseTermsValidation = this.GetTerms(envelope, this.timeProvider);
99-
var entitlementsValidation = this.entitlementsConverter.Convert(this.deserializer.Deserialize<TEntitlementsData>([.. envelope.Message.Entitlements]));
92+
93+
var entitlementsData = Activator.CreateInstance<TEntitlementsData>();
94+
entitlementsData.MergeFrom(envelope.Message.Entitlements.CreateCodedInput());
95+
96+
var entitlementsValidation = this.entitlementsConverter.Convert(entitlementsData);
10097

10198
var keyAlgorithm = publicCertificate.GetKeyAlgorithm();
10299

@@ -107,9 +104,9 @@ public Validation<Error, License<TEntitlements>> Create(
107104

108105
var signatureService = this.serviceProvider.GetRequiredKeyedService<ICertificateSignatureService>(keyAlgorithm);
109106

110-
var messageData = this.serializer.Serialize(envelope.Message);
107+
var messageData = envelope.Message.ToByteArray();
111108

112-
if (!signatureService.Verify(messageData, [.. envelope.Signature], publicCertificate))
109+
if (!signatureService.Verify(messageData, envelope.Signature.ToByteArray(), publicCertificate))
113110
{
114111
errors.Add(Error.New(1311896038, "License signature is invalid"));
115112
}
@@ -133,12 +130,7 @@ private Validation<Error, LicenseTerms> GetTerms(
133130
{
134131
ArgumentNullException.ThrowIfNull(envelope);
135132

136-
if (envelope.Message.VersionNumber != 1)
137-
{
138-
return Error.New(2129266854, "License version is invalid");
139-
}
140-
141-
if (envelope.Message.Discriminator.Count != Guid.Empty.ToByteArray().Length ||
133+
if (envelope.Message.Discriminator.Count() != Guid.Empty.ToByteArray().Length ||
142134
envelope.Message.Discriminator.All(x => x == byte.MinValue) ||
143135
!envelope.Message.Discriminator.SequenceEqual(this.licenseDescriptor.Discriminator.ToByteArray()))
144136
{
@@ -193,14 +185,15 @@ private Validation<Error, LicenseEnvelope> Populate(
193185

194186
var errors = new List<Error>();
195187

196-
envelope.Message.VersionNumber = 1;
197-
198188
if (this.licenseDescriptor.Discriminator == Guid.Empty)
199189
{
200190
errors.Add(Error.New(13127674, "'Discriminator' should not be empty GUID"));
201191
}
202192

203-
envelope.Message.Discriminator = new ArraySegment<byte>(this.licenseDescriptor.Discriminator.ToByteArray());
193+
envelope.Message = new LicenseMessage
194+
{
195+
Discriminator = ByteString.CopyFrom(this.licenseDescriptor.Discriminator.ToByteArray()),
196+
};
204197

205198
if (terms.NotAfter < terms.NotBefore)
206199
{

0 commit comments

Comments
 (0)