diff --git a/MediaBrowser.Common.Implementations/BaseApplicationHost.cs b/MediaBrowser.Common.Implementations/BaseApplicationHost.cs index 8e9a287b6..952592c93 100644 --- a/MediaBrowser.Common.Implementations/BaseApplicationHost.cs +++ b/MediaBrowser.Common.Implementations/BaseApplicationHost.cs @@ -383,7 +383,7 @@ namespace MediaBrowser.Common.Implementations NetworkManager = CreateNetworkManager(); RegisterSingleInstance(NetworkManager); - SecurityManager = new PluginSecurityManager(this, HttpClient, JsonSerializer, ApplicationPaths, NetworkManager); + SecurityManager = new PluginSecurityManager(this, HttpClient, JsonSerializer, ApplicationPaths, NetworkManager, LogManager); RegisterSingleInstance(SecurityManager); InstallationManager = new InstallationManager(Logger, this, ApplicationPaths, HttpClient, JsonSerializer, SecurityManager, NetworkManager, ConfigurationManager); diff --git a/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj b/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj index 69c880916..dfe7d70ee 100644 --- a/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj +++ b/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj @@ -92,6 +92,7 @@ + diff --git a/MediaBrowser.Common.Implementations/Security/MBLicenseFile.cs b/MediaBrowser.Common.Implementations/Security/MBLicenseFile.cs index c5d5f28d6..77a7bf0f6 100644 --- a/MediaBrowser.Common.Implementations/Security/MBLicenseFile.cs +++ b/MediaBrowser.Common.Implementations/Security/MBLicenseFile.cs @@ -56,6 +56,16 @@ namespace MediaBrowser.Common.Implementations.Security } + public void RemoveRegCheck(string featureId) + { + using (var provider = new MD5CryptoServiceProvider()) + { + UpdateRecords.Remove(new Guid(provider.ComputeHash(Encoding.Unicode.GetBytes(featureId)))); + Save(); + } + + } + public DateTime LastChecked(string featureId) { using (var provider = new MD5CryptoServiceProvider()) diff --git a/MediaBrowser.Common.Implementations/Security/MBRegistration.cs b/MediaBrowser.Common.Implementations/Security/MBRegistration.cs index 1f9e63e68..79f60c3ac 100644 --- a/MediaBrowser.Common.Implementations/Security/MBRegistration.cs +++ b/MediaBrowser.Common.Implementations/Security/MBRegistration.cs @@ -1,6 +1,7 @@ using MediaBrowser.Common.Configuration; using MediaBrowser.Common.Net; using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Logging; using MediaBrowser.Model.Serialization; using System; using System.Collections.Generic; @@ -13,10 +14,11 @@ namespace MediaBrowser.Common.Implementations.Security { private static MBLicenseFile _licenseFile; - private const string MBValidateUrl = "http://mb3admin.com/admin/service/registration/validate"; + private const string MBValidateUrl = Constants.Constants.MbAdminUrl+"service/registration/validate"; private static IApplicationPaths _appPaths; private static INetworkManager _networkManager; + private static ILogger _logger; private static MBLicenseFile LicenseFile { @@ -35,37 +37,46 @@ namespace MediaBrowser.Common.Implementations.Security set { LicenseFile.LegacyKey = value; LicenseFile.Save(); } } - public static void Init(IApplicationPaths appPaths, INetworkManager networkManager) + public static void Init(IApplicationPaths appPaths, INetworkManager networkManager, ILogManager logManager) { // Ugly alert (static init) _appPaths = appPaths; _networkManager = networkManager; + _logger = logManager.GetLogger("SecurityManager"); } - public static async Task GetRegistrationStatus(IHttpClient httpClient, IJsonSerializer jsonSerializer, string feature, string mb2Equivalent = null) + public static async Task GetRegistrationStatus(IHttpClient httpClient, IJsonSerializer jsonSerializer, string feature, string mb2Equivalent = null, string version = null) { - var mac = _networkManager.GetMacAddress(); - var data = new Dictionary {{"feature", feature}, {"key",SupporterKey}, {"mac",mac}, {"mb2equiv",mb2Equivalent}, {"legacykey", LegacyKey} }; + //check the reg file first to alleviate strain on the MB admin server - must actually check in every 30 days tho + var reg = new RegRecord {/*registered = LicenseFile.LastChecked(feature) > DateTime.UtcNow.AddDays(-30)*/}; - var reg = new RegRecord(); - try + if (!reg.registered) { - using (var json = await httpClient.Post(MBValidateUrl, data, CancellationToken.None).ConfigureAwait(false)) - { - reg = jsonSerializer.DeserializeFromStream(json); - } + var mac = _networkManager.GetMacAddress(); + var data = new Dictionary { { "feature", feature }, { "key", SupporterKey }, { "mac", mac }, { "mb2equiv", mb2Equivalent }, { "legacykey", LegacyKey }, { "ver", version }, { "platform", Environment.OSVersion.VersionString } }; - if (reg.registered) + try { - LicenseFile.AddRegCheck(feature); - } + using (var json = await httpClient.Post(MBValidateUrl, data, CancellationToken.None).ConfigureAwait(false)) + { + reg = jsonSerializer.DeserializeFromStream(json); + } - } - catch (Exception) - { - //if we have trouble obtaining from web - allow it if we've validated in the past 30 days - reg.registered = LicenseFile.LastChecked(feature) > DateTime.UtcNow.AddDays(-30); + if (reg.registered) + { + LicenseFile.AddRegCheck(feature); + } + else + { + LicenseFile.RemoveRegCheck(feature); + } + + } + catch (Exception e) + { + _logger.ErrorException("Error checking registration status of {0}", e, feature); + } } return new MBRegistrationRecord {IsRegistered = reg.registered, ExpirationDate = reg.expDate, RegChecked = true}; diff --git a/MediaBrowser.Common.Implementations/Security/PluginSecurityManager.cs b/MediaBrowser.Common.Implementations/Security/PluginSecurityManager.cs index 19a1ed646..d60e6cca3 100644 --- a/MediaBrowser.Common.Implementations/Security/PluginSecurityManager.cs +++ b/MediaBrowser.Common.Implementations/Security/PluginSecurityManager.cs @@ -2,6 +2,7 @@ using MediaBrowser.Common.Net; using MediaBrowser.Common.Security; using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Logging; using MediaBrowser.Model.Serialization; using System; using System.Collections.Generic; @@ -37,7 +38,7 @@ namespace MediaBrowser.Common.Implementations.Security { get { - LazyInitializer.EnsureInitialized(ref _isMbSupporter, ref _isMbSupporterInitialized, ref _isMbSupporterSyncLock, () => GetRegistrationStatus("MBSupporter").Result.IsRegistered); + LazyInitializer.EnsureInitialized(ref _isMbSupporter, ref _isMbSupporterInitialized, ref _isMbSupporterSyncLock, () => GetRegistrationStatus("MBSupporter", null, _appHost.ApplicationVersion.ToString()).Result.IsRegistered); return _isMbSupporter.Value; } } @@ -60,7 +61,8 @@ namespace MediaBrowser.Common.Implementations.Security /// /// Initializes a new instance of the class. /// - public PluginSecurityManager(IApplicationHost appHost, IHttpClient httpClient, IJsonSerializer jsonSerializer, IApplicationPaths appPaths, INetworkManager networkManager) + public PluginSecurityManager(IApplicationHost appHost, IHttpClient httpClient, IJsonSerializer jsonSerializer, + IApplicationPaths appPaths, INetworkManager networkManager, ILogManager logManager) { if (httpClient == null) { @@ -72,6 +74,7 @@ namespace MediaBrowser.Common.Implementations.Security _appHost = appHost; _httpClient = httpClient; _jsonSerializer = jsonSerializer; + MBRegistration.Init(_applciationPaths, _networkManager, logManager); } /// @@ -92,13 +95,11 @@ namespace MediaBrowser.Common.Implementations.Security /// /// The feature. /// The MB2 equivalent. + /// The version of this feature /// Task{MBRegistrationRecord}. - public async Task GetRegistrationStatus(string feature, string mb2Equivalent = null) + public async Task GetRegistrationStatus(string feature, string mb2Equivalent = null, string version = null) { - // Do this on demend instead of in the constructor to delay the external assembly load - // Todo: Refactor external methods to take app paths as a param - MBRegistration.Init(_applciationPaths, _networkManager); - return await MBRegistration.GetRegistrationStatus(_httpClient, _jsonSerializer, feature, mb2Equivalent).ConfigureAwait(false); + return await MBRegistration.GetRegistrationStatus(_httpClient, _jsonSerializer, feature, mb2Equivalent, version).ConfigureAwait(false); } /// @@ -109,16 +110,10 @@ namespace MediaBrowser.Common.Implementations.Security { get { - // Do this on demend instead of in the constructor to delay the external assembly load - // Todo: Refactor external methods to take app paths as a param - MBRegistration.Init(_applciationPaths, _networkManager); return MBRegistration.SupporterKey; } set { - // Do this on demend instead of in the constructor to delay the external assembly load - // Todo: Refactor external methods to take app paths as a param - MBRegistration.Init(_applciationPaths, _networkManager); if (value != MBRegistration.SupporterKey) { MBRegistration.SupporterKey = value; @@ -136,16 +131,10 @@ namespace MediaBrowser.Common.Implementations.Security { get { - // Do this on demend instead of in the constructor to delay the external assembly load - // Todo: Refactor external methods to take app paths as a param - MBRegistration.Init(_applciationPaths, _networkManager); return MBRegistration.LegacyKey; } set { - // Do this on demend instead of in the constructor to delay the external assembly load - // Todo: Refactor external methods to take app paths as a param - MBRegistration.Init(_applciationPaths, _networkManager); if (value != MBRegistration.LegacyKey) { MBRegistration.LegacyKey = value; diff --git a/MediaBrowser.Common/Security/ISecurityManager.cs b/MediaBrowser.Common/Security/ISecurityManager.cs index 82a6809be..b7dd8b617 100644 --- a/MediaBrowser.Common/Security/ISecurityManager.cs +++ b/MediaBrowser.Common/Security/ISecurityManager.cs @@ -28,8 +28,9 @@ namespace MediaBrowser.Common.Security /// /// The feature. /// The MB2 equivalent. + /// The version of the feature /// Task{MBRegistrationRecord}. - Task GetRegistrationStatus(string feature, string mb2Equivalent = null); + Task GetRegistrationStatus(string feature, string mb2Equivalent = null, string version = null); /// /// Load all registration info for all entities that require registration