VYPR
Moderate severityNVD Advisory· Published Jun 26, 2020· Updated Aug 4, 2024

CVE-2020-9581

CVE-2020-9581

Description

Magento versions 2.3.4 and earlier, 2.2.11 and earlier (see note), 1.14.4.4 and earlier, and 1.9.4.4 and earlier have a stored cross-site scripting vulnerability. Successful exploitation could lead to sensitive information disclosure.

AI Insight

LLM-synthesized narrative grounded in this CVE's description and references.

Magento contains a stored cross-site scripting vulnerability in multiple versions and editions, enabling sensitive information disclosure via injected malicious scripts.

Vulnerability

Details

CVE-2020-9581 is a stored cross-site scripting (XSS) vulnerability affecting Magento Open Source and Adobe Commerce. The flaw resides in input handling within the product data provider or related admin UI components, as indicated by the patch modifying AdvancedPricingImportExportController and DataProvider/Product/Form/Modifier in reference [3]. The vulnerability allows an attacker to inject malicious JavaScript into application data that is later served to other users without proper sanitization.

Attack

Vector

Exploitation requires the ability to submit crafted input through available upload or form fields. The vulnerability is stored, meaning the injected payload persists in the database and triggers when an administrator or other user views the affected page. No explicit authentication requirement for the initial injection is stated, but typical access to product editing interfaces would be needed. The attack targets admin or store-facing areas where unsanitized data is rendered.

Impact

Successful exploitation enables an attacker to execute arbitrary scripts in the context of a victim's browser session. This can lead to sensitive information disclosure, including session tokens, admin credentials, or customer data, as highlighted in the official description and NVD entry [1]. The CVSS vector has not been officially assigned by NVD, but stored XSS vulnerabilities typically carry a high severity due to the confidentiality impact.

Mitigation

Adobe released security patches for supported versions: Magento 2.3.4-p2 and later, and corresponding updates for 2.2.x and 1.x series. Users must update to the latest patched release [2][3]. For unsupported versions (e.g., original 2.3.4, 2.2.11), no patch is available and upgrading to a supported branch is strongly advised. No workarounds beyond input sanitization or disabling affected features are documented.

AI Insight generated on May 21, 2026. Synthesized from this CVE's description and the cited reference URLs; citations are validated against the source bundle.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
magento/community-editionPackagist
<= 2.2.11
magento/community-editionPackagist
>= 2.3.0, < 2.3.4-p22.3.4-p2
magento/corePackagist
< 1.9.4.51.9.4.5
magento/project-community-editionPackagist
<= 2.0.2

Affected products

5

Patches

1
52d92dbd07f0

MC-33481: Magento 2.3.4-p2 Publication

https://github.com/magento/magento2mage2-teamApr 28, 2020via ghsa
300 files changed · +2377 1349
  • app/code/Magento/AdminAnalytics/composer.json+13 13 modified
    @@ -6,24 +6,24 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-config": "*",
    -        "magento/module-ui": "*",
    -        "magento/module-release-notification": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-config": "101.1.*",
    +        "magento/module-ui": "101.1.*",
    +        "magento/module-release-notification": "100.3.*"
         },
         "type": "magento2-module",
         "license": [
             "OSL-3.0",
             "AFL-3.0"
         ],
         "autoload": {
    -          "files": [
    -              "registration.php"
    -          ],
    -          "psr-4": {
    -              "Magento\\AdminAnalytics\\": ""
    -          }
    -    }
    +        "files": [
    +            "registration.php"
    +        ],
    +        "psr-4": {
    +            "Magento\\AdminAnalytics\\": ""
    +        }
    +    },
    +    "version": "100.3.1-p2"
     }
    -
    
  • app/code/Magento/AdminNotification/composer.json+8 7 modified
    @@ -7,12 +7,12 @@
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
             "lib-libxml": "*",
    -        "magento/framework": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-media-storage": "*",
    -        "magento/module-store": "*",
    -        "magento/module-ui": "*",
    -        "magento/module-config": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-media-storage": "100.3.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-ui": "101.1.*",
    +        "magento/module-config": "101.1.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -26,5 +26,6 @@
             "psr-4": {
                 "Magento\\AdminNotification\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4-p2"
     }
    
  • app/code/Magento/AdvancedPricingImportExport/composer.json+10 9 modified
    @@ -6,14 +6,14 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-catalog-import-export": "*",
    -        "magento/module-catalog-inventory": "*",
    -        "magento/module-customer": "*",
    -        "magento/module-eav": "*",
    -        "magento/module-import-export": "*",
    -        "magento/module-store": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-catalog-import-export": "101.0.*",
    +        "magento/module-catalog-inventory": "100.3.*",
    +        "magento/module-customer": "102.0.*",
    +        "magento/module-eav": "102.0.*",
    +        "magento/module-import-export": "100.3.*",
    +        "magento/module-store": "101.0.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -27,5 +27,6 @@
             "psr-4": {
                 "Magento\\AdvancedPricingImportExport\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/AdvancedSearch/composer.json+10 9 modified
    @@ -5,14 +5,14 @@
             "sort-packages": true
         },
         "require": {
    -        "magento/framework": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-catalog-search": "*",
    -        "magento/module-config": "*",
    -        "magento/module-customer": "*",
    -        "magento/module-search": "*",
    -        "magento/module-store": "*",
    +        "magento/framework": "102.0.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-catalog-search": "101.0.*",
    +        "magento/module-config": "101.1.*",
    +        "magento/module-customer": "102.0.*",
    +        "magento/module-search": "101.0.*",
    +        "magento/module-store": "101.0.*",
             "php": "~7.1.3||~7.2.0||~7.3.0"
         },
         "type": "magento2-module",
    @@ -27,5 +27,6 @@
             "psr-4": {
                 "Magento\\AdvancedSearch\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4-p2"
     }
    
  • app/code/Magento/Amqp/composer.json+5 4 modified
    @@ -5,9 +5,9 @@
             "sort-packages": true
         },
         "require": {
    -        "magento/framework": "*",
    -        "magento/framework-amqp": "*",
    -        "magento/framework-message-queue": "*",
    +        "magento/framework": "102.0.*",
    +        "magento/framework-amqp": "100.3.*",
    +        "magento/framework-message-queue": "100.3.*",
             "php": "~7.1.3||~7.2.0||~7.3.0"
         },
         "type": "magento2-module",
    @@ -22,5 +22,6 @@
             "psr-4": {
                 "Magento\\Amqp\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/AmqpStore/composer.json+7 6 modified
    @@ -5,14 +5,14 @@
             "sort-packages": true
         },
         "require": {
    -        "magento/framework": "*",
    -        "magento/framework-amqp": "*",
    -        "magento/module-store": "*",
    +        "magento/framework": "102.0.*",
    +        "magento/framework-amqp": "100.3.*",
    +        "magento/module-store": "101.0.*",
             "php": "~7.1.3||~7.2.0||~7.3.0"
         },
         "suggest": {
    -        "magento/module-asynchronous-operations": "*",
    -        "magento/framework-message-queue": "*"
    +        "magento/module-asynchronous-operations": "100.3.*",
    +        "magento/framework-message-queue": "100.3.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -26,5 +26,6 @@
             "psr-4": {
                 "Magento\\AmqpStore\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.1"
     }
    
  • app/code/Magento/Analytics/composer.json+7 6 modified
    @@ -3,11 +3,11 @@
         "description": "N/A",
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/module-backend": "*",
    -        "magento/module-config": "*",
    -        "magento/module-integration": "*",
    -        "magento/module-store": "*",
    -        "magento/framework": "*"
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-config": "101.1.*",
    +        "magento/module-integration": "100.3.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/framework": "102.0.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -21,5 +21,6 @@
             "psr-4": {
                 "Magento\\Analytics\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/AsynchronousOperations/composer.json+9 8 modified
    @@ -5,16 +5,16 @@
             "sort-packages": true
         },
         "require": {
    -        "magento/framework": "*",
    -        "magento/framework-bulk": "*",
    -        "magento/module-authorization": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-ui": "*",
    +        "magento/framework": "102.0.*",
    +        "magento/framework-bulk": "100.3.*",
    +        "magento/module-authorization": "100.3.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-ui": "101.1.*",
             "php": "~7.1.3||~7.2.0||~7.3.0"
         },
         "suggest": {
    -        "magento/module-admin-notification": "*",
    -        "magento/module-logging": "*"
    +        "magento/module-admin-notification": "100.3.*",
    +        "magento/module-logging": "101.1.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -28,5 +28,6 @@
             "psr-4": {
                 "Magento\\AsynchronousOperations\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4-p2"
     }
    
  • app/code/Magento/Authorization/composer.json+4 3 modified
    @@ -6,8 +6,8 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-backend": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-backend": "101.0.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -21,5 +21,6 @@
             "psr-4": {
                 "Magento\\Authorization\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4-p2"
     }
    
  • app/code/Magento/AuthorizenetAcceptjs/Block/Form.php+3 3 modified
    @@ -18,8 +18,8 @@
      * Block for representing the payment form
      *
      * @api
    - * @since 100.3.0
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @since 100.2.1
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class Form extends Cc
    @@ -57,7 +57,7 @@ public function __construct(
          * Check if cvv validation is available
          *
          * @return boolean
    -     * @since 100.3.0
    +     * @since 100.2.1
          */
         public function isCvvEnabled(): bool
         {
    
  • app/code/Magento/AuthorizenetAcceptjs/Block/Info.php+3 3 modified
    @@ -15,8 +15,8 @@
      * Translates the labels for the info block
      *
      * @api
    - * @since 100.3.0
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @since 100.2.1
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class Info extends ConfigurableInfo
    @@ -26,7 +26,7 @@ class Info extends ConfigurableInfo
          *
          * @param string $field
          * @return Phrase
    -     * @since 100.3.0
    +     * @since 100.2.1
          */
         protected function getLabel($field): Phrase
         {
    
  • app/code/Magento/AuthorizenetAcceptjs/Block/Payment.php+4 4 modified
    @@ -18,8 +18,8 @@
      * Represents the payment block for the admin checkout form
      *
      * @api
    - * @since 100.3.0
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @since 100.2.1
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class Payment extends Template
    @@ -55,7 +55,7 @@ public function __construct(
          * Retrieves the config that should be used by the block
          *
          * @return string
    -     * @since 100.3.0
    +     * @since 100.2.1
          */
         public function getPaymentConfig(): string
         {
    @@ -70,7 +70,7 @@ public function getPaymentConfig(): string
          * Returns the method code for this payment method
          *
          * @return string
    -     * @since 100.3.0
    +     * @since 100.2.1
          */
         public function getMethodCode(): string
         {
    
  • app/code/Magento/AuthorizenetAcceptjs/composer.json+10 9 modified
    @@ -6,14 +6,14 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-payment": "*",
    -        "magento/module-sales": "*",
    -        "magento/module-config": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-checkout": "*",
    -        "magento/module-store": "*",
    -        "magento/module-quote": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-payment": "100.3.*",
    +        "magento/module-sales": "102.0.*",
    +        "magento/module-config": "101.1.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-checkout": "100.3.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-quote": "101.1.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -27,5 +27,6 @@
             "psr-4": {
                 "Magento\\AuthorizenetAcceptjs\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.3"
     }
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Command/AcceptPaymentStrategyCommand.php+1 1 modified
    @@ -15,7 +15,7 @@
     /**
      * Chooses the best method of accepting the payment based on the status of the transaction
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class AcceptPaymentStrategyCommand implements CommandInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Command/CaptureStrategyCommand.php+1 1 modified
    @@ -21,7 +21,7 @@
     /**
      * Chooses the best method of capture based on the context of the payment
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class CaptureStrategyCommand implements CommandInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Command/FetchTransactionInfoCommand.php+1 1 modified
    @@ -18,7 +18,7 @@
     /**
      * Syncs the transaction status with authorize.net
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class FetchTransactionInfoCommand implements CommandInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Command/GatewayQueryCommand.php+1 1 modified
    @@ -21,7 +21,7 @@
     /**
      * Makes a request to the gateway and returns results
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class GatewayQueryCommand implements CommandInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Command/RefundTransactionStrategyCommand.php+1 1 modified
    @@ -15,7 +15,7 @@
     /**
      * Chooses the best method of returning the payment based on the status of the transaction
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class RefundTransactionStrategyCommand implements CommandInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Config.php+1 1 modified
    @@ -14,7 +14,7 @@
     /**
      * Houses configuration for this gateway
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class Config extends \Magento\Payment\Gateway\Config\Config
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Http/Client.php+1 1 modified
    @@ -22,7 +22,7 @@
     /**
      * A client that can communicate with the Authorize.net API
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class Client implements ClientInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Http/Payload/FilterInterface.php+1 1 modified
    @@ -11,7 +11,7 @@
     /**
      * Describes a filter for filtering content after all the builders have finished
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     interface FilterInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Http/Payload/Filter/RemoveFieldsFilter.php+1 1 modified
    @@ -13,7 +13,7 @@
     /**
      * Removes a set of fields from the payload
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class RemoveFieldsFilter implements FilterInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Http/TransferFactory.php+1 1 modified
    @@ -15,7 +15,7 @@
     /**
      * Can create a transfer object
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class TransferFactory implements TransferFactoryInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/AcceptFdsDataBuilder.php+1 1 modified
    @@ -15,7 +15,7 @@
     /**
      * Adds the meta transaction information to the request
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class AcceptFdsDataBuilder implements BuilderInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/AddressDataBuilder.php+1 1 modified
    @@ -14,7 +14,7 @@
     /**
      * Adds the basic payment information to the request
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class AddressDataBuilder implements BuilderInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/AmountDataBuilder.php+1 1 modified
    @@ -15,7 +15,7 @@
     /**
      * Adds the amount of the transaction to the Request
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class AmountDataBuilder implements BuilderInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/AuthenticationDataBuilder.php+1 1 modified
    @@ -15,7 +15,7 @@
     /**
      * Adds the stored credentials to the request
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class AuthenticationDataBuilder implements BuilderInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/AuthorizeDataBuilder.php+1 1 modified
    @@ -16,7 +16,7 @@
     /**
      * Adds the meta transaction information to the request
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class AuthorizeDataBuilder implements BuilderInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/CaptureDataBuilder.php+1 1 modified
    @@ -16,7 +16,7 @@
     /**
      * Adds the meta transaction information to the request
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class CaptureDataBuilder implements BuilderInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/CustomerDataBuilder.php+1 1 modified
    @@ -15,7 +15,7 @@
     /**
      * Adds the basic payment information to the request
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class CustomerDataBuilder implements BuilderInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/CustomSettingsBuilder.php+1 1 modified
    @@ -15,7 +15,7 @@
     /**
      * Adds the custom settings to the request
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class CustomSettingsBuilder implements BuilderInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/OrderDataBuilder.php+1 1 modified
    @@ -14,7 +14,7 @@
     /**
      * Adds the basic payment information to the request
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class OrderDataBuilder implements BuilderInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/PassthroughDataBuilder.php+1 1 modified
    @@ -14,7 +14,7 @@
     /**
      * Adds data to the request that can be used in the response
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class PassthroughDataBuilder implements BuilderInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/PaymentDataBuilder.php+1 1 modified
    @@ -15,7 +15,7 @@
     /**
      * Adds the basic payment information to the request
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class PaymentDataBuilder implements BuilderInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/PoDataBuilder.php+1 1 modified
    @@ -15,7 +15,7 @@
     /**
      * Adds the basic payment information to the request
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class PoDataBuilder implements BuilderInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/RefundPaymentDataBuilder.php+1 1 modified
    @@ -15,7 +15,7 @@
     /**
      * Adds the basic refund information to the request
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class RefundPaymentDataBuilder implements BuilderInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/RefundReferenceTransactionDataBuilder.php+1 1 modified
    @@ -15,7 +15,7 @@
     /**
      * Adds the reference transaction to the request
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class RefundReferenceTransactionDataBuilder implements BuilderInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/RefundTransactionTypeDataBuilder.php+1 1 modified
    @@ -13,7 +13,7 @@
     /**
      * Adds the meta transaction information to the request
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class RefundTransactionTypeDataBuilder implements BuilderInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/RequestTypeBuilder.php+1 1 modified
    @@ -13,7 +13,7 @@
     /**
      * Adds the type of the request to the build subject
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class RequestTypeBuilder implements BuilderInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/SaleDataBuilder.php+1 1 modified
    @@ -16,7 +16,7 @@
     /**
      * Adds the meta transaction information to the request
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class SaleDataBuilder implements BuilderInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/ShippingDataBuilder.php+1 1 modified
    @@ -16,7 +16,7 @@
     /**
      * Adds the shipping information to the request
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class ShippingDataBuilder implements BuilderInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/SolutionDataBuilder.php+1 1 modified
    @@ -15,7 +15,7 @@
     /**
      * Adds the appropriate solution ID to the request
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class SolutionDataBuilder implements BuilderInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/StoreConfigBuilder.php+1 1 modified
    @@ -13,7 +13,7 @@
     /**
      * This builder is used for correct store resolving and used only to retrieve correct store ID.
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class StoreConfigBuilder implements BuilderInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/StubDataBuilder.php+1 1 modified
    @@ -16,7 +16,7 @@
      * Since the order of params is matters for Authorize.net request,
      * this builder is used to reserve a place in builders sequence.
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class StubDataBuilder implements BuilderInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/TransactionDetailsDataBuilder.php+1 1 modified
    @@ -15,7 +15,7 @@
     /**
      * Adds the reference transaction to the request
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class TransactionDetailsDataBuilder implements BuilderInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Request/VoidDataBuilder.php+1 1 modified
    @@ -15,7 +15,7 @@
     /**
      * Adds the meta transaction information to the request
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class VoidDataBuilder implements BuilderInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Response/CloseParentTransactionHandler.php+1 1 modified
    @@ -15,7 +15,7 @@
     /**
      * Processes payment information from a void transaction response
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class CloseParentTransactionHandler implements HandlerInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Response/ClosePartialTransactionHandler.php+1 1 modified
    @@ -12,7 +12,7 @@
     /**
      * Determines that parent transaction should be close for partial refund operation.
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class ClosePartialTransactionHandler extends CloseTransactionHandler
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Response/CloseTransactionHandler.php+1 1 modified
    @@ -15,7 +15,7 @@
     /**
      * Processes payment information from a void transaction response
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class CloseTransactionHandler implements HandlerInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Response/PaymentResponseHandler.php+1 1 modified
    @@ -15,7 +15,7 @@
     /**
      * Processes payment information from a response
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class PaymentResponseHandler implements HandlerInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Response/PaymentReviewStatusHandler.php+1 1 modified
    @@ -15,7 +15,7 @@
     /**
      * Processes payment information from a void transaction response
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class PaymentReviewStatusHandler implements HandlerInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Response/TransactionDetailsResponseHandler.php+1 1 modified
    @@ -17,7 +17,7 @@
     /**
      * Adds the details to the transaction that should show when the transaction is viewed in the admin
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class TransactionDetailsResponseHandler implements HandlerInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Response/TransactionIdHandler.php+1 1 modified
    @@ -15,7 +15,7 @@
     /**
      * Processes transaction id for the payment
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class TransactionIdHandler implements HandlerInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Response/VoidResponseHandler.php+1 1 modified
    @@ -15,7 +15,7 @@
     /**
      * Processes payment information from a void transaction response
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class VoidResponseHandler implements HandlerInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/SubjectReader.php+1 1 modified
    @@ -14,7 +14,7 @@
     /**
      * Helper for extracting information from the payment data structure
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class SubjectReader
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Validator/GeneralResponseValidator.php+1 1 modified
    @@ -16,7 +16,7 @@
     /**
      * Validates that the request was successful
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class GeneralResponseValidator extends AbstractValidator
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Validator/TransactionHashValidator.php+1 1 modified
    @@ -18,7 +18,7 @@
     /**
      * Validates the transaction hash
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class TransactionHashValidator extends AbstractValidator
    
  • app/code/Magento/AuthorizenetAcceptjs/Gateway/Validator/TransactionResponseValidator.php+1 1 modified
    @@ -16,7 +16,7 @@
     /**
      * Validates the status of an attempted transaction
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class TransactionResponseValidator extends AbstractValidator
    
  • app/code/Magento/AuthorizenetAcceptjs/Model/Adminhtml/Source/Cctype.php+1 1 modified
    @@ -13,7 +13,7 @@
     /**
      * Authorize.net Payment CC Types Source Model
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class Cctype extends PaymentCctype
    
  • app/code/Magento/AuthorizenetAcceptjs/Model/Adminhtml/Source/Environment.php+1 1 modified
    @@ -11,7 +11,7 @@
     /**
      * Authorize.net Environment Dropdown source
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class Environment implements \Magento\Framework\Data\OptionSourceInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Model/Adminhtml/Source/PaymentAction.php+1 1 modified
    @@ -11,7 +11,7 @@
     /**
      * Authorize.net Payment Action Dropdown source
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class PaymentAction implements \Magento\Framework\Data\OptionSourceInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Model/PassthroughDataObject.php+1 1 modified
    @@ -13,7 +13,7 @@
     /**
      * Contains all the accumulated data from the request builders that should be passed through to the handlers
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class PassthroughDataObject extends DataObject
    
  • app/code/Magento/AuthorizenetAcceptjs/Model/Ui/ConfigProvider.php+1 1 modified
    @@ -15,7 +15,7 @@
     /**
      * Retrieves config needed for checkout
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class ConfigProvider implements ConfigProviderInterface
    
  • app/code/Magento/AuthorizenetAcceptjs/Observer/DataAssignObserver.php+1 1 modified
    @@ -15,7 +15,7 @@
     /**
      * Adds the payment info to the payment object
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class DataAssignObserver extends AbstractDataAssignObserver
    
  • app/code/Magento/AuthorizenetAcceptjs/Setup/Patch/Data/CopyCurrentConfig.php+1 1 modified
    @@ -19,7 +19,7 @@
     /**
      * Copies the Authorize.net DirectPost configuration values to the new Accept.js module.
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.3 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class CopyCurrentConfig implements DataPatchInterface
    
  • app/code/Magento/AuthorizenetCardinal/composer.json+10 9 modified
    @@ -6,14 +6,14 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/module-authorizenet-acceptjs": "*",
    -        "magento/framework": "*",
    -        "magento/module-cardinal-commerce": "*",
    -        "magento/module-payment": "*",
    -        "magento/module-sales": "*",
    -        "magento/module-quote": "*",
    -        "magento/module-checkout": "*",
    -        "magento/module-store": "*"
    +        "magento/module-authorizenet-acceptjs": "100.3.*",
    +        "magento/framework": "102.0.*",
    +        "magento/module-cardinal-commerce": "100.3.*",
    +        "magento/module-payment": "100.3.*",
    +        "magento/module-sales": "102.0.*",
    +        "magento/module-quote": "101.1.*",
    +        "magento/module-checkout": "100.3.*",
    +        "magento/module-store": "101.0.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -27,5 +27,6 @@
             "psr-4": {
                 "Magento\\AuthorizenetCardinal\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.1"
     }
    
  • app/code/Magento/AuthorizenetCardinal/Gateway/Request/Authorize3DSecureBuilder.php+1 1 modified
    @@ -17,7 +17,7 @@
     /**
      * Adds the cardholder authentication information to the request
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.1 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class Authorize3DSecureBuilder implements BuilderInterface
    
  • app/code/Magento/AuthorizenetCardinal/Gateway/Validator/CavvResponseValidator.php+1 1 modified
    @@ -17,7 +17,7 @@
     /**
      * Validates cardholder authentication verification response code.
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.1 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class CavvResponseValidator extends AbstractValidator
    
  • app/code/Magento/AuthorizenetCardinal/Model/Checkout/ConfigProvider.php+1 1 modified
    @@ -13,7 +13,7 @@
     /**
      * Configuration provider.
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.1 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class ConfigProvider implements ConfigProviderInterface
    
  • app/code/Magento/AuthorizenetCardinal/Model/Config.php+1 1 modified
    @@ -15,7 +15,7 @@
      *
      * Class is a proxy service for retrieving configuration settings.
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.1 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class Config
    
  • app/code/Magento/AuthorizenetCardinal/Observer/DataAssignObserver.php+1 1 modified
    @@ -16,7 +16,7 @@
     /**
      * Adds the payment info to the payment object
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.1 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class DataAssignObserver extends AbstractDataAssignObserver
    
  • app/code/Magento/Authorizenet/composer.json+11 10 modified
    @@ -6,17 +6,17 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-checkout": "*",
    -        "magento/module-payment": "*",
    -        "magento/module-quote": "*",
    -        "magento/module-sales": "*",
    -        "magento/module-store": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-checkout": "100.3.*",
    +        "magento/module-payment": "100.3.*",
    +        "magento/module-quote": "101.1.*",
    +        "magento/module-sales": "102.0.*",
    +        "magento/module-store": "101.0.*"
         },
         "suggest": {
    -        "magento/module-config": "*"
    +        "magento/module-config": "101.1.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -30,5 +30,6 @@
             "psr-4": {
                 "Magento\\Authorizenet\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/AuthorizenetGraphQl/composer.json+5 4 modified
    @@ -4,11 +4,11 @@
         "type": "magento2-module",
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-quote-graph-ql": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-quote-graph-ql": "100.3.*"
         },
         "suggest": {
    -        "magento/module-graph-ql": "*"
    +        "magento/module-graph-ql": "100.3.*"
         },
         "license": [
             "OSL-3.0",
    @@ -21,5 +21,6 @@
             "psr-4": {
                 "Magento\\AuthorizenetGraphQl\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.1"
     }
    
  • app/code/Magento/AuthorizenetGraphQl/Model/AuthorizenetDataProvider.php+1 1 modified
    @@ -14,7 +14,7 @@
     /**
      * SetPaymentMethod additional data provider model for Authorizenet payment method
      *
    - * @deprecated Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
    + * @deprecated 100.3.1 Starting from Magento 2.3.4 Authorize.net payment method core integration is deprecated in favor of
      * official payment integration available on the marketplace
      */
     class AuthorizenetDataProvider implements AdditionalDataProviderInterface
    
  • app/code/Magento/Backend/composer.json+21 20 modified
    @@ -5,27 +5,27 @@
             "sort-packages": true
         },
         "require": {
    -      "php": "~7.1.3||~7.2.0||~7.3.0",
    -      "magento/framework": "*",
    -      "magento/module-backup": "*",
    -      "magento/module-catalog": "*",
    -      "magento/module-config": "*",
    -      "magento/module-customer": "*",
    -      "magento/module-developer": "*",
    -      "magento/module-directory": "*",
    -      "magento/module-eav": "*",
    -      "magento/module-quote": "*",
    -      "magento/module-reports": "*",
    -      "magento/module-require-js": "*",
    -      "magento/module-sales": "*",
    -      "magento/module-security": "*",
    -      "magento/module-store": "*",
    -      "magento/module-translation": "*",
    -      "magento/module-ui": "*",
    -      "magento/module-user": "*"
    +        "php": "~7.1.3||~7.2.0||~7.3.0",
    +        "magento/framework": "102.0.*",
    +        "magento/module-backup": "100.3.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-config": "101.1.*",
    +        "magento/module-customer": "102.0.*",
    +        "magento/module-developer": "100.3.*",
    +        "magento/module-directory": "100.3.*",
    +        "magento/module-eav": "102.0.*",
    +        "magento/module-quote": "101.1.*",
    +        "magento/module-reports": "100.3.*",
    +        "magento/module-require-js": "100.3.*",
    +        "magento/module-sales": "102.0.*",
    +        "magento/module-security": "100.3.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-translation": "100.3.*",
    +        "magento/module-ui": "101.1.*",
    +        "magento/module-user": "101.1.*"
         },
         "suggest": {
    -        "magento/module-theme": "*"
    +        "magento/module-theme": "101.0.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -39,5 +39,6 @@
             "psr-4": {
                 "Magento\\Backend\\": ""
             }
    -    }
    +    },
    +    "version": "101.0.4-p2"
     }
    
  • app/code/Magento/Backend/Test/Mftf/ActionGroup/AdminSetStoreInformationConfigurationActionGroup.xml+36 0 added
    @@ -0,0 +1,36 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<!--
    + /**
    +  * Copyright © Magento, Inc. All rights reserved.
    +  * See COPYING.txt for license details.
    +  */
    +-->
    +
    +<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    +              xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd">
    +    <actionGroup name="AdminSetStoreInformationConfigurationActionGroup">
    +        <annotations>
    +            <description>Set Store Information configurations</description>
    +        </annotations>
    +        <arguments>
    +            <argument name="storeName" type="string" defaultValue="{{AdminGeneralSetStoreNameConfigData.value}}"/>
    +            <argument name="storeHoursOfOperation" type="string" defaultValue="{{AdminGeneralSetStoreHoursConfigData.value}}"/>
    +            <argument name="vatNumber" type="string" defaultValue="{{AdminGeneralSetVatNumberConfigData.value}}"/>
    +            <argument name="telephone" type="string" defaultValue="{{US_Address_TX.telephone}}"/>
    +            <argument name="country" type="string" defaultValue="{{US_Address_TX.country_id}}"/>
    +            <argument name="state" type="string" defaultValue="{{US_Address_TX.state}}"/>
    +            <argument name="city" type="string" defaultValue="{{US_Address_TX.city}}"/>
    +            <argument name="postcode" type="string" defaultValue="{{US_Address_TX.postcode}}"/>
    +            <argument name="street" type="string" defaultValue="{{US_Address_TX.street[0]}}"/>
    +        </arguments>
    +        <magentoCLI command="config:set {{AdminGeneralSetStoreNameConfigData.path}} '{{storeName}}'" stepKey="setStoreInformationName"/>
    +        <magentoCLI command="config:set {{AdminGeneralSetStorePhoneConfigData.path}} '{{telephone}}'" stepKey="setStoreInformationPhone"/>
    +        <magentoCLI command="config:set {{AdminGeneralSetStoreHoursConfigData.path}} '{{storeHoursOfOperation}}'" stepKey="setStoreHoursInformation"/>
    +        <magentoCLI command="config:set {{AdminGeneralSetCountryConfigData.path}} '{{country}}'" stepKey="setStoreInformationCountry"/>
    +        <magentoCLI command="config:set {{AdminGeneralSetStateConfigData.path}} '{{state}}'" stepKey="setStoreInformationState"/>
    +        <magentoCLI command="config:set {{AdminGeneralSetCityConfigData.path}} '{{city}}'" stepKey="setStoreInformationCity"/>
    +        <magentoCLI command="config:set {{AdminGeneralSetPostcodeConfigData.path}} '{{postcode}}'" stepKey="setStoreInformationPostcode"/>
    +        <magentoCLI command="config:set {{AdminGeneralSetStreetAddressConfigData.path}} '{{street}}'" stepKey="setStoreInformationStreetAddress"/>
    +        <magentoCLI command="config:set {{AdminGeneralSetVatNumberConfigData.path}} '{{vatNumber}}'" stepKey="setStoreInformationVatNumber"/>
    +    </actionGroup>
    +</actionGroups>
    
  • app/code/Magento/Backend/Test/Mftf/Data/AdminGeneralStoreInfomationConfigData.xml+7 0 modified
    @@ -30,4 +30,11 @@
         <entity name="AdminGeneralSetStreetAddress2ConfigData">
             <data key="path">general/store_information/street_line2</data>
         </entity>
    +    <entity name="AdminGeneralSetStateConfigData">
    +        <data key="path">general/store_information/region_id</data>
    +    </entity>
    +    <entity name="AdminGeneralSetStoreHoursConfigData">
    +        <data key="path">general/store_information/hours</data>
    +        <data key="value">8AM-8PM</data>
    +    </entity>
     </entities>
    
  • app/code/Magento/Backup/composer.json+6 5 modified
    @@ -6,10 +6,10 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-cron": "*",
    -        "magento/module-store": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-cron": "100.3.*",
    +        "magento/module-store": "101.0.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -23,5 +23,6 @@
             "psr-4": {
                 "Magento\\Backup\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/Braintree/composer.json+19 18 modified
    @@ -7,26 +7,26 @@
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
             "braintree/braintree_php": "3.35.0",
    -        "magento/framework": "*",
    +        "magento/framework": "102.0.*",
             "magento/magento-composer-installer": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-checkout": "*",
    -        "magento/module-config": "*",
    -        "magento/module-customer": "*",
    -        "magento/module-directory": "*",
    -        "magento/module-instant-purchase": "*",
    -        "magento/module-payment": "*",
    -        "magento/module-paypal": "*",
    -        "magento/module-quote": "*",
    -        "magento/module-sales": "*",
    -        "magento/module-ui": "*",
    -        "magento/module-vault": "*",
    -        "magento/module-multishipping": "*",
    -        "magento/module-theme": "*"
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-checkout": "100.3.*",
    +        "magento/module-config": "101.1.*",
    +        "magento/module-customer": "102.0.*",
    +        "magento/module-directory": "100.3.*",
    +        "magento/module-instant-purchase": "100.3.*",
    +        "magento/module-payment": "100.3.*",
    +        "magento/module-paypal": "100.3.*",
    +        "magento/module-quote": "101.1.*",
    +        "magento/module-sales": "102.0.*",
    +        "magento/module-ui": "101.1.*",
    +        "magento/module-vault": "101.1.*",
    +        "magento/module-multishipping": "100.3.*",
    +        "magento/module-theme": "101.0.*"
         },
         "suggest": {
    -        "magento/module-checkout-agreements": "*"
    +        "magento/module-checkout-agreements": "100.3.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -40,5 +40,6 @@
             "psr-4": {
                 "Magento\\Braintree\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/BraintreeGraphQl/composer.json+8 7 modified
    @@ -4,14 +4,14 @@
         "type": "magento2-module",
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-braintree": "*",
    -        "magento/module-store": "*",
    -        "magento/module-quote": "*",
    -        "magento/module-quote-graph-ql": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-braintree": "100.3.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-quote": "101.1.*",
    +        "magento/module-quote-graph-ql": "100.3.*"
         },
         "suggest": {
    -        "magento/module-graph-ql": "*"
    +        "magento/module-graph-ql": "100.3.*"
         },
         "license": [
             "OSL-3.0",
    @@ -24,5 +24,6 @@
             "psr-4": {
                 "Magento\\BraintreeGraphQl\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.1"
     }
    
  • app/code/Magento/Bundle/composer.json+21 20 modified
    @@ -6,27 +6,27 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-catalog-inventory": "*",
    -        "magento/module-catalog-rule": "*",
    -        "magento/module-checkout": "*",
    -        "magento/module-config": "*",
    -        "magento/module-customer": "*",
    -        "magento/module-eav": "*",
    -        "magento/module-gift-message": "*",
    -        "magento/module-media-storage": "*",
    -        "magento/module-quote": "*",
    -        "magento/module-sales": "*",
    -        "magento/module-store": "*",
    -        "magento/module-tax": "*",
    -        "magento/module-ui": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-catalog-inventory": "100.3.*",
    +        "magento/module-catalog-rule": "101.1.*",
    +        "magento/module-checkout": "100.3.*",
    +        "magento/module-config": "101.1.*",
    +        "magento/module-customer": "102.0.*",
    +        "magento/module-eav": "102.0.*",
    +        "magento/module-gift-message": "100.3.*",
    +        "magento/module-media-storage": "100.3.*",
    +        "magento/module-quote": "101.1.*",
    +        "magento/module-sales": "102.0.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-tax": "100.3.*",
    +        "magento/module-ui": "101.1.*"
         },
         "suggest": {
    -        "magento/module-webapi": "*",
    -        "magento/module-bundle-sample-data": "*",
    -        "magento/module-sales-rule": "*"
    +        "magento/module-webapi": "100.3.*",
    +        "magento/module-bundle-sample-data": "Sample Data version: 100.3.*",
    +        "magento/module-sales-rule": "101.1.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -40,5 +40,6 @@
             "psr-4": {
                 "Magento\\Bundle\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4-p2"
     }
    
  • app/code/Magento/BundleGraphQl/composer.json+9 8 modified
    @@ -4,13 +4,13 @@
         "type": "magento2-module",
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/module-catalog": "*",
    -        "magento/module-bundle": "*",
    -        "magento/module-catalog-graph-ql": "*",
    -        "magento/module-quote": "*",
    -        "magento/module-quote-graph-ql": "*",
    -        "magento/module-store": "*",
    -        "magento/framework": "*"
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-bundle": "100.3.*",
    +        "magento/module-catalog-graph-ql": "100.3.*",
    +        "magento/module-quote": "101.1.*",
    +        "magento/module-quote-graph-ql": "100.3.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/framework": "102.0.*"
         },
         "license": [
             "OSL-3.0",
    @@ -23,5 +23,6 @@
             "psr-4": {
                 "Magento\\BundleGraphQl\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/BundleImportExport/composer.json+9 8 modified
    @@ -6,13 +6,13 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-bundle": "*",
    -        "magento/module-store": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-catalog-import-export": "*",
    -        "magento/module-eav": "*",
    -        "magento/module-import-export": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-bundle": "100.3.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-catalog-import-export": "101.0.*",
    +        "magento/module-eav": "102.0.*",
    +        "magento/module-import-export": "100.3.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -26,5 +26,6 @@
             "psr-4": {
                 "Magento\\BundleImportExport\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/CacheInvalidate/composer.json+4 3 modified
    @@ -6,8 +6,8 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-page-cache": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-page-cache": "100.3.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -21,5 +21,6 @@
             "psr-4": {
                 "Magento\\CacheInvalidate\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/Captcha/composer.json+7 6 modified
    @@ -6,11 +6,11 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-checkout": "*",
    -        "magento/module-customer": "*",
    -        "magento/module-store": "*",
    +        "magento/framework": "102.0.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-checkout": "100.3.*",
    +        "magento/module-customer": "102.0.*",
    +        "magento/module-store": "101.0.*",
             "zendframework/zend-captcha": "^2.7.1",
             "zendframework/zend-db": "^2.8.2",
             "zendframework/zend-session": "^2.7.3"
    @@ -27,5 +27,6 @@
             "psr-4": {
                 "Magento\\Captcha\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4-p2"
     }
    
  • app/code/Magento/CardinalCommerce/composer.json+6 5 modified
    @@ -6,10 +6,10 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-checkout": "*",
    -        "magento/module-payment": "*",
    -        "magento/module-store": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-checkout": "100.3.*",
    +        "magento/module-payment": "100.3.*",
    +        "magento/module-store": "101.0.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -23,5 +23,6 @@
             "psr-4": {
                 "Magento\\CardinalCommerce\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.1-p2"
     }
    
  • app/code/Magento/CardinalCommerce/Model/JwtManagement.php+3 1 modified
    @@ -8,6 +8,7 @@
     namespace Magento\CardinalCommerce\Model;
     
     use Magento\Framework\Serialize\Serializer\Json;
    +use Magento\Framework\Encryption\Helper\Security;
     
     /**
      * JSON Web Token management.
    @@ -62,7 +63,8 @@ public function decode(string $jwt, string $key): array
             $payload = $this->json->unserialize($payloadJson);
     
             $signature = $this->urlSafeB64Decode($signatureB64);
    -        if ($signature !== $this->sign($headB64 . '.' . $payloadB64, $key, $header['alg'])) {
    +
    +        if (!Security::compareStrings($signature, $this->sign($headB64 . '.' . $payloadB64, $key, $header['alg']))) {
                 throw new \InvalidArgumentException('JWT signature verification failed');
             }
     
    
  • app/code/Magento/CatalogAnalytics/composer.json+5 4 modified
    @@ -3,9 +3,9 @@
         "description": "N/A",
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-analytics": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-analytics": "100.3.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -19,5 +19,6 @@
             "psr-4": {
                 "Magento\\CatalogAnalytics\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/Catalog/Api/SpecialPriceInterface.php+1 0 modified
    @@ -31,6 +31,7 @@ interface SpecialPriceInterface
          * ]
          * @since 101.1.0
          * @since 102.0.0
    +     * @since 102.0.0
          */
         public function get(array $skus);
     
    
  • app/code/Magento/CatalogCmsGraphQl/composer.json+8 7 modified
    @@ -4,14 +4,14 @@
         "type": "magento2-module",
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-cms-graph-ql": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-cms-graph-ql": "100.3.*"
         },
         "suggest": {
    -        "magento/module-graph-ql": "*",
    -        "magento/module-cms": "*",
    -        "magento/module-catalog-graph-ql": "*"
    +        "magento/module-graph-ql": "100.3.*",
    +        "magento/module-cms": "103.0.*",
    +        "magento/module-catalog-graph-ql": "100.3.*"
         },
         "license": [
             "OSL-3.0",
    @@ -24,5 +24,6 @@
             "psr-4": {
                 "Magento\\CatalogCmsGraphQl\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.0"
     }
    
  • app/code/Magento/Catalog/composer.json+31 30 modified
    @@ -6,37 +6,37 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-authorization": "*",
    -        "magento/module-asynchronous-operations": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-catalog-inventory": "*",
    -        "magento/module-catalog-rule": "*",
    -        "magento/module-catalog-url-rewrite": "*",
    -        "magento/module-checkout": "*",
    -        "magento/module-cms": "*",
    -        "magento/module-config": "*",
    -        "magento/module-customer": "*",
    -        "magento/module-directory": "*",
    -        "magento/module-eav": "*",
    -        "magento/module-indexer": "*",
    -        "magento/module-media-storage": "*",
    -        "magento/module-msrp": "*",
    -        "magento/module-page-cache": "*",
    -        "magento/module-product-alert": "*",
    -        "magento/module-quote": "*",
    -        "magento/module-store": "*",
    -        "magento/module-tax": "*",
    -        "magento/module-theme": "*",
    -        "magento/module-ui": "*",
    -        "magento/module-url-rewrite": "*",
    -        "magento/module-widget": "*",
    -        "magento/module-wishlist": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-authorization": "100.3.*",
    +        "magento/module-asynchronous-operations": "100.3.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-catalog-inventory": "100.3.*",
    +        "magento/module-catalog-rule": "101.1.*",
    +        "magento/module-catalog-url-rewrite": "100.3.*",
    +        "magento/module-checkout": "100.3.*",
    +        "magento/module-cms": "103.0.*",
    +        "magento/module-config": "101.1.*",
    +        "magento/module-customer": "102.0.*",
    +        "magento/module-directory": "100.3.*",
    +        "magento/module-eav": "102.0.*",
    +        "magento/module-indexer": "100.3.*",
    +        "magento/module-media-storage": "100.3.*",
    +        "magento/module-msrp": "100.3.*",
    +        "magento/module-page-cache": "100.3.*",
    +        "magento/module-product-alert": "100.3.*",
    +        "magento/module-quote": "101.1.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-tax": "100.3.*",
    +        "magento/module-theme": "101.0.*",
    +        "magento/module-ui": "101.1.*",
    +        "magento/module-url-rewrite": "101.1.*",
    +        "magento/module-widget": "101.1.*",
    +        "magento/module-wishlist": "101.1.*"
         },
         "suggest": {
    -        "magento/module-cookie": "*",
    -        "magento/module-sales": "*",
    -        "magento/module-catalog-sample-data": "*"
    +        "magento/module-cookie": "100.3.*",
    +        "magento/module-sales": "102.0.*",
    +        "magento/module-catalog-sample-data": "Sample Data version: 100.3.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -50,5 +50,6 @@
             "psr-4": {
                 "Magento\\Catalog\\": ""
             }
    -    }
    +    },
    +    "version": "103.0.4-p2"
     }
    
  • app/code/Magento/Catalog/Controller/Adminhtml/Product/Action/Attribute/Save.php+37 5 modified
    @@ -7,14 +7,16 @@
     namespace Magento\Catalog\Controller\Adminhtml\Product\Action\Attribute;
     
     use Magento\AsynchronousOperations\Api\Data\OperationInterface;
    +use Magento\Catalog\Model\ProductFactory;
     use Magento\Eav\Model\Config;
     use Magento\Framework\App\Action\HttpPostActionInterface;
     use Magento\Backend\App\Action;
     use Magento\Framework\App\ObjectManager;
    +use Magento\Framework\Exception\LocalizedException;
     use Magento\Framework\Stdlib\DateTime\TimezoneInterface;
     
     /**
    - * Class Save
    + * Class responsible for saving product attributes.
      * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
      */
     class Save extends \Magento\Catalog\Controller\Adminhtml\Product\Action\Attribute implements HttpPostActionInterface
    @@ -59,6 +61,11 @@ class Save extends \Magento\Catalog\Controller\Adminhtml\Product\Action\Attribut
          */
         private $eavConfig;
     
    +    /**
    +     * @var ProductFactory
    +     */
    +    private $productFactory;
    +
         /**
          * @param Action\Context $context
          * @param \Magento\Catalog\Helper\Product\Edit\Action\Attribute $attributeHelper
    @@ -70,6 +77,7 @@ class Save extends \Magento\Catalog\Controller\Adminhtml\Product\Action\Attribut
          * @param int $bulkSize
          * @param TimezoneInterface $timezone
          * @param Config $eavConfig
    +     * @param ProductFactory $productFactory
          * @SuppressWarnings(PHPMD.ExcessiveParameterList)
          */
         public function __construct(
    @@ -82,7 +90,8 @@ public function __construct(
             \Magento\Authorization\Model\UserContextInterface $userContext,
             int $bulkSize = 100,
             TimezoneInterface $timezone = null,
    -        Config $eavConfig = null
    +        Config $eavConfig = null,
    +        ProductFactory $productFactory = null
         ) {
             parent::__construct($context, $attributeHelper);
             $this->bulkManagement = $bulkManagement;
    @@ -95,6 +104,7 @@ public function __construct(
                 ->get(TimezoneInterface::class);
             $this->eavConfig = $eavConfig ?: ObjectManager::getInstance()
                 ->get(Config::class);
    +        $this->productFactory = $productFactory ?? ObjectManager::getInstance()->get(ProductFactory::class);
         }
     
         /**
    @@ -120,9 +130,10 @@ public function execute()
             $attributesData = $this->sanitizeProductAttributes($attributesData);
     
             try {
    +            $this->validateProductAttributes($attributesData);
                 $this->publish($attributesData, $websiteRemoveData, $websiteAddData, $storeId, $websiteId, $productIds);
                 $this->messageManager->addSuccessMessage(__('Message is added to queue'));
    -        } catch (\Magento\Framework\Exception\LocalizedException $e) {
    +        } catch (LocalizedException $e) {
                 $this->messageManager->addErrorMessage($e->getMessage());
             } catch (\Exception $e) {
                 $this->messageManager->addExceptionMessage(
    @@ -147,10 +158,12 @@ private function sanitizeProductAttributes($attributesData)
     
             foreach ($attributesData as $attributeCode => $value) {
                 $attribute = $this->eavConfig->getAttribute(\Magento\Catalog\Model\Product::ENTITY, $attributeCode);
    +
                 if (!$attribute->getAttributeId()) {
                     unset($attributesData[$attributeCode]);
                     continue;
                 }
    +
                 if ($attribute->getBackendType() === 'datetime') {
                     if (!empty($value)) {
                         $filterInput = new \Zend_Filter_LocalizedToNormalized(['date_format' => $dateFormat]);
    @@ -178,6 +191,25 @@ private function sanitizeProductAttributes($attributesData)
             return $attributesData;
         }
     
    +    /**
    +     * Validate product attributes data.
    +     *
    +     * @param array $attributesData
    +     *
    +     * @return void
    +     * @throws LocalizedException
    +     */
    +    private function validateProductAttributes(array $attributesData): void
    +    {
    +        $product = $this->productFactory->create();
    +        $product->setData($attributesData);
    +
    +        foreach (array_keys($attributesData) as $attributeCode) {
    +            $attribute = $this->eavConfig->getAttribute(\Magento\Catalog\Model\Product::ENTITY, $attributeCode);
    +            $attribute->getBackend()->validate($product);
    +        }
    +    }
    +
         /**
          * Schedule new bulk
          *
    @@ -187,7 +219,7 @@ private function sanitizeProductAttributes($attributesData)
          * @param int $storeId
          * @param int $websiteId
          * @param array $productIds
    -     * @throws \Magento\Framework\Exception\LocalizedException
    +     * @throws LocalizedException
          *
          * @return void
          */
    @@ -241,7 +273,7 @@ private function publish(
                     $this->userContext->getUserId()
                 );
                 if (!$result) {
    -                throw new \Magento\Framework\Exception\LocalizedException(
    +                throw new LocalizedException(
                         __('Something went wrong while processing the request.')
                     );
                 }
    
  • app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Save.php+7 3 modified
    @@ -143,8 +143,10 @@ public function execute()
                 $optionData = $this->formDataSerializer
                     ->unserialize($this->getRequest()->getParam('serialized_options', '[]'));
             } catch (\InvalidArgumentException $e) {
    -            $message = __("The attribute couldn't be saved due to an error. Verify your information and try again. "
    -                . "If the error persists, please try again later.");
    +            $message = __(
    +                "The attribute couldn't be saved due to an error. Verify your information and try again. "
    +                . "If the error persists, please try again later."
    +            );
                 $this->messageManager->addErrorMessage($message);
                 return $this->returnResult('catalog/*/edit', ['_current' => true], ['error' => true]);
             }
    @@ -221,7 +223,7 @@ public function execute()
                         return $this->returnResult('catalog/*/', [], ['error' => true]);
                     }
                     // entity type check
    -                if ($model->getEntityTypeId() != $this->_entityTypeId) {
    +                if ($model->getEntityTypeId() != $this->_entityTypeId || array_key_exists('backend_model', $data)) {
                         $this->messageManager->addErrorMessage(__('We can\'t update the attribute.'));
                         $this->_session->setAttributeData($data);
                         return $this->returnResult('catalog/*/', [], ['error' => true]);
    @@ -258,6 +260,8 @@ public function execute()
                     unset($data['apply_to']);
                 }
     
    +            unset($data['entity_type_id']);
    +
                 $model->addData($data);
     
                 if (!$attributeId) {
    
  • app/code/Magento/CatalogCustomerGraphQl/composer.json+7 6 modified
    @@ -4,11 +4,11 @@
         "type": "magento2-module",
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-customer": "*",
    -        "magento/module-catalog-graph-ql": "*",
    -        "magento/module-store": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-customer": "102.0.*",
    +        "magento/module-catalog-graph-ql": "100.3.*",
    +        "magento/module-store": "101.0.*"
         },
         "license": [
             "OSL-3.0",
    @@ -21,5 +21,6 @@
             "psr-4": {
                 "Magento\\CatalogCustomerGraphQl\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.0"
     }
    
  • app/code/Magento/CatalogGraphQl/composer.json+13 12 modified
    @@ -4,19 +4,19 @@
         "type": "magento2-module",
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/module-eav": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-catalog-inventory": "*",
    -        "magento/module-search": "*",
    -        "magento/module-store": "*",
    -        "magento/module-eav-graph-ql": "*",
    -        "magento/module-catalog-search": "*",
    -        "magento/framework": "*"
    +        "magento/module-eav": "102.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-catalog-inventory": "100.3.*",
    +        "magento/module-search": "101.0.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-eav-graph-ql": "100.3.*",
    +        "magento/module-catalog-search": "101.0.*",
    +        "magento/framework": "102.0.*"
         },
         "suggest": {
    -        "magento/module-graph-ql": "*",
    -        "magento/module-graph-ql-cache": "*",
    -        "magento/module-store-graph-ql": "*"
    +        "magento/module-graph-ql": "100.3.*",
    +        "magento/module-graph-ql-cache": "100.3.*",
    +        "magento/module-store-graph-ql": "100.3.*"
         },
         "license": [
             "OSL-3.0",
    @@ -29,5 +29,6 @@
             "psr-4": {
                 "Magento\\CatalogGraphQl\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/CatalogGraphQl/Model/Resolver/Category/Products.php+2 2 modified
    @@ -30,13 +30,13 @@ class Products implements ResolverInterface
     
         /**
          * @var Builder
    -     * @deprecated
    +     * @deprecated 100.3.4
          */
         private $searchCriteriaBuilder;
     
         /**
          * @var Filter
    -     * @deprecated
    +     * @deprecated 100.3.4
          */
         private $filterQuery;
     
    
  • app/code/Magento/CatalogGraphQl/Model/Resolver/Products.php+3 3 modified
    @@ -25,7 +25,7 @@ class Products implements ResolverInterface
     {
         /**
          * @var Builder
    -     * @deprecated
    +     * @deprecated 100.3.4
          */
         private $searchCriteriaBuilder;
     
    @@ -36,13 +36,13 @@ class Products implements ResolverInterface
     
         /**
          * @var Filter
    -     * @deprecated
    +     * @deprecated 100.3.4
          */
         private $filterQuery;
     
         /**
          * @var SearchFilter
    -     * @deprecated
    +     * @deprecated 100.3.4
          */
         private $searchFilter;
     
    
  • app/code/Magento/CatalogImportExport/composer.json+13 12 modified
    @@ -7,17 +7,17 @@
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
             "ext-ctype": "*",
    -        "magento/framework": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-catalog-inventory": "*",
    -        "magento/module-catalog-url-rewrite": "*",
    -        "magento/module-customer": "*",
    -        "magento/module-eav": "*",
    -        "magento/module-import-export": "*",
    -        "magento/module-media-storage": "*",
    -        "magento/module-store": "*",
    -        "magento/module-tax": "*",
    -        "magento/module-authorization": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-catalog-inventory": "100.3.*",
    +        "magento/module-catalog-url-rewrite": "100.3.*",
    +        "magento/module-customer": "102.0.*",
    +        "magento/module-eav": "102.0.*",
    +        "magento/module-import-export": "100.3.*",
    +        "magento/module-media-storage": "100.3.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-tax": "100.3.*",
    +        "magento/module-authorization": "100.3.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -31,5 +31,6 @@
             "psr-4": {
                 "Magento\\CatalogImportExport\\": ""
             }
    -    }
    +    },
    +    "version": "101.0.4-p2"
     }
    
  • app/code/Magento/CatalogImportExport/Test/Mftf/Test/AdminExportBundleProductTest.xml+3 0 modified
    @@ -107,6 +107,9 @@
                 </actionGroup>
                 <!-- Log out -->
                 <actionGroup ref="logout" stepKey="logout"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!-- Go to export page -->
    
  • app/code/Magento/CatalogImportExport/Test/Mftf/Test/AdminExportImportConfigurableProductWithImagesTest.xml+3 0 modified
    @@ -153,6 +153,9 @@
                 <actionGroup ref="resetProductGridToDefaultView" stepKey="resetProductGridColumnsInitial"/>
                 <!-- Admin logout-->
                 <actionGroup ref="logout" stepKey="adminLogout"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!-- Go to System > Export -->
    
  • app/code/Magento/CatalogImportExport/Test/Mftf/Test/AdminExportSimpleAndConfigurableProductsWithCustomOptionsTest.xml+3 0 modified
    @@ -95,6 +95,9 @@
                 </actionGroup>
                 <!-- Log out -->
                 <actionGroup ref="logout" stepKey="logout"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!-- Go to export page -->
    
  • app/code/Magento/CatalogImportExport/Test/Mftf/Test/AdminExportSimpleProductAndConfigurableProductsWithAssignedImagesTest.xml+3 0 modified
    @@ -111,6 +111,9 @@
                 </actionGroup>
                 <!-- Log out -->
                 <actionGroup ref="logout" stepKey="logout"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!-- Go to export page -->
    
  • app/code/Magento/CatalogImportExport/Test/Mftf/Test/AdminExportSimpleProductAssignedToMainWebsiteAndConfigurableProductAssignedToCustomWebsiteTest.xml+3 0 modified
    @@ -96,6 +96,9 @@
                 </actionGroup>
                 <!-- Log out -->
                 <actionGroup ref="logout" stepKey="logout"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!-- Go to export page -->
    
  • app/code/Magento/CatalogInventory/composer.json+10 9 modified
    @@ -6,14 +6,14 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-config": "*",
    -        "magento/module-customer": "*",
    -        "magento/module-eav": "*",
    -        "magento/module-quote": "*",
    -        "magento/module-store": "*",
    -        "magento/module-ui": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-config": "101.1.*",
    +        "magento/module-customer": "102.0.*",
    +        "magento/module-eav": "102.0.*",
    +        "magento/module-quote": "101.1.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-ui": "101.1.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -28,5 +28,6 @@
                 "Magento\\CatalogInventory\\": ""
             }
         },
    -    "abandoned": "magento/inventory-composer-metapackage"
    +    "abandoned": "magento/inventory-composer-metapackage",
    +    "version": "100.3.4-p2"
     }
    
  • app/code/Magento/CatalogInventoryGraphQl/composer.json+22 21 modified
    @@ -1,24 +1,25 @@
     {
    -  "name": "magento/module-catalog-inventory-graph-ql",
    -  "description": "N/A",
    -  "type": "magento2-module",
    -  "require": {
    -    "php": "~7.1.3||~7.2.0||~7.3.0",
    -    "magento/framework": "*",
    -    "magento/module-store": "*",
    -    "magento/module-catalog": "*",
    -    "magento/module-catalog-inventory": "*"
    -  },
    -  "license": [
    -    "OSL-3.0",
    -    "AFL-3.0"
    -  ],
    -  "autoload": {
    -    "files": [
    -      "registration.php"
    +    "name": "magento/module-catalog-inventory-graph-ql",
    +    "description": "N/A",
    +    "type": "magento2-module",
    +    "require": {
    +        "php": "~7.1.3||~7.2.0||~7.3.0",
    +        "magento/framework": "102.0.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-catalog-inventory": "100.3.*"
    +    },
    +    "license": [
    +        "OSL-3.0",
    +        "AFL-3.0"
         ],
    -    "psr-4": {
    -      "Magento\\CatalogInventoryGraphQl\\": ""
    -    }
    -  }
    +    "autoload": {
    +        "files": [
    +            "registration.php"
    +        ],
    +        "psr-4": {
    +            "Magento\\CatalogInventoryGraphQl\\": ""
    +        }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/CatalogInventory/Test/Mftf/Test/AssociatedProductToConfigurableOutOfStockTest.xml+10 7 modified
    @@ -80,13 +80,16 @@
             </before>
     
             <after>
    -              <deleteData createDataKey="createConfigProduct" stepKey="deleteConfigProduct"/>
    -              <deleteData createDataKey="simplecategory" stepKey="deleteSimpleCategory"/>
    -              <deleteData createDataKey="createSimpleUsCustomer" stepKey="deleteCustomer"/>
    -              <deleteData createDataKey="createConfigChildProduct1" stepKey="deleteConfigChildProduct1"/>
    -              <deleteData createDataKey="createConfigChildProduct2" stepKey="deleteConfigChildProduct2"/>
    -              <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/>
    -          </after>
    +            <deleteData createDataKey="createConfigProduct" stepKey="deleteConfigProduct"/>
    +            <deleteData createDataKey="simplecategory" stepKey="deleteSimpleCategory"/>
    +            <deleteData createDataKey="createSimpleUsCustomer" stepKey="deleteCustomer"/>
    +            <deleteData createDataKey="createConfigChildProduct1" stepKey="deleteConfigChildProduct1"/>
    +            <deleteData createDataKey="createConfigChildProduct2" stepKey="deleteConfigChildProduct2"/>
    +            <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
    +        </after>
     
             <!-- Login as a customer -->
             <actionGroup ref="LoginToStorefrontActionGroup" stepKey="signUpNewUser">
    
  • app/code/Magento/Catalog/Model/Attribute/Backend/Customlayoutupdate.php+2 1 modified
    @@ -22,7 +22,7 @@ class Customlayoutupdate extends AbstractBackend
     {
         /**
          * @var ValidatorFactory
    -     * @deprecated Is not used anymore.
    +     * @deprecated 103.0.4 Is not used anymore.
          */
         protected $_layoutUpdateValidatorFactory;
     
    @@ -117,6 +117,7 @@ private function putValue(AbstractModel $object, ?string $value): void
          *
          * @param AbstractModel $object
          * @throws LocalizedException
    +     * @since 103.0.4
          */
         public function beforeSave($object)
         {
    
  • app/code/Magento/Catalog/Model/ProductLink/Repository.php+4 4 modified
    @@ -54,14 +54,14 @@ class Repository implements \Magento\Catalog\Api\ProductLinkRepositoryInterface
     
         /**
          * @var CollectionProvider
    -     * @deprecated Not used anymore.
    +     * @deprecated 103.0.4 Not used anymore.
          * @see query
          */
         protected $entityCollectionProvider;
     
         /**
          * @var LinksInitializer
    -     * @deprecated Not used.
    +     * @deprecated 103.0.4 Not used.
          */
         protected $linkInitializer;
     
    @@ -77,14 +77,14 @@ class Repository implements \Magento\Catalog\Api\ProductLinkRepositoryInterface
     
         /**
          * @var ProductLinkInterfaceFactory
    -     * @deprecated Not used anymore, search delegated.
    +     * @deprecated 103.0.4 Not used anymore, search delegated.
          * @see getList()
          */
         protected $productLinkFactory;
     
         /**
          * @var ProductLinkExtensionFactory
    -     * @deprecated Not used anymore, search delegated.
    +     * @deprecated 103.0.4 Not used anymore, search delegated.
          * @see getList()
          */
         protected $productLinkExtensionFactory;
    
  • app/code/Magento/CatalogRule/composer.json+12 11 modified
    @@ -6,18 +6,18 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-customer": "*",
    -        "magento/module-eav": "*",
    -        "magento/module-rule": "*",
    -        "magento/module-store": "*",
    -        "magento/module-ui": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-customer": "102.0.*",
    +        "magento/module-eav": "102.0.*",
    +        "magento/module-rule": "100.3.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-ui": "101.1.*"
         },
         "suggest": {
    -        "magento/module-import-export": "*",
    -        "magento/module-catalog-rule-sample-data": "*"
    +        "magento/module-import-export": "100.3.*",
    +        "magento/module-catalog-rule-sample-data": "Sample Data version: 100.3.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -31,5 +31,6 @@
             "psr-4": {
                 "Magento\\CatalogRule\\": ""
             }
    -    }
    +    },
    +    "version": "101.1.4-p2"
     }
    
  • app/code/Magento/CatalogRuleConfigurable/composer.json+7 6 modified
    @@ -6,14 +6,14 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    +        "magento/framework": "102.0.*",
             "magento/magento-composer-installer": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-catalog-rule": "*",
    -        "magento/module-configurable-product": "*"
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-catalog-rule": "101.1.*",
    +        "magento/module-configurable-product": "100.3.*"
         },
         "suggest": {
    -        "magento/module-catalog-rule": "*"
    +        "magento/module-catalog-rule": "101.1.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -27,5 +27,6 @@
             "psr-4": {
                 "Magento\\CatalogRuleConfigurable\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4-p2"
     }
    
  • app/code/Magento/CatalogRuleConfigurable/Test/Mftf/Test/AdminApplyCatalogRuleForConfigurableProductWithAssignedSimpleProductsTest.xml+3 0 modified
    @@ -176,6 +176,9 @@
     
                 <!-- Admin log out -->
                 <actionGroup ref="logout" stepKey="logout"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
             <!-- Create price rule -->
             <actionGroup ref="newCatalogPriceRuleByUI" stepKey="createPriceRule">
    
  • app/code/Magento/CatalogRuleConfigurable/Test/Mftf/Test/AdminApplyCatalogRuleForConfigurableProductWithOptionsTest.xml+3 0 modified
    @@ -123,6 +123,9 @@
     
                 <!-- Log out -->
                 <actionGroup ref="logout" stepKey="logout"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!-- Create price rule for first configurable product option -->
    
  • app/code/Magento/CatalogRule/Test/Mftf/Test/AdminApplyCatalogRuleForConfigurableProductWithSpecialPricesTest.xml+3 0 modified
    @@ -92,6 +92,9 @@
                 <deleteData createDataKey="createSecondConfigChildProduct" stepKey="deleteConfigChildProduct2"/>
                 <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/>
                 <deleteData createDataKey="createCategory" stepKey="deleteCategory"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!-- Add special prices for products -->
    
  • app/code/Magento/CatalogRule/Test/Mftf/Test/AdminDeleteCatalogPriceRuleEntityTest.xml+3 0 modified
    @@ -182,6 +182,9 @@
                 <deleteData createDataKey="createConfigChildProduct1" stepKey="deleteConfigChildProduct1"/>
                 <deleteData createDataKey="createConfigChildProduct2" stepKey="deleteConfigChildProduct2"/>
                 <deleteData createDataKey="createConfigProductAttribute1" stepKey="deleteConfigProductAttribute1"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!-- Delete the simple product and catalog price rule -->
    
  • app/code/Magento/CatalogRule/Test/Mftf/Test/ApplyCatalogPriceRuleByProductAttributeTest.xml+3 0 modified
    @@ -105,6 +105,9 @@
                 <click stepKey="resetFilters" selector="{{AdminSecondaryGridSection.resetFilters}}"/>
     
                 <actionGroup ref="logout" stepKey="logout"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!-- Add values to your attribute ( ex: red , green) -->
    
  • app/code/Magento/CatalogRule/Test/Mftf/Test/ApplyCatalogRuleForSimpleAndConfigurableProductTest.xml+3 0 modified
    @@ -99,6 +99,9 @@
                 <deleteData createDataKey="createConfigChildProduct2" stepKey="deleteConfigChildProduct2"/>
                 <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/>
                 <deleteData createDataKey="createCategory" stepKey="deleteApiCategory"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
             <!-- Begin creating a new catalog price rule -->
             <actionGroup ref="newCatalogPriceRuleByUIWithConditionIsCategory" stepKey="newCatalogPriceRuleByUIWithConditionIsCategory">
    
  • app/code/Magento/CatalogSearch/composer.json+15 14 modified
    @@ -6,21 +6,21 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-indexer": "*",
    -        "magento/module-catalog-inventory": "*",
    -        "magento/module-customer": "*",
    -        "magento/module-directory": "*",
    -        "magento/module-eav": "*",
    -        "magento/module-search": "*",
    -        "magento/module-store": "*",
    -        "magento/module-theme": "*",
    -        "magento/module-ui": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-indexer": "100.3.*",
    +        "magento/module-catalog-inventory": "100.3.*",
    +        "magento/module-customer": "102.0.*",
    +        "magento/module-directory": "100.3.*",
    +        "magento/module-eav": "102.0.*",
    +        "magento/module-search": "101.0.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-theme": "101.0.*",
    +        "magento/module-ui": "101.1.*"
         },
         "suggest": {
    -        "magento/module-config": "*"
    +        "magento/module-config": "101.1.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -34,5 +34,6 @@
             "psr-4": {
                 "Magento\\CatalogSearch\\": ""
             }
    -    }
    +    },
    +    "version": "101.0.4-p2"
     }
    
  • app/code/Magento/CatalogSearch/Model/ResourceModel/Advanced/Collection.php+3 0 modified
    @@ -355,6 +355,7 @@ protected function _renderFiltersBefore()
     
         /**
          * @inheritDoc
    +     * @since 101.0.4
          */
         public function clear()
         {
    @@ -364,6 +365,7 @@ public function clear()
     
         /**
          * @inheritDoc
    +     * @since 101.0.4
          */
         protected function _reset()
         {
    @@ -373,6 +375,7 @@ protected function _reset()
     
         /**
          * @inheritdoc
    +     * @since 101.0.4
          */
         public function _loadEntities($printQuery = false, $logQuery = false)
         {
    
  • app/code/Magento/CatalogSearch/Model/ResourceModel/Fulltext/Collection.php+3 0 modified
    @@ -381,6 +381,7 @@ public function addFieldToFilter($field, $condition = null)
     
         /**
          * @inheritDoc
    +     * @since 101.0.4
          */
         public function clear()
         {
    @@ -390,6 +391,7 @@ public function clear()
     
         /**
          * @inheritDoc
    +     * @since 101.0.4
          */
         protected function _reset()
         {
    @@ -399,6 +401,7 @@ protected function _reset()
     
         /**
          * @inheritdoc
    +     * @since 101.0.4
          */
         public function _loadEntities($printQuery = false, $logQuery = false)
         {
    
  • app/code/Magento/CatalogSearch/Test/Mftf/Test/SearchEntityResultsTest.xml+7 0 modified
    @@ -675,6 +675,13 @@
                 <magentoCLI command="indexer:reindex" stepKey="reindex"/>
                 <magentoCLI command="cache:flush" stepKey="flushCache"/>
             </before>
    +        <after>
    +            <deleteData createDataKey="attributeSet" stepKey="deleteAttributeSet"/>
    +            <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
    +        </after>
             <amOnPage url="{{StorefrontHomePage.url}}" stepKey="goToFrontPage"/>
             <actionGroup ref="StorefrontCheckQuickSearchStringActionGroup" stepKey="searchStorefront">
                 <argument name="phrase" value="$createConfigProduct.name$"/>
    
  • app/code/Magento/Catalog/Test/Mftf/Test/AdminAssignProductAttributeToAttributeSetTest.xml+3 0 modified
    @@ -33,6 +33,9 @@
             <after>
                 <deleteData createDataKey="attribute" stepKey="deleteAttribute"/>
                 <actionGroup ref="logout" stepKey="logout"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!-- Go to default attribute set edit page -->
    
  • app/code/Magento/Catalog/Test/Mftf/Test/AdminChangeProductAttributeSet.xml+3 0 modified
    @@ -47,6 +47,9 @@
                 <deleteData createDataKey="createProductAttribute" stepKey="deleteProductAttribute"/>
                 <deleteData createDataKey="createAttributeSet" stepKey="deleteAttributeSet"/>
                 <actionGroup ref="ClearProductsFilterActionGroup" stepKey="clearProductsFilter"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <actionGroup ref="SearchForProductOnBackendActionGroup" stepKey="searchForSimpleProduct">
    
  • app/code/Magento/Catalog/Test/Mftf/Test/AdminCheckConfigurableProductPriceWithDisabledChildProductTest.xml+3 0 modified
    @@ -118,6 +118,9 @@
                 <deleteData createDataKey="createConfigChildProduct3" stepKey="deleteConfigChildProduct3"/>
                 <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteAttribute"/>
                 <actionGroup ref="logout" stepKey="logout"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!-- Open Product in Store Front Page -->
    
  • app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateAttributeSetEntityTest.xml+3 0 modified
    @@ -26,6 +26,9 @@
             <after>
                 <deleteData createDataKey="createProductAttribute" stepKey="deleteProductAttribute"/>
                 <deleteData createDataKey="createAttributeSet" stepKey="deleteAttributeSet"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <amOnPage url="{{AdminProductAttributeSetGridPage.url}}" stepKey="goToAttributeSets"/>
    
  • app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateDropdownProductAttributeVisibleInStorefrontAdvancedSearchFormTest.xml+5 0 modified
    @@ -34,7 +34,12 @@
                 <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/>
             </before>
             <after>
    +            <deleteData createDataKey="attribute" stepKey="deleteProductAttribute"/>
    +            <deleteData createDataKey="createAttributeSet" stepKey="deleteAttributeSet"/>
                 <actionGroup ref="logout" stepKey="logout"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!-- Filter product attribute set by attribute set name -->
    
  • app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateMultipleSelectProductAttributeVisibleInStorefrontAdvancedSearchFormTest.xml+3 0 modified
    @@ -41,6 +41,9 @@
                 <deleteData createDataKey="createAttributeSet" stepKey="deleteAttributeSet"/>
     
                 <actionGroup ref="logout" stepKey="logout"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!-- Filter product attribute set by attribute set name -->
    
  • app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateNewGroupForAttributeSetTest.xml+4 0 modified
    @@ -27,7 +27,11 @@
             </before>
             <after>
                 <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/>
    +            <deleteData createDataKey="createAttributeSet" stepKey="deleteAttributeSet"/>
                 <actionGroup ref="logout" stepKey="logout"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
             
             <!-- Navigate to Stores > Attributes > Attribute Set -->
    
  • app/code/Magento/Catalog/Test/Mftf/Test/AdminDeleteConfigurableChildProductsTest.xml+3 0 modified
    @@ -82,6 +82,9 @@
                 <deleteData createDataKey="createConfigProduct" stepKey="deleteConfigProduct"/>
                 <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteAttribute"/>
                 <actionGroup ref="logout" stepKey="logout"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
             <!--Open Product in Store Front Page -->
             <amOnPage url="$$createConfigProduct.sku$$.html" stepKey="openProductInStoreFront"/>
    
  • app/code/Magento/Catalog/Test/Mftf/Test/AdminDeleteDropdownProductAttributeFromAttributeSetTest.xml+3 0 modified
    @@ -29,6 +29,9 @@
                 <!--Delete Created Data -->
                 <deleteData createDataKey="createAttributeSet" stepKey="deleteAttributeSet"/>
                 <actionGroup ref="logout" stepKey="logout"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
             <!-- Open Product Attribute Set Page -->
             <amOnPage url="{{AdminProductAttributeSetGridPage.url}}" stepKey="goToAttributeSets"/>
    
  • app/code/Magento/Catalog/Test/Mftf/Test/AdminDeleteProductAttributeTest.xml+3 0 modified
    @@ -23,6 +23,9 @@
             </before>
             <after>
                 <actionGroup ref="logout" stepKey="logout"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
             <actionGroup ref="deleteProductAttributeByAttributeCode" stepKey="deleteProductAttribute">
                 <argument name="ProductAttributeCode" value="$$createProductAttribute.attribute_code$$"/>
    
  • app/code/Magento/Catalog/Test/Mftf/Test/AdminDeleteTextFieldProductAttributeFromAttributeSetTest.xml+3 0 modified
    @@ -32,6 +32,9 @@
                 <!--Delete cteated Data -->
                 <deleteData createDataKey="createSimpleProduct" stepKey="deleteSimplaeProduct"/>
                 <actionGroup ref="logout" stepKey="logout"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
             <!-- Open Product Attribute Set Page -->
             <amOnPage url="{{AdminProductAttributeSetGridPage.url}}" stepKey="goToAttributeSets"/>
    
  • app/code/Magento/Catalog/Test/Mftf/Test/AdminNavigateMultipleUpSellProductsTest.xml+3 0 modified
    @@ -90,6 +90,9 @@
                 <deleteData createDataKey="createConfigChildProduct2" stepKey="deletecreateConfigChildProduct2"/>
                 <deleteData createDataKey="createConfigChildProduct1" stepKey="deletecreateConfigChildProduct1"/>
                 <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!--Open Product Index Page-->
    
  • app/code/Magento/Catalog/Test/Mftf/Test/AdminProductGridFilteringByCustomAttributeTest.xml+3 0 modified
    @@ -90,6 +90,9 @@
                 <deleteData createDataKey="createCategory" stepKey="deleteCategory"/>
                 <actionGroup ref="NavigateToAndResetProductGridToDefaultView" stepKey="NavigateToAndResetProductGridToDefaultViewAfterTest"/>
                 <actionGroup ref="logout" stepKey="logout"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
             <amOnPage url="{{AdminProductIndexPage.url}}" stepKey="navigateToProductIndex"/>
             <waitForPageLoad stepKey="waitForProductGridPageLoad"/>
    
  • app/code/Magento/Catalog/Test/Mftf/Test/AdminTierPriceNotAvailableForProductOptionsWithoutTierPriceTest.xml+3 0 modified
    @@ -83,6 +83,9 @@
                 <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/>
     
                 <actionGroup ref="logout" stepKey="logoutOfAdmin"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!--Go to storefront product page an check price box css-->
    
  • app/code/Magento/Catalog/Test/Mftf/Test/AdminUnassignProductAttributeFromAttributeSetTest.xml+3 0 modified
    @@ -36,6 +36,9 @@
                 <deleteData createDataKey="attribute" stepKey="deleteAttribute"/>
                 <deleteData createDataKey="product" stepKey="deleteProduct"/>
                 <actionGroup ref="logout" stepKey="logout"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
             <!-- Assert attribute presence in storefront product additional information -->
             <amOnPage url="/$$product.custom_attributes[url_key]$$.html" stepKey="onProductPage1"/>
    
  • app/code/Magento/Catalog/Test/Mftf/Test/DeleteUsedInConfigurableProductAttributeTest.xml+4 1 modified
    @@ -73,6 +73,9 @@
     
                 <!-- Logout -->
                 <actionGroup ref="logout" stepKey="logoutFromAdmin"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
             <!-- Go to Stores > Attributes > Products. Search and select the product attribute that was used to create the configurable product-->
             <actionGroup ref="OpenProductAttributeFromSearchResultInGridActionGroup" stepKey="openProductAttributeFromSearchResultInGrid">
    @@ -102,4 +105,4 @@
                 <argument name="productAttribute" value="$$productAttributeHandle$$"/>
             </actionGroup>
         </test>
    -</tests>
    \ No newline at end of file
    +</tests>
    
  • app/code/Magento/Catalog/Test/Mftf/Test/StorefrontEnsureThatAccordionAnchorIsVisibleOnViewportOnceClickedTest.xml+4 0 modified
    @@ -69,6 +69,10 @@
                 <deleteData createDataKey="createThirdAttribute" stepKey="deleteThirdAttribute"/>
                 <deleteData createDataKey="createFourthAttribute" stepKey="deleteFourthAttribute"/>
                 <deleteData createDataKey="createProduct" stepKey="deleteProduct"/>
    +
    +            <actionGroup ref="logout" stepKey="logoutFromAdmin"/>
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!-- Edit the product and set those attributes values -->
    
  • app/code/Magento/Catalog/Test/Mftf/Test/StorefrontProductsCompareWithEmptyAttributeTest.xml+3 0 modified
    @@ -33,6 +33,9 @@
                 <deleteData createDataKey="createSimpleProduct1" stepKey="deleteSimpleProduct1"/>
                 <deleteData createDataKey="createSimpleProduct2" stepKey="deleteSimpleProduct2"/>
                 <actionGroup ref="logout" stepKey="logoutOfAdmin"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
             <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin1"/>
             <amOnPage url="{{AdminProductAttributeSetGridPage.url}}" stepKey="amOnAttributeSetPage"/>
    
  • app/code/Magento/Catalog/Test/Mftf/Test/StorefrontProductWithEmptyAttributeTest.xml+3 0 modified
    @@ -29,6 +29,9 @@
                 <deleteData createDataKey="createPreReqCategory" stepKey="deletePreReqCategory"/>
                 <deleteData createDataKey="createProductAttribute" stepKey="deleteProductAttribute"/>
                 <actionGroup ref="logout" stepKey="logoutOfAdmin"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
             <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin1"/>
             <amOnPage url="{{AdminProductAttributeSetGridPage.url}}" stepKey="amOnAttributeSetPage"/>
    
  • app/code/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/LayoutUpdate.php+0 1 modified
    @@ -50,7 +50,6 @@ private function extractLayoutUpdate(ProductInterface $product)
     
         /**
          * @inheritdoc
    -     * @since 101.1.0
          */
         public function modifyData(array $data)
         {
    
  • app/code/Magento/CatalogUrlRewrite/composer.json+12 11 modified
    @@ -6,18 +6,18 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-catalog-import-export": "*",
    -        "magento/module-eav": "*",
    -        "magento/module-import-export": "*",
    -        "magento/module-store": "*",
    -        "magento/module-ui": "*",
    -        "magento/module-url-rewrite": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-catalog-import-export": "101.0.*",
    +        "magento/module-eav": "102.0.*",
    +        "magento/module-import-export": "100.3.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-ui": "101.1.*",
    +        "magento/module-url-rewrite": "101.1.*"
         },
         "suggest": {
    -        "magento/module-webapi": "*"
    +        "magento/module-webapi": "100.3.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -31,5 +31,6 @@
             "psr-4": {
                 "Magento\\CatalogUrlRewrite\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4-p2"
     }
    
  • app/code/Magento/CatalogUrlRewriteGraphQl/composer.json+8 7 modified
    @@ -4,14 +4,14 @@
         "type": "magento2-module",
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/module-store": "*",
    -        "magento/module-catalog": "*",
    -        "magento/framework": "*"
    +        "magento/module-store": "101.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/framework": "102.0.*"
         },
         "suggest": {
    -        "magento/module-catalog-url-rewrite": "*",
    -        "magento/module-catalog-graph-ql": "*",
    -        "magento/module-url-rewrite-graph-ql": "*"
    +        "magento/module-catalog-url-rewrite": "100.3.*",
    +        "magento/module-catalog-graph-ql": "100.3.*",
    +        "magento/module-url-rewrite-graph-ql": "100.3.*"
         },
         "license": [
             "OSL-3.0",
    @@ -24,5 +24,6 @@
             "psr-4": {
                 "Magento\\CatalogUrlRewriteGraphQl\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/Catalog/ViewModel/Product/Breadcrumbs.php+1 1 modified
    @@ -117,7 +117,7 @@ public function getJsonConfigurationHtmlEscaped() : string
          * Returns breadcrumb json.
          *
          * @return string
    -     * @deprecated 103.0.0 in favor of new method with name {suffix}Html{postfix}()
    +     * @deprecated 102.0.11 in favor of new method with name {suffix}Html{postfix}()
          */
         public function getJsonConfiguration()
         {
    
  • app/code/Magento/CatalogWidget/composer.json+12 11 modified
    @@ -6,16 +6,16 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-customer": "*",
    -        "magento/module-eav": "*",
    -        "magento/module-rule": "*",
    -        "magento/module-store": "*",
    -        "magento/module-widget": "*",
    -        "magento/module-wishlist": "*",
    -        "magento/module-theme": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-customer": "102.0.*",
    +        "magento/module-eav": "102.0.*",
    +        "magento/module-rule": "100.3.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-widget": "101.1.*",
    +        "magento/module-wishlist": "101.1.*",
    +        "magento/module-theme": "101.0.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -29,5 +29,6 @@
             "psr-4": {
                 "Magento\\CatalogWidget\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/CheckoutAgreements/composer.json+7 6 modified
    @@ -6,11 +6,11 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-checkout": "*",
    -        "magento/module-quote": "*",
    -        "magento/module-store": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-checkout": "100.3.*",
    +        "magento/module-quote": "101.1.*",
    +        "magento/module-store": "101.0.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -24,5 +24,6 @@
             "psr-4": {
                 "Magento\\CheckoutAgreements\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4-p2"
     }
    
  • app/code/Magento/CheckoutAgreementsGraphQl/composer.json+6 5 modified
    @@ -4,12 +4,12 @@
         "type": "magento2-module",
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-store": "*",
    -        "magento/module-checkout-agreements": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-checkout-agreements": "100.3.*"
         },
         "suggest": {
    -        "magento/module-graph-ql": "*"
    +        "magento/module-graph-ql": "100.3.*"
         },
         "license": [
             "OSL-3.0",
    @@ -22,5 +22,6 @@
             "psr-4": {
                 "Magento\\CheckoutAgreementsGraphQl\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.1"
     }
    
  • app/code/Magento/Checkout/composer.json+22 21 modified
    @@ -6,28 +6,28 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-catalog-inventory": "*",
    -        "magento/module-config": "*",
    -        "magento/module-customer": "*",
    -        "magento/module-directory": "*",
    -        "magento/module-eav": "*",
    -        "magento/module-msrp": "*",
    -        "magento/module-page-cache": "*",
    -        "magento/module-payment": "*",
    -        "magento/module-quote": "*",
    -        "magento/module-sales": "*",
    -        "magento/module-sales-rule": "*",
    -        "magento/module-shipping": "*",
    -        "magento/module-store": "*",
    -        "magento/module-tax": "*",
    -        "magento/module-theme": "*",
    -        "magento/module-ui": "*",
    -        "magento/module-captcha": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-catalog-inventory": "100.3.*",
    +        "magento/module-config": "101.1.*",
    +        "magento/module-customer": "102.0.*",
    +        "magento/module-directory": "100.3.*",
    +        "magento/module-eav": "102.0.*",
    +        "magento/module-msrp": "100.3.*",
    +        "magento/module-page-cache": "100.3.*",
    +        "magento/module-payment": "100.3.*",
    +        "magento/module-quote": "101.1.*",
    +        "magento/module-sales": "102.0.*",
    +        "magento/module-sales-rule": "101.1.*",
    +        "magento/module-shipping": "100.3.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-tax": "100.3.*",
    +        "magento/module-theme": "101.0.*",
    +        "magento/module-ui": "101.1.*",
    +        "magento/module-captcha": "100.3.*"
         },
         "suggest": {
    -        "magento/module-cookie": "*"
    +        "magento/module-cookie": "100.3.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -41,5 +41,6 @@
             "psr-4": {
                 "Magento\\Checkout\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4-p2"
     }
    
  • app/code/Magento/Checkout/Controller/Sidebar/RemoveItem.php+12 1 modified
    @@ -7,6 +7,9 @@
     
     use Magento\Framework\App\Action\HttpPostActionInterface as HttpPostActionInterface;
     
    +/**
    + * Controller for removing quote item from shopping cart.
    + */
     class RemoveItem extends \Magento\Framework\App\Action\Action implements HttpPostActionInterface
     {
         /**
    @@ -56,7 +59,7 @@ public function __construct(
         }
     
         /**
    -     * @return $this
    +     * @inheritdoc
          */
         public function execute()
         {
    @@ -67,11 +70,17 @@ public function execute()
             try {
                 $this->sidebar->checkQuoteItem($itemId);
                 $this->sidebar->removeQuoteItem($itemId);
    +
                 return $this->jsonResponse();
             } catch (\Magento\Framework\Exception\LocalizedException $e) {
                 return $this->jsonResponse($e->getMessage());
    +        } catch (\Zend_Db_Exception $e) {
    +            $this->logger->critical($e);
    +
    +            return $this->jsonResponse(__('An unspecified error occurred. Please contact us for assistance.'));
             } catch (\Exception $e) {
                 $this->logger->critical($e);
    +
                 return $this->jsonResponse($e->getMessage());
             }
         }
    @@ -92,6 +101,8 @@ protected function jsonResponse($error = '')
         }
     
         /**
    +     * Return formKey Validator object instance.
    +     *
          * @return \Magento\Framework\Data\Form\FormKey\Validator
          * @deprecated 100.0.9
          */
    
  • app/code/Magento/Checkout/Test/Mftf/ActionGroup/AssertStorefrontOrderIsNotPlacedActionGroup.xml+17 0 added
    @@ -0,0 +1,17 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<!--
    + /**
    +  * Copyright © Magento, Inc. All rights reserved.
    +  * See COPYING.txt for license details.
    +  */
    +-->
    +
    +<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd">
    +    <actionGroup name="AssertStorefrontOrderIsNotPlacedActionGroup" extends="AssertStorefrontOrderCannotBePlacedActionGroup">
    +        <annotations>
    +            <description>Validates order cannot be placed and checks error message.</description>
    +        </annotations>
    +        <remove keyForRemoval="assertErrorMessage"/>
    +        <seeElementInDOM selector="{{CheckoutHeaderSection.errorMessageContainsText(error)}}" stepKey="assertErrorMessageInDOM"/>
    +    </actionGroup>
    +</actionGroups>
    
  • app/code/Magento/Checkout/Test/Mftf/ActionGroup/StorefrontCheckoutClickNextOnShippingStepActionGroup.xml+17 0 added
    @@ -0,0 +1,17 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<!--
    + /**
    +  * Copyright © Magento, Inc. All rights reserved.
    +  * See COPYING.txt for license details.
    +  */
    +-->
    +
    +<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    +              xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd">
    +    <actionGroup name="StorefrontCheckoutClickNextOnShippingStepActionGroup" extends="StorefrontCheckoutForwardFromShippingStep">
    +        <annotations>
    +            <description>Scrolls and clicks next on Checkout Shipping step</description>
    +        </annotations>
    +        <scrollTo selector="{{CheckoutShippingSection.next}}" before="clickNext" stepKey="scrollToNextButton"/>
    +    </actionGroup>
    +</actionGroups>
    
  • app/code/Magento/Checkout/Test/Mftf/Section/CheckoutHeaderSection.xml+1 0 modified
    @@ -9,5 +9,6 @@
         <section name="CheckoutHeaderSection">
             <element name="shippingMethodStep" type="text" selector=".opc-progress-bar-item:nth-of-type(1)"/>
             <element name="reviewAndPaymentsStep" type="text" selector=".opc-progress-bar-item:nth-of-type(2)"/>
    +        <element name="errorMessageContainsText" type="text" selector="//div[contains(@class, 'message message-error error')]//div[contains(text(), '{{text}}')]" parameterized="true"/>
         </section>
     </sections>
    
  • app/code/Magento/Checkout/Test/Mftf/Test/DeleteConfigurableProductFromShoppingCartTest.xml+3 0 modified
    @@ -60,6 +60,9 @@
     
                 <!-- Delete category -->
                 <deleteData createDataKey="createCategory" stepKey="deleteCategory"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!-- Add configurable product to the cart  -->
    
  • app/code/Magento/Checkout/Test/Mftf/Test/OnePageCheckoutWithAllProductTypesTest.xml+3 0 modified
    @@ -111,6 +111,9 @@
     
                 <!-- Logout customer -->
                 <actionGroup ref="StorefrontCustomerLogoutActionGroup" stepKey="customerLogoutStorefront"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!-- Add Simple Product to cart -->
    
  • app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddConfigurableProductToShoppingCartTest.xml+3 0 modified
    @@ -120,6 +120,9 @@
                 <deleteData createDataKey="createConfigProduct" stepKey="deleteProduct"/>
                 <deleteData createDataKey="createCategory" stepKey="deleteCategory"/>
                 <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteProductAttribute"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!-- Add Configurable Product to the cart -->
    
  • app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCheckoutWithSpecialPriceProductsTest.xml+4 1 modified
    @@ -102,6 +102,9 @@
                 <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteProductAttribute"/>
                 <deleteData createDataKey="createCustomer" stepKey="deleteCustomer"/>
                 <actionGroup ref="logout" stepKey="logout"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!--Open Product page in StoreFront and assert product and price range -->
    @@ -168,4 +171,4 @@
             <!-- Assert order buttons -->
             <actionGroup ref="AdminAssertOrderAvailableButtonsActionGroup" stepKey="assertOrderButtons"/>
         </test>
    -</tests>
    \ No newline at end of file
    +</tests>
    
  • app/code/Magento/Checkout/Test/Mftf/Test/StorefrontDeleteConfigurableProductFromMiniShoppingCartTest.xml+4 1 modified
    @@ -72,6 +72,9 @@
                 <deleteData createDataKey="createCategory" stepKey="deleteCategory"/>
                 <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteProductAttribute"/>
                 <actionGroup ref="logout" stepKey="logout"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!-- Add Configurable Product to the cart -->
    @@ -97,4 +100,4 @@
             <actionGroup ref="assertMiniCartEmpty" stepKey="miniCartEnpty"/>
             <dontSee selector="{{StorefrontMinicartSection.productLinkByName($$createConfigProduct.name$$)}}" stepKey="verifyAssertProductAbsentInMiniShoppingCart"/>
         </test>
    -</tests>
    \ No newline at end of file
    +</tests>
    
  • app/code/Magento/Checkout/Test/Mftf/Test/StorefrontGuestCheckoutUsingFreeShippingAndTaxesTest.xml+4 1 modified
    @@ -109,6 +109,9 @@
                 <createData entity="DefaultShippingMethodsConfig" stepKey="defaultShippingMethodsConfig"/>
                 <createData entity="DefaultMinimumOrderAmount" stepKey="defaultMinimumOrderAmount"/>
                 <actionGroup ref="logout" stepKey="logout"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!-- Create a Tax Rule -->
    @@ -220,4 +223,4 @@
                 <argument name="customerGroup" value=""/>
             </actionGroup>
         </test>
    -</tests>
    \ No newline at end of file
    +</tests>
    
  • app/code/Magento/Checkout/Test/Mftf/Test/StorefrontNotApplicableShippingMethodInReviewAndPaymentStepTest.xml+2 2 modified
    @@ -9,7 +9,7 @@
            xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd">
         <test name="StorefrontNotApplicableShippingMethodInReviewAndPaymentStepTest">
             <annotations>
    -            <title value="Not applicable Shipping Method In Review and Payment Step"/>
    +            <title value="DEPRECATED. Not applicable Shipping Method In Review and Payment Step"/>
                 <stories value="Checkout Shipping Method Recalculation after Coupon Code Added"/>
                 <description value="User should not be able to place order when free shipping declined after applying coupon code"/>
                 <features value="Checkout"/>
    @@ -18,7 +18,7 @@
                 <useCaseId value="MC-21926"/>
                 <group value="Checkout"/>
                 <skip>
    -                <issueId value="MC-29764"/>
    +                <issueId value="DEPRECATED">Use StorefrontShippingMethodIsNotApplicableInReviewAndPaymentStepTest instead</issueId>
                 </skip>
             </annotations>
     
    
  • app/code/Magento/Checkout/Test/Mftf/Test/StorefrontShippingMethodIsNotApplicableInReviewAndPaymentStepTest.xml+201 0 added
    @@ -0,0 +1,201 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<!--
    + /**
    +  * Copyright © Magento, Inc. All rights reserved.
    +  * See COPYING.txt for license details.
    +  */
    +-->
    +<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    +       xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd">
    +    <test name="StorefrontShippingMethodIsNotApplicableInReviewAndPaymentStepTest">
    +        <annotations>
    +            <title value="Not applicable Shipping Method In Review and Payment Step"/>
    +            <stories value="Checkout Shipping Method Recalculation after Coupon Code Added"/>
    +            <description value="User should not be able to place order when free shipping declined after applying coupon code"/>
    +            <features value="Checkout"/>
    +            <severity value="MAJOR"/>
    +            <testCaseId value="MC-22625"/>
    +            <useCaseId value="MC-21926"/>
    +            <group value="checkout"/>
    +        </annotations>
    +
    +        <before>
    +            <!-- Enable Free Shipping Method and set Minimum Order Amount to 100-->
    +            <magentoCLI command="config:set {{AdminFreeshippingActiveConfigData.path}} {{AdminFreeshippingActiveConfigData.enabled}}" stepKey="enableFreeShippingMethod" />
    +            <magentoCLI command="config:set {{AdminFreeshippingMinimumOrderAmountConfigData.path}} {{AdminFreeshippingMinimumOrderAmountConfigData.hundred}}" stepKey="setFreeShippingMethodMinimumOrderAmountToBe100" />
    +
    +            <!--Set Fedex configs data-->
    +            <magentoCLI command="config:set {{AdminFedexEnableForCheckoutConfigData.path}} {{AdminFedexEnableForCheckoutConfigData.value}}" stepKey="enableCheckout"/>
    +            <magentoCLI command="config:set {{AdminFedexEnableSandboxModeConfigData.path}} {{AdminFedexEnableSandboxModeConfigData.value}}" stepKey="enableSandbox"/>
    +            <magentoCLI command="config:set {{AdminFedexEnableDebugConfigData.path}} {{AdminFedexEnableDebugConfigData.value}}" stepKey="enableDebug"/>
    +            <magentoCLI command="config:set {{AdminFedexEnableShowMethodConfigData.path}} {{AdminFedexEnableShowMethodConfigData.value}}" stepKey="enableShowMethod"/>
    +
    +            <!--Set StoreInformation configs data-->
    +            <actionGroup ref="AdminSetStoreInformationConfigurationActionGroup" stepKey="setStoreInformationConfigData">
    +                <argument name="telephone" value="{{DE_Address_Berlin_Not_Default_Address.telephone}}"/>
    +                <argument name="country" value="{{DE_Address_Berlin_Not_Default_Address.country_id}}"/>
    +                <argument name="state" value="{{DE_Address_Berlin_Not_Default_Address.state}}"/>
    +                <argument name="city" value="{{DE_Address_Berlin_Not_Default_Address.city}}"/>
    +                <argument name="postcode" value="{{DE_Address_Berlin_Not_Default_Address.postcode}}"/>
    +                <argument name="street" value="{{DE_Address_Berlin_Not_Default_Address.street[0]}}"/>
    +            </actionGroup>
    +
    +            <!--Set Shipping settings origin data-->
    +            <actionGroup ref="AdminSetShippingOriginConfigurationActionGroup" stepKey="setShippingOriginConfigurationData">
    +                <argument name="address" value="DE_Address_Berlin_Not_Default_Address"/>
    +            </actionGroup>
    +
    +            <!-- Create Simple Product -->
    +            <createData entity="defaultSimpleProduct" stepKey="createSimpleProduct">
    +                <field key="price">100</field>
    +            </createData>
    +            <!-- Create Cart Price Rule with 10% discount -->
    +            <createData entity="ApiSalesRule" stepKey="createCartPriceRule"/>
    +            <!-- Create Coupon code for the Cart Price Rule -->
    +            <createData entity="ApiSalesRuleCoupon" stepKey="createCartPriceRuleCoupon">
    +                <requiredEntity createDataKey="createCartPriceRule"/>
    +            </createData>
    +            <!-- Create Customer with filled Shipping & Billing Address -->
    +            <createData entity="CustomerEntityOne" stepKey="createCustomer"/>
    +        </before>
    +
    +        <after>
    +            <actionGroup ref="StorefrontCustomerLogoutActionGroup" stepKey="logoutFromStorefront"/>
    +            <deleteData createDataKey="createCustomer" stepKey="deleteCustomer"/>
    +            <deleteData createDataKey="createCartPriceRule" stepKey="deleteCartPriceRule"/>
    +            <deleteData createDataKey="createSimpleProduct" stepKey="deleteSimpleProduct"/>
    +            <magentoCLI command="config:set {{AdminFreeshippingMinimumOrderAmountConfigData.path}} {{AdminFreeshippingMinimumOrderAmountConfigData.default}}" stepKey="setFreeShippingMethodMinimumOrderAmountAsDefault" />
    +            <magentoCLI command="config:set {{AdminFreeshippingActiveConfigData.path}} {{AdminFreeshippingActiveConfigData.disabled}}" stepKey="disableFreeShippingMethod" />
    +            <!--Reset configs-->
    +            <magentoCLI command="config:set {{AdminFedexDisableForCheckoutConfigData.path}} {{AdminFedexDisableForCheckoutConfigData.value}}" stepKey="disableCheckout"/>
    +            <magentoCLI command="config:set {{AdminFedexDisableSandboxModeConfigData.path}} {{AdminFedexDisableSandboxModeConfigData.value}}" stepKey="disableSandbox"/>
    +            <magentoCLI command="config:set {{AdminFedexDisableDebugConfigData.path}} {{AdminFedexDisableDebugConfigData.value}}" stepKey="disableDebug"/>
    +            <magentoCLI command="config:set {{AdminFedexDisableShowMethodConfigData.path}} {{AdminFedexDisableShowMethodConfigData.value}}" stepKey="disableShowMethod"/>
    +            <actionGroup ref="AdminResetShippingOriginConfigurationActionGroup" stepKey="resetShippingOriginConfig"/>
    +            <actionGroup ref="AdminSetStoreInformationConfigurationActionGroup" stepKey="resetStoreInformationConfig">
    +                <argument name="storeName" value=""/>
    +                <argument name="storeHoursOfOperation" value=""/>
    +                <argument name="vatNumber" value=""/>
    +                <argument name="telephone" value=""/>
    +                <argument name="country" value=""/>
    +                <argument name="state" value=""/>
    +                <argument name="city" value=""/>
    +                <argument name="postcode" value=""/>
    +                <argument name="street" value=""/>
    +            </actionGroup>
    +            <actionGroup ref="logout" stepKey="logoutFromAdmin"/>
    +        </after>
    +
    +        <!-- Guest Customer Test Scenario -->
    +        <!-- Add Simple Product to Cart -->
    +        <actionGroup ref="StorefrontAddSimpleProductToShoppingCartActionGroup" stepKey="addProductToCart">
    +            <argument name="product" value="$createSimpleProduct$"/>
    +        </actionGroup>
    +
    +        <!-- Go to Checkout -->
    +        <actionGroup ref="GoToCheckoutFromMinicartActionGroup" stepKey="goToCheckout"/>
    +
    +        <!-- Fill all required fields -->
    +        <actionGroup ref="GuestCheckoutFillNewShippingAddressActionGroup" stepKey="fillNewShippingAddress">
    +            <argument name="customer" value="Simple_Customer_Without_Address" />
    +            <argument name="address" value="US_Address_TX"/>
    +        </actionGroup>
    +        <waitForLoadingMaskToDisappear stepKey="waitForFreeShippingMethodAppears"/>
    +        <!-- Select Free Shipping -->
    +        <actionGroup ref="StorefrontSetShippingMethodActionGroup" stepKey="setShippingMethodFreeShipping">
    +            <argument name="shippingMethodName" value="Free Shipping"/>
    +        </actionGroup>
    +
    +        <!-- Go to Order review -->
    +        <actionGroup ref="StorefrontCheckoutClickNextOnShippingStepActionGroup" stepKey="goToCheckoutReview"/>
    +
    +        <!-- Checkout select Check/Money Order payment -->
    +        <actionGroup ref="CheckoutSelectCheckMoneyOrderPaymentActionGroup" stepKey="selectCheckMoneyPayment"/>
    +        <!-- Select payment solution -->
    +        <checkOption selector="{{CheckoutPaymentSection.billingAddressNotSameCheckbox}}" stepKey="selectPaymentSolution" />
    +        <waitForElement selector="{{CheckoutPaymentSection.placeOrder}}" time="30" stepKey="waitForPlaceOrderButton"/>
    +
    +        <!-- Apply Discount Coupon to the Order -->
    +        <actionGroup ref="StorefrontApplyDiscountCodeActionGroup" stepKey="applyDiscountCoupon">
    +            <argument name="discountCode" value="$createCartPriceRuleCoupon.code$"/>
    +        </actionGroup>
    +
    +        <!-- Assert Shipping total is not yet calculated -->
    +        <actionGroup ref="AssertStorefrontNotCalculatedValueInShippingTotalInOrderSummaryActionGroup" stepKey="assertNotYetCalculated"/>
    +
    +        <!--  Assert order cannot be placed and error message will shown. -->
    +        <actionGroup ref="AssertStorefrontOrderIsNotPlacedActionGroup" stepKey="assertOrderCannotBePlaced">
    +            <argument name="error" value="The shipping method is missing. Select the shipping method and try again."/>
    +        </actionGroup>
    +
    +        <!-- Go to checkout page -->
    +        <actionGroup ref="OpenStoreFrontCheckoutShippingPageActionGroup" stepKey="openCheckoutShippingPage"/>
    +
    +        <!-- Chose flat rate -->
    +        <actionGroup ref="StorefrontSetShippingMethodActionGroup" stepKey="setShippingMethodFlatRate">
    +            <argument name="shippingMethodName" value="Flat Rate"/>
    +        </actionGroup>
    +
    +        <!-- Go to Order review -->
    +        <actionGroup ref="StorefrontCheckoutClickNextOnShippingStepActionGroup" stepKey="goToCheckoutOrderReview"/>
    +
    +        <!-- Place order assert succeed -->
    +        <actionGroup ref="ClickPlaceOrderActionGroup" stepKey="checkoutPlaceOrder"/>
    +
    +        <!-- Loged in Customer Test Scenario -->
    +        <!-- Login with created Customer -->
    +        <actionGroup ref="LoginToStorefrontActionGroup" stepKey="loginAsCustomer">
    +            <argument name="Customer" value="$createCustomer$"/>
    +        </actionGroup>
    +
    +        <!-- Add Simple Product to Cart -->
    +        <actionGroup ref="StorefrontAddSimpleProductToShoppingCartActionGroup" stepKey="addSimpleProductToCart">
    +            <argument name="product" value="$createSimpleProduct$"/>
    +        </actionGroup>
    +
    +        <!-- Go to Checkout -->
    +        <actionGroup ref="GoToCheckoutFromMinicartActionGroup" stepKey="proceedToCheckout"/>
    +        <waitForLoadingMaskToDisappear stepKey="waitForShippingMethodAppears"/>
    +        <!-- Select Free Shipping -->
    +        <actionGroup ref="StorefrontSetShippingMethodActionGroup" stepKey="selectFreeShippingMethod">
    +            <argument name="shippingMethodName" value="Free Shipping"/>
    +        </actionGroup>
    +
    +        <!-- Go to Order review -->
    +        <actionGroup ref="StorefrontCheckoutClickNextOnShippingStepActionGroup" stepKey="goToCheckoutPaymentPage"/>
    +
    +        <!-- Checkout select Check/Money Order payment -->
    +        <actionGroup ref="CheckoutSelectCheckMoneyOrderPaymentActionGroup" stepKey="selectCheckMoneyPaymentMethod"/>
    +
    +        <!-- Select payment solution -->
    +        <checkOption selector="{{CheckoutPaymentSection.billingAddressNotSameCheckbox}}" stepKey="checkBillingAddressNotSameCheckbox"/>
    +        <waitForElementVisible selector="{{CheckoutPaymentSection.placeOrder}}" time="30" stepKey="waitForPlaceOrderButtonVisible"/>
    +
    +        <!-- Apply Discount Coupon to the Order -->
    +        <actionGroup ref="StorefrontApplyDiscountCodeActionGroup" stepKey="applyDiscountCouponCode">
    +            <argument name="discountCode" value="$createCartPriceRuleCoupon.code$"/>
    +        </actionGroup>
    +
    +        <!-- Assert Shipping total is not yet calculated -->
    +        <actionGroup ref="AssertStorefrontNotCalculatedValueInShippingTotalInOrderSummaryActionGroup" stepKey="assertShippingTotalNotYetCalculated"/>
    +
    +        <!--  Assert order cannot be placed and error message will shown. -->
    +        <actionGroup ref="AssertStorefrontOrderIsNotPlacedActionGroup" stepKey="assertOrderIsNotPlaced">
    +            <argument name="error" value="The shipping method is missing. Select the shipping method and try again."/>
    +        </actionGroup>
    +
    +        <!-- Go to checkout page -->
    +        <actionGroup ref="OpenStoreFrontCheckoutShippingPageActionGroup" stepKey="goToCheckoutShippingPage"/>
    +
    +        <!-- Chose flat rate -->
    +        <actionGroup ref="StorefrontSetShippingMethodActionGroup" stepKey="selectFlatRateShippingMethod">
    +            <argument name="shippingMethodName" value="Flat Rate"/>
    +        </actionGroup>
    +
    +        <!-- Go to Order review -->
    +        <actionGroup ref="StorefrontCheckoutClickNextOnShippingStepActionGroup" stepKey="goToCheckoutPaymentStep"/>
    +
    +        <!-- Place order assert succeed -->
    +        <actionGroup ref="ClickPlaceOrderActionGroup" stepKey="placeOrder"/>
    +    </test>
    +</tests>
    
  • app/code/Magento/Checkout/Test/Unit/Controller/Sidebar/RemoveItemTest.php+46 0 modified
    @@ -234,6 +234,52 @@ public function testExecuteWithException()
             $this->assertEquals('json represented', $this->removeItem->execute());
         }
     
    +    /**
    +     * Test controller when DB exception is thrown.
    +     *
    +     * @return void
    +     */
    +    public function testExecuteWithDbException(): void
    +    {
    +        $itemId = 1;
    +        $dbError = 'Error';
    +        $message = __('An unspecified error occurred. Please contact us for assistance.');
    +        $response = [
    +            'success' => false,
    +            'error_message' => $message,
    +        ];
    +
    +        $this->getPropertyValue($this->removeItem, 'formKeyValidator')
    +            ->expects($this->once())
    +            ->method('validate')
    +            ->with($this->requestMock)
    +            ->willReturn(true);
    +        $this->requestMock->expects($this->once())->method('getParam')->with('item_id')->willReturn($itemId);
    +
    +        $exception = new \Zend_Db_Exception($dbError);
    +
    +        $this->sidebarMock->expects($this->once())
    +            ->method('checkQuoteItem')
    +            ->with($itemId)
    +            ->willThrowException($exception);
    +
    +        $this->loggerMock->expects($this->once())->method('critical')->with($exception);
    +
    +        $this->sidebarMock->expects($this->once())->method('getResponseData')->with($message)->willReturn($response);
    +        $encodedResponse = json_encode($response);
    +        $this->jsonHelperMock->expects($this->once())
    +            ->method('jsonEncode')
    +            ->with($response)
    +            ->willReturn($encodedResponse);
    +
    +        $this->responseMock->expects($this->once())
    +            ->method('representJson')
    +            ->with($encodedResponse)
    +            ->willReturn($this->responseMock);
    +
    +        $this->removeItem->execute();
    +    }
    +
         public function testExecuteWhenFormKeyValidationFailed()
         {
             $resultRedirect = $this->createMock(\Magento\Framework\Controller\Result\Redirect::class);
    
  • app/code/Magento/Cms/Api/Data/PageInterface.php+4 4 modified
    @@ -125,7 +125,7 @@ public function getSortOrder();
          * Get layout update xml
          *
          * @return string|null
    -     * @deprecated Existing updates are applied, new are not accepted.
    +     * @deprecated 103.0.4 Existing updates are applied, new are not accepted.
          */
         public function getLayoutUpdateXml();
     
    @@ -146,7 +146,7 @@ public function getCustomRootTemplate();
         /**
          * Get custom layout update xml
          *
    -     * @deprecated Existing updates are applied, new are not accepted.
    +     * @deprecated 103.0.4 Existing updates are applied, new are not accepted.
          * @see \Magento\Cms\Model\Page\CustomLayout\Data\CustomLayoutSelectedInterface
          * @return string|null
          */
    @@ -275,7 +275,7 @@ public function setSortOrder($sortOrder);
          *
          * @param string $layoutUpdateXml
          * @return \Magento\Cms\Api\Data\PageInterface
    -     * @deprecated Existing updates are applied, new are not accepted.
    +     * @deprecated 103.0.4 Existing updates are applied, new are not accepted.
          */
         public function setLayoutUpdateXml($layoutUpdateXml);
     
    @@ -300,7 +300,7 @@ public function setCustomRootTemplate($customRootTemplate);
          *
          * @param string $customLayoutUpdateXml
          * @return \Magento\Cms\Api\Data\PageInterface
    -     * @deprecated Existing updates are applied, new are not accepted.
    +     * @deprecated 103.0.4 Existing updates are applied, new are not accepted.
          * @see \Magento\Cms\Model\Page\CustomLayout\Data\CustomLayoutSelectedInterface
          */
         public function setCustomLayoutUpdateXml($customLayoutUpdateXml);
    
  • app/code/Magento/Cms/composer.json+13 12 modified
    @@ -6,19 +6,19 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-email": "*",
    -        "magento/module-media-storage": "*",
    -        "magento/module-store": "*",
    -        "magento/module-theme": "*",
    -        "magento/module-ui": "*",
    -        "magento/module-variable": "*",
    -        "magento/module-widget": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-email": "101.0.*",
    +        "magento/module-media-storage": "100.3.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-theme": "101.0.*",
    +        "magento/module-ui": "101.1.*",
    +        "magento/module-variable": "100.3.*",
    +        "magento/module-widget": "101.1.*"
         },
         "suggest": {
    -        "magento/module-cms-sample-data": "*"
    +        "magento/module-cms-sample-data": "Sample Data version: 100.3.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -32,5 +32,6 @@
             "psr-4": {
                 "Magento\\Cms\\": ""
             }
    -    }
    +    },
    +    "version": "103.0.4-p2"
     }
    
  • app/code/Magento/Cms/Controller/Adminhtml/Page/PostDataProcessor.php+1 1 modified
    @@ -79,7 +79,7 @@ public function filter($data)
          *
          * @param array $data
          * @return bool     Return FALSE if some item is invalid
    -     * @deprecated 103.0.3
    +     * @deprecated 103.0.2
          */
         public function validate($data)
         {
    
  • app/code/Magento/CmsGraphQl/composer.json+8 7 modified
    @@ -4,14 +4,14 @@
         "type": "magento2-module",
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-cms": "*",
    -        "magento/module-widget": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-cms": "103.0.*",
    +        "magento/module-widget": "101.1.*"
         },
         "suggest": {
    -        "magento/module-graph-ql": "*",
    -        "magento/module-graph-ql-cache": "*",
    -        "magento/module-store-graph-ql": "*"
    +        "magento/module-graph-ql": "100.3.*",
    +        "magento/module-graph-ql-cache": "100.3.*",
    +        "magento/module-store-graph-ql": "100.3.*"
         },
         "license": [
             "OSL-3.0",
    @@ -24,5 +24,6 @@
             "psr-4": {
                 "Magento\\CmsGraphQl\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/Cms/Model/Template/Filter.php+2 4 modified
    @@ -5,8 +5,6 @@
      */
     namespace Magento\Cms\Model\Template;
     
    -use Magento\Framework\Exception\LocalizedException;
    -
     /**
      * Cms Template Filter Model
      */
    @@ -41,8 +39,8 @@ public function mediaDirective($construction)
         {
             // phpcs:ignore Magento2.Functions.DiscouragedFunction
             $params = $this->getParameters(html_entity_decode($construction[2], ENT_QUOTES));
    -        if (preg_match('/\.\.(\\\|\/)/', $params['url'])) {
    -            throw new \InvalidArgumentException('Image path must be absolute');
    +        if (preg_match('/(^.*:\/\/.*|\.\.\/.*)/', $params['url'])) {
    +            throw new \InvalidArgumentException('Image path must be absolute and not include URLs');
             }
     
             return $this->_storeManager->getStore()->getBaseMediaDir() . '/' . $params['url'];
    
  • app/code/Magento/Cms/Test/Unit/Model/Template/FilterTest.php+20 0 modified
    @@ -105,4 +105,24 @@ public function testMediaDirectiveRelativePath()
                 ->willReturn($baseMediaDir);
             $this->filter->mediaDirective($construction);
         }
    +
    +    /**
    +     * Test using media directive with a URL path including schema.
    +     *
    +     * @covers \Magento\Cms\Model\Template\Filter::mediaDirective
    +     * @expectedException \InvalidArgumentException
    +     */
    +    public function testMediaDirectiveURL()
    +    {
    +        $baseMediaDir = 'pub/media';
    +        $construction = [
    +            '{{media url="http://wysiwyg/images/image.jpg"}}',
    +            'media',
    +            ' url="http://wysiwyg/images/../image.jpg"'
    +        ];
    +        $this->storeMock->expects($this->any())
    +            ->method('getBaseMediaDir')
    +            ->willReturn($baseMediaDir);
    +        $this->filter->mediaDirective($construction);
    +    }
     }
    
  • app/code/Magento/CmsUrlRewrite/composer.json+6 5 modified
    @@ -6,10 +6,10 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-cms": "*",
    -        "magento/module-store": "*",
    -        "magento/module-url-rewrite": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-cms": "103.0.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-url-rewrite": "101.1.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -23,5 +23,6 @@
             "psr-4": {
                 "Magento\\CmsUrlRewrite\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/CmsUrlRewriteGraphQl/composer.json+8 7 modified
    @@ -4,14 +4,14 @@
         "type": "magento2-module",
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-cms": "*",
    -        "magento/module-store": "*",
    -        "magento/module-url-rewrite-graph-ql": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-cms": "103.0.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-url-rewrite-graph-ql": "100.3.*"
         },
         "suggest": {
    -        "magento/module-cms-url-rewrite": "*",
    -        "magento/module-catalog-graph-ql": "*"
    +        "magento/module-cms-url-rewrite": "100.3.*",
    +        "magento/module-catalog-graph-ql": "100.3.*"
         },
         "license": [
             "OSL-3.0",
    @@ -24,5 +24,6 @@
             "psr-4": {
                 "Magento\\CmsUrlRewriteGraphQl\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/Config/composer.json+10 9 modified
    @@ -6,14 +6,14 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-cron": "*",
    -        "magento/module-deploy": "*",
    -        "magento/module-directory": "*",
    -        "magento/module-email": "*",
    -        "magento/module-media-storage": "*",
    -        "magento/module-store": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-cron": "100.3.*",
    +        "magento/module-deploy": "100.3.*",
    +        "magento/module-directory": "100.3.*",
    +        "magento/module-email": "101.0.*",
    +        "magento/module-media-storage": "100.3.*",
    +        "magento/module-store": "101.0.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -27,5 +27,6 @@
             "psr-4": {
                 "Magento\\Config\\": ""
             }
    -    }
    +    },
    +    "version": "101.1.4-p2"
     }
    
  • app/code/Magento/ConfigurableImportExport/composer.json+9 8 modified
    @@ -6,13 +6,13 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-catalog-import-export": "*",
    -        "magento/module-configurable-product": "*",
    -        "magento/module-eav": "*",
    -        "magento/module-import-export": "*",
    -        "magento/module-store": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-catalog-import-export": "101.0.*",
    +        "magento/module-configurable-product": "100.3.*",
    +        "magento/module-eav": "102.0.*",
    +        "magento/module-import-export": "100.3.*",
    +        "magento/module-store": "101.0.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -26,5 +26,6 @@
             "psr-4": {
                 "Magento\\ConfigurableImportExport\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/ConfigurableProduct/composer.json+21 20 modified
    @@ -6,27 +6,27 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-catalog-inventory": "*",
    -        "magento/module-checkout": "*",
    -        "magento/module-customer": "*",
    -        "magento/module-eav": "*",
    -        "magento/module-media-storage": "*",
    -        "magento/module-quote": "*",
    -        "magento/module-store": "*",
    -        "magento/module-ui": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-catalog-inventory": "100.3.*",
    +        "magento/module-checkout": "100.3.*",
    +        "magento/module-customer": "102.0.*",
    +        "magento/module-eav": "102.0.*",
    +        "magento/module-media-storage": "100.3.*",
    +        "magento/module-quote": "101.1.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-ui": "101.1.*"
         },
         "suggest": {
    -        "magento/module-msrp": "*",
    -        "magento/module-webapi": "*",
    -        "magento/module-sales": "*",
    -        "magento/module-sales-rule": "*",
    -        "magento/module-product-video": "*",
    -        "magento/module-configurable-sample-data": "*",
    -        "magento/module-product-links-sample-data": "*",
    -        "magento/module-tax": "*"
    +        "magento/module-msrp": "100.3.*",
    +        "magento/module-webapi": "100.3.*",
    +        "magento/module-sales": "102.0.*",
    +        "magento/module-sales-rule": "101.1.*",
    +        "magento/module-product-video": "100.3.*",
    +        "magento/module-configurable-sample-data": "Sample Data version: 100.3.*",
    +        "magento/module-product-links-sample-data": "Sample Data version: 100.3.*",
    +        "magento/module-tax": "100.3.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -40,5 +40,6 @@
             "psr-4": {
                 "Magento\\ConfigurableProduct\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4-p2"
     }
    
  • app/code/Magento/ConfigurableProductGraphQl/composer.json+8 7 modified
    @@ -4,12 +4,12 @@
         "type": "magento2-module",
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/module-catalog": "*",
    -        "magento/module-configurable-product": "*",
    -        "magento/module-catalog-graph-ql": "*",
    -        "magento/module-quote": "*",
    -        "magento/module-quote-graph-ql": "*",
    -        "magento/framework": "*"
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-configurable-product": "100.3.*",
    +        "magento/module-catalog-graph-ql": "100.3.*",
    +        "magento/module-quote": "101.1.*",
    +        "magento/module-quote-graph-ql": "100.3.*",
    +        "magento/framework": "102.0.*"
         },
         "license": [
             "OSL-3.0",
    @@ -22,5 +22,6 @@
             "psr-4": {
                 "Magento\\ConfigurableProductGraphQl\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/ConfigurableProductSales/composer.json+7 6 modified
    @@ -6,13 +6,13 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-sales": "*",
    -        "magento/module-store": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-sales": "102.0.*",
    +        "magento/module-store": "101.0.*"
         },
         "suggest": {
    -        "magento/module-configurable-product": "*"
    +        "magento/module-configurable-product": "100.3.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -26,5 +26,6 @@
             "psr-4": {
                 "Magento\\ConfigurableProductSales\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminAddDefaultImageConfigurableTest.xml+3 0 modified
    @@ -89,6 +89,9 @@
                 <deleteData createDataKey="baseConfigProductHandle" stepKey="deleteConfig"/>
                 <deleteData createDataKey="categoryHandle" stepKey="deleteCategory"/>
                 <deleteData createDataKey="productAttributeHandle" stepKey="deleteProductAttribute"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <amOnPage url="{{AdminProductIndexPage.url}}" stepKey="productIndexPage"/>
    
  • app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminCheckConfigurableProductAttributeValueUniquenessTest.xml+3 0 modified
    @@ -34,6 +34,9 @@
                 <deleteData createDataKey="createCategory" stepKey="deleteCategory"/>
                 <deleteData createDataKey="createProductAttribute" stepKey="deleteAttribute"/>
                 <actionGroup ref="logout" stepKey="logOut"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
             <!--Create configurable product-->
             <comment userInput="Create configurable product" stepKey="createConfProd"/>
    
  • app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminCheckResultsOfColorAndOtherFiltersTest.xml+3 0 modified
    @@ -109,6 +109,9 @@
                 <actionGroup ref="AdminClearFiltersActionGroup" stepKey="clearProductsGridFilter"/>
                 <!-- Log out -->
                 <actionGroup ref="logout" stepKey="logout"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
             <!-- Create three configurable products with options -->
             <amOnPage url="{{AdminProductIndexPage.url}}" stepKey="amOnProductGridPage"/>
    
  • app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminCheckValidatorConfigurableProductTest.xml+3 0 modified
    @@ -44,6 +44,9 @@
                     <argument name="ProductAttribute" value="productDropDownAttribute"/>
                 </actionGroup>
                 <actionGroup ref="logout" stepKey="logout"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!-- Find the product that we just created using the product grid -->
    
  • app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminConfigurableProductDeleteTest.xml+6 0 modified
    @@ -70,6 +70,9 @@
                 <deleteData createDataKey="createConfigChildProduct1" stepKey="deleteConfigChildProduct1"/>
                 <deleteData createDataKey="createConfigChildProduct2" stepKey="deleteConfigChildProduct2"/>
                 <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!-- assert product visible in storefront -->
    @@ -225,6 +228,9 @@
                 <deleteData createDataKey="createConfigChildProduct6" stepKey="deleteConfigChildProduct6"/>
                 <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/>
                 <deleteData createDataKey="createCategory" stepKey="deleteCategory"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!-- Search for prefix of the 3 products we created via api -->
    
  • app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminConfigurableProductLongSkuTest.xml+3 0 modified
    @@ -53,6 +53,9 @@
                 <!--Clean up category-->
                 <deleteData createDataKey="createCategory" stepKey="deleteCategory"/>
                 <actionGroup ref="logout" stepKey="adminLogout"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
              <!--Create a configurable product with long name and sku-->
    
  • app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminConfigurableProductOutOfStockTest.xml+9 0 modified
    @@ -83,6 +83,9 @@
                 <deleteData createDataKey="createConfigChildProduct1" stepKey="deleteConfigChildProduct1"/>
                 <deleteData createDataKey="createConfigChildProduct2" stepKey="deleteConfigChildProduct2"/>
                 <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!-- Check to make sure that the configurable product shows up as in stock -->
    @@ -204,6 +207,9 @@
                 <deleteData createDataKey="createCategory" stepKey="deleteCategory"/>
                 <deleteData createDataKey="createConfigProduct" stepKey="deleteConfigProduct"/>
                 <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!-- Check to make sure that the configurable product shows up as in stock -->
    @@ -306,6 +312,9 @@
                 <deleteData createDataKey="createConfigProduct" stepKey="deleteConfigProduct"/>
                 <deleteData createDataKey="createConfigChildProduct2" stepKey="deleteConfigChildProduct2"/>
                 <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!-- Check to make sure that the configurable product shows up as in stock -->
    
  • app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminConfigurableProductSearchTest.xml+6 0 modified
    @@ -73,6 +73,9 @@
                 <deleteData createDataKey="createConfigChildProduct1" stepKey="deleteConfigChildProduct1"/>
                 <deleteData createDataKey="createConfigChildProduct2" stepKey="deleteConfigChildProduct2"/>
                 <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <amOnPage url="{{AdminProductIndexPage.url}}" stepKey="goToProductList"/>
    @@ -152,6 +155,9 @@
                 <deleteData createDataKey="createConfigChildProduct1" stepKey="deleteConfigChildProduct1"/>
                 <deleteData createDataKey="createConfigChildProduct2" stepKey="deleteConfigChildProduct2"/>
                 <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <amOnPage url="{{AdminProductIndexPage.url}}" stepKey="goToProductList"/>
    
  • app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminConfigurableProductUpdateAttributeTest.xml+6 0 modified
    @@ -105,6 +105,9 @@
                 <deleteData createDataKey="createConfigChildProduct2" stepKey="deleteConfigChildProduct2"/>
                 <deleteData createDataKey="createModifiableProductAttribute" stepKey="deleteModifiableProductAttribute"/>
                 <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!-- Get the current option of the attribute before it was changed -->
    @@ -221,6 +224,9 @@
                 <deleteData createDataKey="createConfigChildProduct1" stepKey="deleteConfigChildProduct1"/>
                 <deleteData createDataKey="createConfigChildProduct2" stepKey="deleteConfigChildProduct2"/>
                 <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!-- Find the product that we just created using the product grid -->
    
  • app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminConfigurableProductUpdateTest.xml+6 0 modified
    @@ -145,6 +145,9 @@
                 <deleteData createDataKey="createConfigChildProduct2" stepKey="deleteConfigChildProduct2"/>
                 <deleteData createDataKey="createConfigProduct" stepKey="deleteConfigProduct"/>
                 <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/>
    +            <actionGroup ref="logout" stepKey="logout"/>
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!--check storefront for both options-->
    @@ -238,6 +241,9 @@
                 <deleteData createDataKey="createConfigChildProduct2" stepKey="deleteConfigChildProduct2"/>
                 <deleteData createDataKey="createConfigProduct" stepKey="deleteConfigProduct"/>
                 <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!--check storefront for both options-->
    
  • app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminCreateConfigurableProductWithDisabledChildrenProductsTest.xml+3 0 modified
    @@ -54,6 +54,9 @@
     
                 <!-- Log out -->
                 <actionGroup ref="logout" stepKey="logout"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!-- Create configurable product -->
    
  • app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminCreateConfigurableProductWithImagesTest.xml+3 0 modified
    @@ -57,6 +57,9 @@
     
                 <!-- Log out -->
                 <actionGroup ref="logout" stepKey="logout"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!--Create configurable product -->
    
  • app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminCreateConfigurableProductWithThreeProductDisplayOutOfStockProductsTest.xml+4 1 modified
    @@ -77,6 +77,9 @@
     
                 <!-- Log out -->
                 <actionGroup ref="logout" stepKey="logout"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!--Create configurable product -->
    @@ -137,4 +140,4 @@
             <waitForPageLoad stepKey="waitForProductPageLoad"/>
             <see userInput="$$createConfigProductAttributeOptionThree.option[store_labels][1][label]$$" selector="{{StorefrontProductInfoMainSection.optionByAttributeId($$createConfigProductAttribute.attribute_id$$)}}" stepKey="assertOptionNotAvailable" />
         </test>
    -</tests>
    \ No newline at end of file
    +</tests>
    
  • app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminCreateConfigurableProductWithThreeProductDontDisplayOutOfStockProductsTest.xml+4 1 modified
    @@ -74,6 +74,9 @@
     
                 <!-- Log out -->
                 <actionGroup ref="logout" stepKey="logout"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!--Create configurable product -->
    @@ -131,4 +134,4 @@
             <waitForPageLoad stepKey="waitForPageLoad"/>
             <dontSee userInput="$$createConfigProductAttributeOptionThree.option[store_labels][1][label]$$" selector="{{StorefrontProductInfoMainSection.optionByAttributeId($$createConfigProductAttribute.attribute_id$$)}}" stepKey="assertOptionNotAvailable"/>
         </test>
    -</tests>
    \ No newline at end of file
    +</tests>
    
  • app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminCreateConfigurableProductWithTierPriceForOneItemTest.xml+3 0 modified
    @@ -65,6 +65,9 @@
     
                 <!-- Log out -->
                 <actionGroup ref="logout" stepKey="logout"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!--Create configurable product -->
    
  • app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminProductTypeSwitchingOnEditingTest.xml+6 0 modified
    @@ -44,6 +44,9 @@
                 </actionGroup>
                 <actionGroup ref="AdminClearFiltersActionGroup" stepKey="clearProductFilters"/>
                 <actionGroup ref="logout" stepKey="logout"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
             <!--Add configurations to product-->
             <comment userInput="Add configurations to product" stepKey="commentAddConfigs"/>
    @@ -148,6 +151,9 @@
                 </actionGroup>
                 <actionGroup ref="AdminClearFiltersActionGroup" stepKey="clearProductFilters"/>
                 <actionGroup ref="logout" stepKey="logout"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
             <!--Add configurations to product-->
             <comment userInput="Add configurations to product" stepKey="commentAddConfigurations"/>
    
  • app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminRelatedProductsTest.xml+3 0 modified
    @@ -89,6 +89,9 @@
                 <deleteData createDataKey="baseConfigProductHandle" stepKey="deleteConfig"/>
                 <deleteData createDataKey="categoryHandle" stepKey="deleteCategory"/>
                 <deleteData createDataKey="productAttributeHandle" stepKey="deleteProductAttribute"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <comment userInput="Filter and edit simple product 1" stepKey="filterAndEditComment1"/>
    
  • app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminRemoveDefaultImageConfigurableTest.xml+2 0 modified
    @@ -89,6 +89,8 @@
                 <deleteData createDataKey="baseConfigProductHandle" stepKey="deleteConfig"/>
                 <deleteData createDataKey="categoryHandle" stepKey="deleteCategory"/>
                 <deleteData createDataKey="productAttributeHandle" stepKey="deleteProductAttribute"/>
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <amOnPage url="{{AdminProductIndexPage.url}}" stepKey="productIndexPage"/>
    
  • app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdvanceCatalogSearchConfigurableTest.xml+16 0 modified
    @@ -82,6 +82,10 @@
                 <deleteData createDataKey="simple2Handle" stepKey="deleteSimple2" before="delete"/>
                 <deleteData createDataKey="childProductHandle1" stepKey="deleteChildProduct1" before="delete"/>
                 <deleteData createDataKey="childProductHandle2" stepKey="deleteChildProduct2" before="delete"/>
    +            <deleteData createDataKey="productAttributeHandle" stepKey="deleteProductDropDownAttribute"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
         </test>
         <test name="AdvanceCatalogSearchConfigurableBySkuTest" extends="AdvanceCatalogSearchSimpleProductBySkuTest">
    @@ -158,6 +162,10 @@
                 <deleteData createDataKey="simple2Handle" stepKey="deleteSimple2" before="delete"/>
                 <deleteData createDataKey="childProductHandle1" stepKey="deleteChildProduct1" before="delete"/>
                 <deleteData createDataKey="childProductHandle2" stepKey="deleteChildProduct2" before="delete"/>
    +            <deleteData createDataKey="productAttributeHandle" stepKey="deleteProductDropDownAttribute"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
         </test>
         <test name="AdvanceCatalogSearchConfigurableByDescriptionTest" extends="AdvanceCatalogSearchSimpleProductByDescriptionTest">
    @@ -234,6 +242,10 @@
                 <deleteData createDataKey="simple2Handle" stepKey="deleteSimple2" before="delete"/>
                 <deleteData createDataKey="childProductHandle1" stepKey="deleteChildProduct1" before="delete"/>
                 <deleteData createDataKey="childProductHandle2" stepKey="deleteChildProduct2" before="delete"/>
    +            <deleteData createDataKey="productAttributeHandle" stepKey="deleteProductDropDownAttribute"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
         </test>
         <test name="AdvanceCatalogSearchConfigurableByShortDescriptionTest" extends="AdvanceCatalogSearchSimpleProductByShortDescriptionTest">
    @@ -310,6 +322,10 @@
                 <deleteData createDataKey="simple2Handle" stepKey="deleteSimple2" before="delete"/>
                 <deleteData createDataKey="childProductHandle1" stepKey="deleteChildProduct1" before="delete"/>
                 <deleteData createDataKey="childProductHandle2" stepKey="deleteChildProduct2" before="delete"/>
    +            <deleteData createDataKey="productAttributeHandle" stepKey="deleteProductDropDownAttribute"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
         </test>
     </tests>
    
  • app/code/Magento/ConfigurableProduct/Test/Mftf/Test/ConfigurableProductPriceAdditionalStoreViewTest.xml+2 0 modified
    @@ -78,6 +78,8 @@
                     <argument name="websiteName" value="Second Website"/>
                 </actionGroup>
                 <actionGroup ref="logout" stepKey="adminLogout"/>
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <actionGroup ref="EnableWebUrlOptions" stepKey="addStoreCodeToUrls"/>
    
  • app/code/Magento/ConfigurableProduct/Test/Mftf/Test/EndToEndB2CGuestUserTest.xml+6 0 modified
    @@ -73,6 +73,9 @@
                 <!--<deleteData createDataKey="createConfigProductImage" stepKey="deleteConfigProductImage"/>-->
                 <deleteData createDataKey="createConfigProduct" stepKey="deleteConfigProduct"/>
                 <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!-- Verify Configurable Product in checkout cart items -->
    @@ -282,6 +285,9 @@
                 <!--<deleteData createDataKey="createConfigProductImage" stepKey="deleteConfigProductImage"/>-->
                 <deleteData createDataKey="createConfigProduct" stepKey="deleteConfigProduct"/>
                 <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!-- Verify Configurable Product in checkout cart items -->
    
  • app/code/Magento/ConfigurableProduct/Test/Mftf/Test/EndToEndB2CLoggedInUserTest.xml+3 0 modified
    @@ -73,6 +73,9 @@
                 <!--<deleteData createDataKey="createConfigProductImage" stepKey="deleteConfigProductImage"/>-->
                 <deleteData createDataKey="createConfigProduct" stepKey="deleteConfigProduct"/>
                 <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!-- Verify Configurable Product in checkout cart items -->
    
  • app/code/Magento/ConfigurableProduct/Test/Mftf/Test/NewProductsListWidgetConfigurableProductTest.xml+4 1 modified
    @@ -70,6 +70,9 @@
                 <deleteData createDataKey="createConfigChildProduct2" stepKey="deleteConfigChildProduct2"/>
                 <deleteData createDataKey="createConfigProduct" stepKey="deleteConfigProduct"/>
                 <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!-- A Cms page containing the New Products Widget gets created here via extends -->
    @@ -88,4 +91,4 @@
             <waitForPageLoad stepKey="waitForCmsPage"/>
             <see selector="{{StorefrontCategoryMainSection.ProductItemInfo}}" userInput="$$createConfigProduct.name$$" stepKey="seeProductName"/>
         </test>
    -</tests>
    \ No newline at end of file
    +</tests>
    
  • app/code/Magento/ConfigurableProduct/Test/Mftf/Test/NoOptionAvailableToConfigureDisabledProductTest.xml+3 0 modified
    @@ -103,6 +103,9 @@
                 <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/>
                 <deleteData createDataKey="createCustomer" stepKey="deleteCreatedCustomer"/>
                 <actionGroup ref="logout" stepKey="logout"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
             <!-- Disable child product -->
             <comment userInput="Disable child product" stepKey="disableChildProduct"/>
    
  • app/code/Magento/ConfigurableProduct/Test/Mftf/Test/StorefrontAdvanceCatalogSearchConfigurableBySkuWithHyphenTest.xml+4 0 modified
    @@ -83,6 +83,10 @@
                 <deleteData createDataKey="simple2Handle" stepKey="deleteSimple2" before="delete"/>
                 <deleteData createDataKey="childProductHandle1" stepKey="deleteChildProduct1" before="delete"/>
                 <deleteData createDataKey="childProductHandle2" stepKey="deleteChildProduct2" before="delete"/>
    +            <deleteData createDataKey="productAttributeHandle" stepKey="deleteProductDropDownAttribute"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
         </test>
     </tests>
    
  • app/code/Magento/ConfigurableProduct/Test/Mftf/Test/StorefrontConfigurableProductCategoryViewChildOnlyTest.xml+3 0 modified
    @@ -95,6 +95,9 @@
                 <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/>
                 <deleteData createDataKey="createCategory" stepKey="deleteApiCategory"/>
                 <deleteData createDataKey="secondCategory" stepKey="deleteSecondCategory"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <actionGroup ref="LoginAsAdmin" stepKey="login"/>
    
  • app/code/Magento/ConfigurableProduct/Test/Mftf/Test/StorefrontConfigurableProductChildSearchTest.xml+4 1 modified
    @@ -140,6 +140,9 @@
                 <deleteData createDataKey="createConfigProductAttributeMultiSelect" stepKey="deleteConfigProductAttributeMultiSelect"/>
                 <deleteData createDataKey="createConfigProductAttributeSelect" stepKey="deleteConfigProductAttributeSelect"/>
                 <deleteData createDataKey="createCategory" stepKey="deleteApiCategory"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!-- Quick search the storefront for the first attribute option -->
    @@ -156,4 +159,4 @@
             <submitForm selector="#search_mini_form" parameterArray="['q' => $$createConfigChildProduct1.custom_attributes[short_description]$$]" stepKey="searchStorefront3" />
             <seeElement stepKey="seeProduct3" selector="{{StorefrontCategoryProductSection.ProductTitleByName('$$createConfigProduct.name$$')}}"/>
         </test>
    -</tests>
    \ No newline at end of file
    +</tests>
    
  • app/code/Magento/ConfigurableProduct/Test/Mftf/Test/StorefrontConfigurableProductDetailsTest.xml+3 0 modified
    @@ -36,6 +36,9 @@
                 </actionGroup>
                 <actionGroup ref="clearFiltersAdminDataGrid" stepKey="clearProductsGridFilters"/>
                 <actionGroup ref="logout" stepKey="adminLogout"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!-- Verify configurable product details in storefront product view -->
    
  • app/code/Magento/ConfigurableProduct/Test/Mftf/Test/StorefrontSortingByPriceForConfigurableWithCatalogRuleAppliedTest.xml+3 0 modified
    @@ -117,6 +117,9 @@
                     <argument name="option" value="No"/>
                 </actionGroup>
                 <actionGroup ref="logout" stepKey="logoutFromAdmin"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!--Open category with products and Sort by price desc-->
    
  • app/code/Magento/ConfigurableProduct/Test/Mftf/Test/StorefrontVerifyConfigurableProductLayeredNavigationTest.xml+3 0 modified
    @@ -117,6 +117,9 @@
                 <deleteData createDataKey="createConfigChildProduct3" stepKey="deleteConfigChildProduct3"/>
                 <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteAttribute"/>
                 <actionGroup ref="logout" stepKey="logout"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!-- Open Product Index Page and Filter First Child product -->
    
  • app/code/Magento/Contact/composer.json+7 6 modified
    @@ -6,11 +6,11 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-cms": "*",
    -        "magento/module-config": "*",
    -        "magento/module-customer": "*",
    -        "magento/module-store": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-cms": "103.0.*",
    +        "magento/module-config": "101.1.*",
    +        "magento/module-customer": "102.0.*",
    +        "magento/module-store": "101.0.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -24,5 +24,6 @@
             "psr-4": {
                 "Magento\\Contact\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/Cookie/composer.json+5 4 modified
    @@ -6,11 +6,11 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-store": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-store": "101.0.*"
         },
         "suggest": {
    -        "magento/module-backend": "*"
    +        "magento/module-backend": "101.0.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -24,5 +24,6 @@
             "psr-4": {
                 "Magento\\Cookie\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/Cron/composer.json+5 4 modified
    @@ -6,11 +6,11 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-store": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-store": "101.0.*"
         },
         "suggest": {
    -        "magento/module-config": "*"
    +        "magento/module-config": "101.1.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -24,5 +24,6 @@
             "psr-4": {
                 "Magento\\Cron\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4-p2"
     }
    
  • app/code/Magento/CurrencySymbol/composer.json+8 7 modified
    @@ -6,12 +6,12 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-config": "*",
    -        "magento/module-directory": "*",
    -        "magento/module-page-cache": "*",
    -        "magento/module-store": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-config": "101.1.*",
    +        "magento/module-directory": "100.3.*",
    +        "magento/module-page-cache": "100.3.*",
    +        "magento/module-store": "101.0.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -25,5 +25,6 @@
             "psr-4": {
                 "Magento\\CurrencySymbol\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/CustomerAnalytics/composer.json+5 4 modified
    @@ -3,9 +3,9 @@
         "description": "N/A",
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-customer": "*",
    -        "magento/module-analytics": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-customer": "102.0.*",
    +        "magento/module-analytics": "100.3.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -19,5 +19,6 @@
             "psr-4": {
                 "Magento\\CustomerAnalytics\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/Customer/Api/SessionCleanerInterface.php+22 0 added
    @@ -0,0 +1,22 @@
    +<?php
    +/**
    + * Copyright © Magento, Inc. All rights reserved.
    + * See COPYING.txt for license details.
    + */
    +declare(strict_types=1);
    +
    +namespace Magento\Customer\Api;
    +
    +/**
    + * Interface for cleaning customer session data.
    + */
    +interface SessionCleanerInterface
    +{
    +    /**
    +     * Destroy all active customer sessions related to given customer id, including current session.
    +     *
    +     * @param int $customerId
    +     * @return void
    +     */
    +    public function clearFor(int $customerId): void;
    +}
    
  • app/code/Magento/Customer/composer.json+24 23 modified
    @@ -6,30 +6,30 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-authorization": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-checkout": "*",
    -        "magento/module-config": "*",
    -        "magento/module-directory": "*",
    -        "magento/module-eav": "*",
    -        "magento/module-integration": "*",
    -        "magento/module-media-storage": "*",
    -        "magento/module-newsletter": "*",
    -        "magento/module-page-cache": "*",
    -        "magento/module-quote": "*",
    -        "magento/module-review": "*",
    -        "magento/module-sales": "*",
    -        "magento/module-store": "*",
    -        "magento/module-tax": "*",
    -        "magento/module-theme": "*",
    -        "magento/module-ui": "*",
    -        "magento/module-wishlist": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-authorization": "100.3.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-checkout": "100.3.*",
    +        "magento/module-config": "101.1.*",
    +        "magento/module-directory": "100.3.*",
    +        "magento/module-eav": "102.0.*",
    +        "magento/module-integration": "100.3.*",
    +        "magento/module-media-storage": "100.3.*",
    +        "magento/module-newsletter": "100.3.*",
    +        "magento/module-page-cache": "100.3.*",
    +        "magento/module-quote": "101.1.*",
    +        "magento/module-review": "100.3.*",
    +        "magento/module-sales": "102.0.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-tax": "100.3.*",
    +        "magento/module-theme": "101.0.*",
    +        "magento/module-ui": "101.1.*",
    +        "magento/module-wishlist": "101.1.*"
         },
         "suggest": {
    -        "magento/module-cookie": "*",
    -        "magento/module-customer-sample-data": "*"
    +        "magento/module-cookie": "100.3.*",
    +        "magento/module-customer-sample-data": "Sample Data version: 100.3.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -43,5 +43,6 @@
             "psr-4": {
                 "Magento\\Customer\\": ""
             }
    -    }
    +    },
    +    "version": "102.0.4-p2"
     }
    
  • app/code/Magento/Customer/Controller/Account/CreatePost.php+1 1 modified
    @@ -440,7 +440,7 @@ protected function checkPasswordConfirmation($password, $confirmation)
         /**
          * Retrieve success message
          *
    -     * @deprecated
    +     * @deprecated 102.0.4
          * @see getMessageManagerSuccessMessage()
          * @return string
          */
    
  • app/code/Magento/Customer/CustomerData/SectionPool.php+1 0 modified
    @@ -66,6 +66,7 @@ public function getSectionsData(array $sectionNames = null, $forceNewTimestamp =
          * Return array of section names.
          *
          * @return array
    +     * @since 102.0.4
          */
         public function getSectionNames()
         {
    
  • app/code/Magento/CustomerDownloadableGraphQl/composer.json+6 5 modified
    @@ -4,12 +4,12 @@
         "type": "magento2-module",
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/module-downloadable-graph-ql": "*",
    -        "magento/module-graph-ql": "*",
    -        "magento/framework": "*"
    +        "magento/module-downloadable-graph-ql": "100.3.*",
    +        "magento/module-graph-ql": "100.3.*",
    +        "magento/framework": "102.0.*"
         },
         "suggest": {
    -        "magento/module-catalog-graph-ql": "*"
    +        "magento/module-catalog-graph-ql": "100.3.*"
         },
         "license": [
             "OSL-3.0",
    @@ -22,5 +22,6 @@
             "psr-4": {
                 "Magento\\CustomerDownloadableGraphQl\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.0"
     }
    
  • app/code/Magento/Customer/etc/di.xml+1 0 modified
    @@ -61,6 +61,7 @@
                     type="Magento\Customer\Block\Account\SortLink"/>
         <preference for="Magento\Customer\Model\Group\RetrieverInterface"
                     type="Magento\Customer\Model\Group\Retriever"/>
    +    <preference for="Magento\Customer\Api\SessionCleanerInterface" type="Magento\Customer\Model\Session\SessionCleaner"/>
         <type name="Magento\Customer\Model\Session">
             <arguments>
                 <argument name="configShare" xsi:type="object">Magento\Customer\Model\Config\Share\Proxy</argument>
    
  • app/code/Magento/Customer/etc/webapi.xml+1 0 modified
    @@ -141,6 +141,7 @@
             </resources>
             <data>
                 <parameter name="customer.id" force="true">%customer_id%</parameter>
    +            <parameter name="customer.group_id" force="true">null</parameter>
             </data>
         </route>
         <route url="/V1/customers/me" method="GET" soapOperation="getSelf">
    
  • app/code/Magento/CustomerGraphQl/composer.json+26 26 modified
    @@ -1,29 +1,29 @@
     {
    -  "name": "magento/module-customer-graph-ql",
    -  "description": "N/A",
    -  "type": "magento2-module",
    -  "require": {
    -    "php": "~7.1.3||~7.2.0||~7.3.0",
    -    "magento/module-customer": "*",
    -    "magento/module-authorization": "*",
    -    "magento/module-customer": "*",
    -    "magento/module-eav": "*",
    -    "magento/module-graph-ql": "*",
    -    "magento/module-newsletter": "*",
    -    "magento/module-integration": "*",
    -    "magento/module-store": "*",
    -    "magento/framework": "*"
    -  },
    -  "license": [
    -    "OSL-3.0",
    -    "AFL-3.0"
    -  ],
    -  "autoload": {
    -    "files": [
    -      "registration.php"
    +    "name": "magento/module-customer-graph-ql",
    +    "description": "N/A",
    +    "type": "magento2-module",
    +    "require": {
    +        "php": "~7.1.3||~7.2.0||~7.3.0",
    +        "magento/module-customer": "102.0.*",
    +        "magento/module-authorization": "100.3.*",
    +        "magento/module-eav": "102.0.*",
    +        "magento/module-graph-ql": "100.3.*",
    +        "magento/module-newsletter": "100.3.*",
    +        "magento/module-integration": "100.3.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/framework": "102.0.*"
    +    },
    +    "license": [
    +        "OSL-3.0",
    +        "AFL-3.0"
         ],
    -    "psr-4": {
    -      "Magento\\CustomerGraphQl\\": ""
    -    }
    -  }
    +    "autoload": {
    +        "files": [
    +            "registration.php"
    +        ],
    +        "psr-4": {
    +            "Magento\\CustomerGraphQl\\": ""
    +        }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/CustomerImportExport/composer.json+9 8 modified
    @@ -6,13 +6,13 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-customer": "*",
    -        "magento/module-directory": "*",
    -        "magento/module-eav": "*",
    -        "magento/module-import-export": "*",
    -        "magento/module-store": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-customer": "102.0.*",
    +        "magento/module-directory": "100.3.*",
    +        "magento/module-eav": "102.0.*",
    +        "magento/module-import-export": "100.3.*",
    +        "magento/module-store": "101.0.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -26,5 +26,6 @@
             "psr-4": {
                 "Magento\\CustomerImportExport\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/CustomerImportExport/Model/Import/Address.php+4 4 modified
    @@ -165,7 +165,7 @@ class Address extends AbstractCustomer
          * Array of region parameters
          *
          * @var array
    -     * @deprecated field not in use
    +     * @deprecated 100.3.4 field not in use
          */
         protected $_regionParameters;
     
    @@ -195,19 +195,19 @@ class Address extends AbstractCustomer
     
         /**
          * @var \Magento\Eav\Model\Config
    -     * @deprecated field not-in use
    +     * @deprecated 100.3.4 field not-in use
          */
         protected $_eavConfig;
     
         /**
          * @var \Magento\Customer\Model\AddressFactory
    -     * @deprecated not utilized anymore
    +     * @deprecated 100.3.4 not utilized anymore
          */
         protected $_addressFactory;
     
         /**
          * @var \Magento\Framework\Stdlib\DateTime
    -     * @deprecated the property isn't used
    +     * @deprecated 100.3.4 the property isn't used
          */
         protected $dateTime;
     
    
  • app/code/Magento/Customer/Model/AccountManagement.php+48 76 modified
    @@ -13,6 +13,7 @@
     use Magento\Customer\Api\Data\AddressInterface;
     use Magento\Customer\Api\Data\CustomerInterface;
     use Magento\Customer\Api\Data\ValidationResultsInterfaceFactory;
    +use Magento\Customer\Api\SessionCleanerInterface;
     use Magento\Customer\Helper\View as CustomerViewHelper;
     use Magento\Customer\Model\Config\Share as ConfigShare;
     use Magento\Customer\Model\Customer as CustomerModel;
    @@ -68,92 +69,104 @@ class AccountManagement implements AccountManagementInterface
         /**
          * Configuration paths for create account email template
          *
    -     * @deprecated
    +     * @deprecated get rid of Helpers in Password Security Management.
    +     * @see \Magento\Customer\Model\EmailNotification::XML_PATH_REGISTER_EMAIL_TEMPLATE
          */
         const XML_PATH_REGISTER_EMAIL_TEMPLATE = 'customer/create_account/email_template';
     
         /**
          * Configuration paths for register no password email template
          *
    -     * @deprecated
    +     * @deprecated get rid of Helpers in Password Security Management.
    +     * @see \Magento\Customer\Model\EmailNotification::XML_PATH_REGISTER_NO_PASSWORD_EMAIL_TEMPLATE
          */
         const XML_PATH_REGISTER_NO_PASSWORD_EMAIL_TEMPLATE = 'customer/create_account/email_no_password_template';
     
         /**
          * Configuration paths for remind email identity
          *
    -     * @deprecated
    +     * @deprecated get rid of Helpers in Password Security Management.
    +     * @see \Magento\Customer\Model\EmailNotification::XML_PATH_REGISTER_EMAIL_IDENTITY
          */
         const XML_PATH_REGISTER_EMAIL_IDENTITY = 'customer/create_account/email_identity';
     
         /**
          * Configuration paths for remind email template
          *
    -     * @deprecated
    +     * @deprecated get rid of Helpers in Password Security Management.
    +     * @see \Magento\Customer\Model\EmailNotification::XML_PATH_REMIND_EMAIL_TEMPLATE
          */
         const XML_PATH_REMIND_EMAIL_TEMPLATE = 'customer/password/remind_email_template';
     
         /**
          * Configuration paths for forgot email email template
          *
    -     * @deprecated
    +     * @deprecated get rid of Helpers in Password Security Management.
    +     * @see \Magento\Customer\Model\EmailNotification::XML_PATH_FORGOT_EMAIL_TEMPLATE
          */
         const XML_PATH_FORGOT_EMAIL_TEMPLATE = 'customer/password/forgot_email_template';
     
         /**
          * Configuration paths for forgot email identity
          *
    -     * @deprecated
    +     * @deprecated get rid of Helpers in Password Security Management.
    +     * @see \Magento\Customer\Model\EmailNotification::XML_PATH_FORGOT_EMAIL_IDENTITY
          */
         const XML_PATH_FORGOT_EMAIL_IDENTITY = 'customer/password/forgot_email_identity';
     
         /**
          * Configuration paths for account confirmation required
          *
    -     * @deprecated
    +     * @deprecated get rid of Helpers in Password Security Management.
          * @see AccountConfirmation::XML_PATH_IS_CONFIRM
          */
         const XML_PATH_IS_CONFIRM = 'customer/create_account/confirm';
     
         /**
          * Configuration paths for account confirmation email template
          *
    -     * @deprecated
    +     * @deprecated get rid of Helpers in Password Security Management.
    +     * @see \Magento\Customer\Model\EmailNotification::XML_PATH_CONFIRM_EMAIL_TEMPLATE
          */
         const XML_PATH_CONFIRM_EMAIL_TEMPLATE = 'customer/create_account/email_confirmation_template';
     
         /**
          * Configuration paths for confirmation confirmed email template
          *
    -     * @deprecated
    +     * @deprecated get rid of Helpers in Password Security Management.
    +     * @see \Magento\Customer\Model\EmailNotification::XML_PATH_CONFIRMED_EMAIL_TEMPLATE
          */
         const XML_PATH_CONFIRMED_EMAIL_TEMPLATE = 'customer/create_account/email_confirmed_template';
     
         /**
          * Constants for the type of new account email to be sent
          *
    -     * @deprecated
    +     * @deprecated get rid of Helpers in Password Security Management.
    +     * @see \Magento\Customer\Model\EmailNotificationInterface::NEW_ACCOUNT_EMAIL_REGISTERED
          */
         const NEW_ACCOUNT_EMAIL_REGISTERED = 'registered';
     
         /**
          * Welcome email, when password setting is required
          *
    -     * @deprecated
    +     * @deprecated get rid of Helpers in Password Security Management.
    +     * @see \Magento\Customer\Model\EmailNotificationInterface::NEW_ACCOUNT_EMAIL_REGISTERED_NO_PASSWORD
          */
         const NEW_ACCOUNT_EMAIL_REGISTERED_NO_PASSWORD = 'registered_no_password';
     
         /**
          * Welcome email, when confirmation is enabled
          *
    -     * @deprecated
    +     * @deprecated get rid of Helpers in Password Security Management.
    +     * @see \Magento\Customer\Model\EmailNotificationInterface::NEW_ACCOUNT_EMAIL_CONFIRMATION
          */
         const NEW_ACCOUNT_EMAIL_CONFIRMATION = 'confirmation';
     
         /**
          * Confirmation email, when account is confirmed
          *
    -     * @deprecated
    +     * @deprecated get rid of Helpers in Password Security Management.
    +     * @see \Magento\Customer\Model\EmailNotificationInterface::NEW_ACCOUNT_EMAIL_CONFIRMED
          */
         const NEW_ACCOUNT_EMAIL_CONFIRMED = 'confirmed';
     
    @@ -179,14 +192,16 @@ class AccountManagement implements AccountManagementInterface
         /**
          * Configuration path to customer reset password email template
          *
    -     * @deprecated
    +     * @deprecated get rid of Helpers in Password Security Management.
    +     * @see \Magento\Customer\Model\EmailNotification::XML_PATH_RESET_PASSWORD_TEMPLATE
          */
         const XML_PATH_RESET_PASSWORD_TEMPLATE = 'customer/password/reset_password_template';
     
         /**
          * Minimum password length
          *
    -     * @deprecated
    +     * @deprecated get rid of Helpers in Password Security Management.
    +     * @see \Magento\Customer\Model\AccountManagement::XML_PATH_MINIMUM_PASSWORD_LENGTH
          */
         const MIN_PASSWORD_LENGTH = 6;
     
    @@ -270,21 +285,6 @@ class AccountManagement implements AccountManagementInterface
          */
         private $transportBuilder;
     
    -    /**
    -     * @var SessionManagerInterface
    -     */
    -    private $sessionManager;
    -
    -    /**
    -     * @var SaveHandlerInterface
    -     */
    -    private $saveHandler;
    -
    -    /**
    -     * @var CollectionFactory
    -     */
    -    private $visitorCollectionFactory;
    -
         /**
          * @var DataObjectProcessor
          */
    @@ -370,6 +370,11 @@ class AccountManagement implements AccountManagementInterface
          */
         private $getByToken;
     
    +    /**
    +     * @var SessionCleanerInterface
    +     */
    +    private $sessionCleaner;
    +
         /**
          * @param CustomerFactory $customerFactory
          * @param ManagerInterface $eventManager
    @@ -404,10 +409,12 @@ class AccountManagement implements AccountManagementInterface
          * @param AddressRegistry|null $addressRegistry
          * @param GetCustomerByToken|null $getByToken
          * @param AllowedCountries|null $allowedCountriesReader
    +     * @param SessionCleanerInterface|null $sessionCleaner
          * @SuppressWarnings(PHPMD.CyclomaticComplexity)
          * @SuppressWarnings(PHPMD.ExcessiveParameterList)
          * @SuppressWarnings(PHPMD.NPathComplexity)
          * @SuppressWarnings(PHPMD.LongVariable)
    +     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
          */
         public function __construct(
             CustomerFactory $customerFactory,
    @@ -442,7 +449,8 @@ public function __construct(
             SearchCriteriaBuilder $searchCriteriaBuilder = null,
             AddressRegistry $addressRegistry = null,
             GetCustomerByToken $getByToken = null,
    -        AllowedCountries $allowedCountriesReader = null
    +        AllowedCountries $allowedCountriesReader = null,
    +        SessionCleanerInterface $sessionCleaner = null
         ) {
             $this->customerFactory = $customerFactory;
             $this->eventManager = $eventManager;
    @@ -473,12 +481,6 @@ public function __construct(
             $this->dateTimeFactory = $dateTimeFactory ?: $objectManager->get(DateTimeFactory::class);
             $this->accountConfirmation = $accountConfirmation ?: $objectManager
                 ->get(AccountConfirmation::class);
    -        $this->sessionManager = $sessionManager
    -            ?: $objectManager->get(SessionManagerInterface::class);
    -        $this->saveHandler = $saveHandler
    -            ?: $objectManager->get(SaveHandlerInterface::class);
    -        $this->visitorCollectionFactory = $visitorCollectionFactory
    -            ?: $objectManager->get(CollectionFactory::class);
             $this->searchCriteriaBuilder = $searchCriteriaBuilder
                 ?: $objectManager->get(SearchCriteriaBuilder::class);
             $this->addressRegistry = $addressRegistry
    @@ -487,6 +489,7 @@ public function __construct(
                 ?: $objectManager->get(GetCustomerByToken::class);
             $this->allowedCountriesReader = $allowedCountriesReader
                 ?: $objectManager->get(AllowedCountries::class);
    +        $this->sessionCleaner = $sessionCleaner ?? $objectManager->get(SessionCleanerInterface::class);
         }
     
         /**
    @@ -525,7 +528,11 @@ public function resendConfirmation($email, $websiteId = null, $redirectUrl = '')
             } catch (MailException $e) {
                 // If we are not able to send a new account email, this should be ignored
                 $this->logger->critical($e);
    +
    +            return false;
             }
    +
    +        return true;
         }
     
         /**
    @@ -673,7 +680,8 @@ private function handleUnknownTemplate($template)
         {
             throw new InputException(
                 __(
    -                'Invalid value of "%value" provided for the %fieldName field. Possible values: %template1 or %template2.',
    +                'Invalid value of "%value" provided for the %fieldName field. '
    +                    . 'Possible values: %template1 or %template2.',
                     [
                         'value' => $template,
                         'fieldName' => 'template',
    @@ -712,13 +720,7 @@ public function resetPassword($email, $resetToken, $newPassword)
             $customerSecure->setRpToken(null);
             $customerSecure->setRpTokenCreatedAt(null);
             $customerSecure->setPasswordHash($this->createPasswordHash($newPassword));
    -        $this->destroyCustomerSessions($customer->getId());
    -        if ($this->sessionManager->isSessionExists()) {
    -            //delete old session and move data to the new session
    -            //use this instead of $this->sessionManager->regenerateId because last one doesn't delete old session
    -            // phpcs:ignore Magento2.Functions.DiscouragedFunction
    -            session_regenerate_id(true);
    -        }
    +        $this->sessionCleaner->clearFor((int)$customer->getId());
             $this->customerRepository->save($customer);
     
             return true;
    @@ -1047,7 +1049,7 @@ private function changePasswordForCustomer($customer, $currentPassword, $newPass
             $customerSecure->setRpTokenCreatedAt(null);
             $this->checkPasswordStrength($newPassword);
             $customerSecure->setPasswordHash($this->createPasswordHash($newPassword));
    -        $this->destroyCustomerSessions($customer->getId());
    +        $this->sessionCleaner->clearFor((int)$customer->getId());
             $this->disableAddressValidation($customer);
             $this->customerRepository->save($customer);
     
    @@ -1600,36 +1602,6 @@ private function getEmailNotification()
             }
         }
     
    -    /**
    -     * Destroy all active customer sessions by customer id (current session will not be destroyed).
    -     *
    -     * Customer sessions which should be deleted are collecting from the "customer_visitor" table considering
    -     * configured session lifetime.
    -     *
    -     * @param string|int $customerId
    -     * @return void
    -     */
    -    private function destroyCustomerSessions($customerId)
    -    {
    -        $sessionLifetime = $this->scopeConfig->getValue(
    -            \Magento\Framework\Session\Config::XML_PATH_COOKIE_LIFETIME,
    -            \Magento\Store\Model\ScopeInterface::SCOPE_STORE
    -        );
    -        $dateTime = $this->dateTimeFactory->create();
    -        $activeSessionsTime = $dateTime->setTimestamp($dateTime->getTimestamp() - $sessionLifetime)
    -            ->format(DateTime::DATETIME_PHP_FORMAT);
    -        /** @var \Magento\Customer\Model\ResourceModel\Visitor\Collection $visitorCollection */
    -        $visitorCollection = $this->visitorCollectionFactory->create();
    -        $visitorCollection->addFieldToFilter('customer_id', $customerId);
    -        $visitorCollection->addFieldToFilter('last_visit_at', ['from' => $activeSessionsTime]);
    -        $visitorCollection->addFieldToFilter('session_id', ['neq' => $this->sessionManager->getSessionId()]);
    -        /** @var \Magento\Customer\Model\Visitor $visitor */
    -        foreach ($visitorCollection->getItems() as $visitor) {
    -            $sessionId = $visitor->getSessionId();
    -            $this->saveHandler->destroy($sessionId);
    -        }
    -    }
    -
         /**
          * Set ignore_validation_flag for reset password flow to skip unnecessary address and customer validation
          *
    
  • app/code/Magento/Customer/Model/Session/SessionCleaner.php+100 0 added
    @@ -0,0 +1,100 @@
    +<?php
    +/**
    + * Copyright © Magento, Inc. All rights reserved.
    + * See COPYING.txt for license details.
    + */
    +declare(strict_types=1);
    +
    +namespace Magento\Customer\Model\Session;
    +
    +use Magento\Customer\Api\SessionCleanerInterface;
    +use Magento\Customer\Model\ResourceModel\Visitor\CollectionFactory as VisitorCollectionFactory;
    +use Magento\Framework\App\Config\ScopeConfigInterface;
    +use Magento\Framework\Intl\DateTimeFactory;
    +use Magento\Framework\Session\Config;
    +use Magento\Framework\Session\SaveHandlerInterface;
    +use Magento\Framework\Session\SessionManagerInterface;
    +use Magento\Framework\Stdlib\DateTime;
    +use Magento\Store\Model\ScopeInterface;
    +
    +/**
    + * Deletes all session data which relates to customer, including current session data.
    + *
    + * @SuppressWarnings(PHPMD.CookieAndSessionMisuse)
    + */
    +class SessionCleaner implements SessionCleanerInterface
    +{
    +    /**
    +     * @var ScopeConfigInterface
    +     */
    +    private $scopeConfig;
    +
    +    /**
    +     * @var DateTimeFactory
    +     */
    +    private $dateTimeFactory;
    +
    +    /**
    +     * @var VisitorCollectionFactory
    +     */
    +    private $visitorCollectionFactory;
    +
    +    /**
    +     * @var SessionManagerInterface
    +     */
    +    private $sessionManager;
    +
    +    /**
    +     * @var SaveHandlerInterface
    +     */
    +    private $saveHandler;
    +
    +    /**
    +     * @inheritdoc
    +     */
    +    public function __construct(
    +        ScopeConfigInterface $scopeConfig,
    +        DateTimeFactory $dateTimeFactory,
    +        VisitorCollectionFactory $visitorCollectionFactory,
    +        SessionManagerInterface $sessionManager,
    +        SaveHandlerInterface $saveHandler
    +    ) {
    +        $this->scopeConfig = $scopeConfig;
    +        $this->dateTimeFactory = $dateTimeFactory;
    +        $this->visitorCollectionFactory = $visitorCollectionFactory;
    +        $this->sessionManager = $sessionManager;
    +        $this->saveHandler = $saveHandler;
    +    }
    +
    +    /**
    +     * @inheritdoc
    +     */
    +    public function clearFor(int $customerId): void
    +    {
    +        if ($this->sessionManager->isSessionExists()) {
    +            //delete old session and move data to the new session
    +            //use this instead of $this->sessionManager->regenerateId because last one doesn't delete old session
    +            // phpcs:ignore Magento2.Functions.DiscouragedFunction
    +            session_regenerate_id(true);
    +        }
    +
    +        $sessionLifetime = $this->scopeConfig->getValue(
    +            Config::XML_PATH_COOKIE_LIFETIME,
    +            ScopeInterface::SCOPE_STORE
    +        );
    +        $dateTime = $this->dateTimeFactory->create();
    +        $activeSessionsTime = $dateTime->setTimestamp($dateTime->getTimestamp() - $sessionLifetime)
    +            ->format(DateTime::DATETIME_PHP_FORMAT);
    +        /** @var \Magento\Customer\Model\ResourceModel\Visitor\Collection $visitorCollection */
    +        $visitorCollection = $this->visitorCollectionFactory->create();
    +        $visitorCollection->addFieldToFilter('customer_id', $customerId);
    +        $visitorCollection->addFieldToFilter('last_visit_at', ['from' => $activeSessionsTime]);
    +        /** @var \Magento\Customer\Model\Visitor $visitor */
    +        foreach ($visitorCollection->getItems() as $visitor) {
    +            $sessionId = $visitor->getSessionId();
    +            $this->sessionManager->start();
    +            $this->saveHandler->destroy($sessionId);
    +            $this->sessionManager->writeClose();
    +        }
    +    }
    +}
    
  • app/code/Magento/Customer/Model/Visitor.php+21 3 modified
    @@ -10,9 +10,8 @@
     use Magento\Framework\App\RequestSafetyInterface;
     
     /**
    - * Class Visitor
    + * Class Visitor responsible for initializing visitor's.
      *
    - * @package Magento\Customer\Model
      * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
      * @SuppressWarnings(PHPMD.CookieAndSessionMisuse)
      */
    @@ -194,7 +193,9 @@ public function initByRequest($observer)
         public function saveByRequest($observer)
         {
             // prevent saving Visitor for safe methods, e.g. GET request
    -        if ($this->skipRequestLogging || $this->requestSafety->isSafeMethod() || $this->isModuleIgnored($observer)) {
    +        if (($this->skipRequestLogging || $this->requestSafety->isSafeMethod() || $this->isModuleIgnored($observer))
    +            && !$this->sessionIdHasChanged()
    +        ) {
                 return $this;
             }
     
    @@ -208,6 +209,23 @@ public function saveByRequest($observer)
             return $this;
         }
     
    +    /**
    +     * Check if visitor session id was changed.
    +     *
    +     * @return bool
    +     */
    +    private function sessionIdHasChanged(): bool
    +    {
    +        $visitorData = $this->session->getVisitorData();
    +        $hasChanged = false;
    +
    +        if (isset($visitorData['session_id'])) {
    +            $hasChanged = $this->session->getSessionId() !== $visitorData['session_id'];
    +        }
    +
    +        return $hasChanged;
    +    }
    +
         /**
          * Returns true if the module is required
          *
    
  • app/code/Magento/Customer/Test/Mftf/Data/AddressData.xml+1 0 modified
    @@ -327,6 +327,7 @@
             <data key="postcode">10789</data>
             <data key="telephone">333-33-333-33</data>
             <data key="country">Germany</data>
    +        <data key="state">Berlin</data>
         </entity>
         <entity name="US_Address_California">
             <data key="firstname">John</data>
    
  • app/code/Magento/Customer/Test/Mftf/Test/StorefrontClearAllCompareProductsTest.xml+4 0 modified
    @@ -124,6 +124,10 @@
                 <deleteData createDataKey="createBundleProduct1" stepKey="deleteBundleProduct1"/>
                 <deleteData createDataKey="createGroupedProduct1" stepKey="deleteGroupedProduct1"/>
                 <deleteData createDataKey="createDownloadableProduct1" stepKey="deleteDownloadableProduct1"/>
    +            <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <actionGroup ref="LoginToStorefrontActionGroup" stepKey="loginAsCustomer1">
    
  • app/code/Magento/Customer/Test/Mftf/Test/StorefrontUpdateCustomerPasswordTest.xml+14 1 modified
    @@ -78,4 +78,17 @@
             <remove keyForRemoval="loginWithNewPassword"/>
             <remove keyForRemoval="seeMyEmail"/>
         </test>
    -</tests>
    \ No newline at end of file
    +    <test name="StorefrontUpdateCustomerPasswordRedirectOnLoginPage" extends="StorefrontUpdateCustomerPasswordValidCurrentPasswordTest">
    +        <annotations>
    +            <title value="Update Customer Password on Storefront Redirect on Login Page"/>
    +            <description value="Update Customer Password on Storefront Redirect on Login Page"/>
    +            <testCaseId value="MC-22957"/>
    +            <useCaseId value="MC-29461"/>
    +        </annotations>
    +        <remove keyForRemoval="logout"/>
    +        <remove keyForRemoval="loginWithNewPassword"/>
    +        <remove keyForRemoval="seeMyEmail"/>
    +
    +        <seeInCurrentUrl url="{{StorefrontCustomerSignInPage.url}}" stepKey="assertStorefrontCustomerLoginPage"/>
    +    </test>
    +</tests>
    
  • app/code/Magento/Customer/Test/Unit/Model/AccountManagementTest.php+11 43 modified
    @@ -7,6 +7,7 @@
     namespace Magento\Customer\Test\Unit\Model;
     
     use Magento\Customer\Api\Data\CustomerInterface;
    +use Magento\Customer\Api\SessionCleanerInterface;
     use Magento\Customer\Model\AccountConfirmation;
     use Magento\Customer\Model\AccountManagement;
     use Magento\Customer\Model\AuthenticationInterface;
    @@ -161,6 +162,11 @@ class AccountManagementTest extends \PHPUnit\Framework\TestCase
          */
         private $allowedCountriesReader;
     
    +    /**
    +     * @var SessionCleanerInterface|\PHPUnit_Framework_MockObject_MockObject
    +     */
    +    private $sessionCleanerMock;
    +
         /**
          * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
          */
    @@ -1463,6 +1469,7 @@ private function reInitModel()
                 ->setMethods(['create'])
                 ->getMock();
             $dateTimeFactory->expects($this->any())->method('create')->willReturn($dateTimeMock);
    +        $this->sessionCleanerMock = $this->createMock(SessionCleanerInterface::class);
     
             $this->objectManagerHelper = new ObjectManagerHelper($this);
             $this->accountManagement = $this->objectManagerHelper->getObject(
    @@ -1483,6 +1490,7 @@ private function reInitModel()
                     'storeManager' => $this->storeManager,
                     'addressRegistry' => $this->addressRegistryMock,
                     'transportBuilder' => $this->transportBuilder,
    +                'sessionCleaner' => $this->sessionCleanerMock,
                 ]
             );
             $this->objectManagerHelper->setBackwardCompatibleProperty(
    @@ -1561,33 +1569,13 @@ public function testChangePassword()
                 ->with($newPassword)
                 ->willReturn(7);
     
    +        $this->sessionCleanerMock->expects($this->once())->method('clearFor')->with($customerId)->willReturnSelf();
    +
             $this->customerRepository
                 ->expects($this->once())
                 ->method('save')
                 ->with($customer);
     
    -        $this->sessionManager->expects($this->atLeastOnce())->method('getSessionId');
    -
    -        $visitor = $this->getMockBuilder(\Magento\Customer\Model\Visitor::class)
    -            ->disableOriginalConstructor()
    -            ->setMethods(['getSessionId'])
    -            ->getMock();
    -        $visitor->expects($this->atLeastOnce())->method('getSessionId')
    -            ->willReturnOnConsecutiveCalls('session_id_1', 'session_id_2');
    -        $visitorCollection = $this->getMockBuilder(
    -            \Magento\Customer\Model\ResourceModel\Visitor\CollectionFactory::class
    -        )
    -            ->disableOriginalConstructor()->setMethods(['addFieldToFilter', 'getItems'])->getMock();
    -        $visitorCollection->expects($this->atLeastOnce())->method('addFieldToFilter')->willReturnSelf();
    -        $visitorCollection->expects($this->atLeastOnce())->method('getItems')->willReturn([$visitor, $visitor]);
    -        $this->visitorCollectionFactory->expects($this->atLeastOnce())->method('create')
    -            ->willReturn($visitorCollection);
    -        $this->saveHandler->expects($this->atLeastOnce())->method('destroy')
    -            ->withConsecutive(
    -                ['session_id_1'],
    -                ['session_id_2']
    -            );
    -
             $this->assertTrue($this->accountManagement->changePassword($email, $currentPassword, $newPassword));
         }
     
    @@ -1641,28 +1629,8 @@ function ($string) {
             $this->customerSecure->expects($this->once())->method('setRpToken')->with(null);
             $this->customerSecure->expects($this->once())->method('setRpTokenCreatedAt')->with(null);
             $this->customerSecure->expects($this->any())->method('setPasswordHash')->willReturn(null);
    +        $this->sessionCleanerMock->expects($this->once())->method('clearFor')->with($customerId)->willReturnSelf();
     
    -        $this->sessionManager->method('isSessionExists')->willReturn(false);
    -        $this->sessionManager->expects($this->atLeastOnce())->method('getSessionId');
    -        $visitor = $this->getMockBuilder(\Magento\Customer\Model\Visitor::class)
    -            ->disableOriginalConstructor()
    -            ->setMethods(['getSessionId'])
    -            ->getMock();
    -        $visitor->expects($this->atLeastOnce())->method('getSessionId')
    -            ->willReturnOnConsecutiveCalls('session_id_1', 'session_id_2');
    -        $visitorCollection = $this->getMockBuilder(
    -            \Magento\Customer\Model\ResourceModel\Visitor\CollectionFactory::class
    -        )
    -            ->disableOriginalConstructor()->setMethods(['addFieldToFilter', 'getItems'])->getMock();
    -        $visitorCollection->expects($this->atLeastOnce())->method('addFieldToFilter')->willReturnSelf();
    -        $visitorCollection->expects($this->atLeastOnce())->method('getItems')->willReturn([$visitor, $visitor]);
    -        $this->visitorCollectionFactory->expects($this->atLeastOnce())->method('create')
    -            ->willReturn($visitorCollection);
    -        $this->saveHandler->expects($this->atLeastOnce())->method('destroy')
    -            ->withConsecutive(
    -                ['session_id_1'],
    -                ['session_id_2']
    -            );
             $this->assertTrue($this->accountManagement->resetPassword($customerEmail, $resetToken, $newPassword));
         }
     
    
  • app/code/Magento/Deploy/composer.json+7 6 modified
    @@ -6,11 +6,11 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-config": "*",
    -        "magento/module-require-js": "*",
    -        "magento/module-store": "*",
    -        "magento/module-user": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-config": "101.1.*",
    +        "magento/module-require-js": "100.3.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-user": "101.1.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -25,5 +25,6 @@
             "psr-4": {
                 "Magento\\Deploy\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/Developer/composer.json+5 4 modified
    @@ -6,9 +6,9 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-config": "*",
    -        "magento/module-store": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-config": "101.1.*",
    +        "magento/module-store": "101.0.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -22,5 +22,6 @@
             "psr-4": {
                 "Magento\\Developer\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/Dhl/composer.json+13 12 modified
    @@ -7,19 +7,19 @@
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
             "lib-libxml": "*",
    -        "magento/framework": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-catalog-inventory": "*",
    -        "magento/module-config": "*",
    -        "magento/module-directory": "*",
    -        "magento/module-quote": "*",
    -        "magento/module-sales": "*",
    -        "magento/module-shipping": "*",
    -        "magento/module-store": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-catalog-inventory": "100.3.*",
    +        "magento/module-config": "101.1.*",
    +        "magento/module-directory": "100.3.*",
    +        "magento/module-quote": "101.1.*",
    +        "magento/module-sales": "102.0.*",
    +        "magento/module-shipping": "100.3.*",
    +        "magento/module-store": "101.0.*"
         },
         "suggest": {
    -        "magento/module-checkout": "*"
    +        "magento/module-checkout": "100.3.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -33,5 +33,6 @@
             "psr-4": {
                 "Magento\\Dhl\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/Directory/Block/Data.php+1 1 modified
    @@ -142,7 +142,7 @@ public function getCountryHtmlSelect($defValue = null, $name = 'country_id', $id
             )->setId(
                 $id
             )->setTitle(
    -            $this->escapeHtml(__($title))
    +            $this->escapeHtmlAttr(__($title))
             )->setValue(
                 $defValue
             )->setOptions(
    
  • app/code/Magento/Directory/composer.json+6 5 modified
    @@ -7,10 +7,10 @@
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
             "lib-libxml": "*",
    -        "magento/framework": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-config": "*",
    -        "magento/module-store": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-config": "101.1.*",
    +        "magento/module-store": "101.0.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -24,5 +24,6 @@
             "psr-4": {
                 "Magento\\Directory\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4-p2"
     }
    
  • app/code/Magento/DirectoryGraphQl/composer.json+22 21 modified
    @@ -1,24 +1,25 @@
     {
    -  "name": "magento/module-directory-graph-ql",
    -  "description": "N/A",
    -  "type": "magento2-module",
    -  "require": {
    -    "php": "~7.1.3||~7.2.0||~7.3.0",
    -    "magento/module-directory": "*",
    -    "magento/module-store": "*",
    -    "magento/module-graph-ql": "*",
    -    "magento/framework": "*"
    -  },
    -  "license": [
    -    "OSL-3.0",
    -    "AFL-3.0"
    -  ],
    -  "autoload": {
    -    "files": [
    -      "registration.php"
    +    "name": "magento/module-directory-graph-ql",
    +    "description": "N/A",
    +    "type": "magento2-module",
    +    "require": {
    +        "php": "~7.1.3||~7.2.0||~7.3.0",
    +        "magento/module-directory": "100.3.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-graph-ql": "100.3.*",
    +        "magento/framework": "102.0.*"
    +    },
    +    "license": [
    +        "OSL-3.0",
    +        "AFL-3.0"
         ],
    -    "psr-4": {
    -      "Magento\\DirectoryGraphQl\\": ""
    -    }
    -  }
    +    "autoload": {
    +        "files": [
    +            "registration.php"
    +        ],
    +        "psr-4": {
    +            "Magento\\DirectoryGraphQl\\": ""
    +        }
    +    },
    +    "version": "100.3.3"
     }
    
  • app/code/Magento/Directory/Test/Unit/Block/DataTest.php+10 2 modified
    @@ -65,7 +65,11 @@ class DataTest extends \PHPUnit\Framework\TestCase
         protected function setUp()
         {
             $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
    -        $this->escaper= $objectManagerHelper->getObject(Escaper::class);
    +        $this->escaper = $this->getMockBuilder(Escaper::class)
    +            ->disableOriginalConstructor()
    +            ->setMethods(['escapeHtmlAttr'])
    +            ->getMock();
    +
             $this->prepareContext();
     
             $this->helperDataMock = $this->getMockBuilder(\Magento\Directory\Helper\Data::class)
    @@ -304,7 +308,7 @@ protected function mockElementHtmlSelect($defaultCountry, $options, $resultHtml)
                         'setValue',
                         'setOptions',
                         'setExtraParams',
    -                    'getHtml',
    +                    'getHtml'
                     ]
                 )
                 ->getMock();
    @@ -336,6 +340,10 @@ protected function mockElementHtmlSelect($defaultCountry, $options, $resultHtml)
             $elementHtmlSelect->expects($this->once())
                 ->method('getHtml')
                 ->willReturn($resultHtml);
    +        $this->escaper->expects($this->once())
    +            ->method('escapeHtmlAttr')
    +            ->with(__($title))
    +            ->willReturn(__($title));
     
             return $elementHtmlSelect;
         }
    
  • app/code/Magento/Downloadable/composer.json+20 19 modified
    @@ -6,26 +6,26 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-catalog-inventory": "*",
    -        "magento/module-checkout": "*",
    -        "magento/module-config": "*",
    -        "magento/module-customer": "*",
    -        "magento/module-directory": "*",
    -        "magento/module-eav": "*",
    -        "magento/module-gift-message": "*",
    -        "magento/module-media-storage": "*",
    -        "magento/module-quote": "*",
    -        "magento/module-sales": "*",
    -        "magento/module-store": "*",
    -        "magento/module-tax": "*",
    -        "magento/module-theme": "*",
    -        "magento/module-ui": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-catalog-inventory": "100.3.*",
    +        "magento/module-checkout": "100.3.*",
    +        "magento/module-config": "101.1.*",
    +        "magento/module-customer": "102.0.*",
    +        "magento/module-directory": "100.3.*",
    +        "magento/module-eav": "102.0.*",
    +        "magento/module-gift-message": "100.3.*",
    +        "magento/module-media-storage": "100.3.*",
    +        "magento/module-quote": "101.1.*",
    +        "magento/module-sales": "102.0.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-tax": "100.3.*",
    +        "magento/module-theme": "101.0.*",
    +        "magento/module-ui": "101.1.*"
         },
         "suggest": {
    -        "magento/module-downloadable-sample-data": "*"
    +        "magento/module-downloadable-sample-data": "Sample Data version: 100.3.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -39,5 +39,6 @@
             "psr-4": {
                 "Magento\\Downloadable\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4-p2"
     }
    
  • app/code/Magento/DownloadableGraphQl/composer.json+8 7 modified
    @@ -4,14 +4,14 @@
         "type": "magento2-module",
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/module-catalog": "*",
    -        "magento/module-downloadable": "*",
    -        "magento/module-quote": "*",
    -        "magento/module-quote-graph-ql": "*",
    -        "magento/framework": "*"
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-downloadable": "100.3.*",
    +        "magento/module-quote": "101.1.*",
    +        "magento/module-quote-graph-ql": "100.3.*",
    +        "magento/framework": "102.0.*"
         },
         "suggest": {
    -        "magento/module-catalog-graph-ql": "*"
    +        "magento/module-catalog-graph-ql": "100.3.*"
         },
         "license": [
             "OSL-3.0",
    @@ -24,5 +24,6 @@
             "psr-4": {
                 "Magento\\DownloadableGraphQl\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/DownloadableImportExport/composer.json+9 8 modified
    @@ -6,13 +6,13 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-catalog-import-export": "*",
    -        "magento/module-downloadable": "*",
    -        "magento/module-eav": "*",
    -        "magento/module-import-export": "*",
    -        "magento/module-store": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-catalog-import-export": "101.0.*",
    +        "magento/module-downloadable": "100.3.*",
    +        "magento/module-eav": "102.0.*",
    +        "magento/module-import-export": "100.3.*",
    +        "magento/module-store": "101.0.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -26,5 +26,6 @@
             "psr-4": {
                 "Magento\\DownloadableImportExport\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/Eav/composer.json+8 7 modified
    @@ -6,12 +6,12 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-config": "*",
    -        "magento/module-media-storage": "*",
    -        "magento/module-store": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-config": "101.1.*",
    +        "magento/module-media-storage": "100.3.*",
    +        "magento/module-store": "101.0.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -25,5 +25,6 @@
             "psr-4": {
                 "Magento\\Eav\\": ""
             }
    -    }
    +    },
    +    "version": "102.0.4-p2"
     }
    
  • app/code/Magento/EavGraphQl/composer.json+5 4 modified
    @@ -4,11 +4,11 @@
         "type": "magento2-module",
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-eav": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-eav": "102.0.*"
         },
         "suggest": {
    -        "magento/module-graph-ql": "*"
    +        "magento/module-graph-ql": "100.3.*"
         },
         "license": [
             "OSL-3.0",
    @@ -21,5 +21,6 @@
             "psr-4": {
                 "Magento\\EavGraphQl\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/Eav/Model/Entity/Attribute.php+19 0 modified
    @@ -260,6 +260,8 @@ public function beforeSave()
                 );
             }
     
    +        $this->validateEntityType();
    +
             $defaultValue = $this->getDefaultValue();
             $hasDefaultValue = (string)$defaultValue != '';
     
    @@ -512,4 +514,21 @@ public function __wakeup()
             $this->reservedAttributeList = $objectManager->get(\Magento\Catalog\Model\Product\ReservedAttributeList::class);
             $this->dateTimeFormatter = $objectManager->get(DateTimeFormatterInterface::class);
         }
    +
    +    /**
    +     * Entity type for existing attribute shouldn't be changed.
    +     *
    +     * @return void
    +     * @throws LocalizedException
    +     */
    +    private function validateEntityType(): void
    +    {
    +        if ($this->getId() !== null) {
    +            $origEntityTypeId = $this->getOrigData('entity_type_id');
    +
    +            if (($origEntityTypeId !== null) && ((int)$this->getEntityTypeId() !== (int)$origEntityTypeId)) {
    +                throw new LocalizedException(__('Do not change entity type.'));
    +            }
    +        }
    +    }
     }
    
  • app/code/Magento/Eav/Model/ResourceModel/Entity/Attribute.php+2 1 modified
    @@ -107,6 +107,7 @@ public function loadByCode(AbstractModel $object, $entityTypeId, $code)
     
             if ($data) {
                 $object->setData($data);
    +            $object->setOrigData('entity_type_id', $object->getEntityTypeId());
                 $this->_afterLoad($object);
                 return true;
             }
    @@ -197,7 +198,7 @@ protected function _beforeSave(AbstractModel $object)
          * @param AbstractModel $attribute
          * @return AbstractDb
          * @throws CouldNotDeleteException
    -     * @since 102.0.3
    +     * @since 102.0.2
          */
         protected function _beforeDelete(AbstractModel $attribute)
         {
    
  • app/code/Magento/Elasticsearch6/composer.json+9 8 modified
    @@ -3,16 +3,16 @@
         "description": "N/A",
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-advanced-search": "*",
    -        "magento/module-catalog-search": "*",
    -        "magento/module-search": "*",
    -        "magento/module-store": "*",
    -        "magento/module-elasticsearch": "*",
    +        "magento/framework": "102.0.*",
    +        "magento/module-advanced-search": "100.3.*",
    +        "magento/module-catalog-search": "101.0.*",
    +        "magento/module-search": "101.0.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-elasticsearch": "100.3.*",
             "elasticsearch/elasticsearch": "~2.0|~5.1|~6.1"
         },
         "suggest": {
    -        "magento/module-config": "*"
    +        "magento/module-config": "101.1.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -26,5 +26,6 @@
             "psr-4": {
                 "Magento\\Elasticsearch6\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.3"
     }
    
  • app/code/Magento/Elasticsearch/composer.json+12 11 modified
    @@ -3,19 +3,19 @@
         "description": "N/A",
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/module-advanced-search": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-catalog-search": "*",
    -        "magento/module-customer": "*",
    -        "magento/module-eav": "*",
    -        "magento/module-search": "*",
    -        "magento/module-store": "*",
    -        "magento/module-catalog-inventory": "*",
    -        "magento/framework": "*",
    +        "magento/module-advanced-search": "100.3.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-catalog-search": "101.0.*",
    +        "magento/module-customer": "102.0.*",
    +        "magento/module-eav": "102.0.*",
    +        "magento/module-search": "101.0.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-catalog-inventory": "100.3.*",
    +        "magento/framework": "102.0.*",
             "elasticsearch/elasticsearch": "~2.0|~5.1|~6.1"
         },
         "suggest": {
    -        "magento/module-config": "*"
    +        "magento/module-config": "101.1.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -29,5 +29,6 @@
             "psr-4": {
                 "Magento\\Elasticsearch\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/Email/composer.json+11 10 modified
    @@ -6,17 +6,17 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-cms": "*",
    -        "magento/module-config": "*",
    -        "magento/module-store": "*",
    -        "magento/module-theme": "*",
    -        "magento/module-media-storage": "*",
    -        "magento/module-variable": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-cms": "103.0.*",
    +        "magento/module-config": "101.1.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-theme": "101.0.*",
    +        "magento/module-media-storage": "100.3.*",
    +        "magento/module-variable": "100.3.*"
         },
         "suggest": {
    -        "magento/module-theme": "*"
    +        "magento/module-theme": "101.0.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -30,5 +30,6 @@
             "psr-4": {
                 "Magento\\Email\\": ""
             }
    -    }
    +    },
    +    "version": "101.0.4-p2"
     }
    
  • app/code/Magento/Email/Model/Template/Filter.php+44 7 modified
    @@ -6,8 +6,9 @@
     namespace Magento\Email\Model\Template;
     
     use Magento\Framework\App\ObjectManager;
    +use Magento\Framework\Exception\MailException;
    +use Magento\Framework\Exception\NoSuchEntityException;
     use Magento\Framework\Filesystem;
    -use Magento\Framework\Filesystem\Directory\ReadInterface;
     use Magento\Framework\Filter\VariableResolverInterface;
     use Magento\Framework\View\Asset\ContentProcessorException;
     use Magento\Framework\View\Asset\ContentProcessorInterface;
    @@ -51,7 +52,7 @@ class Filter extends \Magento\Framework\Filter\Template
          * Modifier Callbacks
          *
          * @var array
    -     * @deprecated Use the new Directive Processor interfaces
    +     * @deprecated 101.0.4 Use the new Directive Processor interfaces
          */
         protected $_modifiers = ['nl2br' => ''];
     
    @@ -665,7 +666,7 @@ public function varDirective($construction)
          * @param string $value
          * @param string $default assumed modifier if none present
          * @return array
    -     * @deprecated Use the new FilterApplier or Directive Processor interfaces
    +     * @deprecated 101.0.4 Use the new FilterApplier or Directive Processor interfaces
          */
         protected function explodeModifiers($value, $default = null)
         {
    @@ -684,7 +685,7 @@ protected function explodeModifiers($value, $default = null)
          * @param string $value
          * @param string $modifiers
          * @return string
    -     * @deprecated Use the new FilterApplier or Directive Processor interfaces
    +     * @deprecated 101.0.4 Use the new FilterApplier or Directive Processor interfaces
          */
         protected function applyModifiers($value, $modifiers)
         {
    @@ -712,7 +713,7 @@ protected function applyModifiers($value, $modifiers)
          * @param string $value
          * @param string $type
          * @return string
    -     * @deprecated Use the new FilterApplier or Directive Processor interfaces
    +     * @deprecated 101.0.4 Use the new FilterApplier or Directive Processor interfaces
          */
         public function modifierEscape($value, $type = 'html')
         {
    @@ -740,27 +741,32 @@ public function modifierEscape($value, $type = 'html')
          *     {{protocol store="1"}} - Optional parameter which gets protocol from provide store based on store ID or code
          *
          * @param string[] $construction
    -     * @throws \Magento\Framework\Exception\MailException
          * @return string
    +     * @throws MailException
    +     * @throws NoSuchEntityException
          */
         public function protocolDirective($construction)
         {
             $params = $this->getParameters($construction[2]);
    +
             $store = null;
             if (isset($params['store'])) {
                 try {
                     $store = $this->_storeManager->getStore($params['store']);
                 } catch (\Exception $e) {
    -                throw new \Magento\Framework\Exception\MailException(
    +                throw new MailException(
                         __('Requested invalid store "%1"', $params['store'])
                     );
                 }
             }
    +
             $isSecure = $this->_storeManager->getStore($store)->isCurrentlySecure();
             $protocol = $isSecure ? 'https' : 'http';
             if (isset($params['url'])) {
                 return $protocol . '://' . $params['url'];
             } elseif (isset($params['http']) && isset($params['https'])) {
    +            $this->validateProtocolDirectiveHttpScheme($params);
    +
                 if ($isSecure) {
                     return $params['https'];
                 }
    @@ -770,6 +776,37 @@ public function protocolDirective($construction)
             return $protocol;
         }
     
    +    /**
    +     * Validate protocol directive HTTP parameters.
    +     *
    +     * @param string[] $params
    +     * @return void
    +     * @throws MailException
    +     */
    +    private function validateProtocolDirectiveHttpScheme(array $params) : void
    +    {
    +        $parsed_http = parse_url($params['http']);
    +        $parsed_https = parse_url($params['https']);
    +
    +        if (empty($parsed_http)) {
    +            throw new MailException(
    +                __('Contents of %1 could not be loaded or is empty', $params['http'])
    +            );
    +        } elseif (empty($parsed_https)) {
    +            throw new MailException(
    +                __('Contents of %1 could not be loaded or is empty', $params['https'])
    +            );
    +        } elseif ($parsed_http['scheme'] !== 'http') {
    +            throw new MailException(
    +                __('Contents of %1 could not be loaded or is empty', $params['http'])
    +            );
    +        } elseif ($parsed_https['scheme'] !== 'https') {
    +            throw new MailException(
    +                __('Contents of %1 could not be loaded or is empty', $params['https'])
    +            );
    +        }
    +    }
    +
         /**
          * Store config directive
          *
    
  • app/code/Magento/Email/Test/Unit/Model/Template/FilterTest.php+40 0 modified
    @@ -10,6 +10,8 @@
     use Magento\Framework\App\Area;
     use Magento\Framework\App\Filesystem\DirectoryList;
     use Magento\Framework\Filesystem\Directory\ReadInterface;
    +use Magento\Framework\Exception\MailException;
    +use Magento\Framework\Exception\NoSuchEntityException;
     use Magento\Framework\View\Asset\File\FallbackContext;
     
     /**
    @@ -402,4 +404,42 @@ public function testConfigDirectiveUnavailable()
     
             $this->assertEquals($scopeConfigValue, $this->getModel()->configDirective($construction));
         }
    +
    +    /**
    +     * @throws MailException
    +     * @throws NoSuchEntityException
    +     */
    +    public function testProtocolDirectiveWithValidSchema()
    +    {
    +        $model = $this->getModel();
    +        $storeMock = $this->createMock(\Magento\Store\Model\Store::class);
    +        $storeMock->expects($this->once())->method('isCurrentlySecure')->willReturn(true);
    +        $this->storeManager->expects($this->once())->method('getStore')->willReturn($storeMock);
    +
    +        $data = [
    +            "{{protocol http=\"http://url\" https=\"https://url\"}}",
    +            "protocol",
    +            " http=\"http://url\" https=\"https://url\""
    +        ];
    +        $this->assertEquals('https://url', $model->protocolDirective($data));
    +    }
    +
    +    /**
    +     * @expectedException \Magento\Framework\Exception\MailException
    +     * @throws NoSuchEntityException
    +     */
    +    public function testProtocolDirectiveWithInvalidSchema()
    +    {
    +        $model = $this->getModel();
    +        $storeMock = $this->createMock(\Magento\Store\Model\Store::class);
    +        $storeMock->expects($this->once())->method('isCurrentlySecure')->willReturn(true);
    +        $this->storeManager->expects($this->once())->method('getStore')->willReturn($storeMock);
    +
    +        $data = [
    +            "{{protocol http=\"https://url\" https=\"http://url\"}}",
    +            "protocol",
    +            " http=\"https://url\" https=\"http://url\""
    +        ];
    +        $model->protocolDirective($data);
    +    }
     }
    
  • app/code/Magento/EncryptionKey/composer.json+5 4 modified
    @@ -6,9 +6,9 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-config": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-config": "101.1.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -22,5 +22,6 @@
             "psr-4": {
                 "Magento\\EncryptionKey\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/Fedex/composer.json+11 10 modified
    @@ -7,15 +7,15 @@
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
             "lib-libxml": "*",
    -        "magento/framework": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-catalog-inventory": "*",
    -        "magento/module-config": "*",
    -        "magento/module-directory": "*",
    -        "magento/module-quote": "*",
    -        "magento/module-sales": "*",
    -        "magento/module-shipping": "*",
    -        "magento/module-store": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-catalog-inventory": "100.3.*",
    +        "magento/module-config": "101.1.*",
    +        "magento/module-directory": "100.3.*",
    +        "magento/module-quote": "101.1.*",
    +        "magento/module-sales": "102.0.*",
    +        "magento/module-shipping": "100.3.*",
    +        "magento/module-store": "101.0.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -29,5 +29,6 @@
             "psr-4": {
                 "Magento\\Fedex\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/GiftMessage/composer.json+13 12 modified
    @@ -6,19 +6,19 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-checkout": "*",
    -        "magento/module-customer": "*",
    -        "magento/module-quote": "*",
    -        "magento/module-sales": "*",
    -        "magento/module-store": "*",
    -        "magento/module-ui": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-checkout": "100.3.*",
    +        "magento/module-customer": "102.0.*",
    +        "magento/module-quote": "101.1.*",
    +        "magento/module-sales": "102.0.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-ui": "101.1.*"
         },
         "suggest": {
    -        "magento/module-eav": "*",
    -        "magento/module-multishipping": "*"
    +        "magento/module-eav": "102.0.*",
    +        "magento/module-multishipping": "100.3.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -32,5 +32,6 @@
             "psr-4": {
                 "Magento\\GiftMessage\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4-p2"
     }
    
  • app/code/Magento/GoogleAdwords/composer.json+5 4 modified
    @@ -6,9 +6,9 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-sales": "*",
    -        "magento/module-store": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-sales": "102.0.*",
    +        "magento/module-store": "101.0.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -22,5 +22,6 @@
             "psr-4": {
                 "Magento\\GoogleAdwords\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/GoogleAnalytics/composer.json+7 6 modified
    @@ -6,13 +6,13 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-cookie": "*",
    -        "magento/module-sales": "*",
    -        "magento/module-store": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-cookie": "100.3.*",
    +        "magento/module-sales": "102.0.*",
    +        "magento/module-store": "101.0.*"
         },
         "suggest": {
    -        "magento/module-config": "*"
    +        "magento/module-config": "101.1.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -26,5 +26,6 @@
             "psr-4": {
                 "Magento\\GoogleAnalytics\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/GoogleOptimizer/composer.json+9 8 modified
    @@ -6,13 +6,13 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-cms": "*",
    -        "magento/module-google-analytics": "*",
    -        "magento/module-store": "*",
    -        "magento/module-ui": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-cms": "103.0.*",
    +        "magento/module-google-analytics": "100.3.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-ui": "101.1.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -26,5 +26,6 @@
             "psr-4": {
                 "Magento\\GoogleOptimizer\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4-p2"
     }
    
  • app/code/Magento/GraphQlCache/composer.json+5 4 modified
    @@ -4,9 +4,9 @@
         "type": "magento2-module",
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-page-cache": "*",
    -        "magento/module-graph-ql": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-page-cache": "100.3.*",
    +        "magento/module-graph-ql": "100.3.*"
         },
         "license": [
             "OSL-3.0",
    @@ -19,5 +19,6 @@
             "psr-4": {
                 "Magento\\GraphQlCache\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.2"
     }
    
  • app/code/Magento/GraphQl/composer.json+6 5 modified
    @@ -4,12 +4,12 @@
         "type": "magento2-module",
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/module-eav": "*",
    -        "magento/framework": "*"
    +        "magento/module-eav": "102.0.*",
    +        "magento/framework": "102.0.*"
         },
         "suggest": {
    -        "magento/module-webapi": "*",
    -        "magento/module-graph-ql-cache": "*"
    +        "magento/module-webapi": "100.3.*",
    +        "magento/module-graph-ql-cache": "100.3.*"
         },
         "license": [
             "OSL-3.0",
    @@ -22,5 +22,6 @@
             "psr-4": {
                 "Magento\\GraphQl\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/GroupedCatalogInventory/composer.json+6 5 modified
    @@ -6,10 +6,10 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-catalog-inventory": "*",
    -        "magento/module-grouped-product": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-catalog-inventory": "100.3.*",
    +        "magento/module-grouped-product": "100.3.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -23,5 +23,6 @@
             "psr-4": {
                 "Magento\\GroupedCatalogInventory\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.3"
     }
    
  • app/code/Magento/GroupedImportExport/composer.json+8 7 modified
    @@ -6,12 +6,12 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-catalog-import-export": "*",
    -        "magento/module-eav": "*",
    -        "magento/module-grouped-product": "*",
    -        "magento/module-import-export": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-catalog-import-export": "101.0.*",
    +        "magento/module-eav": "102.0.*",
    +        "magento/module-grouped-product": "100.3.*",
    +        "magento/module-import-export": "100.3.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -25,5 +25,6 @@
             "psr-4": {
                 "Magento\\GroupedImportExport\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/GroupedProduct/composer.json+16 15 modified
    @@ -6,22 +6,22 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-catalog-inventory": "*",
    -        "magento/module-checkout": "*",
    -        "magento/module-customer": "*",
    -        "magento/module-eav": "*",
    -        "magento/module-media-storage": "*",
    -        "magento/module-msrp": "*",
    -        "magento/module-quote": "*",
    -        "magento/module-sales": "*",
    -        "magento/module-store": "*",
    -        "magento/module-ui": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-catalog-inventory": "100.3.*",
    +        "magento/module-checkout": "100.3.*",
    +        "magento/module-customer": "102.0.*",
    +        "magento/module-eav": "102.0.*",
    +        "magento/module-media-storage": "100.3.*",
    +        "magento/module-msrp": "100.3.*",
    +        "magento/module-quote": "101.1.*",
    +        "magento/module-sales": "102.0.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-ui": "101.1.*"
         },
         "suggest": {
    -        "magento/module-grouped-product-sample-data": "*"
    +        "magento/module-grouped-product-sample-data": "Sample Data version: 100.3.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -35,5 +35,6 @@
             "psr-4": {
                 "Magento\\GroupedProduct\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/GroupedProductGraphQl/composer.json+6 5 modified
    @@ -4,10 +4,10 @@
         "type": "magento2-module",
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/module-grouped-product": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-catalog-graph-ql": "*",
    -        "magento/framework": "*"
    +        "magento/module-grouped-product": "100.3.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-catalog-graph-ql": "100.3.*",
    +        "magento/framework": "102.0.*"
         },
         "license": [
             "OSL-3.0",
    @@ -20,5 +20,6 @@
             "psr-4": {
                 "Magento\\GroupedProductGraphQl\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/ImportExport/composer.json+9 8 modified
    @@ -7,13 +7,13 @@
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
             "ext-ctype": "*",
    -        "magento/framework": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-eav": "*",
    -        "magento/module-media-storage": "*",
    -        "magento/module-store": "*",
    -        "magento/module-ui": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-eav": "102.0.*",
    +        "magento/module-media-storage": "100.3.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-ui": "101.1.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -27,5 +27,6 @@
             "psr-4": {
                 "Magento\\ImportExport\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4-p2"
     }
    
  • app/code/Magento/ImportExport/Test/Mftf/Test/AdminCheckThatSomeAttributesChangedValueToEmptyAfterImportTest.xml+3 0 modified
    @@ -42,6 +42,9 @@
                 <!--Delete attribute-->
                 <deleteData createDataKey="productAttribute" stepKey="deleteProductAttribute"/>
                 <actionGroup ref="logout" stepKey="logoutFromAdmin"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
             <!--Create product-->
             <actionGroup ref="GoToSpecifiedCreateProductPage" stepKey="openProductFillForm"/>
    
  • app/code/Magento/Indexer/composer.json+4 3 modified
    @@ -6,8 +6,8 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-backend": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-backend": "101.0.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -21,5 +21,6 @@
             "psr-4": {
                 "Magento\\Indexer\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4-p2"
     }
    
  • app/code/Magento/Indexer/Test/Mftf/ActionGroup/CliRunReindexUsingCronJobsActionGroup.xml+18 0 added
    @@ -0,0 +1,18 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<!--
    + /**
    +  * Copyright © Magento, Inc. All rights reserved.
    +  * See COPYING.txt for license details.
    +  */
    +-->
    +<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    +              xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd">
    +    <actionGroup name="CliRunReindexUsingCronJobsActionGroup">
    +        <annotations>
    +            <description>Run cron 'index' group which reindex all invalidated indices.</description>
    +        </annotations>
    +
    +        <magentoCLI command="cron:run" arguments="--group='index'" stepKey="firstRunToScheduleJobs"/>
    +        <magentoCLI command="cron:run" arguments="--group='index'" stepKey="secondRunToExecuteJobs"/>
    +    </actionGroup>
    +</actionGroups>
    
  • app/code/Magento/InstantPurchase/composer.json+26 25 modified
    @@ -1,28 +1,29 @@
     {
    -  "name": "magento/module-instant-purchase",
    -  "description": "N/A",
    -  "type": "magento2-module",
    -  "license": [
    -    "OSL-3.0",
    -    "AFL-3.0"
    -  ],
    -  "require": {
    -    "php": "~7.1.3||~7.2.0||~7.3.0",
    -    "magento/module-store": "*",
    -    "magento/module-catalog": "*",
    -    "magento/module-customer": "*",
    -    "magento/module-sales": "*",
    -    "magento/module-shipping": "*",
    -    "magento/module-quote": "*",
    -    "magento/module-vault": "*",
    -    "magento/framework": "*"
    -  },
    -  "autoload": {
    -    "files": [
    -      "registration.php"
    +    "name": "magento/module-instant-purchase",
    +    "description": "N/A",
    +    "type": "magento2-module",
    +    "license": [
    +        "OSL-3.0",
    +        "AFL-3.0"
         ],
    -    "psr-4": {
    -      "Magento\\InstantPurchase\\": ""
    -    }
    -  }
    +    "require": {
    +        "php": "~7.1.3||~7.2.0||~7.3.0",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-customer": "102.0.*",
    +        "magento/module-sales": "102.0.*",
    +        "magento/module-shipping": "100.3.*",
    +        "magento/module-quote": "101.1.*",
    +        "magento/module-vault": "101.1.*",
    +        "magento/framework": "102.0.*"
    +    },
    +    "autoload": {
    +        "files": [
    +            "registration.php"
    +        ],
    +        "psr-4": {
    +            "Magento\\InstantPurchase\\": ""
    +        }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/Integration/composer.json+9 8 modified
    @@ -6,13 +6,13 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-authorization": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-customer": "*",
    -        "magento/module-security": "*",
    -        "magento/module-store": "*",
    -        "magento/module-user": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-authorization": "100.3.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-customer": "102.0.*",
    +        "magento/module-security": "100.3.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-user": "101.1.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -26,5 +26,6 @@
             "psr-4": {
                 "Magento\\Integration\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4-p2"
     }
    
  • app/code/Magento/LayeredNavigation/Block/Navigation.php+1 0 modified
    @@ -76,6 +76,7 @@ protected function _prepareLayout()
     
         /**
          * @inheritdoc
    +     * @since 100.3.4
          */
         protected function _beforeToHtml()
         {
    
  • app/code/Magento/LayeredNavigation/composer.json+5 4 modified
    @@ -6,9 +6,9 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-config": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-config": "101.1.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -22,5 +22,6 @@
             "psr-4": {
                 "Magento\\LayeredNavigation\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/Marketplace/composer.json+4 3 modified
    @@ -6,8 +6,8 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-backend": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-backend": "101.0.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -21,5 +21,6 @@
             "psr-4": {
                 "Magento\\Marketplace\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/MediaGalleryApi/composer.json+3 2 modified
    @@ -3,7 +3,7 @@
         "description": "Magento module responsible for media gallery asset attributes storage and management",
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*"
    +        "magento/framework": "102.0.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -17,5 +17,6 @@
             "psr-4": {
                 "Magento\\MediaGalleryApi\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.0"
     }
    
  • app/code/Magento/MediaGallery/composer.json+6 5 modified
    @@ -3,10 +3,10 @@
         "description": "Magento module responsible for media handling",
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-media-gallery-api": "*",
    -        "magento/module-cms": "*",
    -        "magento/module-catalog": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-media-gallery-api": "100.3.*",
    +        "magento/module-cms": "103.0.*",
    +        "magento/module-catalog": "103.0.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -20,5 +20,6 @@
             "psr-4": {
                 "Magento\\MediaGallery\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.0-p2"
     }
    
  • app/code/Magento/MediaStorage/composer.json+8 7 modified
    @@ -6,12 +6,12 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-config": "*",
    -        "magento/module-store": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-theme": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-config": "101.1.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-theme": "101.0.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -25,5 +25,6 @@
             "psr-4": {
                 "Magento\\MediaStorage\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/MessageQueue/composer.json+3 2 modified
    @@ -5,7 +5,7 @@
             "sort-packages": true
         },
         "require": {
    -        "magento/framework": "*",
    +        "magento/framework": "102.0.*",
             "magento/magento-composer-installer": "*",
             "php": "~7.1.3||~7.2.0||~7.3.0"
         },
    @@ -21,5 +21,6 @@
             "psr-4": {
                 "Magento\\MessageQueue\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4-p2"
     }
    
  • app/code/Magento/Msrp/composer.json+10 9 modified
    @@ -6,16 +6,16 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-downloadable": "*",
    -        "magento/module-eav": "*",
    -        "magento/module-store": "*",
    -        "magento/module-tax": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-downloadable": "100.3.*",
    +        "magento/module-eav": "102.0.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-tax": "100.3.*"
         },
         "suggest": {
    -        "magento/module-bundle": "*",
    -        "magento/module-msrp-sample-data": "*"
    +        "magento/module-bundle": "100.3.*",
    +        "magento/module-msrp-sample-data": "Sample Data version: 100.3.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -29,5 +29,6 @@
             "psr-4": {
                 "Magento\\Msrp\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4-p2"
     }
    
  • app/code/Magento/MsrpConfigurableProduct/composer.json+6 5 modified
    @@ -6,10 +6,10 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-msrp": "*",
    -        "magento/module-configurable-product": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-msrp": "100.3.*",
    +        "magento/module-configurable-product": "100.3.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -23,5 +23,6 @@
             "psr-4": {
                 "Magento\\MsrpConfigurableProduct\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.3"
     }
    
  • app/code/Magento/MsrpGroupedProduct/composer.json+6 5 modified
    @@ -6,10 +6,10 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-msrp": "*",
    -        "magento/module-grouped-product": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-msrp": "100.3.*",
    +        "magento/module-grouped-product": "100.3.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -23,5 +23,6 @@
             "psr-4": {
                 "Magento\\MsrpGroupedProduct\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.3"
     }
    
  • app/code/Magento/Msrp/Test/Mftf/Test/StorefrontProductWithMapAssignedConfigProductIsCorrectTest.xml+3 0 modified
    @@ -105,6 +105,9 @@
                 <createData entity="MsrpDisableMAP" stepKey="disableMAP"/>
     
                 <actionGroup ref="logout" stepKey="logoutOfAdmin"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
     
             <!-- Set Manufacturer's Suggested Retail Price to products-->
    
  • app/code/Magento/Multishipping/composer.json+12 11 modified
    @@ -6,16 +6,16 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-checkout": "*",
    -        "magento/module-customer": "*",
    -        "magento/module-directory": "*",
    -        "magento/module-payment": "*",
    -        "magento/module-quote": "*",
    -        "magento/module-sales": "*",
    -        "magento/module-store": "*",
    -        "magento/module-tax": "*",
    -        "magento/module-theme": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-checkout": "100.3.*",
    +        "magento/module-customer": "102.0.*",
    +        "magento/module-directory": "100.3.*",
    +        "magento/module-payment": "100.3.*",
    +        "magento/module-quote": "101.1.*",
    +        "magento/module-sales": "102.0.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-tax": "100.3.*",
    +        "magento/module-theme": "101.0.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -29,5 +29,6 @@
             "psr-4": {
                 "Magento\\Multishipping\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/MysqlMq/composer.json+4 3 modified
    @@ -5,9 +5,9 @@
             "sort-packages": true
         },
         "require": {
    -        "magento/framework": "*",
    +        "magento/framework": "102.0.*",
             "magento/magento-composer-installer": "*",
    -        "magento/module-store": "*",
    +        "magento/module-store": "101.0.*",
             "php": "~7.1.3||~7.2.0||~7.3.0"
         },
         "type": "magento2-module",
    @@ -22,5 +22,6 @@
             "psr-4": {
                 "Magento\\MysqlMq\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4-p2"
     }
    
  • app/code/Magento/NewRelicReporting/composer.json+9 8 modified
    @@ -6,14 +6,14 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    +        "magento/framework": "102.0.*",
             "magento/magento-composer-installer": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-config": "*",
    -        "magento/module-configurable-product": "*",
    -        "magento/module-customer": "*",
    -        "magento/module-store": "*"
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-config": "101.1.*",
    +        "magento/module-configurable-product": "100.3.*",
    +        "magento/module-customer": "102.0.*",
    +        "magento/module-store": "101.0.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -27,5 +27,6 @@
             "psr-4": {
                 "Magento\\NewRelicReporting\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4-p2"
     }
    
  • app/code/Magento/Newsletter/Block/Adminhtml/Queue/Preview.php+5 1 modified
    @@ -26,8 +26,8 @@ class Preview extends \Magento\Newsletter\Block\Adminhtml\Template\Preview
         /**
          * @param \Magento\Backend\Block\Template\Context $context
          * @param \Magento\Newsletter\Model\TemplateFactory $templateFactory
    -     * @param \Magento\Newsletter\Model\QueueFactory $queueFactory
          * @param \Magento\Newsletter\Model\SubscriberFactory $subscriberFactory
    +     * @param \Magento\Newsletter\Model\QueueFactory $queueFactory
          * @param array $data
          */
         public function __construct(
    @@ -42,6 +42,8 @@ public function __construct(
         }
     
         /**
    +     * Load newsletter email template.
    +     *
          * @param \Magento\Newsletter\Model\Template $template
          * @param string $id
          * @return $this
    @@ -50,9 +52,11 @@ protected function loadTemplate(\Magento\Newsletter\Model\Template $template, $i
         {
             /** @var \Magento\Newsletter\Model\Queue $queue */
             $queue = $this->_queueFactory->create()->load($id);
    +        $template->setId($queue->getTemplateId());
             $template->setTemplateType($queue->getNewsletterType());
             $template->setTemplateText($queue->getNewsletterText());
             $template->setTemplateStyles($queue->getNewsletterStyles());
    +
             return $this;
         }
     }
    
  • app/code/Magento/Newsletter/composer.json+11 10 modified
    @@ -6,15 +6,15 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-cms": "*",
    -        "magento/module-customer": "*",
    -        "magento/module-eav": "*",
    -        "magento/module-email": "*",
    -        "magento/module-require-js": "*",
    -        "magento/module-store": "*",
    -        "magento/module-widget": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-cms": "103.0.*",
    +        "magento/module-customer": "102.0.*",
    +        "magento/module-eav": "102.0.*",
    +        "magento/module-email": "101.0.*",
    +        "magento/module-require-js": "100.3.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-widget": "101.1.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -28,5 +28,6 @@
             "psr-4": {
                 "Magento\\Newsletter\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4-p2"
     }
    
  • app/code/Magento/Newsletter/Test/Unit/Block/Adminhtml/Queue/PreviewTest.php+50 22 modified
    @@ -49,18 +49,18 @@ protected function setUp()
         {
             $context = $this->createMock(\Magento\Backend\Block\Template\Context::class);
             $eventManager = $this->createMock(\Magento\Framework\Event\ManagerInterface::class);
    -        $context->expects($this->once())->method('getEventManager')->will($this->returnValue($eventManager));
    +        $context->expects($this->once())->method('getEventManager')->willReturn($eventManager);
             $scopeConfig = $this->createMock(\Magento\Framework\App\Config\ScopeConfigInterface::class);
    -        $context->expects($this->once())->method('getScopeConfig')->will($this->returnValue($scopeConfig));
    +        $context->expects($this->once())->method('getScopeConfig')->willReturn($scopeConfig);
             $this->request = $this->createMock(\Magento\Framework\App\Request\Http::class);
    -        $context->expects($this->once())->method('getRequest')->will($this->returnValue($this->request));
    +        $context->expects($this->once())->method('getRequest')->willReturn($this->request);
             $this->storeManager = $this->createPartialMock(
                 \Magento\Store\Model\StoreManager::class,
                 ['getStores', 'getDefaultStoreView']
             );
    -        $context->expects($this->once())->method('getStoreManager')->will($this->returnValue($this->storeManager));
    +        $context->expects($this->once())->method('getStoreManager')->willReturn($this->storeManager);
             $appState = $this->createMock(\Magento\Framework\App\State::class);
    -        $context->expects($this->once())->method('getAppState')->will($this->returnValue($appState));
    +        $context->expects($this->once())->method('getAppState')->willReturn($appState);
     
             $backendSession = $this->getMockBuilder(\Magento\Backend\Model\Session::class)
                 ->disableOriginalConstructor()
    @@ -69,16 +69,34 @@ protected function setUp()
             $context->expects($this->once())->method('getBackendSession')->willReturn($backendSession);
     
             $templateFactory = $this->createPartialMock(\Magento\Newsletter\Model\TemplateFactory::class, ['create']);
    -        $this->template = $this->createMock(\Magento\Newsletter\Model\Template::class);
    -        $templateFactory->expects($this->once())->method('create')->will($this->returnValue($this->template));
    +        $this->template = $this->createPartialMock(
    +            \Magento\Newsletter\Model\Template::class,
    +            [
    +                'isPlain',
    +                'setId',
    +                'setTemplateType',
    +                'setTemplateText',
    +                'setTemplateStyles',
    +            ]
    +        );
    +        $templateFactory->expects($this->once())->method('create')->willReturn($this->template);
     
             $subscriberFactory = $this->createPartialMock(\Magento\Newsletter\Model\SubscriberFactory::class, ['create']);
             $this->subscriber = $this->createMock(\Magento\Newsletter\Model\Subscriber::class);
    -        $subscriberFactory->expects($this->once())->method('create')->will($this->returnValue($this->subscriber));
    +        $subscriberFactory->expects($this->once())->method('create')->willReturn($this->subscriber);
     
             $queueFactory = $this->createPartialMock(\Magento\Newsletter\Model\QueueFactory::class, ['create']);
    -        $this->queue = $this->createPartialMock(\Magento\Newsletter\Model\Queue::class, ['load']);
    -        $queueFactory->expects($this->any())->method('create')->will($this->returnValue($this->queue));
    +        $this->queue = $this->createPartialMock(
    +            \Magento\Newsletter\Model\Queue::class,
    +            [
    +                'load',
    +                'getTemplateId',
    +                'getNewsletterType',
    +                'getNewsletterText',
    +                'getNewsletterStyles',
    +            ]
    +        );
    +        $queueFactory->expects($this->any())->method('create')->willReturn($this->queue);
     
             $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
     
    @@ -100,27 +118,37 @@ public function testToHtmlEmpty()
         {
             /** @var \Magento\Store\Model\Store $store */
             $store = $this->createPartialMock(\Magento\Store\Model\Store::class, ['getId']);
    -        $this->storeManager->expects($this->once())->method('getDefaultStoreView')->will($this->returnValue($store));
    +        $this->storeManager->expects($this->once())->method('getDefaultStoreView')->willReturn($store);
             $result = $this->preview->toHtml();
             $this->assertEquals('', $result);
         }
     
         public function testToHtmlWithId()
         {
    -        $this->request->expects($this->any())->method('getParam')->will(
    -            $this->returnValueMap(
    -                [
    -                    ['id', null, 1],
    -                    ['store_id', null, 0]
    -                ]
    -            )
    +        $templateId = 1;
    +        $newsletterType = 2;
    +        $newsletterText = 'newsletter text';
    +        $newsletterStyle = 'style';
    +        $this->request->expects($this->any())->method('getParam')->willReturnMap(
    +            [
    +                ['id', null, 1],
    +                ['store_id', null, 0],
    +            ]
             );
    -        $this->queue->expects($this->once())->method('load')->will($this->returnSelf());
    -        $this->template->expects($this->any())->method('isPlain')->will($this->returnValue(true));
    +        $this->queue->expects($this->once())->method('load')->willReturnSelf();
    +        $this->queue->expects($this->once())->method('getTemplateId')->willReturn($templateId);
    +        $this->queue->expects($this->once())->method('getNewsletterType')->willReturn($newsletterType);
    +        $this->queue->expects($this->once())->method('getNewsletterText')->willReturn($newsletterText);
    +        $this->queue->expects($this->once())->method('getNewsletterStyles')->willReturn($newsletterStyle);
    +        $this->template->expects($this->any())->method('isPlain')->willReturn(true);
    +        $this->template->expects($this->once())->method('setId')->willReturn($templateId);
    +        $this->template->expects($this->once())->method('setTemplateType')->willReturn($newsletterType);
    +        $this->template->expects($this->once())->method('setTemplateText')->willReturn($newsletterText);
    +        $this->template->expects($this->once())->method('setTemplateStyles')->willReturn($newsletterStyle);
             /** @var \Magento\Store\Model\Store $store */
    -        $this->storeManager->expects($this->once())->method('getDefaultStoreView')->will($this->returnValue(null));
    +        $this->storeManager->expects($this->once())->method('getDefaultStoreView')->willReturn(null);
             $store = $this->createPartialMock(\Magento\Store\Model\Store::class, ['getId']);
    -        $this->storeManager->expects($this->once())->method('getStores')->will($this->returnValue([0 => $store]));
    +        $this->storeManager->expects($this->once())->method('getStores')->willReturn([0 => $store]);
             $result = $this->preview->toHtml();
             $this->assertEquals('<pre></pre>', $result);
         }
    
  • app/code/Magento/OfflinePayments/composer.json+6 5 modified
    @@ -6,12 +6,12 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-checkout": "*",
    -        "magento/module-payment": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-checkout": "100.3.*",
    +        "magento/module-payment": "100.3.*"
         },
         "suggest": {
    -        "magento/module-config": "*"
    +        "magento/module-config": "101.1.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -25,5 +25,6 @@
             "psr-4": {
                 "Magento\\OfflinePayments\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/OfflineShipping/composer.json+14 13 modified
    @@ -6,20 +6,20 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-config": "*",
    -        "magento/module-directory": "*",
    -        "magento/module-quote": "*",
    -        "magento/module-sales": "*",
    -        "magento/module-sales-rule": "*",
    -        "magento/module-shipping": "*",
    -        "magento/module-store": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-config": "101.1.*",
    +        "magento/module-directory": "100.3.*",
    +        "magento/module-quote": "101.1.*",
    +        "magento/module-sales": "102.0.*",
    +        "magento/module-sales-rule": "101.1.*",
    +        "magento/module-shipping": "100.3.*",
    +        "magento/module-store": "101.0.*"
         },
         "suggest": {
    -        "magento/module-checkout": "*",
    -        "magento/module-offline-shipping-sample-data": "*"
    +        "magento/module-checkout": "100.3.*",
    +        "magento/module-offline-shipping-sample-data": "Sample Data version: 100.3.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -33,5 +33,6 @@
             "psr-4": {
                 "Magento\\OfflineShipping\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4-p2"
     }
    
  • app/code/Magento/PageCache/composer.json+6 5 modified
    @@ -6,10 +6,10 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-config": "*",
    -        "magento/module-store": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-config": "101.1.*",
    +        "magento/module-store": "101.0.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -23,5 +23,6 @@
             "psr-4": {
                 "Magento\\PageCache\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/PageCache/Controller/Block/Render.php+1 1 modified
    @@ -11,7 +11,7 @@
     /**
      * Page cache render controller
      *
    - * @deprecated
    + * @deprecated 100.3.4
      */
     class Render extends \Magento\PageCache\Controller\Block implements HttpGetActionInterface
     {
    
  • app/code/Magento/Payment/composer.json+9 8 modified
    @@ -6,13 +6,13 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-checkout": "*",
    -        "magento/module-config": "*",
    -        "magento/module-directory": "*",
    -        "magento/module-quote": "*",
    -        "magento/module-sales": "*",
    -        "magento/module-store": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-checkout": "100.3.*",
    +        "magento/module-config": "101.1.*",
    +        "magento/module-directory": "100.3.*",
    +        "magento/module-quote": "101.1.*",
    +        "magento/module-sales": "102.0.*",
    +        "magento/module-store": "101.0.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -26,5 +26,6 @@
             "psr-4": {
                 "Magento\\Payment\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/PaypalCaptcha/composer.json+7 6 modified
    @@ -6,13 +6,13 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-captcha": "*",
    -        "magento/module-checkout": "*",
    -        "magento/module-store": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-captcha": "100.3.*",
    +        "magento/module-checkout": "100.3.*",
    +        "magento/module-store": "101.0.*"
         },
         "suggest": {
    -        "magento/module-paypal": "*"
    +        "magento/module-paypal": "100.3.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -26,5 +26,6 @@
             "psr-4": {
                 "Magento\\PaypalCaptcha\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.2"
     }
    
  • app/code/Magento/Paypal/composer.json+20 19 modified
    @@ -7,26 +7,26 @@
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
             "lib-libxml": "*",
    -        "magento/framework": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-checkout": "*",
    -        "magento/module-config": "*",
    -        "magento/module-customer": "*",
    -        "magento/module-directory": "*",
    -        "magento/module-eav": "*",
    -        "magento/module-instant-purchase": "*",
    -        "magento/module-payment": "*",
    -        "magento/module-quote": "*",
    -        "magento/module-sales": "*",
    -        "magento/module-store": "*",
    -        "magento/module-tax": "*",
    -        "magento/module-theme": "*",
    -        "magento/module-ui": "*",
    -        "magento/module-vault": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-checkout": "100.3.*",
    +        "magento/module-config": "101.1.*",
    +        "magento/module-customer": "102.0.*",
    +        "magento/module-directory": "100.3.*",
    +        "magento/module-eav": "102.0.*",
    +        "magento/module-instant-purchase": "100.3.*",
    +        "magento/module-payment": "100.3.*",
    +        "magento/module-quote": "101.1.*",
    +        "magento/module-sales": "102.0.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-tax": "100.3.*",
    +        "magento/module-theme": "101.0.*",
    +        "magento/module-ui": "101.1.*",
    +        "magento/module-vault": "101.1.*"
         },
         "suggest": {
    -        "magento/module-checkout-agreements": "*"
    +        "magento/module-checkout-agreements": "100.3.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -40,5 +40,6 @@
             "psr-4": {
                 "Magento\\Paypal\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4-p2"
     }
    
  • app/code/Magento/PaypalGraphQl/composer.json+11 10 modified
    @@ -6,17 +6,17 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-quote": "*",
    -        "magento/module-checkout": "*",
    -        "magento/module-paypal": "*",
    -        "magento/module-quote-graph-ql": "*",
    -        "magento/module-sales": "*",
    -        "magento/module-payment": "*",
    -        "magento/module-store": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-quote": "101.1.*",
    +        "magento/module-checkout": "100.3.*",
    +        "magento/module-paypal": "100.3.*",
    +        "magento/module-quote-graph-ql": "100.3.*",
    +        "magento/module-sales": "102.0.*",
    +        "magento/module-payment": "100.3.*",
    +        "magento/module-store": "101.0.*"
         },
         "suggest": {
    -        "magento/module-graph-ql": "*"
    +        "magento/module-graph-ql": "100.3.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -30,5 +30,6 @@
             "psr-4": {
                 "Magento\\PaypalGraphQl\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.1"
     }
    
  • app/code/Magento/Paypal/Model/Api/Nvp.php+14 14 modified
    @@ -1512,17 +1512,17 @@ protected function _applyStreetAndRegionWorkarounds(DataObject $address)
             }
             // attempt to fetch region_id from directory
             if ($address->getCountryId() && $address->getRegion()) {
    -            $regions = $this->_countryFactory->create()->loadByCode(
    -                $address->getCountryId()
    -            )->getRegionCollection()->addRegionCodeOrNameFilter(
    -                $address->getRegion()
    -            )->setPageSize(
    -                1
    -            );
    +            $regions = $this->_countryFactory->create()
    +                ->getRegionCollection()
    +                ->addCountryFilter($address->getCountryId())
    +                ->addRegionCodeOrNameFilter($address->getRegion())
    +                ->setPageSize(1);
                 $regionItems = $regions->getItems();
    -            $region = array_shift($regionItems);
    -            $address->setRegionId($region->getId());
    -            $address->setExportedKeys(array_merge($address->getExportedKeys(), ['region_id']));
    +            if (count($regionItems)) {
    +                $region = array_shift($regionItems);
    +                $address->setRegionId($region->getId());
    +                $address->setExportedKeys(array_merge($address->getExportedKeys(), ['region_id']));
    +            }
             }
         }
     
    @@ -1624,7 +1624,7 @@ protected function _filterPeriodUnit($value)
                 case 'year':
                     return 'Year';
                 default:
    -                break;
    +                return '';
             }
         }
     
    @@ -1653,7 +1653,7 @@ protected function _filterBillingAgreementStatus($value)
                 case 'active':
                     return 'Active';
                 default:
    -                break;
    +                return '';
             }
         }
     
    @@ -1694,7 +1694,7 @@ protected function _filterPaymentStatusFromNvpToInfo($value)
                 case 'Voided':
                     return \Magento\Paypal\Model\Info::PAYMENTSTATUS_VOIDED;
                 default:
    -                break;
    +                return null;
             }
         }
     
    @@ -1712,7 +1712,7 @@ protected function _filterPaymentReviewAction($value)
                 case \Magento\Paypal\Model\Pro::PAYMENT_REVIEW_DENY:
                     return 'Deny';
                 default:
    -                break;
    +                return null;
             }
         }
     
    
  • app/code/Magento/Persistent/composer.json+9 8 modified
    @@ -6,13 +6,13 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-checkout": "*",
    -        "magento/module-cron": "*",
    -        "magento/module-customer": "*",
    -        "magento/module-page-cache": "*",
    -        "magento/module-quote": "*",
    -        "magento/module-store": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-checkout": "100.3.*",
    +        "magento/module-cron": "100.3.*",
    +        "magento/module-customer": "102.0.*",
    +        "magento/module-page-cache": "100.3.*",
    +        "magento/module-quote": "101.1.*",
    +        "magento/module-store": "101.0.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -26,5 +26,6 @@
             "psr-4": {
                 "Magento\\Persistent\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4-p2"
     }
    
  • app/code/Magento/ProductAlert/composer.json+8 7 modified
    @@ -6,14 +6,14 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-customer": "*",
    -        "magento/module-store": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-customer": "102.0.*",
    +        "magento/module-store": "101.0.*"
         },
         "suggest": {
    -        "magento/module-config": "*"
    +        "magento/module-config": "101.1.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -27,5 +27,6 @@
             "psr-4": {
                 "Magento\\ProductAlert\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4-p2"
     }
    
  • app/code/Magento/ProductVideo/composer.json+10 9 modified
    @@ -6,17 +6,17 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    +        "magento/framework": "102.0.*",
             "magento/magento-composer-installer": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-eav": "*",
    -        "magento/module-media-storage": "*",
    -        "magento/module-store": "*"
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-eav": "102.0.*",
    +        "magento/module-media-storage": "100.3.*",
    +        "magento/module-store": "101.0.*"
         },
         "suggest": {
    -        "magento/module-customer": "*",
    -        "magento/module-config": "*"
    +        "magento/module-customer": "102.0.*",
    +        "magento/module-config": "101.1.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -30,5 +30,6 @@
             "psr-4": {
                 "Magento\\ProductVideo\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4-p2"
     }
    
  • app/code/Magento/QuoteAnalytics/composer.json+5 4 modified
    @@ -3,9 +3,9 @@
         "description": "N/A",
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-quote": "*",
    -        "magento/module-analytics": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-quote": "101.1.*",
    +        "magento/module-analytics": "100.3.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -19,5 +19,6 @@
             "psr-4": {
                 "Magento\\QuoteAnalytics\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/Quote/composer.json+18 17 modified
    @@ -6,24 +6,24 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-authorization": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-catalog-inventory": "*",
    -        "magento/module-checkout": "*",
    -        "magento/module-customer": "*",
    -        "magento/module-directory": "*",
    -        "magento/module-eav": "*",
    -        "magento/module-payment": "*",
    -        "magento/module-sales": "*",
    -        "magento/module-sales-sequence": "*",
    -        "magento/module-shipping": "*",
    -        "magento/module-store": "*",
    -        "magento/module-tax": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-authorization": "100.3.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-catalog-inventory": "100.3.*",
    +        "magento/module-checkout": "100.3.*",
    +        "magento/module-customer": "102.0.*",
    +        "magento/module-directory": "100.3.*",
    +        "magento/module-eav": "102.0.*",
    +        "magento/module-payment": "100.3.*",
    +        "magento/module-sales": "102.0.*",
    +        "magento/module-sales-sequence": "100.3.*",
    +        "magento/module-shipping": "100.3.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-tax": "100.3.*"
         },
         "suggest": {
    -        "magento/module-webapi": "*"
    +        "magento/module-webapi": "100.3.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -37,5 +37,6 @@
             "psr-4": {
                 "Magento\\Quote\\": ""
             }
    -    }
    +    },
    +    "version": "101.1.4-p2"
     }
    
  • app/code/Magento/QuoteGraphQl/composer.json+13 12 modified
    @@ -4,19 +4,19 @@
         "type": "magento2-module",
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-quote": "*",
    -        "magento/module-checkout": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-store": "*",
    -        "magento/module-customer": "*",
    -        "magento/module-customer-graph-ql": "*",
    -        "magento/module-sales": "*",
    -        "magento/module-directory": "*",
    -        "magento/module-graph-ql": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-quote": "101.1.*",
    +        "magento/module-checkout": "100.3.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-customer": "102.0.*",
    +        "magento/module-customer-graph-ql": "100.3.*",
    +        "magento/module-sales": "102.0.*",
    +        "magento/module-directory": "100.3.*",
    +        "magento/module-graph-ql": "100.3.*"
         },
         "suggest": {
    -        "magento/module-graph-ql-cache": "*"
    +        "magento/module-graph-ql-cache": "100.3.*"
         },
         "license": [
             "OSL-3.0",
    @@ -29,5 +29,6 @@
             "psr-4": {
                 "Magento\\QuoteGraphQl\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    
  • app/code/Magento/QuoteGraphQl/Model/Resolver/SetPaymentAndPlaceOrder.php+1 1 modified
    @@ -22,7 +22,7 @@
     /**
      * Resolver for setting payment method and placing order
      *
    - * @deprecated Should use setPaymentMethodOnCart and placeOrder mutations in single request.
    + * @deprecated 100.3.4 Should use setPaymentMethodOnCart and placeOrder mutations in single request.
      * @see \Magento\QuoteGraphQl\Model\Resolver\SetPaymentMethodOnCart
      * @see \Magento\QuoteGraphQl\Model\Resolver\PlaceOrder
      */
    
  • app/code/Magento/Quote/Test/Mftf/Test/StorefrontGuestCheckoutDisabledProductTest.xml+3 0 modified
    @@ -87,6 +87,9 @@
                 <deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/>
                 <amOnPage url="{{AdminProductIndexPage.url}}" stepKey="navigateToProductListing"/>
                 <actionGroup ref="resetProductGridToDefaultView" stepKey="resetGridToDefaultKeywordSearch"/>
    +
    +            <!-- Reindex invalidated indices after product attribute has been created/deleted -->
    +            <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/>
             </after>
             <!-- Step 1: Add simple product to shopping cart -->
             <amOnPage url="{{StorefrontProductPage.url($$createSimpleProduct.name$$)}}" stepKey="amOnSimpleProductPage"/>
    
  • app/code/Magento/RelatedProductGraphQl/composer.json+6 5 modified
    @@ -4,12 +4,12 @@
         "type": "magento2-module",
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/module-catalog": "*",
    -        "magento/module-catalog-graph-ql": "*",
    -        "magento/framework": "*"
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-catalog-graph-ql": "100.3.*",
    +        "magento/framework": "102.0.*"
         },
         "suggest": {
    -        "magento/module-graph-ql": "*"
    +        "magento/module-graph-ql": "100.3.*"
         },
         "license": [
             "OSL-3.0",
    @@ -22,5 +22,6 @@
             "psr-4": {
                 "Magento\\RelatedProductGraphQl\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.1"
     }
    
  • app/code/Magento/ReleaseNotification/composer.json+25 24 modified
    @@ -1,27 +1,28 @@
     {
    -  "name": "magento/module-release-notification",
    -  "description": "N/A",
    -  "require": {
    -    "php": "~7.1.3||~7.2.0||~7.3.0",
    -    "magento/module-user": "*",
    -    "magento/module-backend": "*",
    -    "magento/module-ui": "*",
    -    "magento/framework": "*"
    -  },
    -  "suggest": {
    -    "magento/module-config": "*"
    -  },
    -  "type": "magento2-module",
    -  "license": [
    -    "OSL-3.0",
    -    "AFL-3.0"
    -  ],
    -  "autoload": {
    -    "files": [
    -      "registration.php"
    +    "name": "magento/module-release-notification",
    +    "description": "N/A",
    +    "require": {
    +        "php": "~7.1.3||~7.2.0||~7.3.0",
    +        "magento/module-user": "101.1.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-ui": "101.1.*",
    +        "magento/framework": "102.0.*"
    +    },
    +    "suggest": {
    +        "magento/module-config": "101.1.*"
    +    },
    +    "type": "magento2-module",
    +    "license": [
    +        "OSL-3.0",
    +        "AFL-3.0"
         ],
    -    "psr-4": {
    -      "Magento\\ReleaseNotification\\": ""
    -    }
    -  }
    +    "autoload": {
    +        "files": [
    +            "registration.php"
    +        ],
    +        "psr-4": {
    +            "Magento\\ReleaseNotification\\": ""
    +        }
    +    },
    +    "version": "100.3.4-p2"
     }
    
  • app/code/Magento/Reports/composer.json+19 18 modified
    @@ -6,23 +6,23 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*",
    -        "magento/module-backend": "*",
    -        "magento/module-catalog": "*",
    -        "magento/module-catalog-inventory": "*",
    -        "magento/module-cms": "*",
    -        "magento/module-config": "*",
    -        "magento/module-customer": "*",
    -        "magento/module-downloadable": "*",
    -        "magento/module-eav": "*",
    -        "magento/module-quote": "*",
    -        "magento/module-review": "*",
    -        "magento/module-sales": "*",
    -        "magento/module-sales-rule": "*",
    -        "magento/module-store": "*",
    -        "magento/module-tax": "*",
    -        "magento/module-widget": "*",
    -        "magento/module-wishlist": "*"
    +        "magento/framework": "102.0.*",
    +        "magento/module-backend": "101.0.*",
    +        "magento/module-catalog": "103.0.*",
    +        "magento/module-catalog-inventory": "100.3.*",
    +        "magento/module-cms": "103.0.*",
    +        "magento/module-config": "101.1.*",
    +        "magento/module-customer": "102.0.*",
    +        "magento/module-downloadable": "100.3.*",
    +        "magento/module-eav": "102.0.*",
    +        "magento/module-quote": "101.1.*",
    +        "magento/module-review": "100.3.*",
    +        "magento/module-sales": "102.0.*",
    +        "magento/module-sales-rule": "101.1.*",
    +        "magento/module-store": "101.0.*",
    +        "magento/module-tax": "100.3.*",
    +        "magento/module-widget": "101.1.*",
    +        "magento/module-wishlist": "101.1.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -36,5 +36,6 @@
             "psr-4": {
                 "Magento\\Reports\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4-p2"
     }
    
  • app/code/Magento/RequireJs/composer.json+3 2 modified
    @@ -6,7 +6,7 @@
         },
         "require": {
             "php": "~7.1.3||~7.2.0||~7.3.0",
    -        "magento/framework": "*"
    +        "magento/framework": "102.0.*"
         },
         "type": "magento2-module",
         "license": [
    @@ -20,5 +20,6 @@
             "psr-4": {
                 "Magento\\RequireJs\\": ""
             }
    -    }
    +    },
    +    "version": "100.3.4"
     }
    

Vulnerability mechanics

Generated on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

4

News mentions

0

No linked articles in our index yet.