| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291 | 
							- using System;
 
- using System.Collections.Generic;
 
- using System.Diagnostics;
 
- using System.Diagnostics.CodeAnalysis;
 
- using System.IO;
 
- using System.Linq;
 
- using System.Net.NetworkInformation;
 
- namespace InABox.Core
 
- {
 
-     public static class LicenseUtils
 
-     {
 
-         #region Mac Addresses
 
-         
 
-         public static String[] GetMacAddresses()
 
-         {
 
-             return NetworkInterface
 
-                 .GetAllNetworkInterfaces()
 
-                 .Where(nic =>
 
-                     nic.OperationalStatus == OperationalStatus.Up &&
 
-                     nic.NetworkInterfaceType != NetworkInterfaceType.Loopback)
 
-                 .Select(nic => nic.GetPhysicalAddress().ToString()).ToArray();
 
-         }
 
-         public static bool ValidateMacAddresses(String[] addresses)
 
-         {
 
-             var hardware = GetMacAddresses();
 
-             return hardware.Any(addresses.Contains);
 
-         }
 
-         
 
-         #endregion
 
-         
 
-         #region License Generation
 
-         
 
-         public static LicenseData RenewLicense(LicenseData oldLicense, DateTime renewed, DateTime newExpiry, DateTime renewAvailable, String[] addresses)
 
-         {
 
-             return new LicenseData
 
-             {
 
-                 LastRenewal = renewed,
 
-                 Expiry = newExpiry,
 
-                 CustomerID = oldLicense?.CustomerID ?? Guid.Empty,
 
-                 RenewalAvailable = renewAvailable,
 
-                 Addresses = addresses,
 
-                 IsDynamic = oldLicense?.IsDynamic ?? false
 
-             };
 
-         }
 
-         
 
-         private static readonly byte[] LicenseKey = Convert.FromBase64String("dCyTyQkj1o1rqJJQlT+Jcnkxr+OQnO4KCoF/b+6cx54=");
 
-         
 
-         public static string? EncryptLicenseRequest(LicenseRequest request)
 
-         {
 
-             return Encryption.EncryptV2(Serialization.Serialize(request), LicenseKey);
 
-         }
 
-         
 
-         public static bool TryEncryptLicenseRequest(LicenseRequest request, [NotNullWhen(true)] out string? result, [NotNullWhen(false)] out string? error)
 
-         {
 
-             return Encryption.TryEncryptV2(Serialization.Serialize(request), LicenseKey, out result, out error);
 
-         }
 
-         
 
-         /// <summary>
 
-         /// Decrypts <paramref name="request"/>.
 
-         /// </summary>
 
-         /// <param name="request">The request to decrypt.</param>
 
-         /// <returns>
 
-         /// The new license request, or <see langword="null"/> if errors occurred.
 
-         /// </returns>
 
-         public static bool TryDecryptLicenseRequest(string data, [NotNullWhen(true)] out LicenseRequest? result, [NotNullWhen(false)] out string? error)
 
-         {
 
-             if (!Encryption.TryDecryptV2(data, LicenseKey, out var decrypted, out error))
 
-             {
 
-                 result = null;
 
-                 return false;
 
-             }
 
-             result = Serialization.Deserialize<LicenseRequest>(decrypted);
 
-             if(result == null)
 
-             {
 
-                 error = "Request deserialization failed";
 
-                 return false;
 
-             }
 
-             return true;
 
-         }
 
-         /// <summary>
 
-         /// Decrypts <paramref name="request"/>, throwing an <see cref="Exception"/> on fail.
 
-         /// </summary>
 
-         /// <param name="request">The data to decrypt.</param>
 
-         /// <returns>
 
-         /// The new license request.
 
-         /// </returns>
 
-         public static LicenseRequest DecryptLicenseRequest(string data)
 
-         {
 
-             if (!TryDecryptLicenseRequest(data, out var result, out var error))
 
-                 throw new Exception(error);
 
-             return result;
 
-         }
 
-         /// <summary>
 
-         /// Encrypts the license data.
 
-         /// </summary>
 
-         /// <param name="license">The license to encrypt.</param>
 
-         /// <returns>
 
-         /// The encrypted data.
 
-         /// </returns>
 
-         public static string? EncryptLicense(LicenseData license)
 
-         {
 
-             return Encryption.EncryptV2(Serialization.Serialize(license), LicenseKey);
 
-         }
 
-         
 
-         public static bool TryEncryptLicense(LicenseData license, [NotNullWhen(true)] out string? result, [NotNullWhen(false)] out string? error)
 
-         {
 
-             return Encryption.TryEncryptV2(Serialization.Serialize(license), LicenseKey, out result, out error);
 
-         }
 
-         /// <summary>
 
-         /// Decrypts <paramref name="license"/>.
 
-         /// </summary>
 
-         /// <param name="license">The license to decrypt.</param>
 
-         /// <returns>
 
-         /// The new license data, or <see langword="null"/> if errors occurred.
 
-         /// </returns>
 
-         public static bool TryDecryptLicense(string data, [NotNullWhen(true)] out LicenseData? result, [NotNullWhen(false)] out string? error)
 
-         {
 
-             if (!Encryption.TryDecryptV2(data, LicenseKey, out var decrypted, out error))
 
-             {
 
-                 result = null;
 
-                 return false;
 
-             }
 
-             result = Serialization.Deserialize<LicenseData>(decrypted);
 
-             if(result == null)
 
-             {
 
-                 error = "License deserialization failed";
 
-                 return false;
 
-             }
 
-             return true;
 
-         }
 
-         /// <summary>
 
-         /// Decrypts <paramref name="license"/>, throwing an <see cref="Exception"/> on fail.
 
-         /// </summary>
 
-         /// <param name="license">The license to decrypt.</param>
 
-         /// <returns>
 
-         /// The new license data.
 
-         /// </returns>
 
-         public static LicenseData DecryptLicense(string data)
 
-         {
 
-             if (!TryDecryptLicense(data, out var result, out var error))
 
-                 throw new Exception(error);
 
-             return result;
 
-         }
 
-         #endregion
 
-         #region Fees & Discounts
 
-         private static readonly Dictionary<String, double> _licensefees = new Dictionary<String, double>();
 
-         private static readonly Dictionary<int, double> _periods = new Dictionary<int, double>();
 
-         private static readonly Dictionary<int, double> _userDiscounts = new Dictionary<int, double>();
 
-         public static double GetLicenseFee(String type)
 
-         {
 
-             return _licensefees.GetValueOrDefault(type, 0);
 
-         }
 
-         public static double GetLicenseFee<T>() where T : LicenseToken
 
-         {
 
-             return GetLicenseFee(typeof(T).EntityName());
 
-         }
 
-         public static IEnumerable<String> LicenseTypes()
 
-         {
 
-             return _licensefees.Keys;
 
-         }
 
-         public static double GetUserDiscount(int users)
 
-         {
 
-             var key = _userDiscounts.Keys
 
-                 .Where(x => x <= users)
 
-                 .DefaultIfEmpty(-1)
 
-                 .Max();
 
-             if (key == -1)
 
-                 return 0;
 
-             return _userDiscounts[key];
 
-         }
 
-         public static double GetTimeDiscount(int months)
 
-         {
 
-             var period = _periods.Keys
 
-                 .Where(x => x <= months)
 
-                 .DefaultIfEmpty(-1)
 
-                 .Max();
 
-             if (period == -1)
 
-                 return 0;
 
-             return _periods[period];
 
-         }
 
-         public static IEnumerable<int> TimeDiscountLevels()
 
-         {
 
-             return _periods.Keys;
 
-         }
 
-         public static double CalculateLicenseFee(Dictionary<String, int> licenses, int time)
 
-         {
 
-             double licensefee = 0.00F;
 
-             foreach (var license in licenses.Keys)
 
-                 if (_licensefees.ContainsKey(license))
 
-                     licensefee += _licensefees[license] * licenses[license];
 
-             var users = licenses.Values.OrderBy(x => x).LastOrDefault();
 
-             var userdiscount = GetUserDiscount(users);
 
-             var timediscount = GetTimeDiscount(time);
 
-             var result = licensefee * ((100.0F - userdiscount) / 100.0F) * ((100.0F - timediscount) / 100.0F);
 
-             return result;
 
-         }
 
-         public static void LoadSummary(LicenseFeeResponse feeResponse)
 
-         {
 
-             _licensefees.Clear();
 
-             _periods.Clear();
 
-             _userDiscounts.Clear();
 
-             foreach (var license in feeResponse.LicenseFees)
 
-                 _licensefees[license.Key] = license.Value;
 
-             foreach (var (months, period) in feeResponse.TimeDiscounts)
 
-                 _periods[months] = period;
 
-             foreach (var (users, discount) in feeResponse.UserDiscounts)
 
-                 _userDiscounts[users] = discount;
 
-         }
 
-         /// <summary>
 
-         /// Gets a map from entities to their associated licenses.
 
-         /// </summary>
 
-         /// <returns>A map of entity types to license types.</returns>
 
-         public static Dictionary<Type, Type> LicenseMap()
 
-         {
 
-             var result = new Dictionary<Type, Type>();
 
-             var entities = CoreUtils.Entities.Where(x => x.IsClass && !x.IsGenericType && x.IsSubclassOf(typeof(Entity)));
 
-             foreach (var entity in entities)
 
-             {
 
-                 var lic = entity.GetInterfaces()
 
-                     .FirstOrDefault(x => x.IsConstructedGenericType && x.GetGenericTypeDefinition() == typeof(ILicense<>));
 
-                 if (lic != null)
 
-                     result[entity] = lic.GenericTypeArguments.FirstOrDefault();
 
-             }
 
-             return result;
 
-         }
 
-         public static void SaveLicenseSummary(string filename)
 
-         {
 
-             var entitymap = LicenseMap();
 
-             var summary = new List<string> { "\"License Token\",\"Class Name\"" };
 
-             foreach (var mapentry in entitymap.OrderBy(x => x.Value))
 
-                 summary.Add(string.Format("\"{0}\",\"{1}\"", mapentry.Value?.GetCaption(), mapentry.Value.EntityName()));
 
-             File.WriteAllLines(filename, summary.ToArray());
 
-         }
 
-         public static void Reset()
 
-         {
 
-             _licensefees.Clear();
 
-             _periods.Clear();
 
-             _userDiscounts.Clear();
 
-         }
 
-         #endregion
 
-     }
 
-     public class LicenseFeeRequest
 
-     {
 
-         public Guid RegistrationID { get; set; }
 
-     }
 
-     
 
-     public class LicenseFeeResponse
 
-     {
 
-         public LicenseFeeResponse()
 
-         {
 
-             LicenseFees = new Dictionary<string, double>();
 
-             TimeDiscounts = new Dictionary<int, double>();
 
-             UserDiscounts = new Dictionary<int, double>();
 
-         }
 
-         
 
-         public Dictionary<string, double> LicenseFees { get; set; }
 
-         public Dictionary<int, double> TimeDiscounts { get; set; }
 
-         public Dictionary<int, double> UserDiscounts { get; set; }
 
-     }
 
- }
 
 
  |