Ejemplo n.º 1
0
 public void GetFailureThrowsIfKeyNotFoundTest()
 {
     Assert.Throws <InvalidOperationException>(() =>
     {
         var actual = FailureStrings.Get("Fake");
     });
 }
Ejemplo n.º 2
0
        public void AllCultures()
        {
            var original = CultureInfo.DefaultThreadCurrentCulture;

            try
            {
                var cultures = new[]
                {
                    "en-US",
                    "ru-RU"
                };

                foreach (var c in cultures)
                {
                    var ci = new CultureInfo(c);
                    CultureInfo.DefaultThreadCurrentCulture = ci;
                    Thread.CurrentThread.CurrentUICulture   = ci;

                    foreach (var key in FailureStrings.GetKeys().Where(x => x.EndsWith("Code")))
                    {
                        var actual = FailureStrings.Get(key);

                        Assert.NotNull(actual);
                    }
                }
            }
            finally
            {
                CultureInfo.DefaultThreadCurrentCulture = original;
            }
        }
Ejemplo n.º 3
0
        public void GetFailureTest()
        {
            var actual = FailureStrings.Get(FailureStrings.ACT00Code);

            Assert.Equal("ACT.00", actual.Code);
            Assert.Equal("Activation failed.", actual.Message);
            Assert.Equal("Your product is having trouble connecting with License servers.", actual.HowToResolve);
        }
Ejemplo n.º 4
0
        public void AllKeysValid()
        {
            foreach (var key in FailureStrings.GetKeys().Where(x => x.EndsWith("Code")))
            {
                var actual = FailureStrings.Get(key);

                Assert.NotNull(actual);
            }
        }
Ejemplo n.º 5
0
        public async Task <LicenseRegisterResult> CreateAsync(LicenseRegisterRequest request, string userName)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }
            if (string.IsNullOrWhiteSpace(userName))
            {
                throw new ArgumentNullException(nameof(userName));
            }

            try
            {
                _logger.LogDebug(JsonSerializer.Serialize(request));

                var failure = await ValidateAsync(request);

                if (failure != null)
                {
                    return(new LicenseRegisterResult
                    {
                        Failure = (GeneralValidationFailure)failure
                    });
                }

                string attributesJson     = null;
                string attributesChecksum = null;

                if (request.Attributes != null && request.Attributes.Any())
                {
                    attributesJson     = JsonSerializer.Serialize(request.Attributes);
                    attributesChecksum = Utils.GetSha256HashFromString(attributesJson);
                }

                var activationId  = Guid.NewGuid();
                var product       = _context.Products.Single(x => x.LicenseProductId == request.ProductUuid);
                var registration  = _context.Registrations.Single(x => x.LicenseRegistrationId == request.LicenseUuid);
                var licenseString = await CreateLicenseAsync(request, registration, product, activationId);

                await CreateLicenseRecordAsync(registration, licenseString, attributesJson, attributesChecksum, userName, activationId);

                var result = new LicenseRegisterResult();
                result.License = licenseString;

                return(result);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, ex.Message);

                return(new LicenseRegisterResult
                {
                    Failure = (GeneralValidationFailure)FailureStrings.Get(FailureStrings.ACT06Code)
                });
            }
        }
        /// <summary>
        /// Validates if the license has been expired.
        /// </summary>
        /// <param name="validationChain">The current <see cref="IStartValidationChain"/>.</param>
        /// <returns>An instance of <see cref="IStartValidationChain"/>.</returns>
        public static IValidationChain ExpirationDate(this IStartValidationChain validationChain)
        {
            var validationChainBuilder = (validationChain as ValidationChainBuilder);
            var validator = validationChainBuilder.StartValidatorChain();

            validator.Validate = license => license.ExpirationUtc > DateTime.UtcNow;

            validator.FailureResult = FailureStrings.Get(FailureStrings.VAL03Code);

            return(validationChainBuilder);
        }
        /// <summary>
        /// Validates the <see cref="License.Signature"/>.
        /// </summary>
        /// <param name="validationChain">The current <see cref="IStartValidationChain"/>.</param>
        /// <returns>An instance of <see cref="IStartValidationChain"/>.</returns>
        public static IValidationChain Signature(this IStartValidationChain validationChain)
        {
            var validationChainBuilder = (validationChain as ValidationChainBuilder);
            var validator = validationChainBuilder.StartValidatorChain();

            validator.Validate = license => license.VerifySignature();

            validator.FailureResult = FailureStrings.Get(FailureStrings.VAL02Code);

            return(validationChainBuilder);
        }
Ejemplo n.º 8
0
        protected override Task <IEnumerable <IValidationFailure> > ValidateInternalAsync(License actual)
        {
            var failure = FailureStrings.Get(FailureStrings.VAL04Code);

            var appId = GetAttributes()[LicenseGlobals.MachineName];

            var failures = actual.Validate()
                           .ExpirationDate()
                           .When(lic => lic.Type == LicenseType.Standard)
                           .And()
                           .Signature()
                           .And()
                           .AssertThat(x => string.Equals(appId, x.AdditionalAttributes.Get(LicenseGlobals.MachineName), StringComparison.OrdinalIgnoreCase), failure)
                           .AssertValidLicense().ToList();

            return(Task.FromResult(failures.AsEnumerable()));
        }
Ejemplo n.º 9
0
        public Task <IValidationFailure> ValidateAsync(LicenseRegisterRequest request)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            if (request.LicenseUuid == Guid.Empty)
            {
                return(Task.FromResult(FailureStrings.Get(FailureStrings.ACT01Code)));
            }
            if (request.ProductUuid == Guid.Empty)
            {
                return(Task.FromResult(FailureStrings.Get(FailureStrings.ACT02Code)));
            }

            var registration = _context.Registrations.SingleOrDefault(x => x.LicenseRegistrationId == request.LicenseUuid);

            if (registration == null)
            {
                return(Task.FromResult(FailureStrings.Get(FailureStrings.ACT01Code)));
            }

            if (registration.ProductId != request.ProductUuid)
            {
                return(Task.FromResult(FailureStrings.Get(FailureStrings.ACT02Code)));
            }

            if (registration.IsActive == false)
            {
                return(Task.FromResult(FailureStrings.Get(FailureStrings.ACT03Code)));
            }

            if (registration.ExpireUtc != null && registration.ExpireUtc <= DateTime.UtcNow)
            {
                return(Task.FromResult(FailureStrings.Get(FailureStrings.ACT04Code)));
            }

            if (registration.Quantity > 1 && (LicenseGetUsage(request.LicenseUuid) >= registration.Quantity))
            {
                return(Task.FromResult(FailureStrings.Get(FailureStrings.ACT05Code)));
            }

            return(Task.FromResult <IValidationFailure>(null));
        }
Ejemplo n.º 10
0
        public Task <IEnumerable <IValidationFailure> > ValidateAsync(Stream license)
        {
            if (license == null)
            {
                throw new ArgumentNullException(nameof(license));
            }

            var task = Task.Run(() =>
            {
                var results = new List <IValidationFailure>();

                try
                {
                    var actual = License.Load(license);

                    var failure = FailureStrings.Get(FailureStrings.VAL04Code);

                    var validationFailures = actual.Validate()
                                             .ExpirationDate()
                                             .When(lic => lic.Type == LicenseType.Standard)
                                             .And()
                                             .Signature()
                                             .And()
                                             .AssertThat(x => string.Equals(AppId, x.AdditionalAttributes.Get(LicenseGlobals.AppId), StringComparison.OrdinalIgnoreCase), failure)
                                             .AssertValidLicense().ToList();

                    foreach (var f in validationFailures)
                    {
                        results.Add(f);
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);

                    var failure = FailureStrings.Get(FailureStrings.VAL01Code);
                    results.Add(failure);
                }
                return(results.AsEnumerable());
            });

            return(task);
        }
Ejemplo n.º 11
0
        public IEnumerable <IValidationFailure> AssertValidLicense()
        {
            CompleteValidatorChain();

            while (validators.Count > 0)
            {
                var validator = validators.Dequeue();
                if (validator.ValidateWhen != null && !validator.ValidateWhen(license))
                {
                    continue;
                }

                if (!validator.Validate(license))
                {
                    yield return(validator.FailureResult
                                 ?? FailureStrings.Get(FailureStrings.VAL05Code));
                }
            }
        }
Ejemplo n.º 12
0
 public bool DeepEquals(DestinyVendorDefinition other)
 {
     return(other != null &&
            DisplayProperties.DeepEquals(other.DisplayProperties) &&
            VendorProgressionType == other.VendorProgressionType &&
            BuyString == other.BuyString &&
            SellString == other.SellString &&
            DisplayItem.DeepEquals(other.DisplayItem) &&
            InhibitBuying == other.InhibitBuying &&
            InhibitSelling == other.InhibitSelling &&
            Faction.DeepEquals(other.Faction) &&
            ResetIntervalMinutes == other.ResetIntervalMinutes &&
            ResetOffsetMinutes == other.ResetOffsetMinutes &&
            FailureStrings.DeepEqualsReadOnlySimpleCollection(other.FailureStrings) &&
            UnlockRanges.DeepEqualsReadOnlyCollections(other.UnlockRanges) &&
            VendorIdentifier == other.VendorIdentifier &&
            VendorPortrait == other.VendorPortrait &&
            VendorBanner == other.VendorBanner &&
            Enabled == other.Enabled &&
            Visible == other.Visible &&
            VendorSubcategoryIdentifier == other.VendorSubcategoryIdentifier &&
            ConsolidateCategories == other.ConsolidateCategories &&
            Actions.DeepEqualsReadOnlyCollections(other.Actions) &&
            Categories.DeepEqualsReadOnlyCollections(other.Categories) &&
            OriginalCategories.DeepEqualsReadOnlyCollections(other.OriginalCategories) &&
            DisplayCategories.DeepEqualsReadOnlyCollections(other.DisplayCategories) &&
            Interactions.DeepEqualsReadOnlyCollections(other.Interactions) &&
            InventoryFlyouts.DeepEqualsReadOnlyCollections(other.InventoryFlyouts) &&
            ItemList.DeepEqualsReadOnlyCollections(other.ItemList) &&
            Services.DeepEqualsReadOnlyCollections(other.Services) &&
            AcceptedItems.DeepEqualsReadOnlyCollections(other.AcceptedItems) &&
            ReturnWithVendorRequest == other.ReturnWithVendorRequest &&
            Locations.DeepEqualsReadOnlyCollections(other.Locations) &&
            Groups.DeepEqualsReadOnlyCollections(other.Groups) &&
            IgnoreSaleItems.DeepEqualsReadOnlyCollections(other.IgnoreSaleItems) &&
            UnlockValueHash == other.UnlockValueHash &&
            Blacklisted == other.Blacklisted &&
            Hash == other.Hash &&
            Index == other.Index &&
            Redacted == other.Redacted);
 }
        /// <summary>
        /// Check whether the product build date of the provided assemblies
        /// exceeded the <see cref="License.ExpirationUtc"/> date.
        /// </summary>
        /// <param name="validationChain">The current <see cref="IStartValidationChain"/>.</param>
        /// <param name="assemblies">The list of assemblies to check.</param>
        /// <returns>An instance of <see cref="IStartValidationChain"/>.</returns>
        public static IValidationChain ProductBuildDate(this IStartValidationChain validationChain, Assembly[] assemblies)
        {
            var validationChainBuilder = (validationChain as ValidationChainBuilder);
            var validator = validationChainBuilder.StartValidatorChain();

#if !NEW_REFLECTION
            validator.Validate = license => assemblies.All(
                asm =>
                asm.GetCustomAttributes(typeof(AssemblyBuildDateAttribute), false)
                .Cast <AssemblyBuildDateAttribute>()
                .All(a => a.BuildDateUtc < license.ExpirationUtc));
#else
            validator.Validate = license => assemblies.All(
                asm =>
                asm.GetCustomAttributes <AssemblyBuildDateAttribute>()
                .Cast <AssemblyBuildDateAttribute>()
                .All(a => a.BuildDateUtc < license.ExpirationUtc));
#endif

            validator.FailureResult = FailureStrings.Get(FailureStrings.VAL03Code);

            return(validationChainBuilder);
        }
 public void Update(DestinyVendorDefinition?other)
 {
     if (other is null)
     {
         return;
     }
     if (!DisplayProperties.DeepEquals(other.DisplayProperties))
     {
         DisplayProperties.Update(other.DisplayProperties);
         OnPropertyChanged(nameof(DisplayProperties));
     }
     if (VendorProgressionType != other.VendorProgressionType)
     {
         VendorProgressionType = other.VendorProgressionType;
         OnPropertyChanged(nameof(VendorProgressionType));
     }
     if (BuyString != other.BuyString)
     {
         BuyString = other.BuyString;
         OnPropertyChanged(nameof(BuyString));
     }
     if (SellString != other.SellString)
     {
         SellString = other.SellString;
         OnPropertyChanged(nameof(SellString));
     }
     if (DisplayItemHash != other.DisplayItemHash)
     {
         DisplayItemHash = other.DisplayItemHash;
         OnPropertyChanged(nameof(DisplayItemHash));
     }
     if (InhibitBuying != other.InhibitBuying)
     {
         InhibitBuying = other.InhibitBuying;
         OnPropertyChanged(nameof(InhibitBuying));
     }
     if (InhibitSelling != other.InhibitSelling)
     {
         InhibitSelling = other.InhibitSelling;
         OnPropertyChanged(nameof(InhibitSelling));
     }
     if (FactionHash != other.FactionHash)
     {
         FactionHash = other.FactionHash;
         OnPropertyChanged(nameof(FactionHash));
     }
     if (ResetIntervalMinutes != other.ResetIntervalMinutes)
     {
         ResetIntervalMinutes = other.ResetIntervalMinutes;
         OnPropertyChanged(nameof(ResetIntervalMinutes));
     }
     if (ResetOffsetMinutes != other.ResetOffsetMinutes)
     {
         ResetOffsetMinutes = other.ResetOffsetMinutes;
         OnPropertyChanged(nameof(ResetOffsetMinutes));
     }
     if (!FailureStrings.DeepEqualsListNaive(other.FailureStrings))
     {
         FailureStrings = other.FailureStrings;
         OnPropertyChanged(nameof(FailureStrings));
     }
     if (!UnlockRanges.DeepEqualsList(other.UnlockRanges))
     {
         UnlockRanges = other.UnlockRanges;
         OnPropertyChanged(nameof(UnlockRanges));
     }
     if (VendorIdentifier != other.VendorIdentifier)
     {
         VendorIdentifier = other.VendorIdentifier;
         OnPropertyChanged(nameof(VendorIdentifier));
     }
     if (VendorPortrait != other.VendorPortrait)
     {
         VendorPortrait = other.VendorPortrait;
         OnPropertyChanged(nameof(VendorPortrait));
     }
     if (VendorBanner != other.VendorBanner)
     {
         VendorBanner = other.VendorBanner;
         OnPropertyChanged(nameof(VendorBanner));
     }
     if (Enabled != other.Enabled)
     {
         Enabled = other.Enabled;
         OnPropertyChanged(nameof(Enabled));
     }
     if (Visible != other.Visible)
     {
         Visible = other.Visible;
         OnPropertyChanged(nameof(Visible));
     }
     if (VendorSubcategoryIdentifier != other.VendorSubcategoryIdentifier)
     {
         VendorSubcategoryIdentifier = other.VendorSubcategoryIdentifier;
         OnPropertyChanged(nameof(VendorSubcategoryIdentifier));
     }
     if (ConsolidateCategories != other.ConsolidateCategories)
     {
         ConsolidateCategories = other.ConsolidateCategories;
         OnPropertyChanged(nameof(ConsolidateCategories));
     }
     if (!Actions.DeepEqualsList(other.Actions))
     {
         Actions = other.Actions;
         OnPropertyChanged(nameof(Actions));
     }
     if (!Categories.DeepEqualsList(other.Categories))
     {
         Categories = other.Categories;
         OnPropertyChanged(nameof(Categories));
     }
     if (!OriginalCategories.DeepEqualsList(other.OriginalCategories))
     {
         OriginalCategories = other.OriginalCategories;
         OnPropertyChanged(nameof(OriginalCategories));
     }
     if (!DisplayCategories.DeepEqualsList(other.DisplayCategories))
     {
         DisplayCategories = other.DisplayCategories;
         OnPropertyChanged(nameof(DisplayCategories));
     }
     if (!Interactions.DeepEqualsList(other.Interactions))
     {
         Interactions = other.Interactions;
         OnPropertyChanged(nameof(Interactions));
     }
     if (!InventoryFlyouts.DeepEqualsList(other.InventoryFlyouts))
     {
         InventoryFlyouts = other.InventoryFlyouts;
         OnPropertyChanged(nameof(InventoryFlyouts));
     }
     if (!ItemList.DeepEqualsList(other.ItemList))
     {
         ItemList = other.ItemList;
         OnPropertyChanged(nameof(ItemList));
     }
     if (!Services.DeepEqualsList(other.Services))
     {
         Services = other.Services;
         OnPropertyChanged(nameof(Services));
     }
     if (!AcceptedItems.DeepEqualsList(other.AcceptedItems))
     {
         AcceptedItems = other.AcceptedItems;
         OnPropertyChanged(nameof(AcceptedItems));
     }
     if (ReturnWithVendorRequest != other.ReturnWithVendorRequest)
     {
         ReturnWithVendorRequest = other.ReturnWithVendorRequest;
         OnPropertyChanged(nameof(ReturnWithVendorRequest));
     }
     if (!Locations.DeepEqualsList(other.Locations))
     {
         Locations = other.Locations;
         OnPropertyChanged(nameof(Locations));
     }
     if (!Groups.DeepEqualsList(other.Groups))
     {
         Groups = other.Groups;
         OnPropertyChanged(nameof(Groups));
     }
     if (!IgnoreSaleItemHashes.DeepEqualsListNaive(other.IgnoreSaleItemHashes))
     {
         IgnoreSaleItemHashes = other.IgnoreSaleItemHashes;
         OnPropertyChanged(nameof(IgnoreSaleItemHashes));
     }
     if (Hash != other.Hash)
     {
         Hash = other.Hash;
         OnPropertyChanged(nameof(Hash));
     }
     if (Index != other.Index)
     {
         Index = other.Index;
         OnPropertyChanged(nameof(Index));
     }
     if (Redacted != other.Redacted)
     {
         Redacted = other.Redacted;
         OnPropertyChanged(nameof(Redacted));
     }
 }
Ejemplo n.º 15
0
        public async void CreateAsync()
        {
            var logger = Substitute.For <ILogger <LicenseService> >();

            // In-memory database only exists while the connection is open
            var connection = new SqliteConnection("DataSource=:memory:");

            connection.Open();

            try
            {
                var contextOptions = new DbContextOptionsBuilder <EfDbContext>()
                                     .UseSqlite(connection)
                                     .Options;

                // Create the schema in the database
                using (var context = new EfDbContext(contextOptions))
                {
                    context.Database.EnsureCreated();
                    var service = new LicenseService(context, logger);

                    var product = CreateProduct();
                    context.Add(product);
                    context.SaveChanges();

                    var expireDate   = DateTime.UtcNow.AddDays(1);
                    var registration = CreateRegistration(product);
                    registration.Quantity  = 2;
                    registration.ExpireUtc = expireDate;
                    context.Add(registration);
                    context.SaveChanges();

                    var request = new LicenseRegisterRequest
                    {
                        LicenseUuid = registration.LicenseRegistrationId,
                        ProductUuid = registration.ProductId,
                        Attributes  = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase)
                    };

                    request.Attributes.Add("AppId", "app-id-0001");

                    var result = await service.CreateAsync(request, "test-user");

                    var lic           = context.Licenses.ToArray();
                    var licenseRecord = await context.Licenses.SingleAsync(x => x.LicenseId == registration.LicenseRegistrationId);

                    Assert.Null(result.Failure);
                    Assert.NotNull(result.License);
                    Assert.NotNull(licenseRecord);
                    Assert.False(licenseRecord.LicenseActivationId == Guid.Empty);
                    Assert.Equal(registration.LicenseRegistrationId, licenseRecord.LicenseId);
                    Assert.Equal(registration.ProductId, licenseRecord.ProductId);
                    Assert.Equal(registration.CompanyId, licenseRecord.CompanyId);
                    Assert.NotNull(licenseRecord.LicenseString);
                    Assert.NotNull(licenseRecord.LicenseAttributes);
                    Assert.NotNull(licenseRecord.LicenseChecksum);
                    Assert.NotNull(licenseRecord.AttributesChecksum);
                    Assert.Equal(Utils.ChecksumType, licenseRecord.ChecksumType);
                    Assert.Equal(DateTime.UtcNow.ToString("yyyyMMdd"), licenseRecord.CreatedDateTimeUtc.ToString("yyyyMMdd"));
                    Assert.NotNull(licenseRecord.CreatedByUser);

                    var license = License.Load(result.License);

                    var failure = FailureStrings.Get(FailureStrings.VAL04Code);

                    var failures = license.Validate()
                                   .ExpirationDate()
                                   .When(lic => lic.Type == LicenseType.Standard)
                                   .And()
                                   .Signature()
                                   .And()
                                   .AssertThat(x => string.Equals(request.Attributes["AppId"], x.AdditionalAttributes.Get("AppId"), StringComparison.OrdinalIgnoreCase), failure)
                                   .AssertValidLicense().ToList();

                    // Valid
                    Assert.False(failures.Any());

                    // License
                    Assert.Equal(licenseRecord.LicenseActivationId, license.ActivationUuid);
                    Assert.Equal(request.LicenseUuid, license.Id);
                    Assert.Equal(registration.LicenseType, license.Type);
                    Assert.Equal(expireDate.ToString("yyyyMMdd"), license.ExpirationUtc.ToString("yyyyMMdd"));
                    Assert.Equal(2, license.Quantity);
                    Assert.Equal(registration.LicenseName, license.Customer.Name);
                    Assert.Equal(registration.LicenseEmail, license.Customer.Email);
                    Assert.Equal(registration.LicenseName, license.Customer.Company);
                    Assert.Equal(request.Attributes["AppId"], license.AdditionalAttributes.Get("AppId"));
                }
            }
            finally
            {
                connection.Close();
            }
        }
        public bool Equals(DestinyVendorDefinition input)
        {
            if (input == null)
            {
                return(false);
            }

            return
                ((
                     DisplayProperties == input.DisplayProperties ||
                     (DisplayProperties != null && DisplayProperties.Equals(input.DisplayProperties))
                     ) &&
                 (
                     VendorProgressionType == input.VendorProgressionType ||
                     (VendorProgressionType != null && VendorProgressionType.Equals(input.VendorProgressionType))
                 ) &&
                 (
                     BuyString == input.BuyString ||
                     (BuyString != null && BuyString.Equals(input.BuyString))
                 ) &&
                 (
                     SellString == input.SellString ||
                     (SellString != null && SellString.Equals(input.SellString))
                 ) &&
                 (
                     DisplayItemHash == input.DisplayItemHash ||
                     (DisplayItemHash.Equals(input.DisplayItemHash))
                 ) &&
                 (
                     InhibitBuying == input.InhibitBuying ||
                     (InhibitBuying != null && InhibitBuying.Equals(input.InhibitBuying))
                 ) &&
                 (
                     InhibitSelling == input.InhibitSelling ||
                     (InhibitSelling != null && InhibitSelling.Equals(input.InhibitSelling))
                 ) &&
                 (
                     FactionHash == input.FactionHash ||
                     (FactionHash.Equals(input.FactionHash))
                 ) &&
                 (
                     ResetIntervalMinutes == input.ResetIntervalMinutes ||
                     (ResetIntervalMinutes.Equals(input.ResetIntervalMinutes))
                 ) &&
                 (
                     ResetOffsetMinutes == input.ResetOffsetMinutes ||
                     (ResetOffsetMinutes.Equals(input.ResetOffsetMinutes))
                 ) &&
                 (
                     FailureStrings == input.FailureStrings ||
                     (FailureStrings != null && FailureStrings.SequenceEqual(input.FailureStrings))
                 ) &&
                 (
                     UnlockRanges == input.UnlockRanges ||
                     (UnlockRanges != null && UnlockRanges.SequenceEqual(input.UnlockRanges))
                 ) &&
                 (
                     VendorIdentifier == input.VendorIdentifier ||
                     (VendorIdentifier != null && VendorIdentifier.Equals(input.VendorIdentifier))
                 ) &&
                 (
                     VendorPortrait == input.VendorPortrait ||
                     (VendorPortrait != null && VendorPortrait.Equals(input.VendorPortrait))
                 ) &&
                 (
                     VendorBanner == input.VendorBanner ||
                     (VendorBanner != null && VendorBanner.Equals(input.VendorBanner))
                 ) &&
                 (
                     Enabled == input.Enabled ||
                     (Enabled != null && Enabled.Equals(input.Enabled))
                 ) &&
                 (
                     Visible == input.Visible ||
                     (Visible != null && Visible.Equals(input.Visible))
                 ) &&
                 (
                     VendorSubcategoryIdentifier == input.VendorSubcategoryIdentifier ||
                     (VendorSubcategoryIdentifier != null && VendorSubcategoryIdentifier.Equals(input.VendorSubcategoryIdentifier))
                 ) &&
                 (
                     ConsolidateCategories == input.ConsolidateCategories ||
                     (ConsolidateCategories != null && ConsolidateCategories.Equals(input.ConsolidateCategories))
                 ) &&
                 (
                     Actions == input.Actions ||
                     (Actions != null && Actions.SequenceEqual(input.Actions))
                 ) &&
                 (
                     Categories == input.Categories ||
                     (Categories != null && Categories.SequenceEqual(input.Categories))
                 ) &&
                 (
                     OriginalCategories == input.OriginalCategories ||
                     (OriginalCategories != null && OriginalCategories.SequenceEqual(input.OriginalCategories))
                 ) &&
                 (
                     DisplayCategories == input.DisplayCategories ||
                     (DisplayCategories != null && DisplayCategories.SequenceEqual(input.DisplayCategories))
                 ) &&
                 (
                     Interactions == input.Interactions ||
                     (Interactions != null && Interactions.SequenceEqual(input.Interactions))
                 ) &&
                 (
                     InventoryFlyouts == input.InventoryFlyouts ||
                     (InventoryFlyouts != null && InventoryFlyouts.SequenceEqual(input.InventoryFlyouts))
                 ) &&
                 (
                     ItemList == input.ItemList ||
                     (ItemList != null && ItemList.SequenceEqual(input.ItemList))
                 ) &&
                 (
                     Services == input.Services ||
                     (Services != null && Services.SequenceEqual(input.Services))
                 ) &&
                 (
                     AcceptedItems == input.AcceptedItems ||
                     (AcceptedItems != null && AcceptedItems.SequenceEqual(input.AcceptedItems))
                 ) &&
                 (
                     ReturnWithVendorRequest == input.ReturnWithVendorRequest ||
                     (ReturnWithVendorRequest != null && ReturnWithVendorRequest.Equals(input.ReturnWithVendorRequest))
                 ) &&
                 (
                     Locations == input.Locations ||
                     (Locations != null && Locations.SequenceEqual(input.Locations))
                 ) &&
                 (
                     Groups == input.Groups ||
                     (Groups != null && Groups.SequenceEqual(input.Groups))
                 ) &&
                 (
                     IgnoreSaleItemHashes == input.IgnoreSaleItemHashes ||
                     (IgnoreSaleItemHashes != null && IgnoreSaleItemHashes.SequenceEqual(input.IgnoreSaleItemHashes))
                 ) &&
                 (
                     Hash == input.Hash ||
                     (Hash.Equals(input.Hash))
                 ) &&
                 (
                     Index == input.Index ||
                     (Index.Equals(input.Index))
                 ) &&
                 (
                     Redacted == input.Redacted ||
                     (Redacted != null && Redacted.Equals(input.Redacted))
                 ));
        }