diff options
| author | Luke <luke.pulverenti@gmail.com> | 2016-12-02 03:07:36 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2016-12-02 03:07:36 -0500 |
| commit | 2050eb7bb2acc8e42ed07fa97c6a5da129860de4 (patch) | |
| tree | 75e7f343794c277edf2574305c18e5d78bc15619 /Emby.Server.Implementations/Security | |
| parent | c9dc6ec7367564791dec54d4c456b0de25cc3d8e (diff) | |
| parent | 12ff39eeafd7bfe81b7d3dd4d3046b5640e33495 (diff) | |
Merge pull request #2322 from MediaBrowser/dev
Dev
Diffstat (limited to 'Emby.Server.Implementations/Security')
| -rw-r--r-- | Emby.Server.Implementations/Security/MBLicenseFile.cs | 64 | ||||
| -rw-r--r-- | Emby.Server.Implementations/Security/PluginSecurityManager.cs | 19 |
2 files changed, 67 insertions, 16 deletions
diff --git a/Emby.Server.Implementations/Security/MBLicenseFile.cs b/Emby.Server.Implementations/Security/MBLicenseFile.cs index 76741bdf8..c791d6a52 100644 --- a/Emby.Server.Implementations/Security/MBLicenseFile.cs +++ b/Emby.Server.Implementations/Security/MBLicenseFile.cs @@ -39,7 +39,7 @@ namespace Emby.Server.Implementations.Security } } - private readonly ConcurrentDictionary<Guid, DateTime> _updateRecords = new ConcurrentDictionary<Guid, DateTime>(); + private readonly ConcurrentDictionary<Guid, FeatureRegInfo> _updateRecords = new ConcurrentDictionary<Guid, FeatureRegInfo>(); private readonly object _fileLock = new object(); private string _regKey; @@ -52,7 +52,7 @@ namespace Emby.Server.Implementations.Security Load(); } - private void SetUpdateRecord(Guid key, DateTime value) + private void SetUpdateRecord(Guid key, FeatureRegInfo value) { _updateRecords.AddOrUpdate(key, value, (k, v) => value); } @@ -62,10 +62,14 @@ namespace Emby.Server.Implementations.Security return new Guid(_cryptographyProvider.ComputeMD5(Encoding.Unicode.GetBytes(featureId))); } - public void AddRegCheck(string featureId) + public void AddRegCheck(string featureId, DateTime expirationDate) { var key = GetKey(featureId); - var value = DateTime.UtcNow; + var value = new FeatureRegInfo + { + ExpirationDate = expirationDate, + LastChecked = DateTime.UtcNow + }; SetUpdateRecord(key, value); Save(); @@ -74,21 +78,26 @@ namespace Emby.Server.Implementations.Security public void RemoveRegCheck(string featureId) { var key = GetKey(featureId); - DateTime val; + FeatureRegInfo val; _updateRecords.TryRemove(key, out val); Save(); } - public DateTime LastChecked(string featureId) + public FeatureRegInfo GetRegInfo(string featureId) { var key = GetKey(featureId); - DateTime last; - _updateRecords.TryGetValue(key, out last); + FeatureRegInfo info = null; + _updateRecords.TryGetValue(key, out info); + + if (info == null) + { + return null; + } // guard agains people just putting a large number in the file - return last < DateTime.UtcNow ? last : DateTime.MinValue; + return info.LastChecked < DateTime.UtcNow ? info : null; } private void Load() @@ -105,7 +114,7 @@ namespace Emby.Server.Implementations.Security { lock (_fileLock) { - _fileSystem.WriteAllBytes(licenseFile, new byte[] {}); + _fileSystem.WriteAllBytes(licenseFile, new byte[] { }); } } catch (IOException) @@ -139,7 +148,23 @@ namespace Emby.Server.Implementations.Security Guid feat; if (Guid.TryParse(line, out feat)) { - SetUpdateRecord(feat, new DateTime(Convert.ToInt64(contents[i + 1]))); + var lineParts = contents[i + 1].Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries); + + long ticks; + if (long.TryParse(lineParts[0], out ticks)) + { + var info = new FeatureRegInfo + { + LastChecked = new DateTime(ticks) + }; + + if (lineParts.Length > 1 && long.TryParse(lineParts[1], out ticks)) + { + info.ExpirationDate = new DateTime(ticks); + } + + SetUpdateRecord(feat, info); + } } } } @@ -160,7 +185,11 @@ namespace Emby.Server.Implementations.Security .ToList()) { lines.Add(pair.Key.ToString()); - lines.Add(pair.Value.Ticks.ToString(CultureInfo.InvariantCulture)); + + var dateLine = pair.Value.LastChecked.Ticks.ToString(CultureInfo.InvariantCulture) + "|" + + pair.Value.ExpirationDate.Ticks.ToString(CultureInfo.InvariantCulture); + + lines.Add(dateLine); } var licenseFile = Filename; @@ -171,4 +200,15 @@ namespace Emby.Server.Implementations.Security } } } + + internal class FeatureRegInfo + { + public DateTime ExpirationDate { get; set; } + public DateTime LastChecked { get; set; } + + public FeatureRegInfo() + { + ExpirationDate = DateTime.MinValue; + } + } } diff --git a/Emby.Server.Implementations/Security/PluginSecurityManager.cs b/Emby.Server.Implementations/Security/PluginSecurityManager.cs index 61d4f5252..f21259137 100644 --- a/Emby.Server.Implementations/Security/PluginSecurityManager.cs +++ b/Emby.Server.Implementations/Security/PluginSecurityManager.cs @@ -245,18 +245,29 @@ namespace Emby.Server.Implementations.Security string mb2Equivalent = null, string version = null) { - var lastChecked = LicenseFile.LastChecked(feature); + var regInfo = LicenseFile.GetRegInfo(feature); + var lastChecked = regInfo == null ? DateTime.MinValue : regInfo.LastChecked; + var expDate = regInfo == null ? DateTime.MinValue : regInfo.ExpirationDate; + + var maxCacheDays = 14; + var nextCheckDate = new [] { expDate, lastChecked.AddDays(maxCacheDays) }.Min(); + + if (nextCheckDate > DateTime.UtcNow.AddDays(maxCacheDays)) + { + nextCheckDate = DateTime.MinValue; + } //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 { // Cache the result for up to a week - registered = lastChecked > DateTime.UtcNow.AddDays(-7) + registered = regInfo != null && nextCheckDate >= DateTime.UtcNow && expDate >= DateTime.UtcNow, + expDate = expDate }; var success = reg.registered; - if (!(lastChecked > DateTime.UtcNow.AddDays(-1))) + if (!(lastChecked > DateTime.UtcNow.AddDays(-1)) || !reg.registered) { var data = new Dictionary<string, string> { @@ -291,7 +302,7 @@ namespace Emby.Server.Implementations.Security if (reg.registered) { - LicenseFile.AddRegCheck(feature); + LicenseFile.AddRegCheck(feature, reg.expDate); } else { |
