Skip to content

Instantly share code, notes, and snippets.

View HowardvanRooijen's full-sized avatar

Howard van Rooijen HowardvanRooijen

View GitHub Profile
@HowardvanRooijen
HowardvanRooijen / ILicenseValidator.cs
Created February 25, 2015 23:37
ILicenseValidator
public interface ILicenseValidator
{
void Validate(IClientLicense clientLicense, ICryptoKey publicKey, IEnumerable<ILicenseValidationRule> validationRules);
LicenseCriteria LicenseCriteria { get; set; }
}
@HowardvanRooijen
HowardvanRooijen / Server.cs
Last active August 29, 2015 14:16
License Generation Code
public static void Main(string[] args)
{
var dataDirectory = @"..\..\..\..\LicenseData".ResolveBaseDirectory();
var publicKeyPath = @"..\..\..\..\LicenseData\PublicKey.xml".ResolveBaseDirectory();
var licensePath = @"..\..\..\..\LicenseData\License.xml".ResolveBaseDirectory();
if (!Directory.Exists(dataDirectory))
{
Directory.CreateDirectory(dataDirectory);
}
@HowardvanRooijen
HowardvanRooijen / Client.cs
Created February 25, 2015 23:46
Client Scaffolding for license validation
public static void Main(string[] args)
{
// In a real implementation the public key would be embedded in the assembly
// possibly via an embedded resource
var publicKeyPath = @"..\..\..\..\LicenseData\PublicKey.xml".ResolveBaseDirectory();
// You could also either load the license from the file system or deliver it
// on demand from a web endpoint
var licensePath = @"..\..\..\..\LicenseData\License.xml".ResolveBaseDirectory();
@HowardvanRooijen
HowardvanRooijen / ValidateLicense.cs
Last active August 29, 2015 14:16
Validate the License Logic
private static void ValidateLicense(string publicKeyPath, string licensePath)
{
var publicKey = new PublicCryptoKey { Contents = File.ReadAllText(publicKeyPath) };
var clientLicense = ClientLicense.Create(File.ReadAllText(licensePath));
var violations = new List<string>();
try
{
var licenseValidationRules = new List<ILicenseValidationRule>
@HowardvanRooijen
HowardvanRooijen / ValidNumberOfCoresLicenseRule.cs
Created February 26, 2015 11:24
ValidNumberOfCoresLicenseRule
public class ValidNumberOfCoresLicenseRule : ILicenseValidationRule
{
public void Validate(LicenseCriteria licenseCriteria)
{
int licensedCores = 0;
if (licenseCriteria.MetaData.ContainsKey("LicensedCores"))
{
licensedCores = Convert.ToInt32(licenseCriteria.MetaData["LicensedCores"]);
}
@HowardvanRooijen
HowardvanRooijen / LicensedCoresExceededException.cs
Last active August 29, 2015 14:16
LicensedCoresExceededException
public class LicensedCoresExceededException : LicenseViolationException
{
public LicensedCoresExceededException(int actualCoreCount)
{
this.ActualCoreCount = actualCoreCount;
}
public LicensedCoresExceededException(string message, int actualCoreCount) : base(message)
{
this.ActualCoreCount = actualCoreCount;
@HowardvanRooijen
HowardvanRooijen / LicenseValidator-Validate.cs
Created February 26, 2015 11:30
LicenseValidator's Validate method
public void Validate(IClientLicense clientLicense, ICryptoKey publicKey, IEnumerable<ILicenseValidationRule> validationRules)
{
if (!LicenseSignatureValidator.ValidateSignature(clientLicense, publicKey))
{
throw new InvalidLicenseException(clientLicense);
}
this.LicenseCriteria = this.licenseCriteriaParser.Parse(clientLicense);
validationRules.ForEachFailEnd(x => x.Validate(this.LicenseCriteria));
var licenseCriteria = new LicenseCriteria
{
ExpirationDate = DateTimeOffset.UtcNow.LastDayOfMonth().EndOfDay(),
IssueDate = DateTimeOffset.UtcNow,
Id = Guid.NewGuid(),
MetaData = new Dictionary<string, string> { { "LicensedCores", "2" } },
Type = "Subscription"
};
@HowardvanRooijen
HowardvanRooijen / DoNotRetryOnConflictPolicy.cs
Last active August 29, 2015 14:16
DoNotRetryOnConflictPolicy Endjin.Retry Extension
#region Using Directives
using System;
using Endjin.Core.Retry.Policies;
using Microsoft.WindowsAzure.Storage;
#endregion
@HowardvanRooijen
HowardvanRooijen / DoNotRetryOnLeaseAcquisitionUnsuccessfulPolicy.cs
Last active August 29, 2015 14:16
DoNotRetryOnLeaseAcquisitionUnsuccessfulPolicy extension for Endjin.Retry
#region Using Directives
using System;
using Endjin.Core.Retry.Policies;
#endregion
public class DoNotRetryOnLeaseAcquisitionUnsuccessfulPolicy : IRetryPolicy
{