diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2014-08-31 15:15:33 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2014-08-31 15:15:33 -0400 |
| commit | 45db7d21b2a0a18b73253c64651a57c60880b084 (patch) | |
| tree | 3f6eb8bae23c5c7a3cab6e4c4ee34f8b2ba1838f /MediaBrowser.Common.Implementations | |
| parent | 10dedf92adddeae707bae5a4204c8164f5bfea48 (diff) | |
localize plugin installation process
Diffstat (limited to 'MediaBrowser.Common.Implementations')
4 files changed, 123 insertions, 27 deletions
diff --git a/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj b/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj index 2af671a6a..4b0c95616 100644 --- a/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj +++ b/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj @@ -101,6 +101,7 @@ <Compile Include="Security\MBLicenseFile.cs" /> <Compile Include="Security\PluginSecurityManager.cs" /> <Compile Include="Security\RegRecord.cs" /> + <Compile Include="Security\SuppporterInfoResponse.cs" /> <Compile Include="Serialization\JsonSerializer.cs" /> <Compile Include="Serialization\XmlSerializer.cs" /> <Compile Include="Updates\InstallationManager.cs" /> diff --git a/MediaBrowser.Common.Implementations/Security/MBLicenseFile.cs b/MediaBrowser.Common.Implementations/Security/MBLicenseFile.cs index 77a7bf0f6..8f3225f4e 100644 --- a/MediaBrowser.Common.Implementations/Security/MBLicenseFile.cs +++ b/MediaBrowser.Common.Implementations/Security/MBLicenseFile.cs @@ -1,7 +1,10 @@ using MediaBrowser.Common.Configuration; using System; +using System.Collections.Concurrent; using System.Collections.Generic; +using System.Globalization; using System.IO; +using System.Linq; using System.Security.Cryptography; using System.Text; @@ -19,7 +22,7 @@ namespace MediaBrowser.Common.Implementations.Security if (value != _regKey) { //if key is changed - clear out our saved validations - UpdateRecords.Clear(); + _updateRecords.Clear(); _regKey = value; } } @@ -33,24 +36,30 @@ namespace MediaBrowser.Common.Implementations.Security } } - public string LegacyKey { get; set; } - private Dictionary<Guid, DateTime> UpdateRecords { get; set; } - private readonly object _lck = new object(); + private readonly ConcurrentDictionary<Guid, DateTime> _updateRecords = new ConcurrentDictionary<Guid, DateTime>(); + private readonly object _fileLock = new object(); private string _regKey; public MBLicenseFile(IApplicationPaths appPaths) { _appPaths = appPaths; - UpdateRecords = new Dictionary<Guid, DateTime>(); Load(); } + private void SetUpdateRecord(Guid key, DateTime value) + { + _updateRecords.AddOrUpdate(key, value, (k, v) => value); + } + public void AddRegCheck(string featureId) { using (var provider = new MD5CryptoServiceProvider()) { - UpdateRecords[new Guid(provider.ComputeHash(Encoding.Unicode.GetBytes(featureId)))] = DateTime.UtcNow; + var key = new Guid(provider.ComputeHash(Encoding.Unicode.GetBytes(featureId))); + var value = DateTime.UtcNow; + + SetUpdateRecord(key, value); Save(); } @@ -60,7 +69,11 @@ namespace MediaBrowser.Common.Implementations.Security { using (var provider = new MD5CryptoServiceProvider()) { - UpdateRecords.Remove(new Guid(provider.ComputeHash(Encoding.Unicode.GetBytes(featureId)))); + var key = new Guid(provider.ComputeHash(Encoding.Unicode.GetBytes(featureId))); + DateTime val; + + _updateRecords.TryRemove(key, out val); + Save(); } @@ -71,8 +84,10 @@ namespace MediaBrowser.Common.Implementations.Security using (var provider = new MD5CryptoServiceProvider()) { DateTime last; - lock(_lck) UpdateRecords.TryGetValue(new Guid(provider.ComputeHash(Encoding.Unicode.GetBytes(featureId))), out last); - return last < DateTime.UtcNow ? last : DateTime.MinValue; // guard agains people just putting a large number in the file + _updateRecords.TryGetValue(new Guid(provider.ComputeHash(Encoding.Unicode.GetBytes(featureId))), out last); + + // guard agains people just putting a large number in the file + return last < DateTime.UtcNow ? last : DateTime.MinValue; } } @@ -80,7 +95,7 @@ namespace MediaBrowser.Common.Implementations.Security { string[] contents = null; var licenseFile = Filename; - lock (_lck) + lock (_fileLock) { try { @@ -95,13 +110,19 @@ namespace MediaBrowser.Common.Implementations.Security { //first line is reg key RegKey = contents[0]; + //next is legacy key - if (contents.Length > 1) LegacyKey = contents[1]; + if (contents.Length > 1) + { + // Don't need this anymore + } + //the rest of the lines should be pairs of features and timestamps for (var i = 2; i < contents.Length; i = i + 2) { var feat = Guid.Parse(contents[i]); - UpdateRecords[feat] = new DateTime(Convert.ToInt64(contents[i + 1])); + + SetUpdateRecord(feat, new DateTime(Convert.ToInt64(contents[i + 1]))); } } } @@ -109,16 +130,24 @@ namespace MediaBrowser.Common.Implementations.Security public void Save() { //build our array - var lines = new List<string> {RegKey, LegacyKey}; - foreach (var pair in UpdateRecords) + var lines = new List<string> + { + RegKey, + + // Legacy key + string.Empty + }; + + foreach (var pair in _updateRecords + .ToList()) { lines.Add(pair.Key.ToString()); - lines.Add(pair.Value.Ticks.ToString()); + lines.Add(pair.Value.Ticks.ToString(CultureInfo.InvariantCulture)); } var licenseFile = Filename; Directory.CreateDirectory(Path.GetDirectoryName(licenseFile)); - lock (_lck) File.WriteAllLines(licenseFile, lines); + lock (_fileLock) File.WriteAllLines(licenseFile, lines); } } } diff --git a/MediaBrowser.Common.Implementations/Security/PluginSecurityManager.cs b/MediaBrowser.Common.Implementations/Security/PluginSecurityManager.cs index b464baffc..22fce1ce1 100644 --- a/MediaBrowser.Common.Implementations/Security/PluginSecurityManager.cs +++ b/MediaBrowser.Common.Implementations/Security/PluginSecurityManager.cs @@ -18,7 +18,7 @@ namespace MediaBrowser.Common.Implementations.Security public class PluginSecurityManager : ISecurityManager { private const string MBValidateUrl = Constants.Constants.MbAdminUrl + "service/registration/validate"; - + /// <summary> /// The _is MB supporter /// </summary> @@ -45,12 +45,12 @@ namespace MediaBrowser.Common.Implementations.Security } } - private MBLicenseFile _licenseFile; - private MBLicenseFile LicenseFile + private MBLicenseFile _licenseFile; + private MBLicenseFile LicenseFile { get { return _licenseFile ?? (_licenseFile = new MBLicenseFile(_appPaths)); } } - + private readonly IHttpClient _httpClient; private readonly IJsonSerializer _jsonSerializer; private readonly IApplicationHost _appHost; @@ -123,7 +123,7 @@ namespace MediaBrowser.Common.Implementations.Security return GetRegistrationStatusInternal(feature, mb2Equivalent, version); } - public Task<MBRegistrationRecord> GetSupporterRegistrationStatus() + private Task<MBRegistrationRecord> GetSupporterRegistrationStatus() { return GetRegistrationStatusInternal("MBSupporter", null, _appHost.ApplicationVersion.ToString()); } @@ -142,15 +142,49 @@ namespace MediaBrowser.Common.Implementations.Security { if (value != LicenseFile.RegKey) { - LicenseFile.RegKey = value; - LicenseFile.Save(); - + LicenseFile.RegKey = value; + LicenseFile.Save(); + // re-load registration info Task.Run(() => LoadAllRegistrationInfo()); } } } + public async Task<SupporterInfo> GetSupporterInfo() + { + var key = SupporterKey; + + if (string.IsNullOrWhiteSpace(key)) + { + return new SupporterInfo(); + } + + var url = Constants.Constants.MbAdminUrl + "/service/supporter/retrieve?key=" + key; + + using (var stream = await _httpClient.Get(url, CancellationToken.None).ConfigureAwait(false)) + { + var response = _jsonSerializer.DeserializeFromStream<SuppporterInfoResponse>(stream); + + + var info = new SupporterInfo + { + Email = response.email, + PlanType = response.planType, + SupporterKey = response.supporterKey, + ExpirationDate = string.IsNullOrWhiteSpace(response.expDate) ? (DateTime?)null : DateTime.Parse(response.expDate), + RegistrationDate = DateTime.Parse(response.regDate), + IsActiveSupporter = IsMBSupporter + }; + + info.IsExpiredSupporter = info.ExpirationDate.HasValue && info.ExpirationDate < DateTime.UtcNow && !string.IsNullOrWhiteSpace(info.SupporterKey); + + // TODO: Now that we've pulled this down, might as well update the cached suppoter registrationinfo? + + return info; + } + } + private async Task<MBRegistrationRecord> GetRegistrationStatusInternal(string feature, string mb2Equivalent = null, string version = null) @@ -158,7 +192,7 @@ namespace MediaBrowser.Common.Implementations.Security //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(-15) + registered = LicenseFile.LastChecked(feature) > DateTime.UtcNow.AddDays(-7) }; var success = reg.registered; @@ -201,15 +235,33 @@ namespace MediaBrowser.Common.Implementations.Security } } - return new MBRegistrationRecord + var record = new MBRegistrationRecord { IsRegistered = reg.registered, ExpirationDate = reg.expDate, RegChecked = true, RegError = !success }; + + record.TrialVersion = IsInTrial(reg.expDate, record.RegChecked, record.IsRegistered); + record.IsValid = !record.RegChecked || (record.IsRegistered || record.TrialVersion); + + return record; } - + + private bool IsInTrial(DateTime expirationDate, bool regChecked, bool isRegistered) + { + //don't set this until we've successfully obtained exp date + if (!regChecked) + { + return false; + } + + var isInTrial = expirationDate > DateTime.UtcNow; + + return (isInTrial && !isRegistered); + } + /// <summary> /// Resets the supporter info. /// </summary> diff --git a/MediaBrowser.Common.Implementations/Security/SuppporterInfoResponse.cs b/MediaBrowser.Common.Implementations/Security/SuppporterInfoResponse.cs new file mode 100644 index 000000000..49c5af8d8 --- /dev/null +++ b/MediaBrowser.Common.Implementations/Security/SuppporterInfoResponse.cs @@ -0,0 +1,14 @@ + +namespace MediaBrowser.Common.Implementations.Security +{ + internal class SuppporterInfoResponse + { + public string email { get; set; } + public string supporterKey { get; set; } + public int totalRegs { get; set; } + public int totalMachines { get; set; } + public string expDate { get; set; } + public string regDate { get; set; } + public string planType { get; set; } + } +} |
