diff options
author | Andrew Rabert | 2017-08-08 01:03:06 -0400 |
---|---|---|
committer | Andrew Rabert | 2017-08-08 01:03:06 -0400 |
commit | 3417c3c01e86d8ab03540a3a19320fa912c39e40 (patch) | |
tree | 8fe3f3703f64d19613fcd0b16848606777e5087e | |
parent | e22800377d5f7da555cb51f55fd575b0068718f5 (diff) | |
download | aur-3417c3c01e86d8ab03540a3a19320fa912c39e40.tar.gz |
Simplify patch
-rw-r--r-- | .SRCINFO | 4 | ||||
-rw-r--r-- | PKGBUILD | 4 | ||||
-rw-r--r-- | PluginSecurityManager.cs | 280 |
3 files changed, 284 insertions, 4 deletions
@@ -1,7 +1,7 @@ pkgbase = emby-server-unlocked pkgdesc = Emby Server compiled with a patch to unlock Emby Premiere features pkgver = 3.2.26.0 - pkgrel = 1 + pkgrel = 2 url = http://emby.media install = emby-server.install arch = i686 @@ -25,7 +25,7 @@ pkgbase = emby-server-unlocked sha256sums = b25bf83a0ab371aff3b13b82f7af71b51bfe6d7e51eb8a8a3dd8f0774ffce6a5 sha256sums = c9ad78f3e2f0ffcb4ee66bb3e99249fcd283dc9fee17895b9265dc733288b953 sha256sums = 8a91ea49a1699c820c4a180710072cba1d6d5c10e45df97477ff6a898f4e1d70 - sha256sums = 9df64aaafae5d75e4dbb592d9b35c3f376c221bddf303f147407bc676423b35e + sha256sums = c501e359a7c1268374e8b1cb8be6afe324d8a16788ba27c980efc7bf286ce9d5 pkgname = emby-server-unlocked @@ -2,7 +2,7 @@ pkgname=emby-server-unlocked pkgver=3.2.26.0 -pkgrel=1 +pkgrel=2 pkgdesc='Emby Server compiled with a patch to unlock Emby Premiere features' arch=('i686' 'x86_64') url='http://emby.media' @@ -22,7 +22,7 @@ sha256sums=('8d1ee6e5da6589dbdda52df13ffe9ef0a9a5025159e0efcb36334214f3c7246c' 'b25bf83a0ab371aff3b13b82f7af71b51bfe6d7e51eb8a8a3dd8f0774ffce6a5' 'c9ad78f3e2f0ffcb4ee66bb3e99249fcd283dc9fee17895b9265dc733288b953' '8a91ea49a1699c820c4a180710072cba1d6d5c10e45df97477ff6a898f4e1d70' - '9df64aaafae5d75e4dbb592d9b35c3f376c221bddf303f147407bc676423b35e') + 'c501e359a7c1268374e8b1cb8be6afe324d8a16788ba27c980efc7bf286ce9d5') prepare() { cd Emby-${pkgver} diff --git a/PluginSecurityManager.cs b/PluginSecurityManager.cs new file mode 100644 index 000000000000..7b7d42d67c36 --- /dev/null +++ b/PluginSecurityManager.cs @@ -0,0 +1,280 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Threading; +using System.Threading.Tasks; +using MediaBrowser.Common.Configuration; +using MediaBrowser.Common.Net; +using MediaBrowser.Common.Security; +using MediaBrowser.Controller; +using MediaBrowser.Model.Cryptography; +using MediaBrowser.Model.Entities; +using MediaBrowser.Model.IO; +using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Net; +using MediaBrowser.Model.Serialization; + +namespace Emby.Server.Implementations.Security +{ + /// <summary> + /// Class PluginSecurityManager + /// </summary> + public class PluginSecurityManager : ISecurityManager + { + private const string MBValidateUrl = "https://mb3admin.com/admin/service/registration/validate"; + private const string AppstoreRegUrl = /*MbAdmin.HttpsUrl*/ "https://mb3admin.com/admin/service/appstore/register"; + + /// <summary> + /// The _is MB supporter + /// </summary> + private bool? _isMbSupporter; + /// <summary> + /// The _is MB supporter initialized + /// </summary> + private bool _isMbSupporterInitialized; + /// <summary> + /// The _is MB supporter sync lock + /// </summary> + private object _isMbSupporterSyncLock = new object(); + + /// <summary> + /// Gets a value indicating whether this instance is MB supporter. + /// </summary> + /// <value><c>true</c> if this instance is MB supporter; otherwise, <c>false</c>.</value> + public bool IsMBSupporter + { + get + { + LazyInitializer.EnsureInitialized(ref _isMbSupporter, ref _isMbSupporterInitialized, ref _isMbSupporterSyncLock, () => GetSupporterRegistrationStatus().Result.IsRegistered); + return _isMbSupporter.Value; + } + } + + private MBLicenseFile _licenseFile; + private MBLicenseFile LicenseFile + { + get { return _licenseFile ?? (_licenseFile = new MBLicenseFile(_appPaths, _fileSystem, _cryptographyProvider)); } + } + + private readonly IHttpClient _httpClient; + private readonly IJsonSerializer _jsonSerializer; + private readonly IServerApplicationHost _appHost; + private readonly ILogger _logger; + private readonly IApplicationPaths _appPaths; + private readonly IFileSystem _fileSystem; + private readonly ICryptoProvider _cryptographyProvider; + + private IEnumerable<IRequiresRegistration> _registeredEntities; + protected IEnumerable<IRequiresRegistration> RegisteredEntities + { + get + { + return _registeredEntities ?? (_registeredEntities = _appHost.GetExports<IRequiresRegistration>()); + } + } + + /// <summary> + /// Initializes a new instance of the <see cref="PluginSecurityManager" /> class. + /// </summary> + public PluginSecurityManager(IServerApplicationHost appHost, IHttpClient httpClient, IJsonSerializer jsonSerializer, + IApplicationPaths appPaths, ILogManager logManager, IFileSystem fileSystem, ICryptoProvider cryptographyProvider) + { + if (httpClient == null) + { + throw new ArgumentNullException("httpClient"); + } + + _appHost = appHost; + _httpClient = httpClient; + _jsonSerializer = jsonSerializer; + _appPaths = appPaths; + _fileSystem = fileSystem; + _cryptographyProvider = cryptographyProvider; + _logger = logManager.GetLogger("SecurityManager"); + } + + /// <summary> + /// Load all registration info for all entities that require registration + /// </summary> + /// <returns></returns> + public async Task LoadAllRegistrationInfo() + { + var tasks = new List<Task>(); + + ResetSupporterInfo(); + tasks.AddRange(RegisteredEntities.Select(i => i.LoadRegistrationInfoAsync())); + await Task.WhenAll(tasks); + } + + /// <summary> + /// Gets the registration status. + /// This overload supports existing plug-ins. + /// </summary> + /// <param name="feature">The feature.</param> + /// <param name="mb2Equivalent">The MB2 equivalent.</param> + /// <returns>Task{MBRegistrationRecord}.</returns> + public Task<MBRegistrationRecord> GetRegistrationStatus(string feature, string mb2Equivalent = null) + { + return GetRegistrationStatusInternal(feature, mb2Equivalent); + } + + /// <summary> + /// Gets the registration status. + /// </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 Task<MBRegistrationRecord> GetRegistrationStatus(string feature, string mb2Equivalent, string version) + { + return GetRegistrationStatusInternal(feature, mb2Equivalent, version); + } + + private Task<MBRegistrationRecord> GetSupporterRegistrationStatus() + { + return GetRegistrationStatusInternal("MBSupporter", null, _appHost.ApplicationVersion.ToString()); + } + + /// <summary> + /// Gets or sets the supporter key. + /// </summary> + /// <value>The supporter key.</value> + public string SupporterKey + { + get + { + return LicenseFile.RegKey; + } + set + { + var newValue = value; + if (newValue != null) + { + newValue = newValue.Trim(); + } + + if (newValue != LicenseFile.RegKey) + { + LicenseFile.RegKey = newValue; + LicenseFile.Save(); + + // re-load registration info + Task.Run(() => LoadAllRegistrationInfo()); + } + } + } + + /// <summary> + /// Register an app store sale with our back-end. It will validate the transaction with the store + /// and then register the proper feature and then fill in the supporter key on success. + /// </summary> + /// <param name="parameters">Json parameters to send to admin server</param> + public async Task RegisterAppStoreSale(string parameters) + { + var options = new HttpRequestOptions() + { + Url = AppstoreRegUrl, + CancellationToken = CancellationToken.None, + BufferContent = false + }; + options.RequestHeaders.Add("X-Emby-Token", _appHost.SystemId); + options.RequestContent = parameters; + options.RequestContentType = "application/json"; + + try + { + using (var response = await _httpClient.Post(options).ConfigureAwait(false)) + { + var reg = _jsonSerializer.DeserializeFromStream<RegRecord>(response.Content); + + if (reg == null) + { + var msg = "Result from appstore registration was null."; + _logger.Error(msg); + throw new ArgumentException(msg); + } + if (!String.IsNullOrEmpty(reg.key)) + { + SupporterKey = reg.key; + } + } + + } + catch (ArgumentException) + { + SaveAppStoreInfo(parameters); + throw; + } + catch (HttpException e) + { + _logger.ErrorException("Error registering appstore purchase {0}", e, parameters ?? "NO PARMS SENT"); + + if (e.StatusCode.HasValue && e.StatusCode.Value == HttpStatusCode.PaymentRequired) + { + throw new PaymentRequiredException(); + } + throw new Exception("Error registering store sale"); + } + catch (Exception e) + { + _logger.ErrorException("Error registering appstore purchase {0}", e, parameters ?? "NO PARMS SENT"); + SaveAppStoreInfo(parameters); + //TODO - could create a re-try routine on start-up if this file is there. For now we can handle manually. + throw new Exception("Error registering store sale"); + } + + } + + private void SaveAppStoreInfo(string info) + { + // Save all transaction information to a file + + try + { + _fileSystem.WriteAllText(Path.Combine(_appPaths.ProgramDataPath, "apptrans-error.txt"), info); + } + catch (IOException) + { + + } + } + + private async Task<MBRegistrationRecord> GetRegistrationStatusInternal(string feature, + string mb2Equivalent = null, + string version = null) + { + return new MBRegistrationRecord + { + IsRegistered = true, + RegChecked = true, + TrialVersion = false, + IsValid = true, + RegError = false + }; + } + + 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> + private void ResetSupporterInfo() + { + _isMbSupporter = null; + _isMbSupporterInitialized = false; + } + } +} |