diff --git a/projects/packages/protect-models/changelog/protect-status-combine-vulns-into-extension-threat b/projects/packages/protect-models/changelog/protect-status-combine-vulns-into-extension-threat new file mode 100644 index 0000000000000..de7eb71625663 --- /dev/null +++ b/projects/packages/protect-models/changelog/protect-status-combine-vulns-into-extension-threat @@ -0,0 +1,4 @@ +Significance: minor +Type: changed + +Combine vulnerabilities for the same extension into single vulnerable extension threats. diff --git a/projects/packages/protect-models/composer.json b/projects/packages/protect-models/composer.json index 7664fbeff894f..1edebbaf5a3d5 100644 --- a/projects/packages/protect-models/composer.json +++ b/projects/packages/protect-models/composer.json @@ -4,7 +4,8 @@ "type": "jetpack-library", "license": "GPL-2.0-or-later", "require": { - "php": ">=7.2" + "php": ">=7.2", + "automattic/jetpack-redirect": "@dev" }, "require-dev": { "yoast/phpunit-polyfills": "^1.1.1", diff --git a/projects/packages/protect-models/src/class-threat-model.php b/projects/packages/protect-models/src/class-threat-model.php index bf8add53d530e..c588953468106 100644 --- a/projects/packages/protect-models/src/class-threat-model.php +++ b/projects/packages/protect-models/src/class-threat-model.php @@ -119,6 +119,15 @@ class Threat_Model { */ public $extension; + /** + * The threat's related vulnerabilities. + * + * @since $$next-version$$ + * + * @var null|Vulnerability_Model[] + */ + public $vulnerabilities; + /** * Threat Constructor * @@ -139,4 +148,118 @@ public function __construct( $threat ) { } } } + + /** + * Get the ID value of the threat based on its related extension and vulnerabilities. + * + * @since $$next-version$$ + * + * @param Extension_Model $extension The extension to get the ID from. + * + * @return string + */ + private static function get_id_from_vulnerable_extension( Extension_Model $extension ) { + return "$extension->type-$extension->slug-$extension->version"; + } + + /** + * Get the title from a vulnerable extension. + * + * @since $$next-version$$ + * + * @param Extension_Model $extension The extension to get the title from. + * + * @return string|null + */ + private static function get_title_from_vulnerable_extension( Extension_Model $extension ) { + $titles = array( + 'plugins' => sprintf( + /* translators: placeholders are the theme name and version number. Example: "Vulnerable theme: Jetpack (version 1.2.3)" */ + __( 'Vulnerable plugin: %1$s (version %2$s)', 'jetpack-protect-models' ), + $extension->name, + $extension->version + ), + 'themes' => sprintf( + /* translators: placeholders are the theme name and version number. Example: "Vulnerable theme: Jetpack (version 1.2.3)" */ + __( 'Vulnerable theme: %1$s (version %2$s)', 'jetpack-protect-models' ), + $extension->name, + $extension->version + ), + 'core' => sprintf( + /* translators: placeholder is the version number. Example: "Vulnerable WordPress (version 1.2.3)" */ + __( 'Vulnerable WordPress (version %s)', 'jetpack-protect-models' ), + $extension->version + ), + ); + + return $titles[ $extension->type ] ?? null; + } + + /** + * Get the description from a vulnerable extension. + * + * @since $$next-version$$ + * + * @param Extension_Model $extension The extension to get the description from. + * @param array $vulnerabilities The vulnerabilities to get the description from. + * + * @return string + */ + private static function get_description_from_vulnerable_extension( Extension_Model $extension, array $vulnerabilities ) { + return sprintf( + /* translators: placeholders are the theme name and version number. Example: "The installed version of Jetpack (1.2.3) has a known security vulnerability." */ + _n( 'The installed version of %1$s (%2$s) has a known security vulnerability.', 'The installed version of %1$s (%2$s) has known security vulnerabilities.', count( $vulnerabilities ), 'jetpack-protect-models' ), + $extension->name, + $extension->version + ); + } + + /** + * Get the latest fixed_in version from a list of vulnerabilities. + * + * @since $$next-version$$ + * + * @param array $vulnerabilities The vulnerabilities to get the fixed_in version from. + * + * @return string|bool|null The latest fixed_in version, or false if any of the vulnerabilities are not fixed. + */ + private static function get_fixed_in_from_vulnerabilities( array $vulnerabilities ) { + $fixed_in = null; + + foreach ( $vulnerabilities as $vulnerability ) { + // If any of the vulnerabilities are not fixed, the threat is not fixed. + if ( ! $vulnerability->fixed_in ) { + break; + } + + // Use the latest available fixed_in version. + if ( ! $fixed_in || ( $fixed_in && version_compare( $vulnerability->fixed_in, $fixed_in, '>' ) ) ) { + $fixed_in = $vulnerability->fixed_in; + } + } + + return $fixed_in; + } + + /** + * Generate a threat from extension vulnerabilities. + * + * @since $$next-version$$ + * + * @param Extension_Model $extension The extension to generate the threat for. + * @param Vulnerability_Model[] $vulnerabilities The vulnerabilities to generate the threat from. + * + * @return Threat_Model + */ + public static function generate_from_extension_vulnerabilities( Extension_Model $extension, array $vulnerabilities ) { + return new Threat_Model( + array( + 'id' => self::get_id_from_vulnerable_extension( $extension ), + 'title' => self::get_title_from_vulnerable_extension( $extension ), + 'description' => self::get_description_from_vulnerable_extension( $extension, $vulnerabilities ), + 'fixed_in' => self::get_fixed_in_from_vulnerabilities( $vulnerabilities ), + 'vulnerabilities' => $vulnerabilities, + ) + ); + } } diff --git a/projects/packages/protect-models/src/class-vulnerability-model.php b/projects/packages/protect-models/src/class-vulnerability-model.php new file mode 100644 index 0000000000000..210d5dc1aa74e --- /dev/null +++ b/projects/packages/protect-models/src/class-vulnerability-model.php @@ -0,0 +1,94 @@ + $value ) { + if ( property_exists( $this, $property ) ) { + $this->$property = $value; + } + } + + // Ensure the source URL is set. + $this->get_source(); + } + + /** + * Get the source URL for the threat. + * + * @return string + */ + public function get_source() { + if ( empty( $this->source ) && $this->id ) { + $this->source = Redirect::get_url( 'jetpack-protect-vul-info', array( 'path' => $this->id ) ); + } + + return $this->source; + } +} diff --git a/projects/packages/protect-status/changelog/combine-vulns-into-threat b/projects/packages/protect-status/changelog/combine-vulns-into-threat new file mode 100644 index 0000000000000..b35e964631a8c --- /dev/null +++ b/projects/packages/protect-status/changelog/combine-vulns-into-threat @@ -0,0 +1,4 @@ +Significance: minor +Type: changed + +Combine multiple vulnerability results for the same extension into a single vulnerable extension threat result. diff --git a/projects/packages/protect-status/src/class-protect-status.php b/projects/packages/protect-status/src/class-protect-status.php index 6a2aa2e0361eb..d09bf0ca6194c 100644 --- a/projects/packages/protect-status/src/class-protect-status.php +++ b/projects/packages/protect-status/src/class-protect-status.php @@ -15,7 +15,7 @@ use Automattic\Jetpack\Protect_Models\Extension_Model; use Automattic\Jetpack\Protect_Models\Status_Model; use Automattic\Jetpack\Protect_Models\Threat_Model; -use Automattic\Jetpack\Redirect; +use Automattic\Jetpack\Protect_Models\Vulnerability_Model; use Automattic\Jetpack\Sync\Functions as Sync_Functions; use Jetpack_Options; use WP_Error; @@ -223,21 +223,29 @@ protected static function normalize_extension_data( &$status, $report_data, $ext continue; } - $extension->checked = true; + $extension->checked = true; + $extension_threats[ $slug ] = $extension; - foreach ( $checked_extension->vulnerabilities as $vulnerability ) { - $threat = new Threat_Model( $vulnerability ); - $threat->source = isset( $vulnerability->id ) ? Redirect::get_url( 'jetpack-protect-vul-info', array( 'path' => $vulnerability->id ) ) : null; + if ( ! empty( $checked_extension->vulnerabilities ) ) { + // normalize the vulnerabilities data + $vulnerabilities = array_map( + function ( $vulnerability ) { + return new Vulnerability_Model( $vulnerability ); + }, + $checked_extension->vulnerabilities + ); + + // convert the detected vulnerabilities into a vulnerable extension threat + $threat = Threat_Model::generate_from_extension_vulnerabilities( $extension, $vulnerabilities ); - $threat_extension = clone $extension; - $extension_threat = clone $threat; - $extension_threat->extension = null; + $threat_extension = clone $extension; + $extension_threat = clone $threat; + $extension_threat->extension = null; $extension_threats[ $slug ]->threats[] = $extension_threat; $threat->extension = $threat_extension; $status->threats[] = $threat; - } } @@ -282,27 +290,26 @@ protected static function normalize_core_data( &$status, $report_data ) { // If we've made it this far, the core version has been checked. $core->checked = true; - // Extract threat data from the report. - if ( is_array( $report_data->core->vulnerabilities ) ) { - foreach ( $report_data->core->vulnerabilities as $vulnerability ) { - $threat = new Threat_Model( - array( - 'id' => $vulnerability->id, - 'title' => $vulnerability->title, - 'fixed_in' => $vulnerability->fixed_in, - 'description' => isset( $vulnerability->description ) ? $vulnerability->description : null, - 'source' => isset( $vulnerability->id ) ? Redirect::get_url( 'jetpack-protect-vul-info', array( 'path' => $vulnerability->id ) ) : null, - ) - ); + // Generate a threat from core vulnerabilities. + if ( ! empty( $report_data->core->vulnerabilities ) ) { + // normalize the vulnerabilities data + $vulnerabilities = array_map( + function ( $vulnerability ) { + return new Vulnerability_Model( $vulnerability ); + }, + $report_data->core->vulnerabilities + ); - $threat_extension = clone $core; - $extension_threat = clone $threat; + // convert the detected vulnerabilities into a vulnerable extension threat + $threat = Threat_Model::generate_from_extension_vulnerabilities( $core, $vulnerabilities ); - $core->threats[] = $extension_threat; - $threat->extension = $threat_extension; + $threat_extension = clone $core; + $extension_threat = clone $threat; - $status->threats[] = $threat; - } + $core->threats[] = $extension_threat; + $threat->extension = $threat_extension; + + $status->threats[] = $threat; } $status->core = $core; diff --git a/projects/packages/protect-status/tests/php/test-status.php b/projects/packages/protect-status/tests/php/test-status.php index 728c83f537537..0416524cca1c3 100644 --- a/projects/packages/protect-status/tests/php/test-status.php +++ b/projects/packages/protect-status/tests/php/test-status.php @@ -13,6 +13,7 @@ use Automattic\Jetpack\Protect_Models\Extension_Model; use Automattic\Jetpack\Protect_Models\Status_Model; use Automattic\Jetpack\Protect_Models\Threat_Model; +use Automattic\Jetpack\Protect_Models\Vulnerability_Model; use Jetpack_Options; use WorDBless\BaseTestCase; @@ -103,14 +104,14 @@ public function get_sample_api_response() { 'themes' => (object) array( 'theme-1' => (object) array( 'slug' => 'theme-1', - 'name' => 'Sample Theme', + 'name' => 'Sample Theme 1', 'version' => '1.0.2', 'checked' => true, 'vulnerabilities' => array( (object) array( 'id' => 'test-vuln-1', 'title' => 'Test Vuln 1', - 'fixed_in' => '2.0.0', + 'fixed_in' => '1.0.0', ), ), ), @@ -118,7 +119,7 @@ public function get_sample_api_response() { 'plugins' => (object) array( 'plugin-1' => (object) array( 'slug' => 'plugin-1', - 'name' => 'Sample Plugin', + 'name' => 'Sample Plugin 1', 'version' => '1.0.2', 'checked' => true, 'vulnerabilities' => array( @@ -131,7 +132,7 @@ public function get_sample_api_response() { ), 'plugin-2' => (object) array( 'slug' => 'plugin-2', - 'name' => 'Sample Plugin', + 'name' => 'Sample Plugin 2', 'version' => '1.0.2', 'checked' => true, 'vulnerabilities' => array(), @@ -144,7 +145,7 @@ public function get_sample_api_response() { (object) array( 'id' => 'test-vuln-3', 'title' => 'Test Vuln 3', - 'fixed_in' => '2.0.0', + 'fixed_in' => null, ), ), 'name' => 'WordPress', @@ -155,11 +156,118 @@ public function get_sample_api_response() { /** * Get a sample result of Protect_Status::get_status(). * + * @phan-suppress PhanDeprecatedProperty -- Testing backwards compatibility. + * * @return object */ public function get_sample_status() { global $wp_version; + $vulnerability_1 = new Vulnerability_Model( + array( + 'id' => 'test-vuln-1', + 'title' => 'Test Vuln 1', + 'fixed_in' => '1.0.0', + ) + ); + + $vulnerability_2 = new Vulnerability_Model( + array( + 'id' => 'test-vuln-2', + 'title' => 'Test Vuln 2', + 'fixed_in' => '2.0.0', + ) + ); + + $vulnerability_3 = new Vulnerability_Model( + array( + 'id' => 'test-vuln-3', + 'title' => 'Test Vuln 3', + 'fixed_in' => null, + ) + ); + + $plugin_1 = new Extension_Model( + array( + 'version' => '1.0.2', + 'name' => 'Sample Plugin 1', + 'checked' => true, + 'type' => 'plugins', + 'slug' => 'plugin-1', + ) + ); + + $theme_1 = new Extension_Model( + array( + 'version' => '1.0.2', + 'name' => 'Sample Theme 1', + 'checked' => true, + 'type' => 'themes', + 'slug' => 'theme-1', + ) + ); + + $core = new Extension_Model( + array( + 'version' => $wp_version, + 'name' => 'WordPress', + 'checked' => true, + 'type' => 'core', + 'slug' => 'wordpress', + ) + ); + + $plugin_1_threat = new Threat_Model( + array( + 'id' => 'plugins-plugin-1-1.0.2', + 'title' => 'Vulnerable plugin: Sample Plugin 1 (version 1.0.2)', + 'description' => 'The installed version of Sample Plugin 1 (1.0.2) has a known security vulnerability.', + 'fixed_in' => '2.0.0', + 'source' => null, + 'vulnerabilities' => array( $vulnerability_2 ), + ) + ); + + $theme_1_threat = new Threat_Model( + array( + 'id' => 'themes-theme-1-1.0.2', + 'title' => 'Vulnerable theme: Sample Theme 1 (version 1.0.2)', + 'description' => 'The installed version of Sample Theme 1 (1.0.2) has a known security vulnerability.', + 'fixed_in' => '1.0.0', + 'source' => null, + 'vulnerabilities' => array( $vulnerability_1 ), + ) + ); + + $core_threat = new Threat_Model( + array( + 'id' => 'core-wordpress-' . $wp_version, + 'title' => 'Vulnerable WordPress (version ' . $wp_version . ')', + 'description' => 'The installed version of WordPress (' . $wp_version . ') has a known security vulnerability.', + 'fixed_in' => null, + 'source' => null, + 'vulnerabilities' => array( $vulnerability_3 ), + ) + ); + + $core_threat_with_extension = clone $core_threat; + $core_threat_with_extension->extension = $core; + + $plugin_1_threat_with_extension = clone $plugin_1_threat; + $plugin_1_threat_with_extension->extension = $plugin_1; + + $theme_1_threat_with_extension = clone $theme_1_threat; + $theme_1_threat_with_extension->extension = $theme_1; + + $plugin_1_with_threats = clone $plugin_1; + $plugin_1_with_threats->threats = array( $plugin_1_threat ); + + $theme_1_with_threats = clone $theme_1; + $theme_1_with_threats->threats = array( $theme_1_threat ); + + $core_with_threats = clone $core; + $core_with_threats->threats = array( $core_threat ); + return new Status_Model( array( 'data_source' => 'protect_report', @@ -172,125 +280,23 @@ public function get_sample_status() { new Extension_Model( array( 'version' => '1.0.2', - 'name' => 'Sample Plugin', + 'name' => 'Sample Plugin 2', 'checked' => true, 'type' => 'plugins', 'threats' => array(), 'slug' => 'plugin-2', ) ), - new Extension_Model( - array( - 'version' => '1.0.2', - 'name' => 'Sample Plugin', - 'checked' => true, - 'type' => 'plugins', - 'threats' => array( - new Threat_Model( - array( - 'id' => 'test-vuln-2', - 'title' => 'Test Vuln 2', - 'fixed_in' => '2.0.0', - 'source' => 'https://jetpack.com/redirect/?source=jetpack-protect-vul-info&site=example.org&path=test-vuln-2', - ) - ), - ), - 'slug' => 'plugin-1', - ) - ), + $plugin_1_with_threats, ), 'themes' => array( - new Extension_Model( - array( - 'version' => '1.0.2', - 'name' => 'Sample Theme', - 'checked' => true, - 'type' => 'themes', - 'threats' => array( - new Threat_Model( - array( - 'id' => 'test-vuln-1', - 'title' => 'Test Vuln 1', - 'fixed_in' => '2.0.0', - 'source' => 'https://jetpack.com/redirect/?source=jetpack-protect-vul-info&site=example.org&path=test-vuln-1', - ) - ), - ), - 'slug' => 'theme-1', - ) - ), - ), - 'core' => new Extension_Model( - array( - 'version' => $wp_version, - 'threats' => array( - new Threat_Model( - array( - 'id' => 'test-vuln-3', - 'title' => 'Test Vuln 3', - 'fixed_in' => '2.0.0', - 'source' => 'https://jetpack.com/redirect/?source=jetpack-protect-vul-info&site=example.org&path=test-vuln-3', - ) - ), - ), - 'checked' => true, - 'name' => 'WordPress', - 'slug' => 'wordpress', - 'type' => 'core', - ) + $theme_1_with_threats, ), + 'core' => $core_with_threats, 'threats' => array( - new Threat_Model( - array( - 'id' => 'test-vuln-1', - 'title' => 'Test Vuln 1', - 'fixed_in' => '2.0.0', - 'source' => 'https://jetpack.com/redirect/?source=jetpack-protect-vul-info&site=example.org&path=test-vuln-1', - 'extension' => new Extension_Model( - array( - 'version' => '1.0.2', - 'name' => 'Sample Theme', - 'checked' => true, - 'type' => 'themes', - 'slug' => 'theme-1', - ) - ), - ) - ), - new Threat_Model( - array( - 'id' => 'test-vuln-2', - 'title' => 'Test Vuln 2', - 'fixed_in' => '2.0.0', - 'source' => 'https://jetpack.com/redirect/?source=jetpack-protect-vul-info&site=example.org&path=test-vuln-2', - 'extension' => new Extension_Model( - array( - 'version' => '1.0.2', - 'name' => 'Sample Plugin', - 'checked' => true, - 'type' => 'plugins', - 'slug' => 'plugin-1', - ) - ), - ) - ), - new Threat_Model( - array( - 'id' => 'test-vuln-3', - 'title' => 'Test Vuln 3', - 'fixed_in' => '2.0.0', - 'source' => 'https://jetpack.com/redirect/?source=jetpack-protect-vul-info&site=example.org&path=test-vuln-3', - 'extension' => new Extension_Model( - array( - 'version' => $wp_version, - 'name' => 'WordPress', - 'checked' => true, - 'type' => 'core', - 'slug' => 'wordpress', - ) - ), - ) - ), + $theme_1_threat_with_extension, + $plugin_1_threat_with_extension, + $core_threat_with_extension, ), ) ); @@ -319,11 +325,11 @@ public function return_sample_response() { public function return_sample_plugins() { return array( 'plugin-1' => array( - 'Name' => 'Sample Plugin', + 'Name' => 'Sample Plugin 1', 'Version' => '1.0.2', ), 'plugin-2' => array( - 'Name' => 'Sample Plugin', + 'Name' => 'Sample Plugin 2', 'Version' => '1.0.2', ), ); @@ -337,7 +343,7 @@ public function return_sample_plugins() { public function return_sample_themes() { return array( 'theme-1' => array( - 'Name' => 'Sample Theme', + 'Name' => 'Sample Theme 1', 'Version' => '1.0.2', ), ); diff --git a/projects/plugins/backup/changelog/update-lock-file b/projects/plugins/backup/changelog/update-lock-file new file mode 100644 index 0000000000000..b6c4ffc2f7e11 --- /dev/null +++ b/projects/plugins/backup/changelog/update-lock-file @@ -0,0 +1,4 @@ +Significance: patch +Type: changed + +Updated composer.lock diff --git a/projects/plugins/backup/composer.lock b/projects/plugins/backup/composer.lock index 9500dd5df1743..1fd32892e395d 100644 --- a/projects/plugins/backup/composer.lock +++ b/projects/plugins/backup/composer.lock @@ -1434,6 +1434,7 @@ "reference": "6b8a84b23ab688f32c77c37bf835ef2b9d3ef6b1" }, "require": { + "automattic/jetpack-redirect": "@dev", "php": ">=7.2" }, "require-dev": { diff --git a/projects/plugins/boost/changelog/update-lock-file b/projects/plugins/boost/changelog/update-lock-file new file mode 100644 index 0000000000000..b6c4ffc2f7e11 --- /dev/null +++ b/projects/plugins/boost/changelog/update-lock-file @@ -0,0 +1,4 @@ +Significance: patch +Type: changed + +Updated composer.lock diff --git a/projects/plugins/boost/composer.lock b/projects/plugins/boost/composer.lock index 974a3ca7adcac..7b77fe4e06826 100644 --- a/projects/plugins/boost/composer.lock +++ b/projects/plugins/boost/composer.lock @@ -1424,6 +1424,7 @@ "reference": "6b8a84b23ab688f32c77c37bf835ef2b9d3ef6b1" }, "require": { + "automattic/jetpack-redirect": "@dev", "php": ">=7.2" }, "require-dev": { diff --git a/projects/plugins/jetpack/changelog/update-lock-file b/projects/plugins/jetpack/changelog/update-lock-file new file mode 100644 index 0000000000000..b327150ba8075 --- /dev/null +++ b/projects/plugins/jetpack/changelog/update-lock-file @@ -0,0 +1,4 @@ +Significance: patch +Type: other + +Update composer.lock diff --git a/projects/plugins/jetpack/composer.lock b/projects/plugins/jetpack/composer.lock index 9fa189498b6e9..be6fd35acc7df 100644 --- a/projects/plugins/jetpack/composer.lock +++ b/projects/plugins/jetpack/composer.lock @@ -2062,6 +2062,7 @@ "reference": "6b8a84b23ab688f32c77c37bf835ef2b9d3ef6b1" }, "require": { + "automattic/jetpack-redirect": "@dev", "php": ">=7.2" }, "require-dev": { diff --git a/projects/plugins/protect/changelog/update-lock-file b/projects/plugins/protect/changelog/update-lock-file new file mode 100644 index 0000000000000..b6c4ffc2f7e11 --- /dev/null +++ b/projects/plugins/protect/changelog/update-lock-file @@ -0,0 +1,4 @@ +Significance: patch +Type: changed + +Updated composer.lock diff --git a/projects/plugins/protect/composer.lock b/projects/plugins/protect/composer.lock index cd1cff1cd428f..94403ea8a5f5f 100644 --- a/projects/plugins/protect/composer.lock +++ b/projects/plugins/protect/composer.lock @@ -1350,6 +1350,7 @@ "reference": "6b8a84b23ab688f32c77c37bf835ef2b9d3ef6b1" }, "require": { + "automattic/jetpack-redirect": "@dev", "php": ">=7.2" }, "require-dev": { diff --git a/projects/plugins/search/changelog/update-lock-file b/projects/plugins/search/changelog/update-lock-file new file mode 100644 index 0000000000000..b6c4ffc2f7e11 --- /dev/null +++ b/projects/plugins/search/changelog/update-lock-file @@ -0,0 +1,4 @@ +Significance: patch +Type: changed + +Updated composer.lock diff --git a/projects/plugins/search/composer.lock b/projects/plugins/search/composer.lock index e48068e900a3b..3f264a236ffa0 100644 --- a/projects/plugins/search/composer.lock +++ b/projects/plugins/search/composer.lock @@ -1296,6 +1296,7 @@ "reference": "6b8a84b23ab688f32c77c37bf835ef2b9d3ef6b1" }, "require": { + "automattic/jetpack-redirect": "@dev", "php": ">=7.2" }, "require-dev": { diff --git a/projects/plugins/social/changelog/update-lock-file b/projects/plugins/social/changelog/update-lock-file new file mode 100644 index 0000000000000..b6c4ffc2f7e11 --- /dev/null +++ b/projects/plugins/social/changelog/update-lock-file @@ -0,0 +1,4 @@ +Significance: patch +Type: changed + +Updated composer.lock diff --git a/projects/plugins/social/composer.lock b/projects/plugins/social/composer.lock index 83745021c30be..c71bc5a19b9a1 100644 --- a/projects/plugins/social/composer.lock +++ b/projects/plugins/social/composer.lock @@ -1355,6 +1355,7 @@ "reference": "6b8a84b23ab688f32c77c37bf835ef2b9d3ef6b1" }, "require": { + "automattic/jetpack-redirect": "@dev", "php": ">=7.2" }, "require-dev": { diff --git a/projects/plugins/starter-plugin/changelog/update-lock-file b/projects/plugins/starter-plugin/changelog/update-lock-file new file mode 100644 index 0000000000000..b6c4ffc2f7e11 --- /dev/null +++ b/projects/plugins/starter-plugin/changelog/update-lock-file @@ -0,0 +1,4 @@ +Significance: patch +Type: changed + +Updated composer.lock diff --git a/projects/plugins/starter-plugin/composer.lock b/projects/plugins/starter-plugin/composer.lock index 2a773f86d3ec8..8f76fd1c0bf1b 100644 --- a/projects/plugins/starter-plugin/composer.lock +++ b/projects/plugins/starter-plugin/composer.lock @@ -1296,6 +1296,7 @@ "reference": "6b8a84b23ab688f32c77c37bf835ef2b9d3ef6b1" }, "require": { + "automattic/jetpack-redirect": "@dev", "php": ">=7.2" }, "require-dev": { diff --git a/projects/plugins/videopress/changelog/update-lock-file b/projects/plugins/videopress/changelog/update-lock-file new file mode 100644 index 0000000000000..b6c4ffc2f7e11 --- /dev/null +++ b/projects/plugins/videopress/changelog/update-lock-file @@ -0,0 +1,4 @@ +Significance: patch +Type: changed + +Updated composer.lock diff --git a/projects/plugins/videopress/composer.lock b/projects/plugins/videopress/composer.lock index 4925b0bdb9b2f..7e143f73219fa 100644 --- a/projects/plugins/videopress/composer.lock +++ b/projects/plugins/videopress/composer.lock @@ -1296,6 +1296,7 @@ "reference": "6b8a84b23ab688f32c77c37bf835ef2b9d3ef6b1" }, "require": { + "automattic/jetpack-redirect": "@dev", "php": ">=7.2" }, "require-dev": {