浏览代码

Add version and platform to stats and don't hit server on every reg check

Eric Reed 11 年之前
父节点
当前提交
b78cdae321

+ 1 - 1
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);

+ 1 - 0
MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj

@@ -92,6 +92,7 @@
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="ScheduledTasks\ScheduledTaskWorker.cs" />
     <Compile Include="ScheduledTasks\TaskManager.cs" />
+    <Compile Include="ScheduledTasks\Tasks\StatisticsTask.cs" />
     <Compile Include="ScheduledTasks\Tasks\DeleteCacheFileTask.cs" />
     <Compile Include="ScheduledTasks\Tasks\DeleteLogFileTask.cs" />
     <Compile Include="ScheduledTasks\Tasks\PluginUpdateTask.cs" />

+ 10 - 0
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())

+ 29 - 18
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<MBRegistrationRecord> GetRegistrationStatus(IHttpClient httpClient, IJsonSerializer jsonSerializer, string feature, string mb2Equivalent = null)
+        public static async Task<MBRegistrationRecord> GetRegistrationStatus(IHttpClient httpClient, IJsonSerializer jsonSerializer, string feature, string mb2Equivalent = null, string version = null)
         {
-            var mac = _networkManager.GetMacAddress();
-            var data = new Dictionary<string, string> {{"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))
+                var mac = _networkManager.GetMacAddress();
+                var data = new Dictionary<string, string> { { "feature", feature }, { "key", SupporterKey }, { "mac", mac }, { "mb2equiv", mb2Equivalent }, { "legacykey", LegacyKey }, { "ver", version }, { "platform", Environment.OSVersion.VersionString } };
+
+                try
                 {
-                    reg = jsonSerializer.DeserializeFromStream<RegRecord>(json);
-                }
+                    using (var json = await httpClient.Post(MBValidateUrl, data, CancellationToken.None).ConfigureAwait(false))
+                    {
+                        reg = jsonSerializer.DeserializeFromStream<RegRecord>(json);
+                    }
 
-                if (reg.registered)
+                    if (reg.registered)
+                    {
+                        LicenseFile.AddRegCheck(feature);
+                    }
+                    else
+                    {
+                        LicenseFile.RemoveRegCheck(feature);
+                    }
+
+                }
+                catch (Exception e)
                 {
-                    LicenseFile.AddRegCheck(feature);
+                    _logger.ErrorException("Error checking registration status of {0}", e, feature);
                 }
-
-            }
-            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);
             }
 
             return new MBRegistrationRecord {IsRegistered = reg.registered, ExpirationDate = reg.expDate, RegChecked = true};

+ 8 - 19
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
         /// <summary>
         /// Initializes a new instance of the <see cref="PluginSecurityManager" /> class.
         /// </summary>
-        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);
         }
 
         /// <summary>
@@ -92,13 +95,11 @@ namespace MediaBrowser.Common.Implementations.Security
         /// </summary>
         /// <param name="feature">The feature.</param>
         /// <param name="mb2Equivalent">The MB2 equivalent.</param>
+        /// <param name="version">The version of this feature</param>
         /// <returns>Task{MBRegistrationRecord}.</returns>
-        public async Task<MBRegistrationRecord> GetRegistrationStatus(string feature, string mb2Equivalent = null)
+        public async Task<MBRegistrationRecord> 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);
         }
 
         /// <summary>
@@ -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;

+ 2 - 1
MediaBrowser.Common/Security/ISecurityManager.cs

@@ -28,8 +28,9 @@ namespace MediaBrowser.Common.Security
         /// </summary>
         /// <param name="feature">The feature.</param>
         /// <param name="mb2Equivalent">The MB2 equivalent.</param>
+        /// <param name="version">The version of the feature</param>
         /// <returns>Task{MBRegistrationRecord}.</returns>
-        Task<MBRegistrationRecord> GetRegistrationStatus(string feature, string mb2Equivalent = null);
+        Task<MBRegistrationRecord> GetRegistrationStatus(string feature, string mb2Equivalent = null, string version = null);
 
         /// <summary>
         /// Load all registration info for all entities that require registration