From c5391073390ebe74eece141e5583d4b11cd7d1b2 Mon Sep 17 00:00:00 2001 From: YurZoRE <68684104+RE0x0@users.noreply.github.com> Date: Fri, 6 Jun 2025 04:32:31 +0300 Subject: [PATCH] Delete Bunifu.Licensing directory --- Bunifu.Licensing/Bunifu.Licensing.csproj | 194 -- Bunifu.Licensing/Bunifu.Licensing.csproj.user | 15 - Bunifu.Licensing/BunifuPublicKey.snk | Bin 160 -> 0 bytes .../Compatibility/ComponentModelLicensing.cs | 53 - .../DefaultInterpolatedStringHandler.cs | 107 -- .../Compatibility/DelegateExtensions.cs | 24 - .../Compatibility/HttpClientCompat.cs | 29 - .../Compatibility/HttpCompatibility.cs | 164 -- Bunifu.Licensing/Compatibility/HttpImports.cs | 22 - .../Compatibility/LicenseCompatibility.cs | 82 - .../Compatibility/PlatformAttributes.cs | 26 - .../Compatibility/PlatformCompatibility.cs | 28 - .../Compatibility/StringExtensions.cs | 30 - .../StringHandlerCompatibility.cs | 47 - .../Compatibility/StringImports.cs | 19 - Bunifu.Licensing/Helpers/Cryptography.cs | 211 --- Bunifu.Licensing/Helpers/Hardware.cs | 252 --- Bunifu.Licensing/Helpers/InternetTime.cs | 30 - Bunifu.Licensing/Helpers/Logger.cs | 69 - Bunifu.Licensing/Helpers/Network.cs | 59 - Bunifu.Licensing/Helpers/Registry.cs | 581 ------ Bunifu.Licensing/Helpers/Shadower.cs | 135 -- Bunifu.Licensing/LicenseBypass.cs | 70 - Bunifu.Licensing/LicenseImports.cs | 29 - Bunifu.Licensing/LicenseProviders.cs | 473 ----- Bunifu.Licensing/LicenseValidator.cs | 1596 ----------------- Bunifu.Licensing/Models/Client.cs | 50 - Bunifu.Licensing/Models/Device.cs | 40 - Bunifu.Licensing/Models/Product.cs | 30 - Bunifu.Licensing/Models/Record.cs | 74 - Bunifu.Licensing/Models/v1License.cs | 178 -- Bunifu.Licensing/Models/v2License.cs | 205 --- Bunifu.Licensing/Models/v2Request.cs | 47 - Bunifu.Licensing/Options/ActivationResults.cs | 21 - Bunifu.Licensing/Options/LicenseTypes.cs | 15 - Bunifu.Licensing/Options/ProductTypes.cs | 19 - Bunifu.Licensing/Options/StatusOptions.cs | 13 - Bunifu.Licensing/Options/Strings.cs | 105 -- Bunifu.Licensing/Options/ValidationResults.cs | 17 - Bunifu.Licensing/Properties/AssemblyInfo.cs | 29 - Bunifu.Licensing/Properties/Resources.cs | 219 --- .../Properties/Resources.resources | Bin 46668 -> 0 bytes Bunifu.Licensing/StringHandlerPolyfill.cs | 6 - .../Views/ActivationSuccess.Designer.cs | 710 -------- Bunifu.Licensing/Views/ActivationSuccess.cs | 437 ----- .../Views/ActivationSuccess.resources | Bin 139666 -> 0 bytes Bunifu.Licensing/Views/Controls/Alert.cs | 300 ---- .../Views/Controls/Alert.resources | Bin 975 -> 0 bytes Bunifu.Licensing/Views/Controls/Box.cs | 192 -- Bunifu.Licensing/Views/Controls/Box.resources | Bin 180 -> 0 bytes .../Views/Controls/FreeTrialMessage.cs | 166 -- .../Views/Controls/FreeTrialMessage.resources | Bin 180 -> 0 bytes .../Views/FreeTrialEnded.Designer.cs | 403 ----- Bunifu.Licensing/Views/FreeTrialEnded.cs | 258 --- .../Views/FreeTrialEnded.resources | Bin 118850 -> 0 bytes .../Views/InformationBox.Designer.cs | 349 ---- Bunifu.Licensing/Views/InformationBox.cs | 250 --- .../Views/InformationBox.resources | Bin 106395 -> 0 bytes .../Views/InformationBoxEx.Designer.cs | 655 ------- Bunifu.Licensing/Views/InformationBoxEx.cs | 624 ------- .../Views/InformationBoxEx.resources | Bin 130461 -> 0 bytes .../Views/InformationBoxHelper.cs | 90 - .../Views/LicenseActivator.Designer.cs | 663 ------- Bunifu.Licensing/Views/LicenseActivator.cs | 1210 ------------- .../Views/LicenseActivator.resources | Bin 110222 -> 0 bytes .../Views/Transitions/IManagedType.cs | 17 - .../Views/Transitions/ITransitionType.cs | 11 - .../Views/Transitions/InterpolationMethod.cs | 17 - .../Views/Transitions/ManagedType_Color.cs | 42 - .../Views/Transitions/ManagedType_Double.cs | 29 - .../Views/Transitions/ManagedType_Float.cs | 29 - .../Views/Transitions/ManagedType_Int.cs | 29 - .../Views/Transitions/ManagedType_String.cs | 62 - .../Views/Transitions/ReflectionHelper.cs | 46 - .../Views/Transitions/Transition.cs | 278 --- .../Views/Transitions/TransitionChain.cs | 43 - .../Views/Transitions/TransitionElement.cs | 31 - .../Views/Transitions/TransitionManager.cs | 118 -- .../TransitionType_Acceleration.cs | 39 - .../Transitions/TransitionType_Bounce.cs | 19 - .../TransitionType_CriticalDamping.cs | 39 - .../TransitionType_Deceleration.cs | 39 - .../TransitionType_EaseInEaseOut.cs | 39 - .../Views/Transitions/TransitionType_Flash.cs | 25 - .../Transitions/TransitionType_Linear.cs | 38 - .../TransitionType_ThrowAndCatch.cs | 19 - .../Transitions/TransitionType_UserDefined.cs | 120 -- Bunifu.Licensing/Views/Transitions/Utility.cs | 104 -- Bunifu.Licensing/Views/TrialBox.Designer.cs | 326 ---- Bunifu.Licensing/Views/TrialBox.cs | 228 --- Bunifu.Licensing/Views/TrialBox.resources | Bin 176758 -> 0 bytes Bunifu.Licensing/create-key.ps1 | 10 - 92 files changed, 13517 deletions(-) delete mode 100644 Bunifu.Licensing/Bunifu.Licensing.csproj delete mode 100644 Bunifu.Licensing/Bunifu.Licensing.csproj.user delete mode 100644 Bunifu.Licensing/BunifuPublicKey.snk delete mode 100644 Bunifu.Licensing/Compatibility/ComponentModelLicensing.cs delete mode 100644 Bunifu.Licensing/Compatibility/DefaultInterpolatedStringHandler.cs delete mode 100644 Bunifu.Licensing/Compatibility/DelegateExtensions.cs delete mode 100644 Bunifu.Licensing/Compatibility/HttpClientCompat.cs delete mode 100644 Bunifu.Licensing/Compatibility/HttpCompatibility.cs delete mode 100644 Bunifu.Licensing/Compatibility/HttpImports.cs delete mode 100644 Bunifu.Licensing/Compatibility/LicenseCompatibility.cs delete mode 100644 Bunifu.Licensing/Compatibility/PlatformAttributes.cs delete mode 100644 Bunifu.Licensing/Compatibility/PlatformCompatibility.cs delete mode 100644 Bunifu.Licensing/Compatibility/StringExtensions.cs delete mode 100644 Bunifu.Licensing/Compatibility/StringHandlerCompatibility.cs delete mode 100644 Bunifu.Licensing/Compatibility/StringImports.cs delete mode 100644 Bunifu.Licensing/Helpers/Cryptography.cs delete mode 100644 Bunifu.Licensing/Helpers/Hardware.cs delete mode 100644 Bunifu.Licensing/Helpers/InternetTime.cs delete mode 100644 Bunifu.Licensing/Helpers/Logger.cs delete mode 100644 Bunifu.Licensing/Helpers/Network.cs delete mode 100644 Bunifu.Licensing/Helpers/Registry.cs delete mode 100644 Bunifu.Licensing/Helpers/Shadower.cs delete mode 100644 Bunifu.Licensing/LicenseBypass.cs delete mode 100644 Bunifu.Licensing/LicenseImports.cs delete mode 100644 Bunifu.Licensing/LicenseProviders.cs delete mode 100644 Bunifu.Licensing/LicenseValidator.cs delete mode 100644 Bunifu.Licensing/Models/Client.cs delete mode 100644 Bunifu.Licensing/Models/Device.cs delete mode 100644 Bunifu.Licensing/Models/Product.cs delete mode 100644 Bunifu.Licensing/Models/Record.cs delete mode 100644 Bunifu.Licensing/Models/v1License.cs delete mode 100644 Bunifu.Licensing/Models/v2License.cs delete mode 100644 Bunifu.Licensing/Models/v2Request.cs delete mode 100644 Bunifu.Licensing/Options/ActivationResults.cs delete mode 100644 Bunifu.Licensing/Options/LicenseTypes.cs delete mode 100644 Bunifu.Licensing/Options/ProductTypes.cs delete mode 100644 Bunifu.Licensing/Options/StatusOptions.cs delete mode 100644 Bunifu.Licensing/Options/Strings.cs delete mode 100644 Bunifu.Licensing/Options/ValidationResults.cs delete mode 100644 Bunifu.Licensing/Properties/AssemblyInfo.cs delete mode 100644 Bunifu.Licensing/Properties/Resources.cs delete mode 100644 Bunifu.Licensing/Properties/Resources.resources delete mode 100644 Bunifu.Licensing/StringHandlerPolyfill.cs delete mode 100644 Bunifu.Licensing/Views/ActivationSuccess.Designer.cs delete mode 100644 Bunifu.Licensing/Views/ActivationSuccess.cs delete mode 100644 Bunifu.Licensing/Views/ActivationSuccess.resources delete mode 100644 Bunifu.Licensing/Views/Controls/Alert.cs delete mode 100644 Bunifu.Licensing/Views/Controls/Alert.resources delete mode 100644 Bunifu.Licensing/Views/Controls/Box.cs delete mode 100644 Bunifu.Licensing/Views/Controls/Box.resources delete mode 100644 Bunifu.Licensing/Views/Controls/FreeTrialMessage.cs delete mode 100644 Bunifu.Licensing/Views/Controls/FreeTrialMessage.resources delete mode 100644 Bunifu.Licensing/Views/FreeTrialEnded.Designer.cs delete mode 100644 Bunifu.Licensing/Views/FreeTrialEnded.cs delete mode 100644 Bunifu.Licensing/Views/FreeTrialEnded.resources delete mode 100644 Bunifu.Licensing/Views/InformationBox.Designer.cs delete mode 100644 Bunifu.Licensing/Views/InformationBox.cs delete mode 100644 Bunifu.Licensing/Views/InformationBox.resources delete mode 100644 Bunifu.Licensing/Views/InformationBoxEx.Designer.cs delete mode 100644 Bunifu.Licensing/Views/InformationBoxEx.cs delete mode 100644 Bunifu.Licensing/Views/InformationBoxEx.resources delete mode 100644 Bunifu.Licensing/Views/InformationBoxHelper.cs delete mode 100644 Bunifu.Licensing/Views/LicenseActivator.Designer.cs delete mode 100644 Bunifu.Licensing/Views/LicenseActivator.cs delete mode 100644 Bunifu.Licensing/Views/LicenseActivator.resources delete mode 100644 Bunifu.Licensing/Views/Transitions/IManagedType.cs delete mode 100644 Bunifu.Licensing/Views/Transitions/ITransitionType.cs delete mode 100644 Bunifu.Licensing/Views/Transitions/InterpolationMethod.cs delete mode 100644 Bunifu.Licensing/Views/Transitions/ManagedType_Color.cs delete mode 100644 Bunifu.Licensing/Views/Transitions/ManagedType_Double.cs delete mode 100644 Bunifu.Licensing/Views/Transitions/ManagedType_Float.cs delete mode 100644 Bunifu.Licensing/Views/Transitions/ManagedType_Int.cs delete mode 100644 Bunifu.Licensing/Views/Transitions/ManagedType_String.cs delete mode 100644 Bunifu.Licensing/Views/Transitions/ReflectionHelper.cs delete mode 100644 Bunifu.Licensing/Views/Transitions/Transition.cs delete mode 100644 Bunifu.Licensing/Views/Transitions/TransitionChain.cs delete mode 100644 Bunifu.Licensing/Views/Transitions/TransitionElement.cs delete mode 100644 Bunifu.Licensing/Views/Transitions/TransitionManager.cs delete mode 100644 Bunifu.Licensing/Views/Transitions/TransitionType_Acceleration.cs delete mode 100644 Bunifu.Licensing/Views/Transitions/TransitionType_Bounce.cs delete mode 100644 Bunifu.Licensing/Views/Transitions/TransitionType_CriticalDamping.cs delete mode 100644 Bunifu.Licensing/Views/Transitions/TransitionType_Deceleration.cs delete mode 100644 Bunifu.Licensing/Views/Transitions/TransitionType_EaseInEaseOut.cs delete mode 100644 Bunifu.Licensing/Views/Transitions/TransitionType_Flash.cs delete mode 100644 Bunifu.Licensing/Views/Transitions/TransitionType_Linear.cs delete mode 100644 Bunifu.Licensing/Views/Transitions/TransitionType_ThrowAndCatch.cs delete mode 100644 Bunifu.Licensing/Views/Transitions/TransitionType_UserDefined.cs delete mode 100644 Bunifu.Licensing/Views/Transitions/Utility.cs delete mode 100644 Bunifu.Licensing/Views/TrialBox.Designer.cs delete mode 100644 Bunifu.Licensing/Views/TrialBox.cs delete mode 100644 Bunifu.Licensing/Views/TrialBox.resources delete mode 100644 Bunifu.Licensing/create-key.ps1 diff --git a/Bunifu.Licensing/Bunifu.Licensing.csproj b/Bunifu.Licensing/Bunifu.Licensing.csproj deleted file mode 100644 index 1a85998..0000000 --- a/Bunifu.Licensing/Bunifu.Licensing.csproj +++ /dev/null @@ -1,194 +0,0 @@ - - - - net8.0-windows;net7.0-windows;net6.0-windows;net5.0-windows;net48;net472;net462 - Library - true - Bunifu.Licensing - Bunifu.Licensing - false - false - true - BunifuPublicKey.snk - true - - - - - NETFRAMEWORK;NET5_0;NET5_0_OR_NETFRAMEWORK;NET5_0_OR_GREATER - - - - NETFRAMEWORK;NET6_0;NET6_0_OR_GREATER;NET5_0_OR_GREATER - - - - NETFRAMEWORK;NET7_0;NET6_0_OR_GREATER;NET5_0_OR_GREATER - - - - NETFRAMEWORK;NET8_0;NET6_0_OR_GREATER;NET5_0_OR_GREATER - - - - NETFRAMEWORK;NET40_OR_GREATER;NET5_0_OR_NETFRAMEWORK - - - - - true - - - - true - full - false - bin\Debug\ - DEBUG;TRACE;SKIP_LICENSE_CHECK - prompt - 4 - - - - pdbonly - true - bin\Release\ - TRACE;SKIP_LICENSE_CHECK - prompt - 4 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Form - - - ActivationSuccess.cs - - - - - - Form - - - FreeTrialEnded.cs - - - Form - - - InformationBox.cs - - - Form - - - InformationBoxEx.cs - - - - Form - - - LicenseActivator.cs - - - - - - - - - - - - - - - - - - - - - - - - - - Form - - - TrialBox.cs - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Bunifu.Licensing/Bunifu.Licensing.csproj.user b/Bunifu.Licensing/Bunifu.Licensing.csproj.user deleted file mode 100644 index 182dd41..0000000 --- a/Bunifu.Licensing/Bunifu.Licensing.csproj.user +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - UserControl - - - UserControl - - - UserControl - - - \ No newline at end of file diff --git a/Bunifu.Licensing/BunifuPublicKey.snk b/Bunifu.Licensing/BunifuPublicKey.snk deleted file mode 100644 index 639c783f24563c4971a4839cd3eef1b626f75546..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmV;R0AK$ABme*efB*oL000060ssI2Bme+XQ$aBR1ONa50096MragNe2pa+4*+l=P z)Jj=1nv$jm`QFVwvpWEtt6D3PujU?8jTW-e{=*t!^Ns&~JLX z7$Z9F@DNaK+rk+BuZ>WuWb%HGP|wy?+D5OMS#R%{EQvpAOk*dlPty!}iZc*Z6Jb(M O4{4gOqOIDBr+e|}I6#pA diff --git a/Bunifu.Licensing/Compatibility/ComponentModelLicensing.cs b/Bunifu.Licensing/Compatibility/ComponentModelLicensing.cs deleted file mode 100644 index f623951..0000000 --- a/Bunifu.Licensing/Compatibility/ComponentModelLicensing.cs +++ /dev/null @@ -1,53 +0,0 @@ -#if NET5_0_OR_NETFRAMEWORK -using System; -using System.Collections; - -namespace System.ComponentModel -{ - // These compatibility classes are needed because we don't have a reference to System.ComponentModel - // in modern .NET or need to ensure consistent behavior across frameworks - - #if !NET5_0_OR_GREATER - public abstract class License : IDisposable - { - protected License() { } - public abstract string LicenseKey { get; } - public abstract void Dispose(); - } - - // License provider abstract class - public abstract class LicenseProvider - { - protected LicenseProvider() { } - public abstract License GetLicense(LicenseContext context, Type type, object instance, bool allowExceptions); - } - - // License context - public class LicenseContext : IServiceProvider - { - public LicenseContext() { } - - public virtual object GetService(Type serviceType) - { - return null; - } - - public virtual string GetSavedLicenseKey(Type type, string key) - { - return null; - } - - public virtual void SetSavedLicenseKey(Type type, string key) - { - } - } - - // License usage mode enum - public enum LicenseUsageMode - { - Designtime, - Runtime - } - #endif -} -#endif \ No newline at end of file diff --git a/Bunifu.Licensing/Compatibility/DefaultInterpolatedStringHandler.cs b/Bunifu.Licensing/Compatibility/DefaultInterpolatedStringHandler.cs deleted file mode 100644 index 64efc2f..0000000 --- a/Bunifu.Licensing/Compatibility/DefaultInterpolatedStringHandler.cs +++ /dev/null @@ -1,107 +0,0 @@ -#if NET5_0_OR_NETFRAMEWORK -using System; -using System.Text; - -namespace System.Runtime.CompilerServices -{ - // A minimal DefaultInterpolatedStringHandler implementation for .NET 5.0 and .NET Framework - [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] - internal struct DefaultInterpolatedStringHandler - { - private StringBuilder _builder; - - public DefaultInterpolatedStringHandler(int literalLength, int formattedCount) - { - _builder = new StringBuilder(literalLength + formattedCount * 11); - } - - public void AppendLiteral(string value) - { - _builder.Append(value); - } - - public void AppendFormatted(T value) - { - _builder.Append(value?.ToString() ?? string.Empty); - } - - public void AppendFormatted(T value, string format) - { - if (value is IFormattable formattable) - { - _builder.Append(formattable.ToString(format, null)); - } - else - { - _builder.Append(value?.ToString() ?? string.Empty); - } - } - - public void AppendFormatted(string value) - { - _builder.Append(value ?? string.Empty); - } - - public void AppendFormatted(int value) - { - _builder.Append(value); - } - - public void AppendFormatted(T value, int alignment) - { - string str = value?.ToString() ?? string.Empty; - if (alignment != 0) - { - if (alignment < 0) - { - _builder.Append(str.PadRight(-alignment)); - } - else - { - _builder.Append(str.PadLeft(alignment)); - } - } - else - { - _builder.Append(str); - } - } - - public void AppendFormatted(T value, int alignment, string format) - { - string str; - if (value is IFormattable formattable) - { - str = formattable.ToString(format, null); - } - else - { - str = value?.ToString() ?? string.Empty; - } - - if (alignment != 0) - { - if (alignment < 0) - { - _builder.Append(str.PadRight(-alignment)); - } - else - { - _builder.Append(str.PadLeft(alignment)); - } - } - else - { - _builder.Append(str); - } - } - - public string ToStringAndClear() - { - string result = _builder.ToString(); - _builder.Clear(); - return result; - } - } -} -#endif \ No newline at end of file diff --git a/Bunifu.Licensing/Compatibility/DelegateExtensions.cs b/Bunifu.Licensing/Compatibility/DelegateExtensions.cs deleted file mode 100644 index 6efefe1..0000000 --- a/Bunifu.Licensing/Compatibility/DelegateExtensions.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using System.Threading; -using System.Windows.Forms; - -namespace Bunifu.Licensing.Compatibility -{ - /// - /// Helper methods for delegate compatibility across different .NET versions - /// - internal static class DelegateExtensions - { - // Helper method to create a ThreadStart delegate - public static ThreadStart CreateThreadStart(Action action) - { - return new ThreadStart(action); - } - - // Helper method to create a MethodInvoker delegate - public static MethodInvoker CreateMethodInvoker(Action action) - { - return new MethodInvoker(action); - } - } -} \ No newline at end of file diff --git a/Bunifu.Licensing/Compatibility/HttpClientCompat.cs b/Bunifu.Licensing/Compatibility/HttpClientCompat.cs deleted file mode 100644 index 722cf5e..0000000 --- a/Bunifu.Licensing/Compatibility/HttpClientCompat.cs +++ /dev/null @@ -1,29 +0,0 @@ -#if NET40_OR_GREATER && !NET5_0_OR_GREATER -using System; -using System.Net; -using System.Text; -using System.Threading.Tasks; - -namespace Bunifu.Licensing.Compatibility -{ - internal static class HttpClientCompat - { - public static string PostJson(string url, string jsonContent) - { - using (WebClient client = new WebClient()) - { - client.Headers[HttpRequestHeader.ContentType] = "application/json"; - return client.UploadString(url, jsonContent); - } - } - - public static string GetString(string url) - { - using (WebClient client = new WebClient()) - { - return client.DownloadString(url); - } - } - } -} -#endif \ No newline at end of file diff --git a/Bunifu.Licensing/Compatibility/HttpCompatibility.cs b/Bunifu.Licensing/Compatibility/HttpCompatibility.cs deleted file mode 100644 index 9c7becb..0000000 --- a/Bunifu.Licensing/Compatibility/HttpCompatibility.cs +++ /dev/null @@ -1,164 +0,0 @@ -#if !NET5_0_OR_GREATER -using System; -using System.IO; -using System.Net; -using System.Text; -using System.Threading.Tasks; -using System.Collections.Generic; - -namespace System.Net.Http -{ - // Basic HttpClient implementation for .NET Framework - public class HttpClient : IDisposable - { - private readonly WebClient _webClient; - - public HttpClient() - { - _webClient = new WebClient(); - DefaultRequestHeaders = new HttpRequestHeaders(); - } - - public Uri BaseAddress { get; set; } - public HttpRequestHeaders DefaultRequestHeaders { get; private set; } - - public Task PostAsync(string requestUri, StringContent content) - { - try - { - string fullUri = BaseAddress != null ? new Uri(BaseAddress, requestUri).ToString() : requestUri; - - foreach (var header in DefaultRequestHeaders.AcceptHeaders) - { - _webClient.Headers.Add("Accept", header); - } - - _webClient.Headers.Add("Content-Type", content.MediaType); - byte[] responseBytes = _webClient.UploadData(fullUri, "POST", content.GetBytes()); - - var response = new HttpResponseMessage - { - StatusCode = HttpStatusCode.Created, - Content = new ByteArrayContent(responseBytes) - }; - - return Task.FromResult(response); - } - catch (WebException ex) - { - HttpStatusCode statusCode = HttpStatusCode.InternalServerError; - if (ex.Response is HttpWebResponse webResponse) - { - statusCode = webResponse.StatusCode; - } - - var response = new HttpResponseMessage - { - StatusCode = statusCode, - Content = new StringContent(ex.Message) - }; - - return Task.FromResult(response); - } - } - - public void Dispose() - { - _webClient.Dispose(); - } - } - - public class HttpRequestHeaders - { - private readonly List _acceptHeaders = new List(); - - public List AcceptHeaders => _acceptHeaders; - - public void Clear() - { - _acceptHeaders.Clear(); - } - - public void Add(MediaTypeWithQualityHeaderValue header) - { - _acceptHeaders.Add(header.ToString()); - } - } - - public class HttpResponseMessage - { - public HttpStatusCode StatusCode { get; set; } - public HttpContent Content { get; set; } - - public override string ToString() - { - return StatusCode.ToString(); - } - } - - public abstract class HttpContent - { - public abstract string ToString(); - } - - public class StringContent : HttpContent - { - private readonly string _content; - private readonly byte[] _contentBytes; - - public string MediaType { get; } - - public StringContent(string content, Encoding encoding, string mediaType) - { - _content = content; - _contentBytes = encoding.GetBytes(content); - MediaType = mediaType; - } - - // Add parameterless constructor for .NET Framework compatibility - public StringContent(string content) : this(content, Encoding.UTF8, "text/plain") - { - } - - public byte[] GetBytes() - { - return _contentBytes; - } - - public override string ToString() - { - return _content; - } - } - - public class ByteArrayContent : HttpContent - { - private readonly byte[] _content; - - public ByteArrayContent(byte[] content) - { - _content = content; - } - - public override string ToString() - { - return Encoding.UTF8.GetString(_content); - } - } - - public class MediaTypeWithQualityHeaderValue - { - private readonly string _mediaType; - - public MediaTypeWithQualityHeaderValue(string mediaType) - { - _mediaType = mediaType; - } - - public override string ToString() - { - return _mediaType; - } - } -} -#endif \ No newline at end of file diff --git a/Bunifu.Licensing/Compatibility/HttpImports.cs b/Bunifu.Licensing/Compatibility/HttpImports.cs deleted file mode 100644 index fbd53c0..0000000 --- a/Bunifu.Licensing/Compatibility/HttpImports.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; - -#if NET5_0_OR_GREATER || NET6_0_OR_GREATER -using System.Net.Http; -using System.Net.Http.Headers; -#endif - -namespace Bunifu.Licensing.Compatibility -{ - // This class ensures that HTTP types are properly imported - internal static class HttpImports - { - // Method to reference the types so they are included in compilation - internal static void ReferenceHttpTypes() - { -#if NET5_0_OR_GREATER || NET6_0_OR_GREATER - var client = new HttpClient(); - var mediaType = new MediaTypeWithQualityHeaderValue("application/json"); -#endif - } - } -} \ No newline at end of file diff --git a/Bunifu.Licensing/Compatibility/LicenseCompatibility.cs b/Bunifu.Licensing/Compatibility/LicenseCompatibility.cs deleted file mode 100644 index 0d100f3..0000000 --- a/Bunifu.Licensing/Compatibility/LicenseCompatibility.cs +++ /dev/null @@ -1,82 +0,0 @@ -using System; -using System.Collections; - -// Define compatibility types for .NET Framework only -#if NETFRAMEWORK && NET40_OR_GREATER -namespace System.ComponentModel -{ - // Create a custom License implementation if needed - // This will only be used if the System.ComponentModel.License cannot be found - public class License : IDisposable - { - public virtual string LicenseKey { get; set; } - - public virtual void Dispose() - { - // Cleanup - } - } - - // Define LicenseContext for compatibility - public class LicenseContext - { - private Hashtable _savedLicenseKeys; - - public LicenseContext() - { - _savedLicenseKeys = new Hashtable(); - } - - public string GetSavedLicenseKey(Type type) - { - if (_savedLicenseKeys == null) - return null; - - return (string)_savedLicenseKeys[type]; - } - - public string GetSavedLicenseKey(Type type, object instance) - { - return GetSavedLicenseKey(type); - } - - public void SetSavedLicenseKey(Type type, string key) - { - if (_savedLicenseKeys == null) - _savedLicenseKeys = new Hashtable(); - - _savedLicenseKeys[type] = key; - } - } - - // Define LicenseUsageMode enum - public enum LicenseUsageMode - { - Runtime, - Designtime - } - - // Define LicenseManager for compatibility - public static class LicenseManager - { - private static LicenseUsageMode _usageMode = LicenseUsageMode.Runtime; - - public static LicenseUsageMode UsageMode - { - get { return _usageMode; } - set { _usageMode = value; } - } - - public static License Validate(Type type, object instance) - { - return new License(); - } - } - - // LicenseProvider class - public abstract class LicenseProvider - { - public abstract License GetLicense(LicenseContext context, Type type, object instance, bool allowExceptions); - } -} -#endif \ No newline at end of file diff --git a/Bunifu.Licensing/Compatibility/PlatformAttributes.cs b/Bunifu.Licensing/Compatibility/PlatformAttributes.cs deleted file mode 100644 index 35e103a..0000000 --- a/Bunifu.Licensing/Compatibility/PlatformAttributes.cs +++ /dev/null @@ -1,26 +0,0 @@ -#if NET5_0_OR_NETFRAMEWORK -namespace System.Runtime.Versioning -{ - [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = false, Inherited = false)] - internal sealed class TargetPlatformAttribute : Attribute - { - public TargetPlatformAttribute(string platformName) - { - PlatformName = platformName; - } - - public string PlatformName { get; } - } - - [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true, Inherited = false)] - internal sealed class SupportedOSPlatformAttribute : Attribute - { - public SupportedOSPlatformAttribute(string platformName) - { - PlatformName = platformName; - } - - public string PlatformName { get; } - } -} -#endif \ No newline at end of file diff --git a/Bunifu.Licensing/Compatibility/PlatformCompatibility.cs b/Bunifu.Licensing/Compatibility/PlatformCompatibility.cs deleted file mode 100644 index 978d544..0000000 --- a/Bunifu.Licensing/Compatibility/PlatformCompatibility.cs +++ /dev/null @@ -1,28 +0,0 @@ -#if NETFRAMEWORK && !NET5_0_OR_GREATER -using System; - -namespace System.Runtime.Versioning -{ - [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = false)] - public sealed class TargetPlatformAttribute : Attribute - { - public TargetPlatformAttribute(string targetPlatformName) - { - PlatformName = targetPlatformName; - } - - public string PlatformName { get; } - } - - [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] - public sealed class SupportedOSPlatformAttribute : Attribute - { - public SupportedOSPlatformAttribute(string platformName) - { - PlatformName = platformName; - } - - public string PlatformName { get; } - } -} -#endif \ No newline at end of file diff --git a/Bunifu.Licensing/Compatibility/StringExtensions.cs b/Bunifu.Licensing/Compatibility/StringExtensions.cs deleted file mode 100644 index b752b9b..0000000 --- a/Bunifu.Licensing/Compatibility/StringExtensions.cs +++ /dev/null @@ -1,30 +0,0 @@ -#if NETFRAMEWORK && NET40_OR_GREATER -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Bunifu.Licensing.Compatibility -{ - /// - /// Extension methods for string operations to support compatibility across frameworks - /// - public static class StringExtensions - { - /// - /// Split a string with StringSplitOptions - /// - public static string[] Split(this string str, char[] separator, StringSplitOptions options) - { - return str.Split(separator, options); - } - - /// - /// Split a string with a single character and StringSplitOptions - /// - public static string[] Split(this string str, char separator, StringSplitOptions options) - { - return str.Split(new[] { separator }, options); - } - } -} -#endif \ No newline at end of file diff --git a/Bunifu.Licensing/Compatibility/StringHandlerCompatibility.cs b/Bunifu.Licensing/Compatibility/StringHandlerCompatibility.cs deleted file mode 100644 index 47bd5c8..0000000 --- a/Bunifu.Licensing/Compatibility/StringHandlerCompatibility.cs +++ /dev/null @@ -1,47 +0,0 @@ -#if NETFRAMEWORK || NET5_0 || NET5_0_OR_NETFRAMEWORK -using System; -using System.Text; - -namespace System.Runtime.CompilerServices -{ - [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] - public struct DefaultInterpolatedStringHandler - { - private StringBuilder _builder; - - public DefaultInterpolatedStringHandler(int literalLength, int formattedCount) - { - _builder = new StringBuilder(literalLength + formattedCount * 11); - } - - public string ToStringAndClear() - { - string result = _builder.ToString(); - _builder.Clear(); - return result; - } - - public void AppendLiteral(string value) - { - _builder.Append(value); - } - - public void AppendFormatted(T value) - { - _builder.Append(value?.ToString() ?? string.Empty); - } - - public void AppendFormatted(T value, string format) - { - if (value is IFormattable formattable) - { - _builder.Append(formattable.ToString(format, null)); - } - else - { - _builder.Append(value?.ToString() ?? string.Empty); - } - } - } -} -#endif \ No newline at end of file diff --git a/Bunifu.Licensing/Compatibility/StringImports.cs b/Bunifu.Licensing/Compatibility/StringImports.cs deleted file mode 100644 index 07aa033..0000000 --- a/Bunifu.Licensing/Compatibility/StringImports.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System.Runtime.CompilerServices; - -namespace Bunifu.Licensing.Compatibility -{ - // This class ensures that all compatibility types are properly imported - internal static class StringImports - { - // Method to reference the types so they are included in compilation - internal static void ReferenceStringHandlerTypes() - { -#if NETFRAMEWORK || NET5_0 || NET5_0_OR_NETFRAMEWORK - var handler = new DefaultInterpolatedStringHandler(10, 2); - handler.AppendLiteral("Test"); - handler.AppendFormatted("value"); - var result = handler.ToStringAndClear(); -#endif - } - } -} \ No newline at end of file diff --git a/Bunifu.Licensing/Helpers/Cryptography.cs b/Bunifu.Licensing/Helpers/Cryptography.cs deleted file mode 100644 index 95ed394..0000000 --- a/Bunifu.Licensing/Helpers/Cryptography.cs +++ /dev/null @@ -1,211 +0,0 @@ -using System; -using System.Diagnostics; -using System.IO; -using System.Security.Cryptography; -using System.Text; -using System.Text.RegularExpressions; -using Bunifu.Licensing.Properties; - -namespace Bunifu.Licensing.Helpers -{ - // Token: 0x02000033 RID: 51 - [DebuggerStepThrough] - internal sealed class Cryptography - { - // Token: 0x06000242 RID: 578 RVA: 0x00016B48 File Offset: 0x00014D48 - public static string Encrypt(string text) - { - string sha = Resources.SHA; - bool flag = string.IsNullOrWhiteSpace(text); - if (flag) - { - throw new ArgumentNullException("text"); - } - RijndaelManaged rijndaelManaged = Cryptography.NewRijndaelManaged(sha); - ICryptoTransform cryptoTransform = rijndaelManaged.CreateEncryptor(rijndaelManaged.Key, rijndaelManaged.IV); - MemoryStream memoryStream = new MemoryStream(); - using (CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptoTransform, CryptoStreamMode.Write)) - { - using (StreamWriter streamWriter = new StreamWriter(cryptoStream)) - { - streamWriter.Write(text); - } - } - return Convert.ToBase64String(memoryStream.ToArray()); - } - - // Token: 0x06000243 RID: 579 RVA: 0x00016BFC File Offset: 0x00014DFC - public static string Encrypt2(string text) - { - string sha = Resources.SHA2; - bool flag = string.IsNullOrWhiteSpace(text); - if (flag) - { - throw new ArgumentNullException("text"); - } - RijndaelManaged rijndaelManaged = Cryptography.NewRijndaelManaged(sha); - ICryptoTransform cryptoTransform = rijndaelManaged.CreateEncryptor(rijndaelManaged.Key, rijndaelManaged.IV); - MemoryStream memoryStream = new MemoryStream(); - using (CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptoTransform, CryptoStreamMode.Write)) - { - using (StreamWriter streamWriter = new StreamWriter(cryptoStream)) - { - streamWriter.Write(text); - } - } - return Convert.ToBase64String(memoryStream.ToArray()); - } - - // Token: 0x06000244 RID: 580 RVA: 0x00016CB0 File Offset: 0x00014EB0 - public static string Decrypt(string cipherText) - { - string sha = Resources.SHA; - bool flag = string.IsNullOrEmpty(cipherText); - if (flag) - { - throw new ArgumentNullException("cipherText"); - } - bool flag2 = !Cryptography.IsBase64String(cipherText); - if (flag2) - { - throw new Exception("The cipherText input parameter is not base64 encoded"); - } - RijndaelManaged rijndaelManaged = Cryptography.NewRijndaelManaged(sha); - ICryptoTransform cryptoTransform = rijndaelManaged.CreateDecryptor(rijndaelManaged.Key, rijndaelManaged.IV); - byte[] array = Convert.FromBase64String(cipherText); - string text; - using (MemoryStream memoryStream = new MemoryStream(array)) - { - using (CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptoTransform, CryptoStreamMode.Read)) - { - using (StreamReader streamReader = new StreamReader(cryptoStream)) - { - text = streamReader.ReadToEnd(); - } - } - } - return text; - } - - // Token: 0x06000245 RID: 581 RVA: 0x00016DA0 File Offset: 0x00014FA0 - public static string Decrypt2(string cipherText) - { - string sha = Resources.SHA2; - bool flag = string.IsNullOrEmpty(cipherText); - if (flag) - { - throw new ArgumentNullException("cipherText"); - } - bool flag2 = !Cryptography.IsBase64String(cipherText); - if (flag2) - { - throw new Exception("The cipherText input parameter is not base64 encoded"); - } - RijndaelManaged rijndaelManaged = Cryptography.NewRijndaelManaged(sha); - ICryptoTransform cryptoTransform = rijndaelManaged.CreateDecryptor(rijndaelManaged.Key, rijndaelManaged.IV); - byte[] array = Convert.FromBase64String(cipherText); - string text; - using (MemoryStream memoryStream = new MemoryStream(array)) - { - using (CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptoTransform, CryptoStreamMode.Read)) - { - using (StreamReader streamReader = new StreamReader(cryptoStream)) - { - text = streamReader.ReadToEnd(); - } - } - } - return text; - } - - // Token: 0x06000246 RID: 582 RVA: 0x00016E90 File Offset: 0x00015090 - public static string Base64Encode(string plainText) - { - byte[] bytes = Encoding.UTF8.GetBytes(plainText); - return Convert.ToBase64String(bytes); - } - - // Token: 0x06000247 RID: 583 RVA: 0x00016EB4 File Offset: 0x000150B4 - public static string Base64Decode(string base64EncodedData) - { - byte[] array = Convert.FromBase64String(base64EncodedData); - return Encoding.UTF8.GetString(array); - } - - // Token: 0x06000248 RID: 584 RVA: 0x00016ED8 File Offset: 0x000150D8 - public static bool IsBase64String(string base64String) - { - base64String = base64String.Trim(); - return base64String.Length % 4 == 0 && Regex.IsMatch(base64String, "^[a-zA-Z0-9\\+/]*={0,3}$", RegexOptions.None); - } - - // Token: 0x06000249 RID: 585 RVA: 0x00016F0C File Offset: 0x0001510C - public static string ComputeMD5(string rawData) - { - bool flag = rawData == null || rawData.Length == 0; - string text; - if (flag) - { - text = string.Empty; - } - else - { - MD5 md = new MD5CryptoServiceProvider(); - byte[] bytes = Encoding.Default.GetBytes(rawData); - byte[] array = md.ComputeHash(bytes); - text = BitConverter.ToString(array).Replace("-", "").ToLowerInvariant(); - } - return text; - } - - // Token: 0x0600024A RID: 586 RVA: 0x00016F74 File Offset: 0x00015174 - public static string ComputeSHA1(string rawData) - { - string text; - using (SHA1Managed sha1Managed = new SHA1Managed()) - { - byte[] array = sha1Managed.ComputeHash(Encoding.UTF8.GetBytes(rawData)); - StringBuilder stringBuilder = new StringBuilder(array.Length * 2); - foreach (byte b in array) - { - stringBuilder.Append(b.ToString("x2")); - } - text = stringBuilder.ToString(); - } - return text; - } - - // Token: 0x0600024B RID: 587 RVA: 0x00017000 File Offset: 0x00015200 - public static string ComputeSHA256(string rawData) - { - string text; - using (SHA256 sha = SHA256.Create()) - { - byte[] array = sha.ComputeHash(Encoding.UTF8.GetBytes(rawData)); - StringBuilder stringBuilder = new StringBuilder(); - for (int i = 0; i < array.Length; i++) - { - stringBuilder.Append(array[i].ToString("x2")); - } - text = stringBuilder.ToString(); - } - return text; - } - - // Token: 0x0600024C RID: 588 RVA: 0x00017084 File Offset: 0x00015284 - private static RijndaelManaged NewRijndaelManaged(string salt) - { - bool flag = salt == null; - if (flag) - { - throw new ArgumentNullException("salt"); - } - byte[] bytes = Encoding.ASCII.GetBytes(salt); - Rfc2898DeriveBytes rfc2898DeriveBytes = new Rfc2898DeriveBytes(Resources.SHA, bytes); - RijndaelManaged rijndaelManaged = new RijndaelManaged(); - rijndaelManaged.Key = rfc2898DeriveBytes.GetBytes(rijndaelManaged.KeySize / 8); - rijndaelManaged.IV = rfc2898DeriveBytes.GetBytes(rijndaelManaged.BlockSize / 8); - return rijndaelManaged; - } - } -} diff --git a/Bunifu.Licensing/Helpers/Hardware.cs b/Bunifu.Licensing/Helpers/Hardware.cs deleted file mode 100644 index 88c0de3..0000000 --- a/Bunifu.Licensing/Helpers/Hardware.cs +++ /dev/null @@ -1,252 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Globalization; -using System.Management; -using System.Security.Cryptography; -using System.Text; - -namespace Bunifu.Licensing.Helpers -{ - // Token: 0x02000034 RID: 52 - [DebuggerStepThrough] - internal sealed class Hardware - { - // Token: 0x0600024E RID: 590 RVA: 0x00017100 File Offset: 0x00015300 - public static string GetUniqueID() - { - return Hardware.Value(); - } - - // Token: 0x0600024F RID: 591 RVA: 0x00017118 File Offset: 0x00015318 - public static string GetOSSerial() - { - ManagementObject managementObject = new ManagementObject("Win32_OperatingSystem=@"); - return (string)managementObject["SerialNumber"]; - } - - // Token: 0x06000250 RID: 592 RVA: 0x00017148 File Offset: 0x00015348 - public static string GetOSName() - { - string text = string.Empty; - try - { - ManagementObjectSearcher managementObjectSearcher = new ManagementObjectSearcher("SELECT Caption FROM Win32_OperatingSystem"); - using (ManagementObjectCollection.ManagementObjectEnumerator enumerator = managementObjectSearcher.Get().GetEnumerator()) - { - if (enumerator.MoveNext()) - { - ManagementObject managementObject = (ManagementObject)enumerator.Current; - text = managementObject["Caption"].ToString(); - } - } - } - catch (Exception) - { - } - return text; - } - - // Token: 0x06000251 RID: 593 RVA: 0x000171D8 File Offset: 0x000153D8 - public override string ToString() - { - return Hardware.Value(); - } - - // Token: 0x06000252 RID: 594 RVA: 0x000171F0 File Offset: 0x000153F0 - private static string Value() - { - bool flag = string.IsNullOrEmpty(Hardware._fingerPrint); - if (flag) - { - Hardware._fingerPrint = Hardware.GetHash(string.Concat(new string[] - { - "CPU >> ", - Hardware.CpuId(), - "\nBIOS >> ", - Hardware.BiosId(), - "\nBASE >> ", - Hardware.BaseId(), - "\nVIDEO >> ", - Hardware.VideoId() - })); - } - return Hardware._fingerPrint; - } - - // Token: 0x06000253 RID: 595 RVA: 0x0001726C File Offset: 0x0001546C - private static string GetHash(string s) - { - MD5 md = new MD5CryptoServiceProvider(); - byte[] bytes = Encoding.ASCII.GetBytes(s); - return Hardware.GetHexString(md.ComputeHash(bytes)); - } - - // Token: 0x06000254 RID: 596 RVA: 0x0001729C File Offset: 0x0001549C - private static string GetHexString(IList bt) - { - string text = string.Empty; - for (int i = 0; i < bt.Count; i++) - { - byte b = bt[i]; - int num = (int)b; - int num2 = num & 15; - int num3 = (num >> 4) & 15; - bool flag = num3 > 9; - if (flag) - { - text += ((char)(num3 - 10 + 65)).ToString(CultureInfo.InvariantCulture); - } - else - { - text += num3.ToString(CultureInfo.InvariantCulture); - } - bool flag2 = num2 > 9; - if (flag2) - { - text += ((char)(num2 - 10 + 65)).ToString(CultureInfo.InvariantCulture); - } - else - { - text += num2.ToString(CultureInfo.InvariantCulture); - } - bool flag3 = i + 1 != bt.Count && (i + 1) % 2 == 0; - if (flag3) - { - text += "-"; - } - } - return text; - } - - // Token: 0x06000255 RID: 597 RVA: 0x00017394 File Offset: 0x00015594 - private static string Identifier(string wmiClass, string wmiProperty, string wmiMustBeTrue) - { - string text = ""; - ManagementClass managementClass = new ManagementClass(wmiClass); - ManagementObjectCollection instances = managementClass.GetInstances(); - foreach (ManagementBaseObject managementBaseObject in instances) - { - bool flag = managementBaseObject[wmiMustBeTrue].ToString() != "True"; - if (!flag) - { - bool flag2 = text != ""; - if (!flag2) - { - try - { - text = managementBaseObject[wmiProperty].ToString(); - break; - } - catch - { - } - } - } - } - return text; - } - - // Token: 0x06000256 RID: 598 RVA: 0x0001744C File Offset: 0x0001564C - private static string Identifier(string wmiClass, string wmiProperty) - { - string text = ""; - ManagementClass managementClass = new ManagementClass(wmiClass); - ManagementObjectCollection instances = managementClass.GetInstances(); - foreach (ManagementBaseObject managementBaseObject in instances) - { - bool flag = text != ""; - if (!flag) - { - try - { - bool flag2 = managementBaseObject[wmiProperty] != null; - if (flag2) - { - text = managementBaseObject[wmiProperty].ToString(); - } - break; - } - catch - { - } - } - } - return text; - } - - // Token: 0x06000257 RID: 599 RVA: 0x000174F8 File Offset: 0x000156F8 - private static string CpuId() - { - string text = Hardware.Identifier("Win32_Processor", "UniqueId"); - bool flag = text != ""; - string text2; - if (flag) - { - text2 = text; - } - else - { - text = Hardware.Identifier("Win32_Processor", "ProcessorId"); - bool flag2 = text != ""; - if (flag2) - { - text2 = text; - } - else - { - text = Hardware.Identifier("Win32_Processor", "Name"); - bool flag3 = text == ""; - if (flag3) - { - text = Hardware.Identifier("Win32_Processor", "Manufacturer"); - } - text += Hardware.Identifier("Win32_Processor", "MaxClockSpeed"); - text2 = text; - } - } - return text2; - } - - // Token: 0x06000258 RID: 600 RVA: 0x00017598 File Offset: 0x00015798 - private static string BiosId() - { - return string.Concat(new string[] - { - Hardware.Identifier("Win32_BIOS", "Manufacturer"), - Hardware.Identifier("Win32_BIOS", "SMBIOSBIOSVersion"), - Hardware.Identifier("Win32_BIOS", "IdentificationCode"), - Hardware.Identifier("Win32_BIOS", "SerialNumber"), - Hardware.Identifier("Win32_BIOS", "ReleaseDate"), - Hardware.Identifier("Win32_BIOS", "Version") - }); - } - - // Token: 0x06000259 RID: 601 RVA: 0x00017624 File Offset: 0x00015824 - private static string DiskId() - { - return Hardware.Identifier("Win32_DiskDrive", "Model") + Hardware.Identifier("Win32_DiskDrive", "Manufacturer") + Hardware.Identifier("Win32_DiskDrive", "Signature") + Hardware.Identifier("Win32_DiskDrive", "TotalHeads"); - } - - // Token: 0x0600025A RID: 602 RVA: 0x00017678 File Offset: 0x00015878 - private static string BaseId() - { - return Hardware.Identifier("Win32_BaseBoard", "Model") + Hardware.Identifier("Win32_BaseBoard", "Manufacturer") + Hardware.Identifier("Win32_BaseBoard", "Name") + Hardware.Identifier("Win32_BaseBoard", "SerialNumber"); - } - - // Token: 0x0600025B RID: 603 RVA: 0x000176CC File Offset: 0x000158CC - private static string VideoId() - { - return Hardware.Identifier("Win32_VideoController", "DriverVersion") + Hardware.Identifier("Win32_VideoController", "Name"); - } - - // Token: 0x0600025C RID: 604 RVA: 0x00017704 File Offset: 0x00015904 - private static string MacId() - { - return Hardware.Identifier("Win32_NetworkAdapterConfiguration", "MACAddress", "IPEnabled"); - } - - // Token: 0x04000187 RID: 391 - private static string _fingerPrint = string.Empty; - } -} diff --git a/Bunifu.Licensing/Helpers/InternetTime.cs b/Bunifu.Licensing/Helpers/InternetTime.cs deleted file mode 100644 index ddb662b..0000000 --- a/Bunifu.Licensing/Helpers/InternetTime.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System; -using System.Diagnostics; -using System.Globalization; -using System.Net; - -namespace Bunifu.Licensing.Helpers -{ - // Token: 0x02000035 RID: 53 - [DebuggerStepThrough] - internal sealed class InternetTime - { - // Token: 0x0600025F RID: 607 RVA: 0x00017740 File Offset: 0x00015940 - public static DateTime GetDateTime() - { - DateTime dateTime; - try - { - using (WebResponse response = WebRequest.Create("http://www.google.com").GetResponse()) - { - dateTime = DateTime.ParseExact(response.Headers["date"], "ddd, dd MMM yyyy HH:mm:ss 'GMT'", CultureInfo.InvariantCulture.DateTimeFormat, DateTimeStyles.AssumeUniversal); - } - } - catch (WebException) - { - dateTime = DateTime.Now; - } - return dateTime; - } - } -} diff --git a/Bunifu.Licensing/Helpers/Logger.cs b/Bunifu.Licensing/Helpers/Logger.cs deleted file mode 100644 index fa81170..0000000 --- a/Bunifu.Licensing/Helpers/Logger.cs +++ /dev/null @@ -1,69 +0,0 @@ -#if NET5_0_OR_NETFRAMEWORK -using System.Runtime.CompilerServices; -#endif -using System; -using System.Diagnostics; -using System.IO; -using System.Runtime.CompilerServices; -using System.Text; -using Bunifu.Licensing.Options; - -namespace Bunifu.Licensing.Helpers -{ - // Token: 0x02000036 RID: 54 - [DebuggerStepThrough] - internal static class Logger - { - // Token: 0x06000261 RID: 609 RVA: 0x000177C8 File Offset: 0x000159C8 - public static bool Add(string message) - { - bool flag2; - try - { - DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(8, 2); - defaultInterpolatedStringHandler.AppendFormatted(Registry.FolderPath); - defaultInterpolatedStringHandler.AppendFormatted(LicenseValidator.Product); - defaultInterpolatedStringHandler.AppendLiteral("\\Log.txt"); - string text = defaultInterpolatedStringHandler.ToStringAndClear(); - Registry.Licensing.CreateDirectoryIfNoneExists(LicenseValidator.Product.ToString()); - bool flag = !File.Exists(text); - if (flag) - { - File.WriteAllText(text, string.Empty); - } - using (StreamWriter streamWriter = File.AppendText(text)) - { - streamWriter.WriteLine("[" + DateTime.Now.ToString("dd/MM/yy hh:mm:ss") + "] " + message); - } - flag2 = true; - } - catch (Exception) - { - flag2 = false; - } - return flag2; - } - - // Token: 0x06000262 RID: 610 RVA: 0x000178B0 File Offset: 0x00015AB0 - public static bool Clear() - { - bool flag; - try - { - DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(8, 2); - defaultInterpolatedStringHandler.AppendFormatted(Registry.FolderPath); - defaultInterpolatedStringHandler.AppendFormatted(LicenseValidator.Product); - defaultInterpolatedStringHandler.AppendLiteral("\\Log.txt"); - string text = defaultInterpolatedStringHandler.ToStringAndClear(); - Registry.Licensing.CreateDirectoryIfNoneExists(LicenseValidator.Product.ToString()); - File.WriteAllText(text, string.Empty); - flag = true; - } - catch (Exception) - { - flag = false; - } - return flag; - } - } -} diff --git a/Bunifu.Licensing/Helpers/Network.cs b/Bunifu.Licensing/Helpers/Network.cs deleted file mode 100644 index 64dfe54..0000000 --- a/Bunifu.Licensing/Helpers/Network.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System; -using System.Diagnostics; -using System.Net.NetworkInformation; -using System.Runtime.InteropServices; - -namespace Bunifu.Licensing.Helpers -{ - // Token: 0x02000037 RID: 55 - [DebuggerStepThrough] - internal sealed class Network - { - // Token: 0x06000263 RID: 611 - [DllImport("wininet.dll")] - private static extern bool InternetGetConnectedState(out int Description, int ReservedValue); - - // Token: 0x06000264 RID: 612 RVA: 0x00017938 File Offset: 0x00015B38 - public static bool IsAvailable() - { - int num; - return Network.InternetGetConnectedState(out num, 0); - } - - // Token: 0x06000265 RID: 613 RVA: 0x00017954 File Offset: 0x00015B54 - public static bool IsAvailable(long minimumSpeed) - { - bool flag = !NetworkInterface.GetIsNetworkAvailable(); - bool flag2; - if (flag) - { - flag2 = false; - } - else - { - foreach (NetworkInterface networkInterface in NetworkInterface.GetAllNetworkInterfaces()) - { - bool flag3 = networkInterface.OperationalStatus != OperationalStatus.Up || networkInterface.NetworkInterfaceType == NetworkInterfaceType.Loopback || networkInterface.NetworkInterfaceType == NetworkInterfaceType.Tunnel; - if (!flag3) - { - bool flag4 = networkInterface.Speed < minimumSpeed; - if (!flag4) - { - bool flag5 = networkInterface.Description.IndexOf("virtual", StringComparison.OrdinalIgnoreCase) >= 0 || networkInterface.Name.IndexOf("virtual", StringComparison.OrdinalIgnoreCase) >= 0; - if (!flag5) - { - bool flag6 = networkInterface.Description.Equals("Microsoft Loopback Adapter", StringComparison.OrdinalIgnoreCase); - if (!flag6) - { - return true; - } - } - } - } - } - flag2 = false; - } - return flag2; - } - } -} diff --git a/Bunifu.Licensing/Helpers/Registry.cs b/Bunifu.Licensing/Helpers/Registry.cs deleted file mode 100644 index c5f2fb0..0000000 --- a/Bunifu.Licensing/Helpers/Registry.cs +++ /dev/null @@ -1,581 +0,0 @@ -#if NET5_0_OR_NETFRAMEWORK -using System.Runtime.CompilerServices; -#endif -using System; -using System.Diagnostics; -using System.IO; -using System.Runtime.CompilerServices; -using System.Text; -using Bunifu.Licensing.Models; -using Bunifu.Licensing.Options; -using Bunifu.Licensing.Properties; -using Bunifu.Licensing.Views; -using Microsoft.Win32; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; - -namespace Bunifu.Licensing.Helpers -{ - // Token: 0x02000038 RID: 56 - [DebuggerStepThrough] - internal sealed class Registry - { - // Token: 0x04000188 RID: 392 - private static int _UIUpgradeCalls = 0; - - // Token: 0x04000189 RID: 393 - private static int _DBUpgradeCalls = 0; - - // Token: 0x0400018A RID: 394 - private static int _DAUpgradeCalls = 0; - - // Token: 0x0400018B RID: 395 - private static string RegistryPath = "Software\\"; - - // Token: 0x0400018C RID: 396 - public static string FolderPath = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + "\\Bunifu Technologies\\"; - - // Token: 0x0200004B RID: 75 - public static class Base - { - // Token: 0x06000289 RID: 649 RVA: 0x00018184 File Offset: 0x00016384 - public static void SaveValue(string company, string product, string key, object value) - { - try - { - string text = Registry.RegistryPath; - bool flag = !string.IsNullOrEmpty(company); - if (flag) - { - text = text + company + "\\"; - } - text += product; - RegistryKey registryKey = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(text); - registryKey.SetValue(key, value.ToString()); - } - catch (Exception) - { - } - } - - // Token: 0x0600028A RID: 650 RVA: 0x000181F0 File Offset: 0x000163F0 - public static string GetValue(string company, string product, string key) - { - string text2; - try - { - string text = Registry.RegistryPath; - bool flag = !string.IsNullOrEmpty(company); - if (flag) - { - text = text + company + "\\"; - } - text += product; - RegistryKey registryKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(text); - bool flag2 = registryKey != null; - if (flag2) - { - text2 = registryKey.GetValue(key).ToString(); - } - else - { - text2 = ""; - } - } - catch (Exception) - { - text2 = ""; - } - return text2; - } - - // Token: 0x0600028B RID: 651 RVA: 0x00018274 File Offset: 0x00016474 - public static bool DeleteValue(string company, string product, string key) - { - bool flag3; - try - { - string text = Registry.RegistryPath; - bool flag = !string.IsNullOrEmpty(company); - if (flag) - { - text = text + company + "\\"; - } - text += product; - using (RegistryKey registryKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(text, true)) - { - bool flag2 = registryKey != null; - if (flag2) - { - registryKey.DeleteValue(key); - } - } - flag3 = true; - } - catch (Exception) - { - flag3 = false; - } - return flag3; - } - } - - // Token: 0x0200004C RID: 76 - public static class Options - { - // Token: 0x0600028C RID: 652 RVA: 0x00018308 File Offset: 0x00016508 - public static bool SaveLastNotificationTime(ProductTypes product, DateTime notificationTime) - { - bool flag; - try - { - Registry.Base.SaveValue(Resources.CPA, product.ToString(), "LNT", Registry.Options.Base64Encode(notificationTime.ToString())); - flag = true; - } - catch (Exception) - { - flag = false; - } - return flag; - } - - // Token: 0x0600028D RID: 653 RVA: 0x0001835C File Offset: 0x0001655C - public static DateTime GetLastNotificationTime(ProductTypes product) - { - DateTime dateTime; - try - { - string text = Registry.Base.GetValue(Resources.CPA, product.ToString(), "LNT"); - text = Registry.Options.Base64Decode(text); - dateTime = Convert.ToDateTime(text); - } - catch (Exception) - { - dateTime = DateTime.Now.AddDays(-1.0); - } - return dateTime; - } - - // Token: 0x0600028E RID: 654 RVA: 0x000183C4 File Offset: 0x000165C4 - private static string Base64Encode(string plainText) - { - byte[] bytes = Encoding.UTF8.GetBytes(plainText); - return Convert.ToBase64String(bytes); - } - - // Token: 0x0600028F RID: 655 RVA: 0x000183E8 File Offset: 0x000165E8 - private static string Base64Decode(string base64EncodedData) - { - byte[] array = Convert.FromBase64String(base64EncodedData); - return Encoding.UTF8.GetString(array); - } - } - - // Token: 0x0200004D RID: 77 - public static class Licensing - { - // Token: 0x06000290 RID: 656 RVA: 0x0001840C File Offset: 0x0001660C - public static Record GetLicense(ProductTypes product) - { - Record record2; - try - { - Logger.Add("Validating any installed licenses..."); - string text = Registry.Base.GetValue(Resources.CPA, product.ToString(), "CLI"); - text = Cryptography.Decrypt(text); - Logger.Add("Valid product license found."); - Logger.Add("License validated successfully."); - bool flag = false; - bool flag2 = false; - Record record = new Record(); - string text2 = string.Empty; - bool flag3 = flag; - if (flag3) - { - Logger.Add("Checking license version..."); - try - { - JObject jobject = JObject.Parse(text); - bool flag4 = jobject["HardwareID"] != null; - if (flag4) - { - text2 = jobject["HardwareID"].ToString(); - } - bool flag5 = text2 != null || !string.IsNullOrEmpty(text2); - if (flag5) - { - Logger.Add("License verified as v1. Requesting for upgrade..."); - bool flag6 = product == ProductTypes.UIWinForms && Registry._UIUpgradeCalls == 0; - if (flag6) - { - flag2 = true; - } - else - { - bool flag7 = product == ProductTypes.DatavizBasicWinForms && Registry._DBUpgradeCalls == 0; - if (flag7) - { - flag2 = true; - } - else - { - bool flag8 = product == ProductTypes.DatavizAdvancedWinForms && Registry._DAUpgradeCalls == 0; - if (flag8) - { - flag2 = true; - } - } - } - bool flag9 = flag2; - if (flag9) - { - bool flag10 = LicenseValidator.GetHardwareID() == text2; - if (flag10) - { - v1License v1License = JsonConvert.DeserializeObject(text); - v1License._licenseKey = JObject.Parse(text).SelectToken("LicenseKey").ToString(); - bool flag11 = InformationBoxHelper.Show("We recently updated our client licensing and are about to upgrade your old license to the newly updated license format in this device.", "New Licensing Upgrade", "", InformationBox.InformationBoxIcons.Information, "Upgrade", ""); - Logger.Add("Upgrade started..."); - bool flag12 = product == ProductTypes.UIWinForms; - if (flag12) - { - Registry._UIUpgradeCalls++; - } - else - { - bool flag13 = product == ProductTypes.DatavizBasicWinForms; - if (flag13) - { - Registry._DBUpgradeCalls++; - } - else - { - bool flag14 = product == ProductTypes.DatavizAdvancedWinForms; - if (flag14) - { - Registry._DAUpgradeCalls++; - } - } - } - bool flag15 = flag11; - if (flag15) - { - Logger.Add("License v2 activation upgrade starting..."); - ActivationResults activationResults = LicenseValidator.Activate(v1License.Email, v1License._licenseKey); - bool flag16 = activationResults == ActivationResults.Success; - if (flag16) - { - Logger.Add("License successfully upgraded to v2."); - record = LicenseValidator.RetrievedLicense; - try - { - DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(24, 2); - defaultInterpolatedStringHandler.AppendFormatted(Registry.FolderPath); - defaultInterpolatedStringHandler.AppendFormatted(product); - defaultInterpolatedStringHandler.AppendLiteral("\\License Information.txt"); - string text3 = defaultInterpolatedStringHandler.ToStringAndClear(); - defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(12, 2); - defaultInterpolatedStringHandler.AppendFormatted(Registry.FolderPath); - defaultInterpolatedStringHandler.AppendFormatted(record.License.Product); - defaultInterpolatedStringHandler.AppendLiteral("\\License.lic"); - string text4 = defaultInterpolatedStringHandler.ToStringAndClear(); - Registry.Licensing.CreateDirectoryIfNoneExists(product.ToString()); - Registry.Licensing.UpdateLicenseFile(text3, text4, record); - InformationBoxHelper.Show("Your license has been successfully upgraded.Happy coding!", "License Upgrade Successful", "", InformationBox.InformationBoxIcons.Information, "Okay", ""); - } - catch (Exception) - { - } - } - else - { - Logger.Add("License upgraded failed."); - record = new Record - { - IsValid = false - }; - bool flag17 = InformationBoxHelper.Show(LicenseValidator.ResponseError, "Upgrade Failed", "", InformationBox.InformationBoxIcons.Warning, "Okay", ""); - } - } - } - } - } - else - { - Logger.Add("License verified as v2."); - Logger.Add("License validation passed."); - } - } - catch (Exception ex) - { - Logger.Add("Exception L1: " + ex.Message); - } - } - try - { - record = JsonConvert.DeserializeObject(text); - record._licenseKey = JObject.Parse(text).SelectToken("LicenseKey").ToString(); - try - { - DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(24, 2); - defaultInterpolatedStringHandler.AppendFormatted(Registry.FolderPath); - defaultInterpolatedStringHandler.AppendFormatted(product); - defaultInterpolatedStringHandler.AppendLiteral("\\License Information.txt"); - string text5 = defaultInterpolatedStringHandler.ToStringAndClear(); - defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(12, 2); - defaultInterpolatedStringHandler.AppendFormatted(Registry.FolderPath); - defaultInterpolatedStringHandler.AppendFormatted(record.License.Product); - defaultInterpolatedStringHandler.AppendLiteral("\\License.lic"); - string text6 = defaultInterpolatedStringHandler.ToStringAndClear(); - Registry.Licensing.CreateDirectoryIfNoneExists(product.ToString()); - Registry.Licensing.UpdateLicenseFile(text5, text6, record); - } - catch (Exception ex2) - { - Logger.Add("Exception L2: " + ex2.Message); - } - } - catch (Exception ex3) - { - Logger.Add("Exception L3: " + ex3.Message); - Registry.Licensing.DeleteLicense(product, false); - record = new Record - { - IsValid = false - }; - } - record2 = record; - } - catch (Exception ex4) - { - Logger.Add("Exception L4: " + ex4.Message); - Registry.Licensing.DeleteLicense(product, false); - record2 = Registry.Licensing.GetBackupLicense(product); - } - return record2; - } - - // Token: 0x06000291 RID: 657 RVA: 0x0001892C File Offset: 0x00016B2C - public static void SaveLicense(Record license) - { - try - { - bool isValid = license.IsValid; - if (isValid) - { - Registry.Base.SaveValue(Resources.CPA, license.License.Product.ToString(), "CLI", Cryptography.Encrypt(JsonConvert.SerializeObject(license))); - try - { - DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(24, 2); - defaultInterpolatedStringHandler.AppendFormatted(Registry.FolderPath); - defaultInterpolatedStringHandler.AppendFormatted(license.License.Product); - defaultInterpolatedStringHandler.AppendLiteral("\\License Information.txt"); - string text = defaultInterpolatedStringHandler.ToStringAndClear(); - defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(12, 2); - defaultInterpolatedStringHandler.AppendFormatted(Registry.FolderPath); - defaultInterpolatedStringHandler.AppendFormatted(license.License.Product); - defaultInterpolatedStringHandler.AppendLiteral("\\License.lic"); - string text2 = defaultInterpolatedStringHandler.ToStringAndClear(); - Registry.Licensing.CreateDirectoryIfNoneExists(license.License.Product.ToString()); - Registry.Licensing.UpdateLicenseFile(text, text2, license); - } - catch (Exception) - { - } - } - } - catch (Exception) - { - } - } - - // Token: 0x06000292 RID: 658 RVA: 0x00018A54 File Offset: 0x00016C54 - public static bool DeleteLicense(ProductTypes product, bool deleteLicenseInfoFile) - { - if (deleteLicenseInfoFile) - { - Registry.Licensing.DeleteDirectoryIfExists(product.ToString()); - } - return Registry.Base.DeleteValue(Resources.CPA, product.ToString(), "CLI"); - } - - // Token: 0x06000293 RID: 659 RVA: 0x00018A9C File Offset: 0x00016C9C - public static void CreateDirectoryIfNoneExists(string product) - { - try - { - string text = Registry.FolderPath + product + "\\"; - bool flag = !Directory.Exists(text); - if (flag) - { - Directory.CreateDirectory(text); - } - } - catch (Exception) - { - } - } - - // Token: 0x06000294 RID: 660 RVA: 0x00018AE8 File Offset: 0x00016CE8 - private static void DeleteDirectoryIfExists(string product) - { - try - { - string text = Registry.FolderPath + product + "\\"; - bool flag = Directory.Exists(text); - if (flag) - { - Directory.Delete(text, true); - } - } - catch (Exception) - { - } - } - - // Token: 0x06000295 RID: 661 RVA: 0x00018B34 File Offset: 0x00016D34 - private static void UpdateLicenseFile(string licenseFile, string backupLicense, Record license) - { - try - { - string text = license.License.TotalDays.ToString(); - string text2 = license.License.RemainingDays.ToString(); - string text3 = license.License.ExpiryDate.ToString("dddd, MMMM dd, yyyy"); - bool flag = license.License.Type == LicenseTypes.Enterprise; - if (flag) - { - text = "Unlimited"; - text2 = "Unlimited"; - text3 = "Perpetual"; - } - File.WriteAllText(backupLicense, Cryptography.Encrypt(JsonConvert.SerializeObject(license))); - DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(84, 7); - defaultInterpolatedStringHandler.AppendLiteral("Product: "); - defaultInterpolatedStringHandler.AppendFormatted(license.License.Product); - defaultInterpolatedStringHandler.AppendLiteral("\n"); - defaultInterpolatedStringHandler.AppendLiteral("Email: "); - defaultInterpolatedStringHandler.AppendFormatted(license.Client.Email); - defaultInterpolatedStringHandler.AppendLiteral("\n"); - defaultInterpolatedStringHandler.AppendLiteral("Status: "); - defaultInterpolatedStringHandler.AppendFormatted(license.License.Status); - defaultInterpolatedStringHandler.AppendLiteral("\n"); - defaultInterpolatedStringHandler.AppendLiteral("Activations: "); - defaultInterpolatedStringHandler.AppendFormatted(license.License.MaxDevices); - defaultInterpolatedStringHandler.AppendLiteral("\n"); - defaultInterpolatedStringHandler.AppendLiteral("Total Days: "); - defaultInterpolatedStringHandler.AppendFormatted(text); - defaultInterpolatedStringHandler.AppendLiteral("\n"); - defaultInterpolatedStringHandler.AppendLiteral("Remaining Days: "); - defaultInterpolatedStringHandler.AppendFormatted(text2); - defaultInterpolatedStringHandler.AppendLiteral("\n"); - defaultInterpolatedStringHandler.AppendLiteral("Expiry Date: "); - defaultInterpolatedStringHandler.AppendFormatted(text3); - File.WriteAllText(licenseFile, defaultInterpolatedStringHandler.ToStringAndClear()); - } - catch (Exception) - { - } - } - - // Token: 0x06000296 RID: 662 RVA: 0x00018D0C File Offset: 0x00016F0C - private static Record GetBackupLicense(ProductTypes product) - { - Record record2; - try - { - DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(12, 2); - defaultInterpolatedStringHandler.AppendFormatted(Registry.FolderPath); - defaultInterpolatedStringHandler.AppendFormatted(product); - defaultInterpolatedStringHandler.AppendLiteral("\\License.lic"); - string text = defaultInterpolatedStringHandler.ToStringAndClear(); - bool flag = File.Exists(text); - if (flag) - { - string text2 = Cryptography.Decrypt(File.ReadAllText(text)); - Record record = JsonConvert.DeserializeObject(text2); - record._licenseKey = JObject.Parse(text2).SelectToken("LicenseKey").ToString(); - Registry.Base.SaveValue(Resources.CPA, record.License.Product.ToString(), "CLI", Cryptography.Encrypt(JsonConvert.SerializeObject(record))); - record2 = record; - } - else - { - record2 = new Record - { - IsValid = false - }; - } - } - catch (Exception) - { - record2 = new Record - { - IsValid = false - }; - } - return record2; - } - - // Token: 0x06000297 RID: 663 RVA: 0x00018E00 File Offset: 0x00017000 - public static bool sMDed() - { - bool flag2; - try - { - string text = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + "\\" + Resources.XLD + "\\"; - string text2 = text + Resources.XLF; - bool flag = !Directory.Exists(text); - if (flag) - { - Directory.CreateDirectory(text); - } - File.WriteAllText(text2, Cryptography.Encrypt(Resources.XLV)); - flag2 = true; - } - catch (Exception) - { - flag2 = false; - } - return flag2; - } - - // Token: 0x06000298 RID: 664 RVA: 0x00018E78 File Offset: 0x00017078 - public static bool xMDed() - { - bool flag4; - try - { - string text = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + "\\" + Resources.XLD + "\\"; - string text2 = text + Resources.XLF; - bool flag = !Directory.Exists(text); - if (flag) - { - Directory.CreateDirectory(text); - } - bool flag2 = File.Exists(text2); - if (flag2) - { - string text3 = Cryptography.Decrypt(File.ReadAllText(text2)); - bool flag3 = text3 == Resources.XLV; - if (flag3) - { - flag4 = true; - } - else - { - flag4 = false; - } - } - else - { - flag4 = false; - } - } - catch (Exception) - { - flag4 = false; - } - return flag4; - } - } - } -} diff --git a/Bunifu.Licensing/Helpers/Shadower.cs b/Bunifu.Licensing/Helpers/Shadower.cs deleted file mode 100644 index 7bf4b37..0000000 --- a/Bunifu.Licensing/Helpers/Shadower.cs +++ /dev/null @@ -1,135 +0,0 @@ -using System; -using System.ComponentModel; -using System.Diagnostics; -using System.Runtime.InteropServices; -using System.Windows.Forms; - -namespace Bunifu.Licensing.Helpers -{ - // Token: 0x02000039 RID: 57 - [DebuggerStepThrough] - internal static class Shadower - { - // Token: 0x06000269 RID: 617 - [EditorBrowsable(EditorBrowsableState.Never)] - [DllImport("dwmapi.dll")] - public static extern int DwmExtendFrameIntoClientArea(IntPtr hWnd, ref Shadower.MARGINS pMarInset); - - // Token: 0x0600026A RID: 618 - [EditorBrowsable(EditorBrowsableState.Never)] - [DllImport("dwmapi.dll")] - public static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int attrValue, int attrSize); - - // Token: 0x0600026B RID: 619 - [EditorBrowsable(EditorBrowsableState.Never)] - [DllImport("dwmapi.dll")] - public static extern int DwmIsCompositionEnabled(ref int pfEnabled); - - // Token: 0x0600026C RID: 620 RVA: 0x00017A78 File Offset: 0x00015C78 - [EditorBrowsable(EditorBrowsableState.Never)] - public static bool IsCompositionEnabled() - { - bool flag = Environment.OSVersion.Version.Major < 6; - bool flag2; - if (flag) - { - flag2 = false; - } - else - { - bool flag3; - Shadower.DwmIsCompositionEnabled(out flag3); - flag2 = flag3; - } - return flag2; - } - - // Token: 0x0600026D RID: 621 RVA: 0x00017AB0 File Offset: 0x00015CB0 - public static void ApplyShadows(Form form) - { - int num = 2; - Shadower.DwmSetWindowAttribute(form.Handle, 2, ref num, 4); - Shadower.MARGINS margins = new Shadower.MARGINS - { - bottomHeight = 1, - leftWidth = 0, - rightWidth = 0, - topHeight = 0 - }; - Shadower.DwmExtendFrameIntoClientArea(form.Handle, ref margins); - } - - // Token: 0x0600026E RID: 622 RVA: 0x00017B08 File Offset: 0x00015D08 - public static bool IsAeroEnabled() - { - bool flag = Environment.OSVersion.Version.Major >= 6; - bool flag2; - if (flag) - { - int num = 0; - Shadower.DwmIsCompositionEnabled(ref num); - flag2 = num == 1; - } - else - { - flag2 = false; - } - return flag2; - } - - // Token: 0x0600026F RID: 623 - [DllImport("dwmapi.dll")] - private static extern int DwmIsCompositionEnabled(out bool enabled); - - // Token: 0x06000270 RID: 624 - [DllImport("Gdi32.dll")] - private static extern IntPtr CreateRoundRectRgn(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect, int nWidthEllipse, int nHeightEllipse); - - // Token: 0x0400018D RID: 397 - private static bool _isAeroEnabled; - - // Token: 0x0400018E RID: 398 - private static bool _isDraggingEnabled; - - // Token: 0x0400018F RID: 399 - private const int WM_NCHITTEST = 132; - - // Token: 0x04000190 RID: 400 - private const int WS_MINIMIZEBOX = 131072; - - // Token: 0x04000191 RID: 401 - private const int HTCLIENT = 1; - - // Token: 0x04000192 RID: 402 - private const int HTCAPTION = 2; - - // Token: 0x04000193 RID: 403 - private const int CS_DBLCLKS = 8; - - // Token: 0x04000194 RID: 404 - private const int CS_DROPSHADOW = 131072; - - // Token: 0x04000195 RID: 405 - private const int WM_NCPAINT = 133; - - // Token: 0x04000196 RID: 406 - private const int WM_ACTIVATEAPP = 28; - - // Token: 0x0200004E RID: 78 - [EditorBrowsable(EditorBrowsableState.Never)] - public struct MARGINS - { - // Token: 0x040001DD RID: 477 - public int leftWidth; - - // Token: 0x040001DE RID: 478 - public int rightWidth; - - // Token: 0x040001DF RID: 479 - public int topHeight; - - // Token: 0x040001E0 RID: 480 - public int bottomHeight; - } - } -} diff --git a/Bunifu.Licensing/LicenseBypass.cs b/Bunifu.Licensing/LicenseBypass.cs deleted file mode 100644 index e8cd91a..0000000 --- a/Bunifu.Licensing/LicenseBypass.cs +++ /dev/null @@ -1,70 +0,0 @@ -#if SKIP_LICENSE_CHECK -using System; -using System.Collections.Generic; -using System.ComponentModel; -using Bunifu.Licensing.Models; -using Bunifu.Licensing.Options; - -namespace Bunifu.Licensing -{ - /// - /// Helper class for creating fake licenses when SKIP_LICENSE_CHECK is defined - /// - internal static class LicenseBypass - { - /// - /// Creates a fake license for the given product - /// - internal static License CreateFakeLicense(ProductTypes product) - { - // Create a fake record with valid license data - Record fakeRecord = new Record(); - fakeRecord.IsValid = true; - fakeRecord.License.Status = StatusOptions.Active; - fakeRecord.License.Type = LicenseTypes.Enterprise; - fakeRecord.License.Plan = "Enterprise"; - fakeRecord.License.ProductsLicensed.Add(new Product { Name = product }); - - // Ensure the license is valid for all products - fakeRecord.License.ProductsLicensed.Add(new Product { Name = ProductTypes.UIWinForms }); - fakeRecord.License.ProductsLicensed.Add(new Product { Name = ProductTypes.DatavizBasicWinForms }); - fakeRecord.License.ProductsLicensed.Add(new Product { Name = ProductTypes.DatavizAdvancedWinForms }); - fakeRecord.License.ProductsLicensed.Add(new Product { Name = ProductTypes.Charts }); - - // Set license properties to make it valid - fakeRecord.License.TotalDays = 1000000; // Effectively unlimited - fakeRecord.License.CreatedAt = DateTime.Now.AddDays(-1); - - return fakeRecord; - } - - /// - /// Creates a fake record for activation - /// - internal static Record CreateFakeRecord(string email, string licenseKey, ProductTypes product) - { - // Create a fake record with valid license data - Record fakeRecord = new Record(); - fakeRecord.IsValid = true; - fakeRecord._licenseKey = licenseKey; - fakeRecord.Client.Email = email; - fakeRecord.License.Status = StatusOptions.Active; - fakeRecord.License.Type = LicenseTypes.Enterprise; - fakeRecord.License.Plan = "Enterprise"; - fakeRecord.License.ProductsLicensed.Add(new Product { Name = product }); - - // Ensure the license is valid for all products - fakeRecord.License.ProductsLicensed.Add(new Product { Name = ProductTypes.UIWinForms }); - fakeRecord.License.ProductsLicensed.Add(new Product { Name = ProductTypes.DatavizBasicWinForms }); - fakeRecord.License.ProductsLicensed.Add(new Product { Name = ProductTypes.DatavizAdvancedWinForms }); - fakeRecord.License.ProductsLicensed.Add(new Product { Name = ProductTypes.Charts }); - - // Set license properties to make it valid - fakeRecord.License.TotalDays = 1000000; // Effectively unlimited - fakeRecord.License.CreatedAt = DateTime.Now.AddDays(-1); - - return fakeRecord; - } - } -} -#endif \ No newline at end of file diff --git a/Bunifu.Licensing/LicenseImports.cs b/Bunifu.Licensing/LicenseImports.cs deleted file mode 100644 index a6833ce..0000000 --- a/Bunifu.Licensing/LicenseImports.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; -using System.ComponentModel; - -// Import all licensing types from System.ComponentModel -// These will either be the real types from .NET or our compatibility implementations - -namespace Bunifu.Licensing -{ - internal class LicenseImports - { - // Reference license types to ensure they're available - internal static void ReferenceLicenseTypes() - { - var license = new License(); - var context = new LicenseContext(); - var mode = LicenseUsageMode.Runtime; - - // For validation only - code not executed - if (false) - { - license.Dispose(); - var key = license.LicenseKey; - var savedKey = context.GetSavedLicenseKey(typeof(LicenseImports)); - context.SetSavedLicenseKey(typeof(LicenseImports), "test"); - var validate = LicenseManager.Validate(typeof(LicenseImports), null); - } - } - } -} \ No newline at end of file diff --git a/Bunifu.Licensing/LicenseProviders.cs b/Bunifu.Licensing/LicenseProviders.cs deleted file mode 100644 index 1b56a5f..0000000 --- a/Bunifu.Licensing/LicenseProviders.cs +++ /dev/null @@ -1,473 +0,0 @@ -#if NET5_0_OR_NETFRAMEWORK -using System.Runtime.CompilerServices; -#endif -using System; -using System.ComponentModel; -using System.Diagnostics; -using System.Drawing; -using System.Runtime.CompilerServices; -using System.Windows.Forms; -using Bunifu.Licensing.Models; -using Bunifu.Licensing.Options; -using Bunifu.Licensing.Views; - -namespace Bunifu.Licensing -{ - // Token: 0x02000002 RID: 2 - [DebuggerStepThrough] - public sealed class LicenseProviders - { - // Token: 0x06000001 RID: 1 RVA: 0x00002050 File Offset: 0x00000250 - private static LicenseUsageMode GetContext(LicenseContext context) - { -#if SKIP_LICENSE_CHECK - // When SKIP_LICENSE_CHECK is defined, always return Designtime to avoid runtime checks - return LicenseUsageMode.Designtime; -#else - LicenseUsageMode licenseUsageMode = LicenseUsageMode.Designtime; - bool flag = Application.ExecutablePath.IndexOf("DesignToolsServer.exe", StringComparison.OrdinalIgnoreCase) > -1; - if (flag) - { - licenseUsageMode = LicenseUsageMode.Designtime; - } - return licenseUsageMode; -#endif - } - - // Token: 0x06000002 RID: 2 RVA: 0x00002080 File Offset: 0x00000280 - private static License InvokeActivation(ProductTypes product, LicenseContext context, Type type, LicenseProviders.LicenseStatus status, bool reshow = false, bool f1ad718eb = true) - { -#if SKIP_LICENSE_CHECK - // When SKIP_LICENSE_CHECK is defined, return a valid license without any checks - var license = LicenseBypass.CreateFakeLicense(product); - LicenseValidator.RetrievedLicense = license as Record; - return license; -#else - bool flag = false; - LicenseProviders._f1ad718eb = f1ad718eb; - bool flag2 = product == ProductTypes.UIWinForms; - if (flag2) - { - flag = LicenseProviders._activator.UIWinFormsWasCancelled; - } - else - { - bool flag3 = product == ProductTypes.DatavizBasicWinForms; - if (flag3) - { - flag = LicenseProviders._activator.DatavizBasicWasCancelled; - } - else - { - bool flag4 = product == ProductTypes.DatavizAdvancedWinForms; - if (flag4) - { - flag = LicenseProviders._activator.DatavizAdvancedWasCancelled; - } - else - { - bool flag5 = product == ProductTypes.Charts; - if (flag5) - { - flag = LicenseProviders._activator.ChartsWasCancelled; - } - } - } - } - bool flag6 = !flag || reshow; - License license; - if (flag6) - { - LicenseProviders._activator.ShowDialog(); - bool flag7 = !LicenseActivator.LicenseCreated; - if (flag7) - { - bool flag8 = !reshow; - if (flag8) - { - bool flag9 = status == LicenseProviders.LicenseStatus.NonExistent; - if (flag9) - { - LicenseValidator.ThrowLicenseNonExistentException(); - } - else - { - bool flag10 = status == LicenseProviders.LicenseStatus.Expired; - if (flag10) - { - LicenseValidator.ThrowLicenseExpiredException(); - } - else - { - bool flag11 = status == LicenseProviders.LicenseStatus.Invalid; - if (flag11) - { - LicenseValidator.ThrowLicenseInvalidException(); - } - } - } - } - license = null; - } - else - { - LicenseValidator.ReadLicense(true); - DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(2, 3); - defaultInterpolatedStringHandler.AppendFormatted(product); - defaultInterpolatedStringHandler.AppendLiteral(","); - defaultInterpolatedStringHandler.AppendFormatted(LicenseValidator.RetrievedLicense.License.Type); - defaultInterpolatedStringHandler.AppendLiteral(","); - defaultInterpolatedStringHandler.AppendFormatted(type.Name); - context.SetSavedLicenseKey(type, defaultInterpolatedStringHandler.ToStringAndClear()); - license = LicenseValidator.RetrievedLicense; - } - } - else - { - bool flag12 = !reshow; - if (flag12) - { - bool flag13 = status == LicenseProviders.LicenseStatus.NonExistent; - if (flag13) - { - LicenseValidator.ThrowLicenseNonExistentException(); - } - else - { - bool flag14 = status == LicenseProviders.LicenseStatus.Expired; - if (flag14) - { - LicenseValidator.ThrowLicenseExpiredException(); - } - else - { - bool flag15 = status == LicenseProviders.LicenseStatus.Invalid; - if (flag15) - { - LicenseValidator.ThrowLicenseInvalidException(); - } - } - } - } - license = null; - } - return license; -#endif - } - - // Token: 0x06000003 RID: 3 RVA: 0x0000221C File Offset: 0x0000041C - private static License GetProductLicense(ProductTypes product, LicenseContext context, Type type) - { -#if SKIP_LICENSE_CHECK - // When SKIP_LICENSE_CHECK is defined, return a valid license without any checks - var license = LicenseBypass.CreateFakeLicense(product); - LicenseValidator.RetrievedLicense = license as Record; - return license; -#else - LicenseUsageMode context2 = LicenseProviders.GetContext(context); - bool flag = context2 == LicenseUsageMode.Designtime; - License license; - if (flag) - { - LicenseValidator.Product = product; - LicenseValidator.ReadLicense(false); - bool flag2 = LicenseValidator.RetrievedLicense != null; - if (flag2) - { - bool flag3 = LicenseValidator.IsDateBackdated(); - if (flag3) - { - LicenseValidator.ThrowSystemBackdatedException(); - license = null; - } - else - { - bool flag4 = LicenseValidator.RetrievedLicense.License.Status == StatusOptions.Expired; - if (flag4) - { - bool flag5 = !LicenseProviders._freeTrialExpiredShown; - if (flag5) - { - LicenseProviders._freeTrialExpiredShown = true; - int totalDays = LicenseValidator.RetrievedLicense.License.TotalDays; - string licenseKey = LicenseValidator.RetrievedLicense._licenseKey; - LicenseValidator.DeleteLicense(false); - bool flag6 = LicenseValidator.RetrievedLicense.License.Type == LicenseTypes.Trial; - if (flag6) - { - DialogResult dialogResult = LicenseProviders._freeTrialEnded.ShowDialog(totalDays); - bool flag7 = dialogResult == DialogResult.Cancel; - if (flag7) - { - license = LicenseProviders.InvokeActivation(product, context, type, LicenseProviders.LicenseStatus.Expired, false, true); - } - else - { - LicenseValidator.ThrowLicenseExpiredException(); - license = null; - } - } - else - { - bool flag8 = InformationBoxHelper.Show("It appears your license has expired.\n\nWould you like to renew now?", "License Expired", "", InformationBox.InformationBoxIcons.Alert, "Renew", "Cancel"); - try - { - bool flag9 = flag8; - if (flag9) - { - Process.Start(LicenseValidator.GetRenewalLink(licenseKey)); - } - } - catch (Exception) - { - } - license = LicenseProviders.InvokeActivation(product, context, type, LicenseProviders.LicenseStatus.Expired, false, true); - } - } - else - { - LicenseValidator.ThrowLicenseExpiredException(); - license = null; - } - } - else - { - bool flag10 = LicenseValidator.IsLicenseValid(LicenseValidator.RetrievedLicense); - if (flag10) - { - LicenseContext context3 = context; - Type type2 = type; - DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(3, 4); - defaultInterpolatedStringHandler.AppendFormatted(product); - defaultInterpolatedStringHandler.AppendLiteral(","); - defaultInterpolatedStringHandler.AppendFormatted(LicenseValidator.RetrievedLicense.License.Type); - defaultInterpolatedStringHandler.AppendLiteral(","); - defaultInterpolatedStringHandler.AppendFormatted(LicenseValidator.RetrievedLicense.LicenseKey); - defaultInterpolatedStringHandler.AppendLiteral(","); - defaultInterpolatedStringHandler.AppendFormatted(type.Name); - context3.SetSavedLicenseKey(type2, defaultInterpolatedStringHandler.ToStringAndClear()); - license = LicenseValidator.RetrievedLicense; - } - else - { - LicenseValidator.DeleteLicense(false); - license = LicenseProviders.InvokeActivation(product, context, type, LicenseProviders.LicenseStatus.Invalid, false, true); - } - } - } - } - else - { - bool flag11 = LicenseValidator.LicenseExists(); - if (flag11) - { - bool flag12 = LicenseValidator.IsDateBackdated(); - if (flag12) - { - LicenseValidator.ThrowSystemBackdatedException(); - license = null; - } - else - { - bool flag13 = LicenseValidator.IsLicenseValid(LicenseValidator.RetrievedLicense); - if (flag13) - { - LicenseContext context4 = context; - Type type3 = type; - DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(3, 4); - defaultInterpolatedStringHandler.AppendFormatted(product); - defaultInterpolatedStringHandler.AppendLiteral(","); - defaultInterpolatedStringHandler.AppendFormatted(LicenseValidator.RetrievedLicense.License.Type); - defaultInterpolatedStringHandler.AppendLiteral(","); - defaultInterpolatedStringHandler.AppendFormatted(LicenseValidator.RetrievedLicense.LicenseKey); - defaultInterpolatedStringHandler.AppendLiteral(","); - defaultInterpolatedStringHandler.AppendFormatted(type.Name); - context4.SetSavedLicenseKey(type3, defaultInterpolatedStringHandler.ToStringAndClear()); - license = LicenseValidator.RetrievedLicense; - } - else - { - LicenseValidator.DeleteLicense(false); - license = LicenseProviders.InvokeActivation(product, context, type, LicenseProviders.LicenseStatus.Invalid, false, true); - } - } - } - else - { - bool flag14 = context2 == LicenseUsageMode.Designtime; - if (flag14) - { - LicenseValidator.DeleteLicense(false); - license = LicenseProviders.InvokeActivation(product, context, type, LicenseProviders.LicenseStatus.NonExistent, false, true); - } - else - { - LicenseValidator.ThrowLicenseNonExistentException(); - license = null; - } - } - } - } - else - { - string savedLicenseKey = context.GetSavedLicenseKey(type, null); - bool flag15 = savedLicenseKey != null; - if (flag15) - { - string[] array = savedLicenseKey.Split(new char[] { ',' }); - bool flag16 = LicenseValidator.GetTypeEnum(array[1]) == LicenseTypes.Trial && !LicenseProviders._trialBoxShown; - if (flag16) - { - bool flag17 = LicenseProviders.DevelopmentMode(); - if (flag17) - { - LicenseProviders._trialBox.ShowApplyNewLicenseButton = true; - LicenseProviders._trialBox.OnClickActivatePremium = delegate - { - LicenseProviders.InvokeActivation(product, context, type, LicenseProviders.LicenseStatus.Expired, true, false); - }; - } - else - { - LicenseProviders._trialBox.ShowApplyNewLicenseButton = false; - } - LicenseProviders._trialBox.ShowDialog(); - LicenseProviders._trialBoxShown = true; - } - license = new Record(); - } - else - { - bool flag18 = type.Name == "BunifuDataGridView"; - if (flag18) - { - license = new Record(); - } - else - { - LicenseValidator.ThrowRuntimeLicenseException(); - license = null; - } - } - } - return license; -#endif - } - - // Token: 0x06000004 RID: 4 RVA: 0x000026E4 File Offset: 0x000008E4 - private static bool DevelopmentMode() - { - bool flag; - try - { - flag = Debugger.IsAttached; - } - catch (Exception) - { - flag = false; - } - return flag; - } - - // Token: 0x04000001 RID: 1 - internal static bool _f1ad718eb = true; - - // Token: 0x04000002 RID: 2 - private static bool _trialBoxShown = false; - - // Token: 0x04000003 RID: 3 - private static bool _freeTrialExpiredShown = false; - - // Token: 0x04000004 RID: 4 - private static FreeTrialEnded _freeTrialEnded = new FreeTrialEnded(); - - // Token: 0x04000005 RID: 5 - internal static TrialBox _trialBox = new TrialBox(); - - // Token: 0x04000006 RID: 6 - internal static LicenseActivator _activator = new LicenseActivator(); - - // Token: 0x0200003A RID: 58 - private enum LicenseStatus - { - // Token: 0x04000198 RID: 408 - NonExistent, - // Token: 0x04000199 RID: 409 - Expired, - // Token: 0x0400019A RID: 410 - Invalid - } - - // Token: 0x0200003B RID: 59 - [DebuggerStepThrough] - public class UIWinFormsLicenseProvider : LicenseProvider - { - // Token: 0x06000271 RID: 625 RVA: 0x00017B4C File Offset: 0x00015D4C - public override License GetLicense(LicenseContext context, Type type, object instance, bool allowExceptions) - { -#if SKIP_LICENSE_CHECK - // When SKIP_LICENSE_CHECK is defined, return a valid license without any checks - var license = LicenseBypass.CreateFakeLicense(ProductTypes.UIWinForms); - LicenseValidator.RetrievedLicense = license as Record; - return license; -#else - return LicenseProviders.GetProductLicense(ProductTypes.UIWinForms, context, type); -#endif - } - } - - // Token: 0x0200003C RID: 60 - [DebuggerStepThrough] - public class DatavizBasicLicenseProvider : LicenseProvider - { - // Token: 0x06000273 RID: 627 RVA: 0x00017B70 File Offset: 0x00015D70 - public override License GetLicense(LicenseContext context, Type type, object instance, bool allowExceptions) - { -#if SKIP_LICENSE_CHECK - // When SKIP_LICENSE_CHECK is defined, return a valid license without any checks - var license = LicenseBypass.CreateFakeLicense(ProductTypes.DatavizBasicWinForms); - LicenseValidator.RetrievedLicense = license as Record; - return license; -#else - return LicenseProviders.GetProductLicense(ProductTypes.DatavizBasicWinForms, context, type); -#endif - } - } - - // Token: 0x0200003D RID: 61 - [DebuggerStepThrough] - public class DatavizAdvancedLicenseProvider : LicenseProvider - { - // Token: 0x06000275 RID: 629 RVA: 0x00017B94 File Offset: 0x00015D94 - public override License GetLicense(LicenseContext context, Type type, object instance, bool allowExceptions) - { -#if SKIP_LICENSE_CHECK - // When SKIP_LICENSE_CHECK is defined, return a valid license without any checks - var license = LicenseBypass.CreateFakeLicense(ProductTypes.DatavizAdvancedWinForms); - LicenseValidator.RetrievedLicense = license as Record; - return license; -#else - return LicenseProviders.GetProductLicense(ProductTypes.DatavizAdvancedWinForms, context, type); -#endif - } - } - - // Token: 0x0200003E RID: 62 - [DebuggerStepThrough] - public class ChartsLicenseProvider : LicenseProvider - { - // Token: 0x06000277 RID: 631 RVA: 0x00017BB8 File Offset: 0x00015DB8 - public override License GetLicense(LicenseContext context, Type type, object instance, bool allowExceptions) - { -#if SKIP_LICENSE_CHECK - // When SKIP_LICENSE_CHECK is defined, return a valid license without any checks - var license = LicenseBypass.CreateFakeLicense(ProductTypes.Charts); - LicenseValidator.RetrievedLicense = license as Record; - return license; -#else - return LicenseProviders.GetProductLicense(ProductTypes.Charts, context, type); -#endif - } - } - } -} diff --git a/Bunifu.Licensing/LicenseValidator.cs b/Bunifu.Licensing/LicenseValidator.cs deleted file mode 100644 index 060a889..0000000 --- a/Bunifu.Licensing/LicenseValidator.cs +++ /dev/null @@ -1,1596 +0,0 @@ -#if NET5_0_OR_NETFRAMEWORK -using System.Runtime.CompilerServices; -#endif -// Added SKIP_LICENSE_CHECK preprocessor definition that can be enabled to bypass all license checks -#define SKIP_LICENSE_CHECK -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -#if NET5_0_OR_GREATER || NET6_0_OR_GREATER -using System.Net.Http; -using System.Net.Http.Headers; -using System.Net.Http.Json; -#else -using System.Net; -using System.Net.Http; -#endif -using System.Text; -using System.Threading; -using System.Windows.Forms; -using Bunifu.Licensing.Helpers; -using Bunifu.Licensing.Models; -using Bunifu.Licensing.Options; -using Bunifu.Licensing.Properties; -using Bunifu.Licensing.Views; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using System.ComponentModel; -using System.Net; -using System.Runtime.CompilerServices; - -namespace Bunifu.Licensing -{ - // Token: 0x02000003 RID: 3 - [DebuggerStepThrough] - public sealed class LicenseValidator - { - // Token: 0x17000001 RID: 1 - // (get) Token: 0x06000008 RID: 8 RVA: 0x0000275C File Offset: 0x0000095C - public static bool DesignMode2 - { - get - { - return Application.ExecutablePath.IndexOf("DesignToolsServer.exe", StringComparison.OrdinalIgnoreCase) > -1; - } - } - - // Token: 0x17000002 RID: 2 - // (get) Token: 0x06000009 RID: 9 RVA: 0x0000278C File Offset: 0x0000098C - // (set) Token: 0x0600000A RID: 10 RVA: 0x00002793 File Offset: 0x00000993 - internal static string ResponseError { get; private set; } - - // Token: 0x17000003 RID: 3 - // (get) Token: 0x0600000B RID: 11 RVA: 0x0000279C File Offset: 0x0000099C - private static bool DesignMode - { - get - { - return LicenseManager.UsageMode == LicenseUsageMode.Designtime || Debugger.IsAttached; - } - } - - // Token: 0x17000004 RID: 4 - // (get) Token: 0x0600000C RID: 12 RVA: 0x000027CC File Offset: 0x000009CC - internal static bool LicenseExpired - { - get - { - return LicenseValidator.RetrievedLicense.License.Status == StatusOptions.Expired; - } - } - - // Token: 0x17000005 RID: 5 - // (get) Token: 0x0600000D RID: 13 RVA: 0x000027FC File Offset: 0x000009FC - private static string LicenseFolder - { - get - { - string folderPath = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); - DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(2, 2); - defaultInterpolatedStringHandler.AppendLiteral("\\"); - defaultInterpolatedStringHandler.AppendFormatted(Resources.CPA); - defaultInterpolatedStringHandler.AppendLiteral("\\"); - defaultInterpolatedStringHandler.AppendFormatted(LicenseValidator.Product); - return folderPath + defaultInterpolatedStringHandler.ToStringAndClear(); - } - } - - // Token: 0x17000006 RID: 6 - // (get) Token: 0x0600000E RID: 14 RVA: 0x00002860 File Offset: 0x00000A60 - private static string LicenseFile - { - get - { - DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(5, 2); - defaultInterpolatedStringHandler.AppendFormatted(LicenseValidator.LicenseFolder); - defaultInterpolatedStringHandler.AppendLiteral("\\"); - defaultInterpolatedStringHandler.AppendFormatted(LicenseValidator.Product); - defaultInterpolatedStringHandler.AppendLiteral(".lic"); - return defaultInterpolatedStringHandler.ToStringAndClear(); - } - } - - // Token: 0x17000007 RID: 7 - // (get) Token: 0x0600000F RID: 15 RVA: 0x000028B4 File Offset: 0x00000AB4 - // (set) Token: 0x06000010 RID: 16 RVA: 0x000028FF File Offset: 0x00000AFF - internal static Record RetrievedLicense - { - get - { - bool flag = LicenseValidator._retrievedLicense != null && LicenseValidator._retrievedLicense.IsValid; - Record record; - if (flag) - { - bool flag2 = LicenseValidator.IsProductLicenseAvailable(LicenseValidator._retrievedLicense, LicenseValidator.Product); - if (flag2) - { - record = LicenseValidator._retrievedLicense; - } - else - { - record = null; - } - } - else - { - record = null; - } - return record; - } - set - { - LicenseValidator._retrievedLicense = value; - } - } - - // Token: 0x17000008 RID: 8 - // (get) Token: 0x06000011 RID: 17 RVA: 0x00002907 File Offset: 0x00000B07 - // (set) Token: 0x06000012 RID: 18 RVA: 0x0000290E File Offset: 0x00000B0E - internal static ProductTypes Product { get; set; } - - // Token: 0x17000009 RID: 9 - // (get) Token: 0x06000013 RID: 19 RVA: 0x00002916 File Offset: 0x00000B16 - // (set) Token: 0x06000014 RID: 20 RVA: 0x0000291D File Offset: 0x00000B1D - internal static Type LicensedControlType { get; set; } - - // Token: 0x1700000A RID: 10 - // (get) Token: 0x06000015 RID: 21 RVA: 0x00002925 File Offset: 0x00000B25 - // (set) Token: 0x06000016 RID: 22 RVA: 0x0000292C File Offset: 0x00000B2C - internal static object LicensedControlInstance { get; set; } - - // Token: 0x06000017 RID: 23 RVA: 0x00002934 File Offset: 0x00000B34 - public static License Validate(ProductTypes product, Type control = null) - { -#if SKIP_LICENSE_CHECK - // When SKIP_LICENSE_CHECK is defined, return a valid license without any checks - var license = LicenseBypass.CreateFakeLicense(product); - _retrievedLicense = license as Record; - return license; -#else - control = typeof(Button); - LicenseValidator.Product = product; - LicenseValidator._activator.FromCli = false; - return LicenseValidator.GetProductLicense(product, new LicenseContext(), control); -#endif - } - - // Token: 0x06000018 RID: 24 RVA: 0x00002974 File Offset: 0x00000B74 - public static License Validate(ProductTypes product, Type control, object instance) - { -#if SKIP_LICENSE_CHECK - // When SKIP_LICENSE_CHECK is defined, return a valid license without any checks - var license = LicenseBypass.CreateFakeLicense(product); - _retrievedLicense = license as Record; - return license; -#else - LicenseValidator.Product = product; - return LicenseManager.Validate(control, instance); -#endif - } - - // Token: 0x06000019 RID: 25 RVA: 0x00002998 File Offset: 0x00000B98 - public static License Activate(ProductTypes product, bool fromCli = false) - { - LicenseValidator.Product = product; - LicenseValidator._activator.FromCli = fromCli; - LicenseValidator._activator.ShowDialog(); - bool licenseCreated = LicenseActivator.LicenseCreated; - License license; - if (licenseCreated) - { - license = LicenseValidator.RetrievedLicense; - } - else - { - license = null; - } - return license; - } - - // Token: 0x0600001A RID: 26 RVA: 0x000029DC File Offset: 0x00000BDC - internal static Record Validate(string email, string licenseKey) - { -#if SKIP_LICENSE_CHECK - // When SKIP_LICENSE_CHECK is defined, return a fake valid record - return LicenseBypass.CreateFakeRecord(email, licenseKey, LicenseValidator.Product); -#else - Record record2; - try - { - LicenseValidator.ResponseError = string.Empty; - Logger.Add("Activation request initiated."); - v2Request v2Request = new v2Request - { - DeviceID = LicenseValidator.GetHardwareID(), - DeviceName = Environment.MachineName, - OS = Hardware.GetOSName(), - Email = email, - LicenseKey = licenseKey - }; - //LicenseValidator._apiClient.DefaultRequestHeaders.Accept.Clear(); - //LicenseValidator._apiClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); net462 issues.. - LicenseValidator._apiClient.BaseAddress = new Uri(Resources.BUL); - Logger.Add("Request successfully created."); - StringContent stringContent = new StringContent(JsonConvert.SerializeObject(v2Request), Encoding.UTF8, "application/json"); - Logger.Add("Request now being sent..."); - HttpResponseMessage result = LicenseValidator._apiClient.PostAsync("", stringContent).GetAwaiter().GetResult(); - DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(19, 1); - defaultInterpolatedStringHandler.AppendLiteral("Response received: "); - defaultInterpolatedStringHandler.AppendFormatted(result.StatusCode); - Logger.Add(defaultInterpolatedStringHandler.ToStringAndClear()); - bool flag = result.StatusCode == HttpStatusCode.Created; - if (flag) - { - Logger.Add("License verified (200)."); - Logger.Add("Preparing to parse response object..."); - JObject jobject = JObject.Parse(result.Content.ToString()); - Record record = new Record(); - try - { - record.IsValid = true; - record.ID = (int)jobject["id"]; - record.UUID = (string)jobject["uuid"]; - record.CreatedAt = new DateTime?(LicenseValidator.IsNullDateTime(jobject["created_at"])); - record.RemovedAt = new DateTime?(LicenseValidator.IsNullDateTime(jobject["removed_at"])); - Logger.Add("Header object fields parsed."); - record.Device.ID = (int)jobject["device_id"]; - record.Device.Name = (string)jobject["device"]["name"]; - record.Device.HardwareID = (string)jobject["device"]["hw_id"]; - record.Device.OS = (string)jobject["device"]["os"]; - record.Device.Blocked = (bool)jobject["device"]["blocked"]; - record.Device.LastSeen = LicenseValidator.IsNullDateTime(jobject["device"]["last_seen"]); - Logger.Add("Device object fields parsed."); - record.Client.ID = LicenseValidator.IsNullInt(jobject["client"]["id"]); - record.Client.TeamID = LicenseValidator.IsNullInt(jobject["client"]["team_id"]); - record.Client.WPUserID = LicenseValidator.IsNullInt(jobject["client"]["wp_user_id"]); - record.Client.IsTeamAdmin = (bool)jobject["client"]["is_team_admin"]; - record.Client.Name = (string)jobject["client"]["name"]; - record.Client.Email = (string)jobject["client"]["email"]; - record.Client.Blocked = (bool)jobject["client"]["blocked"]; - record.Client.CreatedAt = LicenseValidator.IsNullDateTime(jobject["client"]["created_at"]); - Logger.Add("Client object fields parsed."); - record._licenseKey = licenseKey; - record.License.ID = (int)jobject["license"]["id"]; - record.License.UUID = (string)jobject["license"]["uuid"]; - record.License.BundleID = new int?(LicenseValidator.IsNullInt(jobject["license"]["bundle_id"])); - record.License.TeamID = new int?(LicenseValidator.IsNullInt(jobject["license"]["team_id"])); - record.License.UserID = new int?(LicenseValidator.IsNullInt(jobject["license"]["user_id"])); - record.License.PurchaseID = LicenseValidator.IsNullInt(jobject["license"]["purchase_ref_id"]); - record.License.Plan = (string)jobject["license"]["name"]; - record.License.Product = LicenseValidator.Product; - record.License.TotalDays = (int)jobject["license"]["duration"]; - record.License.MaxDevices = (int)jobject["license"]["no_of_devices"]; - record.License.RemainingDevices = (int)jobject["license"]["devices_remaining"]; - record.License.Activations = (int)jobject["license"]["activations"]; - record.License.CreatedAt = LicenseValidator.IsNullDateTime(jobject["license"]["created_at"]); - record.License.LicenseKeyID = new int?((int)jobject["license_key_id"]); - Logger.Add("License object fields parsed."); - string text = jobject["license"]["type"].ToString().ToLower(); - string text2 = jobject["license"]["status"].ToString().ToLower(); - JArray jarray = JsonConvert.DeserializeObject(jobject["license"]["products"].ToString()); - Logger.Add("Special license object fields parsed."); - foreach (JToken jtoken in jarray) - { - bool flag2 = jtoken.Type != JTokenType.Object; - if (flag2) - { - record.License.ProductsLicensed.Add(new Product - { - ID = (int)jtoken["id"], - Name = LicenseValidator.GetProduct((int)jtoken["id"]), - UUID = (string)jtoken["uuid"] - }); - } - } - Logger.Add("Licensed products successfully added."); - record.License.Type = LicenseValidator.GetTypeEnum(text); - record.License.Status = LicenseValidator.GetStatusEnum(text2); - bool flag3 = record.License.TotalDays > 14 && record.License.TotalDays <= 365; - if (flag3) - { - record.License.Type = LicenseTypes.Premium; - } - else - { - bool flag4 = record.License.TotalDays >= 1000000; - if (flag4) - { - record.License.Type = LicenseTypes.Enterprise; - } - } - Logger.Add("Special license enum fields casted."); - Logger.Add("Activation succeeded."); - } - catch (Exception ex) - { - Logger.Add("Exception raised while parsing response: " + ex.Message + "."); - LicenseValidator.ResponseError = ex.Message; - LicenseValidator.RetrievedLicense = new Record - { - IsValid = false - }; - return LicenseValidator.RetrievedLicense; - } - bool flag5 = LicenseValidator.IsProductLicenseAvailable(record, LicenseValidator.Product); - if (flag5) - { - LicenseValidator.RetrievedLicense = record; - record2 = record; - } - else - { - string text3 = string.Join(", ", LicenseValidator.GetProductsLicensed(record, LicenseValidator.Product, true)); - LicenseValidator.ResponseError = "[404] Product License Mismatch. Your license caters for " + text3 + "."; - Logger.Add(LicenseValidator.ResponseError); - LicenseValidator.RetrievedLicense = new Record - { - IsValid = false - }; - record2 = LicenseValidator.RetrievedLicense; - } - } - else - { - bool flag6 = result.StatusCode == HttpStatusCode.Forbidden; - if (flag6) - { - JObject jobject2 = JObject.Parse(result.Content.ToString()); - LicenseValidator.ResponseError = "[403] " + (string)jobject2["message"]; - bool flag7 = LicenseValidator.ResponseError.ToLower().Contains("key is blocked"); - if (flag7) - { - Logger.Add("License blocked; revocation executed."); - LicenseValidator.ResponseError = "[403] Your license has been blocked.\n\nIf this was unintentional, please visit our support site: https://bunifuframework.com/support."; - } - Logger.Add(LicenseValidator.ResponseError); - LicenseValidator.RetrievedLicense = new Record - { - IsValid = false - }; - record2 = LicenseValidator._retrievedLicense; - } - else - { - bool flag8 = !Network.IsAvailable(); - if (flag8) - { - LicenseValidator.ResponseError = Strings.Exceptions.NetworkUnavailable; - Logger.Add("Network unavailable."); - } - else - { - bool flag9 = result.StatusCode.ToString() == "0"; - if (flag9) - { - LicenseValidator.ResponseError = "[101] TLS-1.2 request did not succeed."; - } - else - { - defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(3, 2); - defaultInterpolatedStringHandler.AppendLiteral("["); - defaultInterpolatedStringHandler.AppendFormatted(result.StatusCode); - defaultInterpolatedStringHandler.AppendLiteral("] "); - defaultInterpolatedStringHandler.AppendFormatted(result.Content); - LicenseValidator.ResponseError = defaultInterpolatedStringHandler.ToStringAndClear(); - } - Logger.Add(LicenseValidator.ResponseError); - } - LicenseValidator.RetrievedLicense = new Record - { - IsValid = false - }; - record2 = LicenseValidator._retrievedLicense; - } - } - } - catch (Exception ex2) - { - Logger.Add("[Exception] " + ex2.Message + "; " + ex2.StackTrace); - LicenseValidator.ResponseError = ex2.Message; - LicenseValidator.RetrievedLicense = new Record - { - IsValid = false - }; - record2 = LicenseValidator._retrievedLicense; - } - return record2; -#endif - } - - // Token: 0x0600001B RID: 27 RVA: 0x000034F4 File Offset: 0x000016F4 - internal static Record Validate(string email, string licenseKey, ProductTypes product) - { - LicenseValidator.Product = product; - return LicenseValidator.Validate(email, licenseKey); - } - - // Token: 0x0600001C RID: 28 RVA: 0x00003514 File Offset: 0x00001714 - internal static ActivationResults Activate(string email, string licenseKey) - { - ActivationResults activationResults; - try - { - Record record = LicenseValidator.Validate(email, licenseKey); - bool flag = record == null; - if (flag) - { - Logger.Add("License not found for " + email + "."); - activationResults = ActivationResults.ProductLicenseMismatch; - } - else - { - bool isValid = record.IsValid; - if (isValid) - { - LicenseValidator.CreateLicense(record); - Logger.Add("License created."); - activationResults = ActivationResults.Success; - } - else - { - bool flag2 = LicenseValidator.ResponseError.Contains("[101]"); - if (flag2) - { - Logger.Add("TLS 1.2 not supported."); - activationResults = ActivationResults.TLS12Issue; - } - else - { - bool flag3 = LicenseValidator.ResponseError.Contains("[403]"); - if (flag3) - { - Logger.Add("License activation forbidden."); - activationResults = ActivationResults.Forbidden; - } - else - { - Logger.Add("License activation failed."); - activationResults = ActivationResults.Failed; - } - } - } - } - } - catch (Exception ex) - { - bool flag4 = !Network.IsAvailable(); - if (flag4) - { - Logger.Add("[Exception] Network unavailable."); - LicenseValidator.ResponseError = Strings.Exceptions.NetworkUnavailable; - } - else - { - Logger.Add("[Exception] " + ex.Message + "."); - LicenseValidator.ResponseError = ex.Message; - } - activationResults = ActivationResults.ExceptionRaised; - } - return activationResults; - } - - // Token: 0x0600001D RID: 29 RVA: 0x00003640 File Offset: 0x00001840 - internal static ActivationResults Activate(string email, string licenseKey, ProductTypes product) - { - LicenseValidator.Product = product; - return LicenseValidator.Activate(email, licenseKey); - } - - // Token: 0x0600001E RID: 30 RVA: 0x00003660 File Offset: 0x00001860 - internal static bool CreateLicense(Record license) - { - Registry.Licensing.SaveLicense(license); - return true; - } - - // Token: 0x0600001F RID: 31 RVA: 0x0000367C File Offset: 0x0000187C - internal static Record ReadLicense(bool forceRead = false) - { - Record record; - try - { - if (forceRead) - { - LicenseValidator.RetrievedLicense = Registry.Licensing.GetLicense(LicenseValidator.Product); - record = LicenseValidator.RetrievedLicense; - } - else - { - bool flag = LicenseValidator._retrievedLicense != null; - if (flag) - { - record = LicenseValidator.RetrievedLicense; - } - else - { - LicenseValidator.RetrievedLicense = Registry.Licensing.GetLicense(LicenseValidator.Product); - record = LicenseValidator.RetrievedLicense; - } - } - } - catch (Exception) - { - record = new Record - { - IsValid = false - }; - } - return record; - } - - // Token: 0x06000020 RID: 32 RVA: 0x000036FC File Offset: 0x000018FC - internal static bool DeleteLicense(bool deleteLicenseInfoFile) - { - bool flag; - try - { - flag = Registry.Licensing.DeleteLicense(LicenseValidator.Product, deleteLicenseInfoFile); - } - catch (Exception) - { - flag = false; - } - return flag; - } - - // Token: 0x06000021 RID: 33 RVA: 0x00003730 File Offset: 0x00001930 - internal static bool LicenseExists() - { - bool flag = false; - string hardwareID = LicenseValidator.GetHardwareID(); - Record license = Registry.Licensing.GetLicense(LicenseValidator.Product); - bool flag2 = license.Device.HardwareID == hardwareID; - if (flag2) - { - LicenseValidator.RetrievedLicense = license; - flag = true; - } - return flag; - } - - // Token: 0x06000022 RID: 34 RVA: 0x00003778 File Offset: 0x00001978 - private static int GetProductID() - { - int num = 0; - bool flag = LicenseValidator.LicenseExists(); - if (flag) - { - bool flag2 = LicenseValidator.RetrievedLicense.LicenseKey.StartsWith("FREE"); - if (flag2) - { - num = 0; - } - else - { - bool flag3 = LicenseValidator.RetrievedLicense.License.TotalDays >= 10000; - if (flag3) - { - num = 112860; - } - else - { - bool flag4 = LicenseValidator.RetrievedLicense.ID.ToString().StartsWith("26"); - if (flag4) - { - num = LicenseValidator.RetrievedLicense.ID; - } - else - { - bool flag5 = LicenseValidator.RetrievedLicense.License.Product == ProductTypes.UIWinForms; - if (flag5) - { - num = 25428; - } - else - { - bool flag6 = LicenseValidator.RetrievedLicense.License.Product == ProductTypes.DatavizBasicWinForms; - if (flag6) - { - num = 25429; - } - else - { - bool flag7 = LicenseValidator.RetrievedLicense.License.Product == ProductTypes.DatavizAdvancedWinForms; - if (flag7) - { - num = 25431; - } - else - { - bool flag8 = LicenseValidator.RetrievedLicense.License.Product == ProductTypes.Charts; - if (flag8) - { - num = 262207; - } - } - } - } - } - } - } - } - else - { - bool flag9 = LicenseValidator.Product == ProductTypes.UIWinForms; - if (flag9) - { - num = 25428; - } - else - { - bool flag10 = LicenseValidator.Product == ProductTypes.DatavizBasicWinForms; - if (flag10) - { - num = 25429; - } - else - { - bool flag11 = LicenseValidator.Product == ProductTypes.DatavizAdvancedWinForms; - if (flag11) - { - num = 25431; - } - else - { - bool flag12 = LicenseValidator.Product == ProductTypes.Charts; - if (flag12) - { - num = 262207; - } - } - } - } - } - return num; - } - - // Token: 0x06000023 RID: 35 RVA: 0x000038FC File Offset: 0x00001AFC - internal static string GetRenewalLink(string licenseKey = "") - { - int productID = LicenseValidator.GetProductID(); - bool flag = LicenseValidator.LicenseExists(); - string text; - if (flag) - { - licenseKey = LicenseValidator.RetrievedLicense.LicenseKey; - DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(67, 2); - defaultInterpolatedStringHandler.AppendLiteral("https://bunifuframework.com/checkout/?edd_license_key="); - defaultInterpolatedStringHandler.AppendFormatted(licenseKey); - defaultInterpolatedStringHandler.AppendLiteral("&download_id="); - defaultInterpolatedStringHandler.AppendFormatted(productID); - text = defaultInterpolatedStringHandler.ToStringAndClear(); - } - else - { - bool flag2 = string.IsNullOrWhiteSpace(licenseKey); - if (flag2) - { - DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(72, 1); - defaultInterpolatedStringHandler.AppendLiteral("https://bunifuframework.com/checkout?edd_action=add_to_cart&download_id="); - defaultInterpolatedStringHandler.AppendFormatted(productID); - text = defaultInterpolatedStringHandler.ToStringAndClear(); - } - else - { - DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(67, 2); - defaultInterpolatedStringHandler.AppendLiteral("https://bunifuframework.com/checkout/?edd_license_key="); - defaultInterpolatedStringHandler.AppendFormatted(licenseKey); - defaultInterpolatedStringHandler.AppendLiteral("&download_id="); - defaultInterpolatedStringHandler.AppendFormatted(productID); - text = defaultInterpolatedStringHandler.ToStringAndClear(); - } - } - return text; - } - - // Token: 0x06000024 RID: 36 RVA: 0x000039E0 File Offset: 0x00001BE0 - internal static string GetHardwareID() - { - return Hardware.GetUniqueID(); - } - - // Token: 0x06000025 RID: 37 RVA: 0x000039F8 File Offset: 0x00001BF8 - internal static bool IsLicenseValid(Record license) - { -#if SKIP_LICENSE_CHECK - // When SKIP_LICENSE_CHECK is defined, always return true - return true; -#else - bool flag3; - try - { - bool flag = license != null; - if (flag) - { - bool flag2 = license.Device.HardwareID == LicenseValidator.GetHardwareID(); - if (flag2) - { - flag3 = true; - } - else - { - flag3 = false; - } - } - else - { - flag3 = false; - } - } - catch (Exception) - { - flag3 = false; - } - return flag3; -#endif - } - - // Token: 0x06000026 RID: 38 RVA: 0x00003A50 File Offset: 0x00001C50 - internal static bool IsDateBackdated() - { - bool flag = LicenseValidator._retrievedLicense != null && LicenseValidator._retrievedLicense.IsValid; - bool flag3; - if (flag) - { - int num = LicenseValidator._retrievedLicense.License.CreatedAt.Date.CompareTo(DateTime.Now.Date); - bool flag2 = num == 1; - flag3 = flag2; - } - else - { - int num2 = InternetTime.GetDateTime().Date.CompareTo(DateTime.Now.Date); - bool flag4 = num2 == 1; - flag3 = flag4; - } - return flag3; - } - - // Token: 0x06000027 RID: 39 RVA: 0x00003AF8 File Offset: 0x00001CF8 - internal static void InnerValidate(ProductTypes product, Type control, object instance) - { - bool designMode = LicenseValidator.DesignMode; - if (designMode) - { - ValidationResults validationResults = LicenseValidator.Validate(product); - LicenseValidator.LicensedControlType = control; - LicenseValidator.LicensedControlInstance = instance; - LicenseValidator.ProvideResponse(validationResults, product, control, instance); - } - } - - // Token: 0x06000028 RID: 40 RVA: 0x00003B30 File Offset: 0x00001D30 - internal static void ThrowRuntimeLicenseException() - { - LicenseValidator._activator.Hide(); - bool flag = LicenseValidator.Product == ProductTypes.UIWinForms; - if (flag) - { - throw new LicenseException(LicenseValidator.LicensedControlType, LicenseValidator.LicensedControlInstance, "This product does not have a registered Bunifu UI license to run."); - } - bool flag2 = LicenseValidator.Product == ProductTypes.Charts; - if (flag2) - { - throw new LicenseException(LicenseValidator.LicensedControlType, LicenseValidator.LicensedControlInstance, "This product does not have a registered Bunifu Charts license to run."); - } - bool flag3 = LicenseValidator.Product == ProductTypes.DatavizBasicWinForms; - if (flag3) - { - throw new LicenseException(LicenseValidator.LicensedControlType, LicenseValidator.LicensedControlInstance, "This product does not have a registered Bunifu Dataviz license to run."); - } - bool flag4 = LicenseValidator.Product == ProductTypes.DatavizAdvancedWinForms; - if (flag4) - { - throw new LicenseException(LicenseValidator.LicensedControlType, LicenseValidator.LicensedControlInstance, "This product does not have a registered Bunifu Dataviz license to run."); - } - } - - // Token: 0x06000029 RID: 41 RVA: 0x00003BD4 File Offset: 0x00001DD4 - internal static void ThrowLicenseNonExistentException() - { - LicenseValidator._activator.Hide(); - bool flag = LicenseValidator.Product == ProductTypes.UIWinForms; - if (flag) - { - throw new LicenseException(LicenseValidator.LicensedControlType, LicenseValidator.LicensedControlInstance, "Please ensure you have an active Bunifu UI WinForms license."); - } - bool flag2 = LicenseValidator.Product == ProductTypes.Charts; - if (flag2) - { - throw new LicenseException(LicenseValidator.LicensedControlType, LicenseValidator.LicensedControlInstance, "Please ensure you have an active Bunifu Charts license."); - } - bool flag3 = LicenseValidator.Product == ProductTypes.DatavizBasicWinForms; - if (flag3) - { - throw new LicenseException(LicenseValidator.LicensedControlType, LicenseValidator.LicensedControlInstance, "Please ensure you have an active Bunifu Dataviz Basic license."); - } - bool flag4 = LicenseValidator.Product == ProductTypes.DatavizAdvancedWinForms; - if (flag4) - { - throw new LicenseException(LicenseValidator.LicensedControlType, LicenseValidator.LicensedControlInstance, "Please ensure you have an active Bunifu Dataviz Advanced license."); - } - } - - // Token: 0x0600002A RID: 42 RVA: 0x00003C78 File Offset: 0x00001E78 - internal static void ThrowLicenseInvalidException() - { - bool flag = LicenseValidator.Product == ProductTypes.UIWinForms; - if (flag) - { - throw new LicenseException(LicenseValidator.LicensedControlType, LicenseValidator.LicensedControlInstance, "Please ensure you have a valid Bunifu UI WinForms license."); - } - bool flag2 = LicenseValidator.Product == ProductTypes.Charts; - if (flag2) - { - throw new LicenseException(LicenseValidator.LicensedControlType, LicenseValidator.LicensedControlInstance, "Please ensure you have a valid Bunifu Charts license."); - } - bool flag3 = LicenseValidator.Product == ProductTypes.DatavizBasicWinForms; - if (flag3) - { - throw new LicenseException(LicenseValidator.LicensedControlType, LicenseValidator.LicensedControlInstance, "Please ensure you have a valid Bunifu Dataviz Basic license."); - } - bool flag4 = LicenseValidator.Product == ProductTypes.DatavizAdvancedWinForms; - if (flag4) - { - throw new LicenseException(LicenseValidator.LicensedControlType, LicenseValidator.LicensedControlInstance, "Please ensure you have a valid Bunifu Dataviz Advanced license."); - } - } - - // Token: 0x0600002B RID: 43 RVA: 0x00003D10 File Offset: 0x00001F10 - internal static void ThrowLicenseExpiredException() - { - bool flag = LicenseValidator.Product == ProductTypes.UIWinForms; - if (flag) - { - throw new LicenseException(LicenseValidator.LicensedControlType, LicenseValidator.LicensedControlInstance, "Your Bunifu UI WinForms license has expired."); - } - bool flag2 = LicenseValidator.Product == ProductTypes.Charts; - if (flag2) - { - throw new LicenseException(LicenseValidator.LicensedControlType, LicenseValidator.LicensedControlInstance, "Your Bunifu Charts license has expired."); - } - bool flag3 = LicenseValidator.Product == ProductTypes.DatavizBasicWinForms; - if (flag3) - { - throw new LicenseException(LicenseValidator.LicensedControlType, LicenseValidator.LicensedControlInstance, "Your Bunifu Dataviz Basic license has expired."); - } - bool flag4 = LicenseValidator.Product == ProductTypes.DatavizAdvancedWinForms; - if (flag4) - { - throw new LicenseException(LicenseValidator.LicensedControlType, LicenseValidator.LicensedControlInstance, "Your Bunifu Dataviz Advanced license has expired."); - } - } - - // Token: 0x0600002C RID: 44 RVA: 0x00003DA8 File Offset: 0x00001FA8 - internal static void ThrowLicenseBlockedException() - { - LicenseValidator._activator.Hide(); - bool flag = LicenseValidator.Product == ProductTypes.UIWinForms; - if (flag) - { - throw new LicenseException(LicenseValidator.LicensedControlType, LicenseValidator.LicensedControlInstance, "Your Bunifu UI license has been blocked."); - } - bool flag2 = LicenseValidator.Product == ProductTypes.Charts; - if (flag2) - { - throw new LicenseException(LicenseValidator.LicensedControlType, LicenseValidator.LicensedControlInstance, "Your Bunifu Charts license has been blocked."); - } - bool flag3 = LicenseValidator.Product == ProductTypes.DatavizBasicWinForms; - if (flag3) - { - throw new LicenseException(LicenseValidator.LicensedControlType, LicenseValidator.LicensedControlInstance, "Your Bunifu Dataviz Basic license has been blocked."); - } - bool flag4 = LicenseValidator.Product == ProductTypes.DatavizAdvancedWinForms; - if (flag4) - { - throw new LicenseException(LicenseValidator.LicensedControlType, LicenseValidator.LicensedControlInstance, "Your Bunifu Dataviz Advanced license has been blocked."); - } - } - - // Token: 0x0600002D RID: 45 RVA: 0x00003E49 File Offset: 0x00002049 - internal static void ThrowSystemBackdatedException() - { - throw new LicenseException(LicenseValidator.LicensedControlType, LicenseValidator.LicensedControlInstance, "Please ensure your System Date/Time is correct."); - } - - // Token: 0x0600002E RID: 46 RVA: 0x00003E60 File Offset: 0x00002060 - private static void ProvideResponse(ValidationResults result, ProductTypes product, Type control, object instance) - { - bool flag = result == ValidationResults.LicenseBlocked; - if (flag) - { - bool flag2 = product == ProductTypes.UIWinForms; - if (flag2) - { - throw new LicenseException(control, instance, "Your Bunifu UI license has been blocked."); - } - bool flag3 = product == ProductTypes.DatavizBasicWinForms; - if (flag3) - { - throw new LicenseException(control, instance, "Your Bunifu Dataviz Basic license has been blocked."); - } - bool flag4 = product == ProductTypes.DatavizAdvancedWinForms; - if (flag4) - { - throw new LicenseException(control, instance, "Your Bunifu Dataviz Advanced license has been blocked."); - } - bool flag5 = product == ProductTypes.Charts; - if (flag5) - { - throw new LicenseException(control, instance, "Your Bunifu Charts license has been blocked."); - } - } - else - { - bool flag6 = result == ValidationResults.LicenseExpired; - if (flag6) - { - bool flag7 = product == ProductTypes.UIWinForms; - if (flag7) - { - throw new LicenseException(control, instance, "Your Bunifu UI WinForms license has expired."); - } - bool flag8 = product == ProductTypes.DatavizBasicWinForms; - if (flag8) - { - throw new LicenseException(control, instance, "Your Bunifu Dataviz Basic license has expired."); - } - bool flag9 = product == ProductTypes.DatavizAdvancedWinForms; - if (flag9) - { - throw new LicenseException(control, instance, "Your Bunifu Dataviz Advanced license has expired."); - } - bool flag10 = product == ProductTypes.Charts; - if (flag10) - { - throw new LicenseException(control, instance, "Your Bunifu Charts license has expired."); - } - } - else - { - bool flag11 = result == ValidationResults.LicenseNonExistent; - if (flag11) - { - LicenseValidator._activator.ShowDialog(); - bool flag12 = !LicenseActivator.LicenseCreated; - if (flag12) - { - bool flag13 = product == ProductTypes.UIWinForms; - if (flag13) - { - throw new LicenseException(control, instance, "Please ensure you have an active Bunifu UI WinForms license."); - } - bool flag14 = product == ProductTypes.DatavizBasicWinForms; - if (flag14) - { - throw new LicenseException(control, instance, "Please ensure you have an active Bunifu Dataviz Basic license."); - } - bool flag15 = product == ProductTypes.DatavizAdvancedWinForms; - if (flag15) - { - throw new LicenseException(control, instance, "Please ensure you have an active Bunifu Dataviz Advanced license."); - } - bool flag16 = product == ProductTypes.Charts; - if (flag16) - { - throw new LicenseException(control, instance, "Please ensure you have an active Bunifu Charts license."); - } - } - } - } - } - } - - // Token: 0x0600002F RID: 47 RVA: 0x00003FC4 File Offset: 0x000021C4 - private static ValidationResults Validate(ProductTypes product) - { -#if SKIP_LICENSE_CHECK - // When SKIP_LICENSE_CHECK is defined, always return a valid result - return ValidationResults.LicenseActive; -#else - LicenseValidator.Product = product; - bool flag = LicenseValidator.LicenseExists(); - ValidationResults validationResults; - if (flag) - { - bool licenseExpired = LicenseValidator.LicenseExpired; - if (licenseExpired) - { - validationResults = ValidationResults.LicenseExpired; - } - else - { - validationResults = ValidationResults.LicenseActive; - } - } - else - { - validationResults = ValidationResults.LicenseNonExistent; - } - return validationResults; -#endif - } - - // Token: 0x06000030 RID: 48 RVA: 0x00003FFC File Offset: 0x000021FC - internal static string ListProductsLicensed(Record license, ProductTypes primaryProduct, bool excludePrimaryProduct = true) - { - string text; - try - { - List list = new List(); - foreach (Product product in license.License.ProductsLicensed) - { - if (excludePrimaryProduct) - { - bool flag = product.Name != primaryProduct; - if (flag) - { - list.Add(LicenseValidator.CastProductEnum(product.Name)); - } - } - else - { - list.Add(LicenseValidator.CastProductEnum(product.Name)); - } - } - text = string.Join(", ", list); - } - catch (Exception) - { - text = string.Empty; - } - return text; - } - - // Token: 0x06000031 RID: 49 RVA: 0x000040C4 File Offset: 0x000022C4 - internal static List GetProductsLicensed(Record license, ProductTypes primaryProduct, bool excludePrimaryProduct = true) - { - List list2; - try - { - List list = new List(); - foreach (Product product in license.License.ProductsLicensed) - { - if (excludePrimaryProduct) - { - bool flag = product.Name != primaryProduct; - if (flag) - { - list.Add(LicenseValidator.CastProductEnum(product.Name)); - } - } - else - { - list.Add(LicenseValidator.CastProductEnum(product.Name)); - } - } - list2 = list; - } - catch (Exception) - { - list2 = new List(); - } - return list2; - } - - // Token: 0x06000032 RID: 50 RVA: 0x00004180 File Offset: 0x00002380 - internal static bool IsProductLicenseAvailable(Record license, ProductTypes product) - { -#if SKIP_LICENSE_CHECK - // When SKIP_LICENSE_CHECK is defined, always return true - return true; -#else - bool flag = false; - try - { - foreach (Product product2 in license.License.ProductsLicensed) - { - bool flag2 = product2.Name == product; - if (flag2) - { - flag = true; - } - } - } - catch (Exception) - { - } - return flag; -#endif - } - - // Token: 0x06000033 RID: 51 RVA: 0x00004204 File Offset: 0x00002404 - internal static int IsNullInt(JToken value) - { - bool flag = value.Type != JTokenType.Null; - int num; - if (flag) - { - num = Convert.ToInt32(value); - } - else - { - num = 0; - } - return num; - } - - // Token: 0x06000034 RID: 52 RVA: 0x00004234 File Offset: 0x00002434 - internal static DateTime IsNullDateTime(JToken value) - { - bool flag = value.Type != JTokenType.Null; - DateTime dateTime; - if (flag) - { - dateTime = Convert.ToDateTime(value); - } - else - { - dateTime = DateTime.MinValue; - } - return dateTime; - } - - // Token: 0x06000035 RID: 53 RVA: 0x00004268 File Offset: 0x00002468 - internal static ProductTypes GetProduct(int productID) - { - bool flag = productID == 1; - ProductTypes productTypes; - if (flag) - { - productTypes = ProductTypes.UIWinForms; - } - else - { - bool flag2 = productID == 2; - if (flag2) - { - productTypes = ProductTypes.Charts; - } - else - { - bool flag3 = productID == 3; - if (flag3) - { - productTypes = ProductTypes.DatavizBasicWinForms; - } - else - { - bool flag4 = productID == 4; - if (flag4) - { - productTypes = ProductTypes.DatavizAdvancedWinForms; - } - else - { - productTypes = ProductTypes.UIWinForms; - } - } - } - } - return productTypes; - } - - // Token: 0x06000036 RID: 54 RVA: 0x000042B0 File Offset: 0x000024B0 - internal static string GetProductName(ProductTypes product) - { - bool flag = product == ProductTypes.UIWinForms; - string text; - if (flag) - { - text = "Bunifu UI WinForms"; - } - else - { - bool flag2 = product == ProductTypes.DatavizBasicWinForms; - if (flag2) - { - text = "Bunifu Dataviz Basic"; - } - else - { - bool flag3 = product == ProductTypes.DatavizAdvancedWinForms; - if (flag3) - { - text = "Bunifu Dataviz Advanced"; - } - else - { - bool flag4 = product == ProductTypes.Charts; - if (flag4) - { - text = "Bunifu Charts"; - } - else - { - text = product.ToString(); - } - } - } - } - return text; - } - - // Token: 0x06000037 RID: 55 RVA: 0x00004314 File Offset: 0x00002514 - internal static LicenseTypes GetTypeEnum(string type) - { - type = type.ToLower(); - bool flag = type == "trial"; - LicenseTypes licenseTypes; - if (flag) - { - licenseTypes = LicenseTypes.Trial; - } - else - { - bool flag2 = type == "premium"; - if (flag2) - { - licenseTypes = LicenseTypes.Premium; - } - else - { - bool flag3 = type == "enterprise"; - if (flag3) - { - licenseTypes = LicenseTypes.Enterprise; - } - else - { - licenseTypes = LicenseTypes.Trial; - } - } - } - return licenseTypes; - } - - // Token: 0x06000038 RID: 56 RVA: 0x00004368 File Offset: 0x00002568 - internal static StatusOptions GetStatusEnum(string status) - { - status = status.ToLower(); - bool flag = status == "active"; - StatusOptions statusOptions; - if (flag) - { - statusOptions = StatusOptions.Active; - } - else - { - bool flag2 = status == "expired"; - if (flag2) - { - statusOptions = StatusOptions.Expired; - } - else - { - statusOptions = StatusOptions.Active; - } - } - return statusOptions; - } - - // Token: 0x06000039 RID: 57 RVA: 0x000043AC File Offset: 0x000025AC - internal static ProductTypes GetProductEnum(string product) - { - product = product.ToLower(); - bool flag = product == "bunifu ui winforms" || product == "bunifu ui"; - ProductTypes productTypes; - if (flag) - { - productTypes = ProductTypes.UIWinForms; - } - else - { - bool flag2 = product == "bunifu dataviz basic"; - if (flag2) - { - productTypes = ProductTypes.DatavizBasicWinForms; - } - else - { - bool flag3 = product == "bunifu dataviz advanced"; - if (flag3) - { - productTypes = ProductTypes.DatavizAdvancedWinForms; - } - else - { - bool flag4 = product == "bunifu charts"; - if (flag4) - { - productTypes = ProductTypes.Charts; - } - else - { - productTypes = ProductTypes.UIWinForms; - } - } - } - } - return productTypes; - } - - // Token: 0x0600003A RID: 58 RVA: 0x00004428 File Offset: 0x00002628 - internal static string CastProductEnum(ProductTypes product) - { - bool flag = product == ProductTypes.UIWinForms; - string text; - if (flag) - { - text = "Bunifu UI"; - } - else - { - bool flag2 = product == ProductTypes.DatavizBasicWinForms; - if (flag2) - { - text = "Bunifu Dataviz Basic"; - } - else - { - bool flag3 = product == ProductTypes.DatavizAdvancedWinForms; - if (flag3) - { - text = "Bunifu Dataviz Advanced"; - } - else - { - bool flag4 = product == ProductTypes.Charts; - if (flag4) - { - text = "Bunifu Charts"; - } - else - { - text = "Bunifu UI"; - } - } - } - } - return text; - } - - // Token: 0x0600003B RID: 59 RVA: 0x00004484 File Offset: 0x00002684 - private static LicenseUsageMode GetContext() - { - bool designMode = LicenseValidator.DesignMode2; - LicenseUsageMode licenseUsageMode; - if (designMode) - { - licenseUsageMode = LicenseUsageMode.Designtime; - } - else - { - licenseUsageMode = LicenseUsageMode.Runtime; - } - return licenseUsageMode; - } - - // Token: 0x0600003C RID: 60 RVA: 0x000044AC File Offset: 0x000026AC - private static License GetProductLicense(ProductTypes product, LicenseContext context, Type type) - { -#if SKIP_LICENSE_CHECK - // When SKIP_LICENSE_CHECK is defined, return a valid license without any checks - var license = LicenseBypass.CreateFakeLicense(product); - _retrievedLicense = license as Record; - return license; -#else - LicenseUsageMode context2 = LicenseValidator.GetContext(); - bool flag = context2 == LicenseUsageMode.Designtime; - License license; - if (flag) - { - LicenseValidator.Product = product; - LicenseValidator.ReadLicense(false); - bool flag2 = LicenseValidator.RetrievedLicense != null; - if (flag2) - { - bool flag3 = LicenseValidator.IsDateBackdated(); - if (flag3) - { - LicenseValidator.ThrowSystemBackdatedException(); - license = null; - } - else - { - bool flag4 = LicenseValidator.RetrievedLicense.License.Status == StatusOptions.Expired; - if (flag4) - { - bool flag5 = !LicenseValidator._freeTrialExpiredShown; - if (flag5) - { - LicenseValidator._freeTrialExpiredShown = true; - int totalDays = LicenseValidator.RetrievedLicense.License.TotalDays; - string licenseKey = LicenseValidator.RetrievedLicense._licenseKey; - LicenseValidator.DeleteLicense(false); - bool flag6 = LicenseValidator.RetrievedLicense.License.Type == LicenseTypes.Trial; - if (flag6) - { - DialogResult dialogResult = LicenseValidator._freeTrialEnded.ShowDialog(totalDays); - bool flag7 = dialogResult == DialogResult.Cancel; - if (flag7) - { - license = LicenseValidator.InvokeActivation(product, context, type, LicenseValidator.LicenseStatus.Expired, false, true); - } - else - { - LicenseValidator.ThrowLicenseExpiredException(); - license = null; - } - } - else - { - bool flag8 = InformationBoxHelper.Show("It appears your license has expired.\n\nWould you like to renew now?", "License Expired", "", InformationBox.InformationBoxIcons.Alert, "Renew", "Cancel"); - try - { - bool flag9 = flag8; - if (flag9) - { - Process.Start(LicenseValidator.GetRenewalLink(licenseKey)); - } - } - catch (Exception) - { - } - license = LicenseValidator.InvokeActivation(product, context, type, LicenseValidator.LicenseStatus.Expired, false, true); - } - } - else - { - LicenseValidator.ThrowLicenseExpiredException(); - license = null; - } - } - else - { - bool flag10 = LicenseValidator.IsLicenseValid(LicenseValidator.RetrievedLicense); - if (flag10) - { - DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(3, 4); - defaultInterpolatedStringHandler.AppendFormatted(product); - defaultInterpolatedStringHandler.AppendLiteral(","); - defaultInterpolatedStringHandler.AppendFormatted(LicenseValidator.RetrievedLicense.License.Type); - defaultInterpolatedStringHandler.AppendLiteral(","); - defaultInterpolatedStringHandler.AppendFormatted(LicenseValidator.RetrievedLicense.LicenseKey); - defaultInterpolatedStringHandler.AppendLiteral(","); - defaultInterpolatedStringHandler.AppendFormatted(type.Name); - context.SetSavedLicenseKey(type, defaultInterpolatedStringHandler.ToStringAndClear()); - license = LicenseValidator.RetrievedLicense; - } - else - { - LicenseValidator.DeleteLicense(false); - license = LicenseValidator.InvokeActivation(product, context, type, LicenseValidator.LicenseStatus.Invalid, false, true); - } - } - } - } - else - { - bool flag11 = LicenseValidator.LicenseExists(); - if (flag11) - { - bool flag12 = LicenseValidator.IsDateBackdated(); - if (flag12) - { - LicenseValidator.ThrowSystemBackdatedException(); - license = null; - } - else - { - bool flag13 = LicenseValidator.IsLicenseValid(LicenseValidator.RetrievedLicense); - if (flag13) - { - DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(3, 4); - defaultInterpolatedStringHandler.AppendFormatted(product); - defaultInterpolatedStringHandler.AppendLiteral(","); - defaultInterpolatedStringHandler.AppendFormatted(LicenseValidator.RetrievedLicense.License.Type); - defaultInterpolatedStringHandler.AppendLiteral(","); - defaultInterpolatedStringHandler.AppendFormatted(LicenseValidator.RetrievedLicense.LicenseKey); - defaultInterpolatedStringHandler.AppendLiteral(","); - defaultInterpolatedStringHandler.AppendFormatted(type.Name); - context.SetSavedLicenseKey(type, defaultInterpolatedStringHandler.ToStringAndClear()); - license = LicenseValidator.RetrievedLicense; - } - else - { - LicenseValidator.DeleteLicense(false); - license = LicenseValidator.InvokeActivation(product, context, type, LicenseValidator.LicenseStatus.Invalid, false, true); - } - } - } - else - { - bool flag14 = context2 == LicenseUsageMode.Designtime; - if (flag14) - { - LicenseValidator.DeleteLicense(false); - license = LicenseValidator.InvokeActivation(product, context, type, LicenseValidator.LicenseStatus.NonExistent, false, true); - } - else - { - LicenseValidator.ThrowLicenseNonExistentException(); - license = null; - } - } - } - } - else - { - license = null; - } - return license; -#endif - } - - // Token: 0x0600003D RID: 61 RVA: 0x00004648 File Offset: 0x00002848 - private static bool DevelopmentMode() - { - bool flag; - try - { - flag = LicenseValidator.DesignMode2; - } - catch (Exception) - { - flag = false; - } - return flag; - } - - // Token: 0x04000007 RID: 7 - private static Record _retrievedLicense; - - // Token: 0x04000008 RID: 8 - private static string _url = Resources.BUL; - - // Token: 0x04000009 RID: 9 - private static LicenseActivator _activator = new LicenseActivator(); - -#if NET5_0_OR_GREATER || NET6_0_OR_GREATER - private static HttpClient _apiClient = new HttpClient(); -#else - private static HttpClient _apiClient = new HttpClient(); - // HttpClient compatible implementation for .NET Framework - private static WebClient _webClient = new WebClient(); -#endif - - // Token: 0x0400000A RID: 10 - internal static bool _f1ad718eb = true; - - // Token: 0x0400000B RID: 11 - private static bool _trialBoxShown = false; - - // Token: 0x0400000C RID: 12 - private static bool _freeTrialExpiredShown = false; - - // Token: 0x0400000D RID: 13 - private static FreeTrialEnded _freeTrialEnded = new FreeTrialEnded(); - - // Token: 0x0400000E RID: 14 - internal static TrialBox _trialBox = new TrialBox(); - - // Token: 0x02000040 RID: 64 - private enum LicenseStatus - { - // Token: 0x0400019F RID: 415 - NonExistent, - // Token: 0x040001A0 RID: 416 - Expired, - // Token: 0x040001A1 RID: 417 - Invalid - } - } -} - - // Token: 0x0600003D RID: 61 RVA: 0x00004648 File Offset: 0x00002848 diff --git a/Bunifu.Licensing/Models/Client.cs b/Bunifu.Licensing/Models/Client.cs deleted file mode 100644 index bb9aaf9..0000000 --- a/Bunifu.Licensing/Models/Client.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using System.Diagnostics; - -namespace Bunifu.Licensing.Models -{ - // Token: 0x0200002C RID: 44 - [DebuggerStepThrough] - internal sealed class Client - { - // Token: 0x1700003C RID: 60 - // (get) Token: 0x060001B3 RID: 435 RVA: 0x00016422 File Offset: 0x00014622 - // (set) Token: 0x060001B4 RID: 436 RVA: 0x0001642A File Offset: 0x0001462A - public bool Blocked { get; set; } - - // Token: 0x1700003D RID: 61 - // (get) Token: 0x060001B5 RID: 437 RVA: 0x00016433 File Offset: 0x00014633 - // (set) Token: 0x060001B6 RID: 438 RVA: 0x0001643B File Offset: 0x0001463B - public bool IsTeamAdmin { get; set; } - - // Token: 0x1700003E RID: 62 - // (get) Token: 0x060001B7 RID: 439 RVA: 0x00016444 File Offset: 0x00014644 - // (set) Token: 0x060001B8 RID: 440 RVA: 0x0001644C File Offset: 0x0001464C - public int ID { get; set; } - - // Token: 0x1700003F RID: 63 - // (get) Token: 0x060001B9 RID: 441 RVA: 0x00016455 File Offset: 0x00014655 - // (set) Token: 0x060001BA RID: 442 RVA: 0x0001645D File Offset: 0x0001465D - public int TeamID { get; set; } - - // Token: 0x17000040 RID: 64 - // (get) Token: 0x060001BB RID: 443 RVA: 0x00016466 File Offset: 0x00014666 - // (set) Token: 0x060001BC RID: 444 RVA: 0x0001646E File Offset: 0x0001466E - public int WPUserID { get; set; } - - // Token: 0x17000041 RID: 65 - // (get) Token: 0x060001BD RID: 445 RVA: 0x00016477 File Offset: 0x00014677 - // (set) Token: 0x060001BE RID: 446 RVA: 0x0001647F File Offset: 0x0001467F - public string Name { get; set; } - - // Token: 0x17000042 RID: 66 - // (get) Token: 0x060001BF RID: 447 RVA: 0x00016488 File Offset: 0x00014688 - // (set) Token: 0x060001C0 RID: 448 RVA: 0x00016490 File Offset: 0x00014690 - public string Email { get; set; } - - // Token: 0x17000043 RID: 67 - // (get) Token: 0x060001C1 RID: 449 RVA: 0x00016499 File Offset: 0x00014699 - // (set) Token: 0x060001C2 RID: 450 RVA: 0x000164A1 File Offset: 0x000146A1 - public DateTime CreatedAt { get; set; } = DateTime.MinValue; - } -} diff --git a/Bunifu.Licensing/Models/Device.cs b/Bunifu.Licensing/Models/Device.cs deleted file mode 100644 index 473c91e..0000000 --- a/Bunifu.Licensing/Models/Device.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using System.Diagnostics; - -namespace Bunifu.Licensing.Models -{ - // Token: 0x0200002D RID: 45 - [DebuggerStepThrough] - internal sealed class Device - { - // Token: 0x17000044 RID: 68 - // (get) Token: 0x060001C4 RID: 452 RVA: 0x000164BE File Offset: 0x000146BE - // (set) Token: 0x060001C5 RID: 453 RVA: 0x000164C6 File Offset: 0x000146C6 - public int ID { get; set; } - - // Token: 0x17000045 RID: 69 - // (get) Token: 0x060001C6 RID: 454 RVA: 0x000164CF File Offset: 0x000146CF - // (set) Token: 0x060001C7 RID: 455 RVA: 0x000164D7 File Offset: 0x000146D7 - public bool Blocked { get; set; } - - // Token: 0x17000046 RID: 70 - // (get) Token: 0x060001C8 RID: 456 RVA: 0x000164E0 File Offset: 0x000146E0 - // (set) Token: 0x060001C9 RID: 457 RVA: 0x000164E8 File Offset: 0x000146E8 - public string Name { get; set; } - - // Token: 0x17000047 RID: 71 - // (get) Token: 0x060001CA RID: 458 RVA: 0x000164F1 File Offset: 0x000146F1 - // (set) Token: 0x060001CB RID: 459 RVA: 0x000164F9 File Offset: 0x000146F9 - public string OS { get; set; } - - // Token: 0x17000048 RID: 72 - // (get) Token: 0x060001CC RID: 460 RVA: 0x00016502 File Offset: 0x00014702 - // (set) Token: 0x060001CD RID: 461 RVA: 0x0001650A File Offset: 0x0001470A - public string HardwareID { get; set; } - - // Token: 0x17000049 RID: 73 - // (get) Token: 0x060001CE RID: 462 RVA: 0x00016513 File Offset: 0x00014713 - // (set) Token: 0x060001CF RID: 463 RVA: 0x0001651B File Offset: 0x0001471B - public DateTime LastSeen { get; internal set; } - } -} diff --git a/Bunifu.Licensing/Models/Product.cs b/Bunifu.Licensing/Models/Product.cs deleted file mode 100644 index a3ff808..0000000 --- a/Bunifu.Licensing/Models/Product.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System; -using System.Diagnostics; -using Bunifu.Licensing.Options; -using Newtonsoft.Json; - -namespace Bunifu.Licensing.Models -{ - // Token: 0x0200002E RID: 46 - [DebuggerStepThrough] - internal sealed class Product - { - // Token: 0x1700004A RID: 74 - // (get) Token: 0x060001D1 RID: 465 RVA: 0x0001652D File Offset: 0x0001472D - // (set) Token: 0x060001D2 RID: 466 RVA: 0x00016535 File Offset: 0x00014735 - [JsonProperty(PropertyName = "id")] - public int ID { get; set; } - - // Token: 0x1700004B RID: 75 - // (get) Token: 0x060001D3 RID: 467 RVA: 0x0001653E File Offset: 0x0001473E - // (set) Token: 0x060001D4 RID: 468 RVA: 0x00016546 File Offset: 0x00014746 - [JsonProperty(PropertyName = "name")] - public ProductTypes Name { get; set; } - - // Token: 0x1700004C RID: 76 - // (get) Token: 0x060001D5 RID: 469 RVA: 0x0001654F File Offset: 0x0001474F - // (set) Token: 0x060001D6 RID: 470 RVA: 0x00016557 File Offset: 0x00014757 - [JsonProperty(PropertyName = "uuid")] - public string UUID { get; set; } - } -} diff --git a/Bunifu.Licensing/Models/Record.cs b/Bunifu.Licensing/Models/Record.cs deleted file mode 100644 index 15b7ed1..0000000 --- a/Bunifu.Licensing/Models/Record.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System; -using System.ComponentModel; -using System.Diagnostics; - -namespace Bunifu.Licensing.Models -{ - // Token: 0x0200002F RID: 47 - [DebuggerStepThrough] - internal sealed class Record : License - { - // Token: 0x1700004D RID: 77 - // (get) Token: 0x060001D8 RID: 472 RVA: 0x00016569 File Offset: 0x00014769 - // (set) Token: 0x060001D9 RID: 473 RVA: 0x00016571 File Offset: 0x00014771 - public bool IsValid { get; set; } - - // Token: 0x1700004E RID: 78 - // (get) Token: 0x060001DA RID: 474 RVA: 0x0001657A File Offset: 0x0001477A - // (set) Token: 0x060001DB RID: 475 RVA: 0x00016582 File Offset: 0x00014782 - public int ID { get; set; } - - // Token: 0x1700004F RID: 79 - // (get) Token: 0x060001DC RID: 476 RVA: 0x0001658B File Offset: 0x0001478B - // (set) Token: 0x060001DD RID: 477 RVA: 0x00016593 File Offset: 0x00014793 - public string UUID { get; set; } - - // Token: 0x17000050 RID: 80 - // (get) Token: 0x060001DE RID: 478 RVA: 0x0001659C File Offset: 0x0001479C - public override string LicenseKey - { - get - { - return this._licenseKey; - } - } - - // Token: 0x17000051 RID: 81 - // (get) Token: 0x060001DF RID: 479 RVA: 0x000165A4 File Offset: 0x000147A4 - // (set) Token: 0x060001E0 RID: 480 RVA: 0x000165AC File Offset: 0x000147AC - public DateTime? CreatedAt { get; set; } = new DateTime?(DateTime.MinValue); - - // Token: 0x17000052 RID: 82 - // (get) Token: 0x060001E1 RID: 481 RVA: 0x000165B5 File Offset: 0x000147B5 - // (set) Token: 0x060001E2 RID: 482 RVA: 0x000165BD File Offset: 0x000147BD - public DateTime? LastSeen { get; set; } = new DateTime?(DateTime.MinValue); - - // Token: 0x17000053 RID: 83 - // (get) Token: 0x060001E3 RID: 483 RVA: 0x000165C6 File Offset: 0x000147C6 - // (set) Token: 0x060001E4 RID: 484 RVA: 0x000165CE File Offset: 0x000147CE - public DateTime? RemovedAt { get; internal set; } = new DateTime?(DateTime.MinValue); - - // Token: 0x17000054 RID: 84 - // (get) Token: 0x060001E5 RID: 485 RVA: 0x000165D7 File Offset: 0x000147D7 - // (set) Token: 0x060001E6 RID: 486 RVA: 0x000165DF File Offset: 0x000147DF - public Client Client { get; set; } = new Client(); - - // Token: 0x17000055 RID: 85 - // (get) Token: 0x060001E7 RID: 487 RVA: 0x000165E8 File Offset: 0x000147E8 - // (set) Token: 0x060001E8 RID: 488 RVA: 0x000165F0 File Offset: 0x000147F0 - public Device Device { get; set; } = new Device(); - - // Token: 0x17000056 RID: 86 - // (get) Token: 0x060001E9 RID: 489 RVA: 0x000165F9 File Offset: 0x000147F9 - // (set) Token: 0x060001EA RID: 490 RVA: 0x00016601 File Offset: 0x00014801 - public v2License License { get; set; } = new v2License(); - - // Token: 0x060001EB RID: 491 RVA: 0x0001660A File Offset: 0x0001480A - public override void Dispose() - { - } - - // Token: 0x04000156 RID: 342 - internal string _licenseKey; - } -} diff --git a/Bunifu.Licensing/Models/v1License.cs b/Bunifu.Licensing/Models/v1License.cs deleted file mode 100644 index c48f084..0000000 --- a/Bunifu.Licensing/Models/v1License.cs +++ /dev/null @@ -1,178 +0,0 @@ -using System; -using System.ComponentModel; -using System.Diagnostics; -using Bunifu.Licensing.Helpers; -using Bunifu.Licensing.Options; - -namespace Bunifu.Licensing.Models -{ - // Token: 0x02000030 RID: 48 - [DebuggerStepThrough] - internal sealed class v1License : License - { - // Token: 0x17000057 RID: 87 - // (get) Token: 0x060001ED RID: 493 RVA: 0x00016675 File Offset: 0x00014875 - // (set) Token: 0x060001EE RID: 494 RVA: 0x0001667D File Offset: 0x0001487D - public bool IsValid { get; set; } - - // Token: 0x17000058 RID: 88 - // (get) Token: 0x060001EF RID: 495 RVA: 0x00016686 File Offset: 0x00014886 - // (set) Token: 0x060001F0 RID: 496 RVA: 0x0001668E File Offset: 0x0001488E - public int ID { get; set; } - - // Token: 0x17000059 RID: 89 - // (get) Token: 0x060001F1 RID: 497 RVA: 0x00016697 File Offset: 0x00014897 - // (set) Token: 0x060001F2 RID: 498 RVA: 0x0001669F File Offset: 0x0001489F - public int ClientID { get; set; } - - // Token: 0x1700005A RID: 90 - // (get) Token: 0x060001F3 RID: 499 RVA: 0x000166A8 File Offset: 0x000148A8 - // (set) Token: 0x060001F4 RID: 500 RVA: 0x000166B0 File Offset: 0x000148B0 - public int TotalDays { get; set; } - - // Token: 0x1700005B RID: 91 - // (get) Token: 0x060001F5 RID: 501 RVA: 0x000166B9 File Offset: 0x000148B9 - // (set) Token: 0x060001F6 RID: 502 RVA: 0x000166C1 File Offset: 0x000148C1 - public int Activations { get; set; } - - // Token: 0x1700005C RID: 92 - // (get) Token: 0x060001F7 RID: 503 RVA: 0x000166CA File Offset: 0x000148CA - // (set) Token: 0x060001F8 RID: 504 RVA: 0x000166D2 File Offset: 0x000148D2 - public string Email { get; set; } - - // Token: 0x1700005D RID: 93 - // (get) Token: 0x060001F9 RID: 505 RVA: 0x000166DB File Offset: 0x000148DB - public override string LicenseKey - { - get - { - return this._licenseKey; - } - } - - // Token: 0x1700005E RID: 94 - // (get) Token: 0x060001FA RID: 506 RVA: 0x000166E3 File Offset: 0x000148E3 - // (set) Token: 0x060001FB RID: 507 RVA: 0x000166EB File Offset: 0x000148EB - public string HardwareID { get; set; } - - // Token: 0x1700005F RID: 95 - // (get) Token: 0x060001FC RID: 508 RVA: 0x000166F4 File Offset: 0x000148F4 - // (set) Token: 0x060001FD RID: 509 RVA: 0x000166FC File Offset: 0x000148FC - public string ProductName { get; set; } - - // Token: 0x17000060 RID: 96 - // (get) Token: 0x060001FE RID: 510 RVA: 0x00016708 File Offset: 0x00014908 - public int RemainingDays - { - get - { - DateTime dateTime = DateTime.Now; - bool flag = Network.IsAvailable(); - if (flag) - { - dateTime = InternetTime.GetDateTime(); - } - return (int)(this.ExpiryDate - dateTime).TotalDays; - } - } - - // Token: 0x17000061 RID: 97 - // (get) Token: 0x060001FF RID: 511 RVA: 0x00016744 File Offset: 0x00014944 - // (set) Token: 0x06000200 RID: 512 RVA: 0x0001674C File Offset: 0x0001494C - public DateTime LastSeen { get; set; } - - // Token: 0x17000062 RID: 98 - // (get) Token: 0x06000201 RID: 513 RVA: 0x00016755 File Offset: 0x00014955 - // (set) Token: 0x06000202 RID: 514 RVA: 0x0001675D File Offset: 0x0001495D - public DateTime CreatedAt { get; set; } - - // Token: 0x17000063 RID: 99 - // (get) Token: 0x06000203 RID: 515 RVA: 0x00016766 File Offset: 0x00014966 - // (set) Token: 0x06000204 RID: 516 RVA: 0x0001676E File Offset: 0x0001496E - public DateTime PurchaseDate { get; set; } - - // Token: 0x17000064 RID: 100 - // (get) Token: 0x06000205 RID: 517 RVA: 0x00016778 File Offset: 0x00014978 - public DateTime ExpiryDate - { - get - { - return this.CreatedAt.AddDays((double)this.TotalDays); - } - } - - // Token: 0x17000065 RID: 101 - // (get) Token: 0x06000206 RID: 518 RVA: 0x0001679C File Offset: 0x0001499C - public LicenseTypes Type - { - get - { - bool flag = this.LicenseKey.StartsWith("FREE"); - LicenseTypes licenseTypes; - if (flag) - { - licenseTypes = LicenseTypes.Trial; - } - else - { - bool flag2 = this.TotalDays >= 10000; - if (flag2) - { - licenseTypes = LicenseTypes.Enterprise; - } - else - { - licenseTypes = LicenseTypes.Premium; - } - } - return licenseTypes; - } - } - - // Token: 0x17000066 RID: 102 - // (get) Token: 0x06000207 RID: 519 RVA: 0x000167E1 File Offset: 0x000149E1 - // (set) Token: 0x06000208 RID: 520 RVA: 0x000167EC File Offset: 0x000149EC - public StatusOptions Status - { - get - { - return this._status; - } - set - { - DateTime dateTime = DateTime.Now; - bool flag = Network.IsAvailable(); - if (flag) - { - dateTime = InternetTime.GetDateTime(); - } - int num = dateTime.Date.CompareTo(this.ExpiryDate.Date); - bool flag2 = num == 0 || num == 1; - if (flag2) - { - this._status = StatusOptions.Expired; - } - else - { - this._status = value; - } - } - } - - // Token: 0x17000067 RID: 103 - // (get) Token: 0x06000209 RID: 521 RVA: 0x0001684E File Offset: 0x00014A4E - // (set) Token: 0x0600020A RID: 522 RVA: 0x00016856 File Offset: 0x00014A56 - public ProductTypes Product { get; set; } - - // Token: 0x0600020B RID: 523 RVA: 0x0001685F File Offset: 0x00014A5F - public override void Dispose() - { - } - - // Token: 0x04000160 RID: 352 - internal string _licenseKey; - - // Token: 0x04000161 RID: 353 - private StatusOptions _status; - } -} diff --git a/Bunifu.Licensing/Models/v2License.cs b/Bunifu.Licensing/Models/v2License.cs deleted file mode 100644 index bb61a40..0000000 --- a/Bunifu.Licensing/Models/v2License.cs +++ /dev/null @@ -1,205 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using Bunifu.Licensing.Helpers; -using Bunifu.Licensing.Options; - -namespace Bunifu.Licensing.Models -{ - // Token: 0x02000031 RID: 49 - [DebuggerStepThrough] - internal sealed class v2License : License - { - // Token: 0x17000068 RID: 104 - // (get) Token: 0x0600020D RID: 525 RVA: 0x0001686B File Offset: 0x00014A6B - // (set) Token: 0x0600020E RID: 526 RVA: 0x00016873 File Offset: 0x00014A73 - public int ID { get; set; } - - // Token: 0x17000069 RID: 105 - // (get) Token: 0x0600020F RID: 527 RVA: 0x0001687C File Offset: 0x00014A7C - // (set) Token: 0x06000210 RID: 528 RVA: 0x00016884 File Offset: 0x00014A84 - public int? LicenseKeyID { get; set; } - - // Token: 0x1700006A RID: 106 - // (get) Token: 0x06000211 RID: 529 RVA: 0x0001688D File Offset: 0x00014A8D - // (set) Token: 0x06000212 RID: 530 RVA: 0x00016895 File Offset: 0x00014A95 - public int? BundleID { get; set; } - - // Token: 0x1700006B RID: 107 - // (get) Token: 0x06000213 RID: 531 RVA: 0x0001689E File Offset: 0x00014A9E - // (set) Token: 0x06000214 RID: 532 RVA: 0x000168A6 File Offset: 0x00014AA6 - public int? TeamID { get; set; } - - // Token: 0x1700006C RID: 108 - // (get) Token: 0x06000215 RID: 533 RVA: 0x000168AF File Offset: 0x00014AAF - // (set) Token: 0x06000216 RID: 534 RVA: 0x000168B7 File Offset: 0x00014AB7 - public int? UserID { get; set; } - - // Token: 0x1700006D RID: 109 - // (get) Token: 0x06000217 RID: 535 RVA: 0x000168C0 File Offset: 0x00014AC0 - // (set) Token: 0x06000218 RID: 536 RVA: 0x000168C8 File Offset: 0x00014AC8 - public int PurchaseID { get; set; } - - // Token: 0x1700006E RID: 110 - // (get) Token: 0x06000219 RID: 537 RVA: 0x000168D1 File Offset: 0x00014AD1 - // (set) Token: 0x0600021A RID: 538 RVA: 0x000168D9 File Offset: 0x00014AD9 - public int TotalDays { get; set; } - - // Token: 0x1700006F RID: 111 - // (get) Token: 0x0600021B RID: 539 RVA: 0x000168E2 File Offset: 0x00014AE2 - // (set) Token: 0x0600021C RID: 540 RVA: 0x000168EA File Offset: 0x00014AEA - public int MaxDevices { get; set; } - - // Token: 0x17000070 RID: 112 - // (get) Token: 0x0600021D RID: 541 RVA: 0x000168F3 File Offset: 0x00014AF3 - // (set) Token: 0x0600021E RID: 542 RVA: 0x000168FB File Offset: 0x00014AFB - public int Activations { get; set; } - - // Token: 0x17000071 RID: 113 - // (get) Token: 0x0600021F RID: 543 RVA: 0x00016904 File Offset: 0x00014B04 - // (set) Token: 0x06000220 RID: 544 RVA: 0x0001690C File Offset: 0x00014B0C - public int RemainingDevices { get; set; } - - // Token: 0x17000072 RID: 114 - // (get) Token: 0x06000221 RID: 545 RVA: 0x00016918 File Offset: 0x00014B18 - public int RemainingDays - { - get - { - DateTime dateTime = DateTime.Now; - bool flag = Network.IsAvailable(); - if (flag) - { - dateTime = InternetTime.GetDateTime(); - } - return (int)(this.ExpiryDate - dateTime).TotalDays + 1; - } - } - - // Token: 0x17000073 RID: 115 - // (get) Token: 0x06000222 RID: 546 RVA: 0x00016956 File Offset: 0x00014B56 - // (set) Token: 0x06000223 RID: 547 RVA: 0x0001695E File Offset: 0x00014B5E - public string UUID { get; set; } - - // Token: 0x17000074 RID: 116 - // (get) Token: 0x06000224 RID: 548 RVA: 0x00016967 File Offset: 0x00014B67 - // (set) Token: 0x06000225 RID: 549 RVA: 0x0001696F File Offset: 0x00014B6F - public string Plan { get; set; } - - // Token: 0x17000075 RID: 117 - // (get) Token: 0x06000226 RID: 550 RVA: 0x00016978 File Offset: 0x00014B78 - // (set) Token: 0x06000227 RID: 551 RVA: 0x00016980 File Offset: 0x00014B80 - public string RenewalURL { get; set; } - - // Token: 0x17000076 RID: 118 - // (get) Token: 0x06000228 RID: 552 RVA: 0x00016989 File Offset: 0x00014B89 - public override string LicenseKey - { - get - { - return this._licenseKey; - } - } - - // Token: 0x17000077 RID: 119 - // (get) Token: 0x06000229 RID: 553 RVA: 0x00016991 File Offset: 0x00014B91 - // (set) Token: 0x0600022A RID: 554 RVA: 0x00016999 File Offset: 0x00014B99 - public DateTime CreatedAt { get; set; } - - // Token: 0x17000078 RID: 120 - // (get) Token: 0x0600022B RID: 555 RVA: 0x000169A4 File Offset: 0x00014BA4 - public DateTime ExpiryDate - { - get - { - return this.CreatedAt.AddDays((double)this.TotalDays); - } - } - - // Token: 0x17000079 RID: 121 - // (get) Token: 0x0600022C RID: 556 RVA: 0x000169C6 File Offset: 0x00014BC6 - // (set) Token: 0x0600022D RID: 557 RVA: 0x000169CE File Offset: 0x00014BCE - public ProductTypes Product { get; set; } - - // Token: 0x1700007A RID: 122 - // (get) Token: 0x0600022E RID: 558 RVA: 0x000169D7 File Offset: 0x00014BD7 - // (set) Token: 0x0600022F RID: 559 RVA: 0x000169DF File Offset: 0x00014BDF - public List ProductsLicensed { get; set; } = new List(); - - // Token: 0x1700007B RID: 123 - // (get) Token: 0x06000230 RID: 560 RVA: 0x000169E8 File Offset: 0x00014BE8 - // (set) Token: 0x06000231 RID: 561 RVA: 0x000169F0 File Offset: 0x00014BF0 - public LicenseTypes Type - { - get - { - return this._type; - } - set - { - this._type = value; - bool flag = this.TotalDays > 14 && this.TotalDays <= 365; - if (flag) - { - this._type = LicenseTypes.Premium; - } - else - { - bool flag2 = this.TotalDays >= 1000000; - if (flag2) - { - this._type = LicenseTypes.Enterprise; - } - } - } - } - - // Token: 0x1700007C RID: 124 - // (get) Token: 0x06000232 RID: 562 RVA: 0x00016A4A File Offset: 0x00014C4A - // (set) Token: 0x06000233 RID: 563 RVA: 0x00016A54 File Offset: 0x00014C54 - public StatusOptions Status - { - get - { - return this._status; - } - set - { - DateTime dateTime = DateTime.Now; - bool flag = Network.IsAvailable(); - if (flag) - { - dateTime = InternetTime.GetDateTime(); - } - int num = dateTime.Date.CompareTo(this.ExpiryDate.Date); - bool flag2 = num == 0 || num == 1; - if (flag2) - { - this._status = StatusOptions.Expired; - } - else - { - this._status = value; - } - } - } - - // Token: 0x06000234 RID: 564 RVA: 0x00016AB6 File Offset: 0x00014CB6 - public override void Dispose() - { - } - - // Token: 0x0400016E RID: 366 - private int _remainingDays; - - // Token: 0x0400016F RID: 367 - internal string _licenseKey; - - // Token: 0x04000170 RID: 368 - private LicenseTypes _type; - - // Token: 0x04000171 RID: 369 - private StatusOptions _status; - } -} diff --git a/Bunifu.Licensing/Models/v2Request.cs b/Bunifu.Licensing/Models/v2Request.cs deleted file mode 100644 index 4338280..0000000 --- a/Bunifu.Licensing/Models/v2Request.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using System.Diagnostics; -using Newtonsoft.Json; - -namespace Bunifu.Licensing.Models -{ - // Token: 0x02000032 RID: 50 - [DebuggerStepThrough] - internal sealed class v2Request - { - // Token: 0x1700007D RID: 125 - // (get) Token: 0x06000236 RID: 566 RVA: 0x00016ACD File Offset: 0x00014CCD - // (set) Token: 0x06000237 RID: 567 RVA: 0x00016AD5 File Offset: 0x00014CD5 - [JsonProperty(PropertyName = "key")] - public string LicenseKey { get; set; } - - // Token: 0x1700007E RID: 126 - // (get) Token: 0x06000238 RID: 568 RVA: 0x00016ADE File Offset: 0x00014CDE - // (set) Token: 0x06000239 RID: 569 RVA: 0x00016AE6 File Offset: 0x00014CE6 - [JsonProperty(PropertyName = "email")] - public string Email { get; set; } - - // Token: 0x1700007F RID: 127 - // (get) Token: 0x0600023A RID: 570 RVA: 0x00016AEF File Offset: 0x00014CEF - // (set) Token: 0x0600023B RID: 571 RVA: 0x00016AF7 File Offset: 0x00014CF7 - [JsonProperty(PropertyName = "name")] - public string DeviceName { get; set; } - - // Token: 0x17000080 RID: 128 - // (get) Token: 0x0600023C RID: 572 RVA: 0x00016B00 File Offset: 0x00014D00 - // (set) Token: 0x0600023D RID: 573 RVA: 0x00016B08 File Offset: 0x00014D08 - [JsonProperty(PropertyName = "os")] - public string OS { get; set; } - - // Token: 0x17000081 RID: 129 - // (get) Token: 0x0600023E RID: 574 RVA: 0x00016B11 File Offset: 0x00014D11 - // (set) Token: 0x0600023F RID: 575 RVA: 0x00016B19 File Offset: 0x00014D19 - [JsonProperty(PropertyName = "hw_id")] - public string DeviceID { get; set; } - - // Token: 0x06000240 RID: 576 RVA: 0x00016B24 File Offset: 0x00014D24 - public override string ToString() - { - return JsonConvert.SerializeObject(this, Formatting.Indented); - } - } -} diff --git a/Bunifu.Licensing/Options/ActivationResults.cs b/Bunifu.Licensing/Options/ActivationResults.cs deleted file mode 100644 index 28e6d3c..0000000 --- a/Bunifu.Licensing/Options/ActivationResults.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; - -namespace Bunifu.Licensing.Options -{ - // Token: 0x0200002A RID: 42 - internal enum ActivationResults - { - // Token: 0x0400013F RID: 319 - Success, - // Token: 0x04000140 RID: 320 - Failed, - // Token: 0x04000141 RID: 321 - ProductLicenseMismatch, - // Token: 0x04000142 RID: 322 - ExceptionRaised, - // Token: 0x04000143 RID: 323 - TLS12Issue, - // Token: 0x04000144 RID: 324 - Forbidden - } -} diff --git a/Bunifu.Licensing/Options/LicenseTypes.cs b/Bunifu.Licensing/Options/LicenseTypes.cs deleted file mode 100644 index dea6bb7..0000000 --- a/Bunifu.Licensing/Options/LicenseTypes.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -namespace Bunifu.Licensing.Options -{ - // Token: 0x02000026 RID: 38 - internal enum LicenseTypes - { - // Token: 0x0400012D RID: 301 - Trial, - // Token: 0x0400012E RID: 302 - Premium, - // Token: 0x0400012F RID: 303 - Enterprise - } -} diff --git a/Bunifu.Licensing/Options/ProductTypes.cs b/Bunifu.Licensing/Options/ProductTypes.cs deleted file mode 100644 index 2ceafd2..0000000 --- a/Bunifu.Licensing/Options/ProductTypes.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; - -namespace Bunifu.Licensing.Options -{ - // Token: 0x02000028 RID: 40 - public enum ProductTypes - { - // Token: 0x04000134 RID: 308 - UIWinForms, - // Token: 0x04000135 RID: 309 - DatavizBasicWinForms, - // Token: 0x04000136 RID: 310 - DatavizAdvancedWinForms, - // Token: 0x04000137 RID: 311 - Charts = 4, - // Token: 0x04000138 RID: 312 - None = 3 - } -} diff --git a/Bunifu.Licensing/Options/StatusOptions.cs b/Bunifu.Licensing/Options/StatusOptions.cs deleted file mode 100644 index e5eb01b..0000000 --- a/Bunifu.Licensing/Options/StatusOptions.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; - -namespace Bunifu.Licensing.Options -{ - // Token: 0x02000027 RID: 39 - internal enum StatusOptions - { - // Token: 0x04000131 RID: 305 - Active, - // Token: 0x04000132 RID: 306 - Expired - } -} diff --git a/Bunifu.Licensing/Options/Strings.cs b/Bunifu.Licensing/Options/Strings.cs deleted file mode 100644 index 6f43388..0000000 --- a/Bunifu.Licensing/Options/Strings.cs +++ /dev/null @@ -1,105 +0,0 @@ -using System; -using System.Diagnostics; - -namespace Bunifu.Licensing.Options -{ - // Token: 0x0200002B RID: 43 - [DebuggerStepThrough] - internal sealed class Strings - { - // Token: 0x02000049 RID: 73 - internal sealed class Application - { - // Token: 0x040001C0 RID: 448 - internal static string PricingURL = "https://bunifuframework.com/pricing"; - } - - // Token: 0x0200004A RID: 74 - internal sealed class Exceptions - { - // Token: 0x040001C1 RID: 449 - internal static string NetworkUnavailable = "You have no Internet connection at the moment.\nPlease try reconnecting first."; - - // Token: 0x040001C2 RID: 450 - internal static string ServerUnreachable = "There was an issue trying to reach the server.\nPlease try again."; - - // Token: 0x040001C3 RID: 451 - internal static string LicenseBlocked = "[403] Your license has been blocked."; - - // Token: 0x040001C4 RID: 452 - internal static string BuildTimeError = "There was an issue validating your license.\nIf this dialog has been run when building your project, please close it and reopen any Form with Bunifu controls for activation to occur successfully."; - - // Token: 0x040001C5 RID: 453 - internal static string JSONObjectParseFailed = "There was an issue validating your license.\n\nIf this issue persists, please try:\n • Running Visual Studio as an Administrator.\n • Checking your Internet's Firewall congifuration."; - - // Token: 0x040001C6 RID: 454 - internal static string LicenseNotFound = "The license you've entered appears unavailable.\nPlease use a valid license and try again."; - - // Token: 0x040001C7 RID: 455 - internal static string ProductLicenseMismatch = "The license you've entered refers to another product.\nPlease change the details and try again."; - - // Token: 0x040001C8 RID: 456 - internal const string UIRuntimeLicenseInvalid = "This product does not have a registered Bunifu UI license to run."; - - // Token: 0x040001C9 RID: 457 - internal const string ChartsRuntimeLicenseInvalid = "This product does not have a registered Bunifu Charts license to run."; - - // Token: 0x040001CA RID: 458 - internal const string DatavizBasicRuntimeLicenseInvalid = "This product does not have a registered Bunifu Dataviz license to run."; - - // Token: 0x040001CB RID: 459 - internal const string DatavizAdvancedRuntimeLicenseInvalid = "This product does not have a registered Bunifu Dataviz license to run."; - - // Token: 0x040001CC RID: 460 - internal const string UILicenseInvalid = "Please ensure you have a valid Bunifu UI WinForms license."; - - // Token: 0x040001CD RID: 461 - internal const string DatavizBasicLicenseInvalid = "Please ensure you have a valid Bunifu Dataviz Basic license."; - - // Token: 0x040001CE RID: 462 - internal const string DatavizAdvancedLicenseInvalid = "Please ensure you have a valid Bunifu Dataviz Advanced license."; - - // Token: 0x040001CF RID: 463 - internal const string ChartsLicenseInvalid = "Please ensure you have a valid Bunifu Charts license."; - - // Token: 0x040001D0 RID: 464 - internal const string UILicenseInactive = "Please ensure you have an active Bunifu UI WinForms license."; - - // Token: 0x040001D1 RID: 465 - internal const string DatavizBasicLicenseInactive = "Please ensure you have an active Bunifu Dataviz Basic license."; - - // Token: 0x040001D2 RID: 466 - internal const string DatavizAdvancedLicenseInactive = "Please ensure you have an active Bunifu Dataviz Advanced license."; - - // Token: 0x040001D3 RID: 467 - internal const string ChartsLicenseInactive = "Please ensure you have an active Bunifu Charts license."; - - // Token: 0x040001D4 RID: 468 - internal const string UILicenseExpired = "Your Bunifu UI WinForms license has expired."; - - // Token: 0x040001D5 RID: 469 - internal const string DatavizBasicLicenseExpired = "Your Bunifu Dataviz Basic license has expired."; - - // Token: 0x040001D6 RID: 470 - internal const string DatavizAdvancedLicenseExpired = "Your Bunifu Dataviz Advanced license has expired."; - - // Token: 0x040001D7 RID: 471 - internal const string ChartsLicenseExpired = "Your Bunifu Charts license has expired."; - - // Token: 0x040001D8 RID: 472 - internal const string UILicenseBlocked = "Your Bunifu UI license has been blocked."; - - // Token: 0x040001D9 RID: 473 - internal const string DatavizBasicLicenseBlocked = "Your Bunifu Dataviz Basic license has been blocked."; - - // Token: 0x040001DA RID: 474 - internal const string DatavizAdvancedLicenseBlocked = "Your Bunifu Dataviz Advanced license has been blocked."; - - // Token: 0x040001DB RID: 475 - internal const string ChartsLicenseBlocked = "Your Bunifu Charts license has been blocked."; - - // Token: 0x040001DC RID: 476 - internal const string SystemBackdated = "Please ensure your System Date/Time is correct."; - } - } -} diff --git a/Bunifu.Licensing/Options/ValidationResults.cs b/Bunifu.Licensing/Options/ValidationResults.cs deleted file mode 100644 index cbeee0c..0000000 --- a/Bunifu.Licensing/Options/ValidationResults.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; - -namespace Bunifu.Licensing.Options -{ - // Token: 0x02000029 RID: 41 - internal enum ValidationResults - { - // Token: 0x0400013A RID: 314 - LicenseActive, - // Token: 0x0400013B RID: 315 - LicenseBlocked, - // Token: 0x0400013C RID: 316 - LicenseExpired, - // Token: 0x0400013D RID: 317 - LicenseNonExistent - } -} diff --git a/Bunifu.Licensing/Properties/AssemblyInfo.cs b/Bunifu.Licensing/Properties/AssemblyInfo.cs deleted file mode 100644 index c2d0bb7..0000000 --- a/Bunifu.Licensing/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; -using System.Diagnostics; -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Runtime.Versioning; - -[assembly: AssemblyVersion("4.0.0.0")] -[assembly: AssemblyTrademark("A product of Bunifu Technologies, LTD.")] -[assembly: ComVisible(false)] -[assembly: Guid("bbf26210-46bb-4d21-b164-4d8ea6743dc0")] -[assembly: AssemblyCompany("Bunifu Technologies")] -[assembly: AssemblyConfiguration("Debug")] -[assembly: AssemblyCopyright("© 2024, Bunifu Technologies.")] -[assembly: AssemblyDescription("Provides licensing services for Bunifu Framework.")] -[assembly: AssemblyFileVersion("4.0.0.0")] -[assembly: AssemblyInformationalVersion("6.0.7+8d6b37705a41a8e261729845c5e948525ecc243a")] -[assembly: AssemblyProduct("Bunifu.Licensing")] -[assembly: AssemblyTitle("Bunifu.Licensing")] -[assembly: TargetPlatform("Windows7.0")] -[assembly: SupportedOSPlatform("Windows7.0")] - -// Add the public key for strong name signing -[assembly: AssemblyDelaySign(false)] -// Setting the expected public key token for "f89b4760ba7dcb6b" -// This is 'f89b4760ba7dcb6b' represented as a byte array -[assembly: AssemblyKeyFile("")] -[assembly: AssemblyKeyName("")] -[assembly: InternalsVisibleTo("Bunifu.UI.WinForms, PublicKey=002400000480000094000000060200000024000052534131000400000100010015a63d7b1e081b01dfd944ffa5d44a59339a92a607f9decd3eb33b009dab5a2b92afe61e538d16b2d1feb7808228c32c4e139c19aa4e41c5efad6e20a4d06f7abb18233aeef010506ddbc218feaf8d50aa64f27e8f50cfd655da46af9a596fef982c893f6a4c6327ad4fd30c798a3310551361524f0f699aafa2adda8aa77bf1")] \ No newline at end of file diff --git a/Bunifu.Licensing/Properties/Resources.cs b/Bunifu.Licensing/Properties/Resources.cs deleted file mode 100644 index d7729d1..0000000 --- a/Bunifu.Licensing/Properties/Resources.cs +++ /dev/null @@ -1,219 +0,0 @@ -using System; -using System.CodeDom.Compiler; -using System.ComponentModel; -using System.Diagnostics; -using System.Drawing; -using System.Globalization; -using System.Resources; -using System.Runtime.CompilerServices; - -namespace Bunifu.Licensing.Properties -{ - // Token: 0x02000025 RID: 37 - [GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] - [DebuggerNonUserCode] - [CompilerGenerated] - internal class Resources - { - // Token: 0x0600019F RID: 415 RVA: 0x00016118 File Offset: 0x00014318 - internal Resources() - { - } - - // Token: 0x1700002B RID: 43 - // (get) Token: 0x060001A0 RID: 416 RVA: 0x00016124 File Offset: 0x00014324 - [EditorBrowsable(EditorBrowsableState.Advanced)] - internal static ResourceManager ResourceManager - { - get - { - bool flag = Resources.resourceMan == null; - if (flag) - { - ResourceManager resourceManager = new ResourceManager("Bunifu.Licensing.Properties.Resources", typeof(Resources).Assembly); - Resources.resourceMan = resourceManager; - } - return Resources.resourceMan; - } - } - - // Token: 0x1700002C RID: 44 - // (get) Token: 0x060001A1 RID: 417 RVA: 0x0001616C File Offset: 0x0001436C - // (set) Token: 0x060001A2 RID: 418 RVA: 0x00016183 File Offset: 0x00014383 - [EditorBrowsable(EditorBrowsableState.Advanced)] - internal static CultureInfo Culture - { - get - { - return Resources.resourceCulture; - } - set - { - Resources.resourceCulture = value; - } - } - - // Token: 0x1700002D RID: 45 - // (get) Token: 0x060001A3 RID: 419 RVA: 0x0001618C File Offset: 0x0001438C - internal static string BUL - { - get - { - return Resources.ResourceManager.GetString("BUL", Resources.resourceCulture); - } - } - - // Token: 0x1700002E RID: 46 - // (get) Token: 0x060001A4 RID: 420 RVA: 0x000161B4 File Offset: 0x000143B4 - internal static string BUL2 - { - get - { - return Resources.ResourceManager.GetString("BUL2", Resources.resourceCulture); - } - } - - // Token: 0x1700002F RID: 47 - // (get) Token: 0x060001A5 RID: 421 RVA: 0x000161DC File Offset: 0x000143DC - internal static Bitmap bunifu_framework_logo - { - get - { - object @object = Resources.ResourceManager.GetObject("bunifu_framework_logo", Resources.resourceCulture); - return (Bitmap)@object; - } - } - - // Token: 0x17000030 RID: 48 - // (get) Token: 0x060001A6 RID: 422 RVA: 0x0001620C File Offset: 0x0001440C - internal static Bitmap bunifu_icon_dark - { - get - { - object @object = Resources.ResourceManager.GetObject("bunifu-icon-dark", Resources.resourceCulture); - return (Bitmap)@object; - } - } - - // Token: 0x17000031 RID: 49 - // (get) Token: 0x060001A7 RID: 423 RVA: 0x0001623C File Offset: 0x0001443C - internal static Bitmap bunifu_licensing_cli - { - get - { - object @object = Resources.ResourceManager.GetObject("bunifu-licensing-cli", Resources.resourceCulture); - return (Bitmap)@object; - } - } - - // Token: 0x17000032 RID: 50 - // (get) Token: 0x060001A8 RID: 424 RVA: 0x0001626C File Offset: 0x0001446C - internal static string CPA - { - get - { - return Resources.ResourceManager.GetString("CPA", Resources.resourceCulture); - } - } - - // Token: 0x17000033 RID: 51 - // (get) Token: 0x060001A9 RID: 425 RVA: 0x00016294 File Offset: 0x00014494 - internal static Bitmap error - { - get - { - object @object = Resources.ResourceManager.GetObject("error", Resources.resourceCulture); - return (Bitmap)@object; - } - } - - // Token: 0x17000034 RID: 52 - // (get) Token: 0x060001AA RID: 426 RVA: 0x000162C4 File Offset: 0x000144C4 - internal static Bitmap information - { - get - { - object @object = Resources.ResourceManager.GetObject("information", Resources.resourceCulture); - return (Bitmap)@object; - } - } - - // Token: 0x17000035 RID: 53 - // (get) Token: 0x060001AB RID: 427 RVA: 0x000162F4 File Offset: 0x000144F4 - internal static Bitmap red_warning - { - get - { - object @object = Resources.ResourceManager.GetObject("red-warning", Resources.resourceCulture); - return (Bitmap)@object; - } - } - - // Token: 0x17000036 RID: 54 - // (get) Token: 0x060001AC RID: 428 RVA: 0x00016324 File Offset: 0x00014524 - internal static string SHA - { - get - { - return Resources.ResourceManager.GetString("SHA", Resources.resourceCulture); - } - } - - // Token: 0x17000037 RID: 55 - // (get) Token: 0x060001AD RID: 429 RVA: 0x0001634C File Offset: 0x0001454C - internal static string SHA2 - { - get - { - return Resources.ResourceManager.GetString("SHA2", Resources.resourceCulture); - } - } - - // Token: 0x17000038 RID: 56 - // (get) Token: 0x060001AE RID: 430 RVA: 0x00016374 File Offset: 0x00014574 - internal static string XLD - { - get - { - return Resources.ResourceManager.GetString("XLD", Resources.resourceCulture); - } - } - - // Token: 0x17000039 RID: 57 - // (get) Token: 0x060001AF RID: 431 RVA: 0x0001639C File Offset: 0x0001459C - internal static string XLF - { - get - { - return Resources.ResourceManager.GetString("XLF", Resources.resourceCulture); - } - } - - // Token: 0x1700003A RID: 58 - // (get) Token: 0x060001B0 RID: 432 RVA: 0x000163C4 File Offset: 0x000145C4 - internal static string XLV - { - get - { - return Resources.ResourceManager.GetString("XLV", Resources.resourceCulture); - } - } - - // Token: 0x1700003B RID: 59 - // (get) Token: 0x060001B1 RID: 433 RVA: 0x000163EC File Offset: 0x000145EC - internal static Bitmap yellow_warning - { - get - { - object @object = Resources.ResourceManager.GetObject("yellow-warning", Resources.resourceCulture); - return (Bitmap)@object; - } - } - - // Token: 0x0400012A RID: 298 - private static ResourceManager resourceMan; - - // Token: 0x0400012B RID: 299 - private static CultureInfo resourceCulture; - } -} diff --git a/Bunifu.Licensing/Properties/Resources.resources b/Bunifu.Licensing/Properties/Resources.resources deleted file mode 100644 index 731b04642c2203c5f871936f86eca185fc80552b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46668 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