From 51859e212bc0bba74369725986e7a2d89064eaa1 Mon Sep 17 00:00:00 2001 From: Przemek Kuliga Date: Thu, 21 Mar 2024 14:05:15 +0100 Subject: [PATCH 01/18] Paywall: Switching accounts URL fix (#36337) --- .../update-paywall-switch-accounts-token-fix | 4 ++ .../blocks/subscriptions/subscriptions.php | 41 ++++++++----------- 2 files changed, 20 insertions(+), 25 deletions(-) create mode 100644 projects/plugins/jetpack/changelog/update-paywall-switch-accounts-token-fix diff --git a/projects/plugins/jetpack/changelog/update-paywall-switch-accounts-token-fix b/projects/plugins/jetpack/changelog/update-paywall-switch-accounts-token-fix new file mode 100644 index 0000000000000..04fa7630015cf --- /dev/null +++ b/projects/plugins/jetpack/changelog/update-paywall-switch-accounts-token-fix @@ -0,0 +1,4 @@ +Significance: patch +Type: other + +Paywall: Switching accounts URL fix diff --git a/projects/plugins/jetpack/extensions/blocks/subscriptions/subscriptions.php b/projects/plugins/jetpack/extensions/blocks/subscriptions/subscriptions.php index b81e75b66b6d0..32c29b156b593 100644 --- a/projects/plugins/jetpack/extensions/blocks/subscriptions/subscriptions.php +++ b/projects/plugins/jetpack/extensions/blocks/subscriptions/subscriptions.php @@ -1095,36 +1095,28 @@ function get_paywall_blocks( $newsletter_access_level ) { // translators: %s is the name of the site. : esc_html__( 'Subscribe to get access to the rest of this post and other subscriber-only content.', 'jetpack' ); - $sign_in = ''; - $switch_accounts = ''; + $login_block = ''; - if ( ( new Host() )->is_wpcom_simple() ) { - // On WPCOM we will redirect directly to the current page - $redirect_url = get_current_url(); - } else { - // On self-hosted we will save and hide the token - $redirect_url = get_site_url() . '/wp-json/jetpack/v4/subscribers/auth'; - $redirect_url = add_query_arg( 'redirect_url', get_current_url(), $redirect_url ); - } - - $sign_in_link = add_query_arg( - array( - 'site_id' => intval( \Jetpack_Options::get_option( 'id' ) ), - 'redirect_url' => rawurlencode( $redirect_url ), - ), - 'https://subscribe.wordpress.com/memberships/jwt/' - ); if ( is_user_auth() ) { if ( ( new Host() )->is_wpcom_simple() ) { - $switch_accounts_link = wp_logout_url( $sign_in_link ); - $switch_accounts = ' -

' . __( 'Switch Accounts', 'jetpack' ) . '

+ // We cannot use wpcom_logmein_redirect_url since it returns redirect URL when user is already logged in. + $login_link = add_query_arg( + array( + 'redirect_to' => rawurlencode( get_current_url() ), + 'blog_id' => get_current_blog_id(), + ), + 'https://wordpress.com/log-in/link' + ); + $switch_accounts_link = wp_logout_url( $login_link ); + $login_block = ' +

+ ' . __( 'Switch accounts', 'jetpack' ) . ' +

'; - } } else { $access_question = get_paywall_access_question( $newsletter_access_level ); - $sign_in = ' + $login_block = '
@@ -1149,8 +1141,7 @@ function get_paywall_blocks( $newsletter_access_level ) { -' . $sign_in . ' -' . $switch_accounts . ' +' . $login_block . ' '; From 79ee16951b9fb3d86d0dc5ff373fe8c6f527cab1 Mon Sep 17 00:00:00 2001 From: Kev Date: Thu, 21 Mar 2024 10:05:05 -0400 Subject: [PATCH 02/18] My Jetpack: Refactor ConnectionScreen component (#36499) --- .../components/connection-screen/body.tsx | 69 +++++++++ .../components/connection-screen/footer.tsx | 32 ++++ .../components/connection-screen/index.jsx | 137 ------------------ .../components/connection-screen/index.tsx | 28 ++++ .../use-my-jetpack-return-to-page/index.ts | 23 +++ .../refactor-connection-screen-duplicate | 5 + projects/packages/my-jetpack/global.d.ts | 5 + 7 files changed, 162 insertions(+), 137 deletions(-) create mode 100644 projects/packages/my-jetpack/_inc/components/connection-screen/body.tsx create mode 100644 projects/packages/my-jetpack/_inc/components/connection-screen/footer.tsx delete mode 100644 projects/packages/my-jetpack/_inc/components/connection-screen/index.jsx create mode 100644 projects/packages/my-jetpack/_inc/components/connection-screen/index.tsx create mode 100644 projects/packages/my-jetpack/_inc/hooks/use-my-jetpack-return-to-page/index.ts create mode 100644 projects/packages/my-jetpack/changelog/refactor-connection-screen-duplicate diff --git a/projects/packages/my-jetpack/_inc/components/connection-screen/body.tsx b/projects/packages/my-jetpack/_inc/components/connection-screen/body.tsx new file mode 100644 index 0000000000000..fb75f82979137 --- /dev/null +++ b/projects/packages/my-jetpack/_inc/components/connection-screen/body.tsx @@ -0,0 +1,69 @@ +import { getRedirectUrl } from '@automattic/jetpack-components'; +import { ConnectScreen } from '@automattic/jetpack-connection'; +import { VisuallyHidden } from '@wordpress/components'; +import { __ } from '@wordpress/i18n'; +import { Icon, external } from '@wordpress/icons'; +import useMyJetpackConnection from '../../hooks/use-my-jetpack-connection'; +import connectImage from './connect.png'; +import ConnectionScreenFooter from './footer'; +import styles from './styles.module.scss'; + +type Props = { + redirectUri: string; +}; + +const ConnectionScreenBody: React.FC< Props > = ( { redirectUri } ) => { + const { apiRoot, apiNonce, registrationNonce } = useMyJetpackConnection(); + + return ( + } + from="my-jetpack" + redirectUri={ redirectUri } + > + { /* + Since the list style type is set to none, `role=list` is required for VoiceOver (on Safari) to announce the list. + See: https://www.scottohara.me/blog/2019/01/12/lists-and-safari.html + */ } + + + ); +}; + +export default ConnectionScreenBody; diff --git a/projects/packages/my-jetpack/_inc/components/connection-screen/footer.tsx b/projects/packages/my-jetpack/_inc/components/connection-screen/footer.tsx new file mode 100644 index 0000000000000..e95586da066ba --- /dev/null +++ b/projects/packages/my-jetpack/_inc/components/connection-screen/footer.tsx @@ -0,0 +1,32 @@ +import { __ } from '@wordpress/i18n'; +import appleLogo from './apple.svg'; +import googleLogo from './google.svg'; +import styles from './styles.module.scss'; +import wordpressLogo from './wordpress.svg'; + +const ConnectionScreenFooter: React.FC = () => ( + <> + { /* not using p here since connect screen apply styles for all p down the tree */ } + { /* https://github.com/Automattic/jetpack/blob/trunk/projects/js-packages/connection/components/connect-screen/layout/style.scss#L49-L54 */ } +
+ { __( 'You can use your existing account on any of these services:', 'jetpack-my-jetpack' ) } +
+ { /* + Since the list style type is set to none, `role=list` is required for VoiceOver (on Safari) to announce the list. + See: https://www.scottohara.me/blog/2019/01/12/lists-and-safari.html + */ } + + +); + +export default ConnectionScreenFooter; diff --git a/projects/packages/my-jetpack/_inc/components/connection-screen/index.jsx b/projects/packages/my-jetpack/_inc/components/connection-screen/index.jsx deleted file mode 100644 index 563e374805535..0000000000000 --- a/projects/packages/my-jetpack/_inc/components/connection-screen/index.jsx +++ /dev/null @@ -1,137 +0,0 @@ -import { Container, Col, AdminPage, getRedirectUrl } from '@automattic/jetpack-components'; -import { ConnectScreen } from '@automattic/jetpack-connection'; -import { VisuallyHidden } from '@wordpress/components'; -import { __ } from '@wordpress/i18n'; -import { Icon, external } from '@wordpress/icons'; -import React from 'react'; -import { useSearchParams } from 'react-router-dom'; -import useMyJetpackConnection from '../../hooks/use-my-jetpack-connection'; -import CloseLink from '../close-link'; -import appleLogo from './apple.svg'; -import connectImage from './connect.png'; -import googleLogo from './google.svg'; -import styles from './styles.module.scss'; -import wordpressLogo from './wordpress.svg'; - -const ConnectionScreenFooter = () => { - return ( - <> - { /* not using p here since connect screen apply styles for all p down the tree */ } - { /* https://github.com/Automattic/jetpack/blob/trunk/projects/js-packages/connection/components/connect-screen/layout/style.scss#L49-L54 */ } -
- { __( - 'You can use your existing account on any of these services:', - 'jetpack-my-jetpack' - ) } -
- { /* - Since the list style type is set to none, `role=list` is required for VoiceOver (on Safari) to announce the list. - See: https://www.scottohara.me/blog/2019/01/12/lists-and-safari.html - */ } - - - ); -}; - -const ConnectionScreen = () => { - const { apiRoot, apiNonce, registrationNonce } = useMyJetpackConnection(); - const returnToPage = useMyJetpackReturnToPage(); - - return ( - - - - - - - } - from="my-jetpack" - redirectUri={ returnToPage } - > - { /* - Since the list style type is set to none, `role=list` is required for VoiceOver (on Safari) to announce the list. - See: https://www.scottohara.me/blog/2019/01/12/lists-and-safari.html - */ } - - - - - - ); -}; - -/** - * Looks at query parameters to determine where the browser should go - * after a user connection is established. Usually the My Jetpack root - * is a safe bet, but in some instances (e.g., trying to activate a license), - * it's easier on people to be sent back to a different page - * (e.g., the license activation form). - * - * @returns {string} the URL of a My Jetpack page that should be displayed after connection. - */ -const useMyJetpackReturnToPage = () => { - const [ searchParams ] = useSearchParams(); - - const returnTo = searchParams.get( 'returnTo' ); - if ( returnTo ) { - return `admin.php?page=my-jetpack#/${ returnTo }`; - } - - return `admin.php?page=my-jetpack`; -}; - -export default ConnectionScreen; diff --git a/projects/packages/my-jetpack/_inc/components/connection-screen/index.tsx b/projects/packages/my-jetpack/_inc/components/connection-screen/index.tsx new file mode 100644 index 0000000000000..35fda85b8e13a --- /dev/null +++ b/projects/packages/my-jetpack/_inc/components/connection-screen/index.tsx @@ -0,0 +1,28 @@ +import { Container, Col, AdminPage } from '@automattic/jetpack-components'; +import { __ } from '@wordpress/i18n'; +import useMyJetpackReturnToPage from '../../hooks/use-my-jetpack-return-to-page'; +import CloseLink from '../close-link'; +import ConnectionScreenBody from './body'; +import styles from './styles.module.scss'; + +const ConnectionScreen: React.FC = () => { + const returnToPage = useMyJetpackReturnToPage(); + + return ( + + + + + + + + + + + ); +}; + +export default ConnectionScreen; diff --git a/projects/packages/my-jetpack/_inc/hooks/use-my-jetpack-return-to-page/index.ts b/projects/packages/my-jetpack/_inc/hooks/use-my-jetpack-return-to-page/index.ts new file mode 100644 index 0000000000000..14096205ccdc8 --- /dev/null +++ b/projects/packages/my-jetpack/_inc/hooks/use-my-jetpack-return-to-page/index.ts @@ -0,0 +1,23 @@ +import { useSearchParams } from 'react-router-dom'; + +/** + * Looks at query parameters to determine where the browser should go + * after a user connection is established. Usually the My Jetpack root + * is a safe bet, but in some instances (e.g., trying to activate a license), + * it's easier on people to be sent back to a different page + * (e.g., the license activation form). + * + * @returns {string} the URL of a My Jetpack page that should be displayed after connection. + */ +const useMyJetpackReturnToPage = () => { + const [ searchParams ] = useSearchParams(); + + const returnTo = searchParams.get( 'returnTo' ); + if ( returnTo ) { + return `admin.php?page=my-jetpack#/${ returnTo }`; + } + + return `admin.php?page=my-jetpack`; +}; + +export default useMyJetpackReturnToPage; diff --git a/projects/packages/my-jetpack/changelog/refactor-connection-screen-duplicate b/projects/packages/my-jetpack/changelog/refactor-connection-screen-duplicate new file mode 100644 index 0000000000000..95db492afb632 --- /dev/null +++ b/projects/packages/my-jetpack/changelog/refactor-connection-screen-duplicate @@ -0,0 +1,5 @@ +Significance: patch +Type: changed +Comment: Moved components into their own files + + diff --git a/projects/packages/my-jetpack/global.d.ts b/projects/packages/my-jetpack/global.d.ts index 8f188f1f7fc03..7076d3b5fa4ff 100644 --- a/projects/packages/my-jetpack/global.d.ts +++ b/projects/packages/my-jetpack/global.d.ts @@ -1,3 +1,8 @@ +declare module '*.png'; +declare module '*.svg'; +declare module '*.jpeg'; +declare module '*.jpg'; +declare module '*.scss'; interface Window { myJetpackInitialState?: { siteSuffix: string; From 25afd194660a52f31cc3d7b08741616fa7935dfa Mon Sep 17 00:00:00 2001 From: Emanuele Buccelli Date: Thu, 21 Mar 2024 15:22:23 +0100 Subject: [PATCH 03/18] Verbum: Gutenberg to all users (#36476) Co-authored-by: Anthony Grullon Co-authored-by: heavyweight --- .../update-gutenberg-verbum-all-users | 4 ++++ .../verbum-comments/class-verbum-comments.php | 19 +------------------ 2 files changed, 5 insertions(+), 18 deletions(-) create mode 100644 projects/packages/jetpack-mu-wpcom/changelog/update-gutenberg-verbum-all-users diff --git a/projects/packages/jetpack-mu-wpcom/changelog/update-gutenberg-verbum-all-users b/projects/packages/jetpack-mu-wpcom/changelog/update-gutenberg-verbum-all-users new file mode 100644 index 0000000000000..477f71982f911 --- /dev/null +++ b/projects/packages/jetpack-mu-wpcom/changelog/update-gutenberg-verbum-all-users @@ -0,0 +1,4 @@ +Significance: minor +Type: changed + +Releasing Gutenberg to all Verbum users. diff --git a/projects/packages/jetpack-mu-wpcom/src/features/verbum-comments/class-verbum-comments.php b/projects/packages/jetpack-mu-wpcom/src/features/verbum-comments/class-verbum-comments.php index 7530996db1cbc..b39441539d3d5 100644 --- a/projects/packages/jetpack-mu-wpcom/src/features/verbum-comments/class-verbum-comments.php +++ b/projects/packages/jetpack-mu-wpcom/src/features/verbum-comments/class-verbum-comments.php @@ -568,24 +568,7 @@ public function should_load_gutenberg_comments() { return false; } - $blog_id = $this->blog_id; - $e2e_tests = function_exists( 'has_blog_sticker' ) && has_blog_sticker( 'a8c-e2e-test-blog', $blog_id ); - $has_blocks_flag = function_exists( 'has_blog_sticker' ) && has_blog_sticker( 'verbum-block-comments', $blog_id ); - // phpcs:ignore WordPress.Security.NonceVerification.Recommended - $gutenberg_query_param = isset( $_GET['verbum_gutenberg'] ) ? intval( $_GET['verbum_gutenberg'] ) : null; - // This will release to 80% of sites. - $blog_in_80_percent = $blog_id % 100 >= 20; - // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable - $is_proxied = isset( $_SERVER['A8C_PROXIED_REQUEST'] ) - ? sanitize_text_field( wp_unslash( $_SERVER['A8C_PROXIED_REQUEST'] ) ) - : defined( 'A8C_PROXIED_REQUEST' ) && A8C_PROXIED_REQUEST; - - // Check if the parameter is set and its value is either 0 or 1, if any random value is passed, it is ignored. - if ( $gutenberg_query_param !== null ) { - return $gutenberg_query_param === 1; - } - - return $has_blocks_flag || $e2e_tests || $blog_in_80_percent; + return true; } /** From d88b0adc9e85e514ba78436594f9ad8ddb9f3ede Mon Sep 17 00:00:00 2001 From: Dylan Munson <65001528+CodeyGuyDylan@users.noreply.github.com> Date: Thu, 21 Mar 2024 10:15:33 -0600 Subject: [PATCH 04/18] Add/bad installation notices to my jetpack (#36449) * Add red bubble notification for bad installations * changelog * remove log statement * fixup project versions * Display bad install messages on My Jetpack * Remove purposeful bad installment * Make watcher a bit more consistent * Update project version * Fix changelogs * changelog * Add tracks event for bad notice click * Remove intentional bad installation * Simplify use of red bubble filter * Fix Jetpack Social hook * Split hooks up into individual files --- .../components/my-jetpack-screen/index.jsx | 4 +- .../_inc/components/product-card/index.jsx | 1 + .../hooks/use-connection-watcher/index.ts | 68 ------------------- .../hooks/use-notification-watcher/index.ts | 12 ++++ .../use-bad-install-notice.ts | 62 +++++++++++++++++ .../use-site-connection-notice.ts | 61 +++++++++++++++++ ...add-bad-installation-notices-to-my-jetpack | 4 ++ projects/packages/my-jetpack/global.d.ts | 8 +++ .../my-jetpack/src/class-initializer.php | 2 +- ...add-bad-installation-notices-to-my-jetpack | 4 ++ projects/plugins/backup/jetpack-backup.php | 14 ++++ ...add-bad-installation-notices-to-my-jetpack | 4 ++ projects/plugins/beta/jetpack-beta.php | 14 ++++ ...add-bad-installation-notices-to-my-jetpack | 4 ++ projects/plugins/boost/jetpack-boost.php | 14 ++++ projects/plugins/crm/ZeroBSCRM.php | 14 ++++ ...add-bad-installation-notices-to-my-jetpack | 4 ++ ...add-bad-installation-notices-to-my-jetpack | 4 ++ projects/plugins/jetpack/jetpack.php | 14 ++++ ...add-bad-installation-notices-to-my-jetpack | 4 ++ .../plugins/migration/wpcom-migration.php | 14 ++++ ...add-bad-installation-notices-to-my-jetpack | 4 ++ projects/plugins/protect/jetpack-protect.php | 14 ++++ ...add-bad-installation-notices-to-my-jetpack | 4 ++ projects/plugins/search/jetpack-search.php | 14 ++++ ...add-bad-installation-notices-to-my-jetpack | 4 ++ projects/plugins/social/jetpack-social.php | 14 ++++ ...add-bad-installation-notices-to-my-jetpack | 4 ++ .../starter-plugin/jetpack-starter-plugin.php | 16 ++++- ...add-bad-installation-notices-to-my-jetpack | 4 ++ projects/plugins/vaultpress/vaultpress.php | 15 ++++ ...add-bad-installation-notices-to-my-jetpack | 4 ++ .../plugins/videopress/jetpack-videopress.php | 14 ++++ 33 files changed, 369 insertions(+), 72 deletions(-) delete mode 100644 projects/packages/my-jetpack/_inc/hooks/use-connection-watcher/index.ts create mode 100644 projects/packages/my-jetpack/_inc/hooks/use-notification-watcher/index.ts create mode 100644 projects/packages/my-jetpack/_inc/hooks/use-notification-watcher/use-bad-install-notice.ts create mode 100644 projects/packages/my-jetpack/_inc/hooks/use-notification-watcher/use-site-connection-notice.ts create mode 100644 projects/packages/my-jetpack/changelog/add-bad-installation-notices-to-my-jetpack create mode 100644 projects/plugins/backup/changelog/add-bad-installation-notices-to-my-jetpack create mode 100644 projects/plugins/beta/changelog/add-bad-installation-notices-to-my-jetpack create mode 100644 projects/plugins/boost/changelog/add-bad-installation-notices-to-my-jetpack create mode 100644 projects/plugins/crm/changelog/add-bad-installation-notices-to-my-jetpack create mode 100644 projects/plugins/jetpack/changelog/add-bad-installation-notices-to-my-jetpack create mode 100644 projects/plugins/migration/changelog/add-bad-installation-notices-to-my-jetpack create mode 100644 projects/plugins/protect/changelog/add-bad-installation-notices-to-my-jetpack create mode 100644 projects/plugins/search/changelog/add-bad-installation-notices-to-my-jetpack create mode 100644 projects/plugins/social/changelog/add-bad-installation-notices-to-my-jetpack create mode 100644 projects/plugins/starter-plugin/changelog/add-bad-installation-notices-to-my-jetpack create mode 100644 projects/plugins/vaultpress/changelog/add-bad-installation-notices-to-my-jetpack create mode 100644 projects/plugins/videopress/changelog/add-bad-installation-notices-to-my-jetpack diff --git a/projects/packages/my-jetpack/_inc/components/my-jetpack-screen/index.jsx b/projects/packages/my-jetpack/_inc/components/my-jetpack-screen/index.jsx index fd17496e9af60..31923e68c6afa 100644 --- a/projects/packages/my-jetpack/_inc/components/my-jetpack-screen/index.jsx +++ b/projects/packages/my-jetpack/_inc/components/my-jetpack-screen/index.jsx @@ -31,7 +31,7 @@ import useProduct from '../../data/products/use-product'; import useSimpleQuery from '../../data/use-simple-query'; import { getMyJetpackWindowInitialState } from '../../data/utils/get-my-jetpack-window-state'; import useAnalytics from '../../hooks/use-analytics'; -import useConnectionWatcher from '../../hooks/use-connection-watcher'; +import useNotificationWatcher from '../../hooks/use-notification-watcher'; import ConnectionsSection from '../connections-section'; import IDCModal from '../idc-modal'; import JetpackManageBanner from '../jetpack-manage-banner'; @@ -93,7 +93,7 @@ const GlobalNotice = ( { message, options } ) => { * @returns {object} The MyJetpackScreen component. */ export default function MyJetpackScreen() { - useConnectionWatcher(); + useNotificationWatcher(); const { hasBeenDismissed = false } = getMyJetpackWindowInitialState( 'welcomeBanner' ); const { showFullJetpackStatsCard = false } = getMyJetpackWindowInitialState( 'myJetpackFlags' ); const { jetpackManage = {}, adminUrl } = getMyJetpackWindowInitialState(); diff --git a/projects/packages/my-jetpack/_inc/components/product-card/index.jsx b/projects/packages/my-jetpack/_inc/components/product-card/index.jsx index 994a97ceadc27..87f4c8f65f0fa 100644 --- a/projects/packages/my-jetpack/_inc/components/product-card/index.jsx +++ b/projects/packages/my-jetpack/_inc/components/product-card/index.jsx @@ -251,6 +251,7 @@ ProductCard.propTypes = { PRODUCT_STATUSES.NEEDS_PURCHASE, PRODUCT_STATUSES.NEEDS_PURCHASE_OR_FREE, PRODUCT_STATUSES.CAN_UPGRADE, + PRODUCT_STATUSES.MODULE_DISABLED, ] ).isRequired, }; diff --git a/projects/packages/my-jetpack/_inc/hooks/use-connection-watcher/index.ts b/projects/packages/my-jetpack/_inc/hooks/use-connection-watcher/index.ts deleted file mode 100644 index 59191e6bafab6..0000000000000 --- a/projects/packages/my-jetpack/_inc/hooks/use-connection-watcher/index.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { __, sprintf } from '@wordpress/i18n'; -import { useEffect, useContext } from 'react'; -import { MyJetpackRoutes } from '../../constants'; -import { NOTICE_PRIORITY_HIGH } from '../../context/constants'; -import { NoticeContext } from '../../context/notices/noticeContext'; -import { useAllProducts } from '../../data/products/use-product'; -import getProductSlugsThatRequireUserConnection from '../../data/utils/get-product-slugs-that-require-user-connection'; -import useMyJetpackConnection from '../use-my-jetpack-connection'; -import useMyJetpackNavigate from '../use-my-jetpack-navigate'; - -/** - * React custom hook to watch connection. - * For instance, when the user is not connected, - * the hook dispatches an action to populate the global notice. - */ -export default function useConnectionWatcher() { - const { setNotice } = useContext( NoticeContext ); - const navToConnection = useMyJetpackNavigate( MyJetpackRoutes.Connection ); - const products = useAllProducts(); - const productSlugsThatRequireUserConnection = - getProductSlugsThatRequireUserConnection( products ); - - const { isSiteConnected, hasConnectedOwner, isUserConnected } = useMyJetpackConnection(); - const requiresUserConnection = - ! hasConnectedOwner && ! isUserConnected && productSlugsThatRequireUserConnection.length > 0; - - const oneProductMessage = sprintf( - /* translators: placeholder is product name. */ - __( - 'Jetpack %s needs a user connection to WordPress.com to be able to work.', - 'jetpack-my-jetpack' - ), - productSlugsThatRequireUserConnection[ 0 ] - ); - - const needsUserConnectionMessage = - productSlugsThatRequireUserConnection.length === 1 - ? oneProductMessage - : __( - 'Some products need a user connection to WordPress.com to be able to work.', - 'jetpack-my-jetpack' - ); - - useEffect( () => { - if ( ! isSiteConnected || requiresUserConnection ) { - setNotice( { - message: needsUserConnectionMessage, - options: { - status: 'warning', - actions: [ - { - label: __( 'Connect your user account to fix this', 'jetpack-my-jetpack' ), - onClick: navToConnection, - noDefaultClasses: true, - }, - ], - }, - priority: NOTICE_PRIORITY_HIGH, - } ); - } - }, [ - isSiteConnected, - needsUserConnectionMessage, - requiresUserConnection, - navToConnection, - setNotice, - ] ); -} diff --git a/projects/packages/my-jetpack/_inc/hooks/use-notification-watcher/index.ts b/projects/packages/my-jetpack/_inc/hooks/use-notification-watcher/index.ts new file mode 100644 index 0000000000000..5016b21c5e310 --- /dev/null +++ b/projects/packages/my-jetpack/_inc/hooks/use-notification-watcher/index.ts @@ -0,0 +1,12 @@ +import { getMyJetpackWindowInitialState } from '../../data/utils/get-my-jetpack-window-state'; +import useBadInstallNotice from './use-bad-install-notice'; +import useSiteConnectionNotice from './use-site-connection-notice'; + +const useNotificationWatcher = () => { + const { redBubbleAlerts } = getMyJetpackWindowInitialState(); + + useBadInstallNotice( redBubbleAlerts ); + useSiteConnectionNotice( redBubbleAlerts ); +}; + +export default useNotificationWatcher; diff --git a/projects/packages/my-jetpack/_inc/hooks/use-notification-watcher/use-bad-install-notice.ts b/projects/packages/my-jetpack/_inc/hooks/use-notification-watcher/use-bad-install-notice.ts new file mode 100644 index 0000000000000..7e0f8e49e4eef --- /dev/null +++ b/projects/packages/my-jetpack/_inc/hooks/use-notification-watcher/use-bad-install-notice.ts @@ -0,0 +1,62 @@ +import { __, sprintf } from '@wordpress/i18n'; +import { useContext, useEffect } from 'react'; +import { NOTICE_PRIORITY_MEDIUM } from '../../context/constants'; +import { NoticeContext } from '../../context/notices/noticeContext'; +import useAnalytics from '../use-analytics'; + +type RedBubbleAlerts = Window[ 'myJetpackInitialState' ][ 'redBubbleAlerts' ]; + +const useBadInstallNotice = ( redBubbleAlerts: RedBubbleAlerts ) => { + const { setNotice } = useContext( NoticeContext ); + const { recordEvent } = useAnalytics(); + + useEffect( () => { + const badInstallAlerts = Object.keys( redBubbleAlerts ).filter( key => + key.endsWith( '-bad-installation' ) + ) as Array< `${ string }-bad-installation` >; + + if ( badInstallAlerts.length === 0 ) { + return; + } + + const alert = redBubbleAlerts[ badInstallAlerts[ 0 ] ]; + const { plugin } = alert.data; + const devEnvUrl = + 'https://github.com/Automattic/jetpack/blob/trunk/docs/development-environment.md'; + + const errorMessage = sprintf( + // translators: %s is the name of the plugin that has a bad installation. + __( + 'Your installation of %1$s is incomplete. If you installed %1$s from GitHub, please refer to the developer documentation to set up your development environment.', + 'jetpack-my-jetpack' + ), + plugin + ); + + const onCtaClick = () => { + window.open( devEnvUrl ); + recordEvent( 'jetpack_my_jetpack_bad_installation_notice_cta_click', { + plugin, + } ); + }; + + const noticeOptions = { + status: 'error', + actions: [ + { + label: __( 'See documentation', 'jetpack-my-jetpack' ), + onClick: onCtaClick, + noDefaultClasses: true, + }, + ], + }; + + setNotice( { + message: errorMessage, + options: noticeOptions, + priority: NOTICE_PRIORITY_MEDIUM, + } ); + }, [ redBubbleAlerts, setNotice, recordEvent ] ); +}; + +export default useBadInstallNotice; diff --git a/projects/packages/my-jetpack/_inc/hooks/use-notification-watcher/use-site-connection-notice.ts b/projects/packages/my-jetpack/_inc/hooks/use-notification-watcher/use-site-connection-notice.ts new file mode 100644 index 0000000000000..5178ab862df2e --- /dev/null +++ b/projects/packages/my-jetpack/_inc/hooks/use-notification-watcher/use-site-connection-notice.ts @@ -0,0 +1,61 @@ +import { __, sprintf } from '@wordpress/i18n'; +import { useContext, useEffect } from 'react'; +import { MyJetpackRoutes } from '../../constants'; +import { NOTICE_PRIORITY_HIGH } from '../../context/constants'; +import { NoticeContext } from '../../context/notices/noticeContext'; +import { useAllProducts } from '../../data/products/use-product'; +import getProductSlugsThatRequireUserConnection from '../../data/utils/get-product-slugs-that-require-user-connection'; +import useMyJetpackNavigate from '../use-my-jetpack-navigate'; + +type RedBubbleAlerts = Window[ 'myJetpackInitialState' ][ 'redBubbleAlerts' ]; + +const useSiteConnectionNotice = ( redBubbleAlerts: RedBubbleAlerts ) => { + const { setNotice } = useContext( NoticeContext ); + const products = useAllProducts(); + const navToConnection = useMyJetpackNavigate( MyJetpackRoutes.Connection ); + + useEffect( () => { + if ( ! Object.keys( redBubbleAlerts ).includes( 'missing-site-connection' ) ) { + return; + } + + const productSlugsThatRequireUserConnection = + getProductSlugsThatRequireUserConnection( products ); + + const oneProductMessage = sprintf( + /* translators: placeholder is product name. */ + __( + 'Jetpack %s needs a user connection to WordPress.com to be able to work.', + 'jetpack-my-jetpack' + ), + productSlugsThatRequireUserConnection[ 0 ] + ); + + const needsUserConnectionMessage = + productSlugsThatRequireUserConnection.length === 1 + ? oneProductMessage + : __( + 'Some products need a user connection to WordPress.com to be able to work.', + 'jetpack-my-jetpack' + ); + + const noticeOptions = { + status: 'warning', + actions: [ + { + label: __( 'Connect your user account to fix this', 'jetpack-my-jetpack' ), + onClick: navToConnection, + noDefaultClasses: true, + }, + ], + }; + + setNotice( { + message: needsUserConnectionMessage, + options: noticeOptions, + priority: NOTICE_PRIORITY_HIGH, + } ); + }, [ navToConnection, products, redBubbleAlerts, setNotice ] ); +}; + +export default useSiteConnectionNotice; diff --git a/projects/packages/my-jetpack/changelog/add-bad-installation-notices-to-my-jetpack b/projects/packages/my-jetpack/changelog/add-bad-installation-notices-to-my-jetpack new file mode 100644 index 0000000000000..5cf6fb645e17e --- /dev/null +++ b/projects/packages/my-jetpack/changelog/add-bad-installation-notices-to-my-jetpack @@ -0,0 +1,4 @@ +Significance: patch +Type: added + +Hook into red bubble notification when bad installation is detected diff --git a/projects/packages/my-jetpack/global.d.ts b/projects/packages/my-jetpack/global.d.ts index 7076d3b5fa4ff..774aa556c3f86 100644 --- a/projects/packages/my-jetpack/global.d.ts +++ b/projects/packages/my-jetpack/global.d.ts @@ -184,6 +184,14 @@ interface Window { check_dns: boolean; } >; }; + redBubbleAlerts: { + 'missing-site-connection'?: null; + [ key: `${ string }-bad-installation` ]: { + data: { + plugin: string; + }; + }; + }; topJetpackMenuItemUrl: string; userIsAdmin: string; userIsNewToJetpack: string; diff --git a/projects/packages/my-jetpack/src/class-initializer.php b/projects/packages/my-jetpack/src/class-initializer.php index f509d218dc948..1439a4e7a2356 100644 --- a/projects/packages/my-jetpack/src/class-initializer.php +++ b/projects/packages/my-jetpack/src/class-initializer.php @@ -661,7 +661,7 @@ public static function get_red_bubble_alerts() { */ public static function alert_if_missing_site_connection( array $red_bubble_slugs ) { if ( ! ( new Connection_Manager() )->is_connected() ) { - $red_bubble_slugs[] = self::MISSING_SITE_CONNECTION_NOTIFICATION_KEY; + $red_bubble_slugs[ self::MISSING_SITE_CONNECTION_NOTIFICATION_KEY ] = null; } return $red_bubble_slugs; diff --git a/projects/plugins/backup/changelog/add-bad-installation-notices-to-my-jetpack b/projects/plugins/backup/changelog/add-bad-installation-notices-to-my-jetpack new file mode 100644 index 0000000000000..7a8c5684ef4be --- /dev/null +++ b/projects/plugins/backup/changelog/add-bad-installation-notices-to-my-jetpack @@ -0,0 +1,4 @@ +Significance: patch +Type: added + +Trigger red bubble notification when bad install is detected diff --git a/projects/plugins/backup/jetpack-backup.php b/projects/plugins/backup/jetpack-backup.php index f641c5c23a31d..fde32d0e9e358 100644 --- a/projects/plugins/backup/jetpack-backup.php +++ b/projects/plugins/backup/jetpack-backup.php @@ -100,6 +100,20 @@ function () use ( $jetpack_backup_meets_requirements ) { ); } + // Add a red bubble notification to My Jetpack if the installation is bad. + add_filter( + 'my_jetpack_red_bubble_notification_slugs', + function ( $slugs ) { + $slugs['jetpack-vaultpress-backup-plugin-bad-installation'] = array( + 'data' => array( + 'plugin' => 'Jetpack VaultPress Backup', + ), + ); + + return $slugs; + } + ); + add_action( 'admin_notices', function () { diff --git a/projects/plugins/beta/changelog/add-bad-installation-notices-to-my-jetpack b/projects/plugins/beta/changelog/add-bad-installation-notices-to-my-jetpack new file mode 100644 index 0000000000000..5cf6fb645e17e --- /dev/null +++ b/projects/plugins/beta/changelog/add-bad-installation-notices-to-my-jetpack @@ -0,0 +1,4 @@ +Significance: patch +Type: added + +Hook into red bubble notification when bad installation is detected diff --git a/projects/plugins/beta/jetpack-beta.php b/projects/plugins/beta/jetpack-beta.php index 72a05dd390a1c..559b00a2da9e1 100644 --- a/projects/plugins/beta/jetpack-beta.php +++ b/projects/plugins/beta/jetpack-beta.php @@ -63,6 +63,20 @@ ); } + // Add a red bubble notification to My Jetpack if the installation is bad. + add_filter( + 'my_jetpack_red_bubble_notification_slugs', + function ( $slugs ) { + $slugs['jetpack-beta-plugin-bad-installation'] = array( + 'data' => array( + 'plugin' => 'Jetpack Beta', + ), + ); + + return $slugs; + } + ); + /** * Outputs an admin notice for folks running Jetpack Beta without having run composer install. * diff --git a/projects/plugins/boost/changelog/add-bad-installation-notices-to-my-jetpack b/projects/plugins/boost/changelog/add-bad-installation-notices-to-my-jetpack new file mode 100644 index 0000000000000..7a8c5684ef4be --- /dev/null +++ b/projects/plugins/boost/changelog/add-bad-installation-notices-to-my-jetpack @@ -0,0 +1,4 @@ +Significance: patch +Type: added + +Trigger red bubble notification when bad install is detected diff --git a/projects/plugins/boost/jetpack-boost.php b/projects/plugins/boost/jetpack-boost.php index be88abcb07aa0..689637643f046 100644 --- a/projects/plugins/boost/jetpack-boost.php +++ b/projects/plugins/boost/jetpack-boost.php @@ -85,6 +85,20 @@ ); } + // Add a red bubble notification to My Jetpack if the installation is bad. + add_filter( + 'my_jetpack_red_bubble_notification_slugs', + function ( $slugs ) { + $slugs['jetpack-boost-plugin-bad-installation'] = array( + 'data' => array( + 'plugin' => 'Jetpack Boost', + ), + ); + + return $slugs; + } + ); + /** * Outputs an admin notice for folks running Jetpack Boost without having run composer install. * diff --git a/projects/plugins/crm/ZeroBSCRM.php b/projects/plugins/crm/ZeroBSCRM.php index ecf1a81434f47..4f1b8e6ece042 100644 --- a/projects/plugins/crm/ZeroBSCRM.php +++ b/projects/plugins/crm/ZeroBSCRM.php @@ -52,6 +52,20 @@ ); } + // Add a red bubble notification to My Jetpack if the installation is bad. + add_filter( + 'my_jetpack_red_bubble_notification_slugs', + function ( $slugs ) { + $slugs['jetpack-crm-plugin-bad-installation'] = array( + 'data' => array( + 'plugin' => 'Jetpack CRM', + ), + ); + + return $slugs; + } + ); + add_action( 'admin_notices', function () { diff --git a/projects/plugins/crm/changelog/add-bad-installation-notices-to-my-jetpack b/projects/plugins/crm/changelog/add-bad-installation-notices-to-my-jetpack new file mode 100644 index 0000000000000..5cf6fb645e17e --- /dev/null +++ b/projects/plugins/crm/changelog/add-bad-installation-notices-to-my-jetpack @@ -0,0 +1,4 @@ +Significance: patch +Type: added + +Hook into red bubble notification when bad installation is detected diff --git a/projects/plugins/jetpack/changelog/add-bad-installation-notices-to-my-jetpack b/projects/plugins/jetpack/changelog/add-bad-installation-notices-to-my-jetpack new file mode 100644 index 0000000000000..3f0201953ef48 --- /dev/null +++ b/projects/plugins/jetpack/changelog/add-bad-installation-notices-to-my-jetpack @@ -0,0 +1,4 @@ +Significance: patch +Type: enhancement + +Trigger red bubble notifiction on My Jetpack when bad install is detected diff --git a/projects/plugins/jetpack/jetpack.php b/projects/plugins/jetpack/jetpack.php index f64d144e2ec25..91c2217d868ba 100644 --- a/projects/plugins/jetpack/jetpack.php +++ b/projects/plugins/jetpack/jetpack.php @@ -156,6 +156,20 @@ function jetpack_admin_unsupported_wp_notice() { ); } + // Add a red bubble notification to My Jetpack if the installation is bad. + add_filter( + 'my_jetpack_red_bubble_notification_slugs', + function ( $slugs ) { + $slugs['jetpack-plugin-bad-installation'] = array( + 'data' => array( + 'plugin' => 'Jetpack', + ), + ); + + return $slugs; + } + ); + /** * Outputs an admin notice for folks running Jetpack without having run composer install. * diff --git a/projects/plugins/migration/changelog/add-bad-installation-notices-to-my-jetpack b/projects/plugins/migration/changelog/add-bad-installation-notices-to-my-jetpack new file mode 100644 index 0000000000000..7a8c5684ef4be --- /dev/null +++ b/projects/plugins/migration/changelog/add-bad-installation-notices-to-my-jetpack @@ -0,0 +1,4 @@ +Significance: patch +Type: added + +Trigger red bubble notification when bad install is detected diff --git a/projects/plugins/migration/wpcom-migration.php b/projects/plugins/migration/wpcom-migration.php index 6845e26ade573..1dd99a460f593 100644 --- a/projects/plugins/migration/wpcom-migration.php +++ b/projects/plugins/migration/wpcom-migration.php @@ -55,6 +55,20 @@ ); } + // Add a red bubble notification to My Jetpack if the installation is bad. + add_filter( + 'my_jetpack_red_bubble_notification_slugs', + function ( $slugs ) { + $slugs['move-to-wordpress-plugin-bad-installation'] = array( + 'data' => array( + 'plugin' => 'Move to WordPress.com', + ), + ); + + return $slugs; + } + ); + add_action( 'admin_notices', function () { diff --git a/projects/plugins/protect/changelog/add-bad-installation-notices-to-my-jetpack b/projects/plugins/protect/changelog/add-bad-installation-notices-to-my-jetpack new file mode 100644 index 0000000000000..7a8c5684ef4be --- /dev/null +++ b/projects/plugins/protect/changelog/add-bad-installation-notices-to-my-jetpack @@ -0,0 +1,4 @@ +Significance: patch +Type: added + +Trigger red bubble notification when bad install is detected diff --git a/projects/plugins/protect/jetpack-protect.php b/projects/plugins/protect/jetpack-protect.php index 3fca96027d352..dcb131e321d4e 100644 --- a/projects/plugins/protect/jetpack-protect.php +++ b/projects/plugins/protect/jetpack-protect.php @@ -56,6 +56,20 @@ ); } + // Add a red bubble notification to My Jetpack if the installation is bad. + add_filter( + 'my_jetpack_red_bubble_notification_slugs', + function ( $slugs ) { + $slugs['jetpack-protect-plugin-bad-installation'] = array( + 'data' => array( + 'plugin' => 'Jetpack Protect', + ), + ); + + return $slugs; + } + ); + add_action( 'admin_notices', function () { diff --git a/projects/plugins/search/changelog/add-bad-installation-notices-to-my-jetpack b/projects/plugins/search/changelog/add-bad-installation-notices-to-my-jetpack new file mode 100644 index 0000000000000..7a8c5684ef4be --- /dev/null +++ b/projects/plugins/search/changelog/add-bad-installation-notices-to-my-jetpack @@ -0,0 +1,4 @@ +Significance: patch +Type: added + +Trigger red bubble notification when bad install is detected diff --git a/projects/plugins/search/jetpack-search.php b/projects/plugins/search/jetpack-search.php index de28c440a61cc..d57098d5ee120 100644 --- a/projects/plugins/search/jetpack-search.php +++ b/projects/plugins/search/jetpack-search.php @@ -55,6 +55,20 @@ ); } + // Add a red bubble notification to My Jetpack if the installation is bad. + add_filter( + 'my_jetpack_red_bubble_notification_slugs', + function ( $slugs ) { + $slugs['jetpack-search-plugin-bad-installation'] = array( + 'data' => array( + 'plugin' => 'Jetpack Search', + ), + ); + + return $slugs; + } + ); + /** * Outputs an admin notice for folks running Jetpack Search without having run composer install. * diff --git a/projects/plugins/social/changelog/add-bad-installation-notices-to-my-jetpack b/projects/plugins/social/changelog/add-bad-installation-notices-to-my-jetpack new file mode 100644 index 0000000000000..7a8c5684ef4be --- /dev/null +++ b/projects/plugins/social/changelog/add-bad-installation-notices-to-my-jetpack @@ -0,0 +1,4 @@ +Significance: patch +Type: added + +Trigger red bubble notification when bad install is detected diff --git a/projects/plugins/social/jetpack-social.php b/projects/plugins/social/jetpack-social.php index b902a92dcaf3c..1b3234687c5d9 100644 --- a/projects/plugins/social/jetpack-social.php +++ b/projects/plugins/social/jetpack-social.php @@ -55,6 +55,20 @@ ); } + // Add a red bubble notification to My Jetpack if the installation is bad. + add_filter( + 'my_jetpack_red_bubble_notification_slugs', + function ( $slugs ) { + $slugs['jetpack-social-plugin-bad-installation'] = array( + 'data' => array( + 'plugin' => 'Jetpack Social', + ), + ); + + return $slugs; + } + ); + add_action( 'admin_notices', function () { diff --git a/projects/plugins/starter-plugin/changelog/add-bad-installation-notices-to-my-jetpack b/projects/plugins/starter-plugin/changelog/add-bad-installation-notices-to-my-jetpack new file mode 100644 index 0000000000000..7a8c5684ef4be --- /dev/null +++ b/projects/plugins/starter-plugin/changelog/add-bad-installation-notices-to-my-jetpack @@ -0,0 +1,4 @@ +Significance: patch +Type: added + +Trigger red bubble notification when bad install is detected diff --git a/projects/plugins/starter-plugin/jetpack-starter-plugin.php b/projects/plugins/starter-plugin/jetpack-starter-plugin.php index 9f08645300837..f63b3939000e3 100644 --- a/projects/plugins/starter-plugin/jetpack-starter-plugin.php +++ b/projects/plugins/starter-plugin/jetpack-starter-plugin.php @@ -55,6 +55,20 @@ ); } + // Add a red bubble notification to My Jetpack if the installation is bad. + add_filter( + 'my_jetpack_red_bubble_notification_slugs', + function ( $slugs ) { + $slugs['jetpack-starter-plugin-bad-installation'] = array( + 'data' => array( + 'plugin' => 'Jetpack Starter', + ), + ); + + return $slugs; + } + ); + add_action( 'admin_notices', function () { @@ -68,7 +82,7 @@ function () { printf( wp_kses( /* translators: Placeholder is a link to a support document. */ - __( 'Your installation of Jetpack Starter Plugin is incomplete. If you installed Jetpack Starter Plugin from GitHub, please refer to this document to set up your development environment. Jetpack Starter Plugin must have Composer dependencies installed and built via the build command.', 'jetpack-starter-plugin' ), + __( 'Your installation of Jetpack Starter is incomplete. If you installed Jetpack Starter Plugin from GitHub, please refer to this document to set up your development environment. Jetpack Starter Plugin must have Composer dependencies installed and built via the build command.', 'jetpack-starter-plugin' ), array( 'a' => array( 'href' => array(), diff --git a/projects/plugins/vaultpress/changelog/add-bad-installation-notices-to-my-jetpack b/projects/plugins/vaultpress/changelog/add-bad-installation-notices-to-my-jetpack new file mode 100644 index 0000000000000..5cf6fb645e17e --- /dev/null +++ b/projects/plugins/vaultpress/changelog/add-bad-installation-notices-to-my-jetpack @@ -0,0 +1,4 @@ +Significance: patch +Type: added + +Hook into red bubble notification when bad installation is detected diff --git a/projects/plugins/vaultpress/vaultpress.php b/projects/plugins/vaultpress/vaultpress.php index 94eae5a02724c..fd91d1f9fa363 100644 --- a/projects/plugins/vaultpress/vaultpress.php +++ b/projects/plugins/vaultpress/vaultpress.php @@ -39,6 +39,21 @@ ) ); } + + // Add a red bubble notification to My Jetpack if the installation is bad. + add_filter( + 'my_jetpack_red_bubble_notification_slugs', + function ( $slugs ) { + $slugs['vaultpress-plugin-bad-installation'] = array( + 'data' => array( + 'plugin' => 'VaultPress', + ), + ); + + return $slugs; + } + ); + /** * Outputs an admin notice for folks running VaultPress without having run `composer install`. */ diff --git a/projects/plugins/videopress/changelog/add-bad-installation-notices-to-my-jetpack b/projects/plugins/videopress/changelog/add-bad-installation-notices-to-my-jetpack new file mode 100644 index 0000000000000..7a8c5684ef4be --- /dev/null +++ b/projects/plugins/videopress/changelog/add-bad-installation-notices-to-my-jetpack @@ -0,0 +1,4 @@ +Significance: patch +Type: added + +Trigger red bubble notification when bad install is detected diff --git a/projects/plugins/videopress/jetpack-videopress.php b/projects/plugins/videopress/jetpack-videopress.php index 7324839bfa0ae..0916b0867bb9e 100644 --- a/projects/plugins/videopress/jetpack-videopress.php +++ b/projects/plugins/videopress/jetpack-videopress.php @@ -55,6 +55,20 @@ ); } + // Add a red bubble notification to My Jetpack if the installation is bad. + add_filter( + 'my_jetpack_red_bubble_notification_slugs', + function ( $slugs ) { + $slugs['jetpack-videopress-plugin-bad-installation'] = array( + 'data' => array( + 'plugin' => 'Jetpack VideoPress', + ), + ); + + return $slugs; + } + ); + add_action( 'admin_notices', function () { From 08c645eaa6e0187bb13e07094e99ac74f9b2e8f2 Mon Sep 17 00:00:00 2001 From: Linas Valiukas Date: Thu, 21 Mar 2024 19:18:39 +0200 Subject: [PATCH 05/18] Backup: Change some error messages to not trigger security scanners (#36496) * Make t_file_get_contents() and t_file_put_contents() labels less suspicious Some security scanners grep for `file_get_contents()` / `file_put_contents()`, and mark them as suspicious. * Bump namespace version * Appease changelog gods * Change some more error messages / variable names just in case * Appease versioning gods --- .../changelog/backup-change-log-label | 4 ++++ .../src/class-helper-script-manager-impl.php | 2 +- .../src/class-helper-script-manager.php | 2 +- .../src/class-throw-on-errors.php | 18 ++++++++++-------- .../test-class-helper-script-manager-impl.php | 2 +- .../tests/php/test-class-throw-on-errors.php | 10 +++++----- projects/packages/backup/actions.php | 4 ++-- .../backup/changelog/backup-change-log-label | 4 ++++ .../backup/src/class-initial-state.php | 2 +- .../src/class-jetpack-backup-upgrades.php | 2 +- .../backup/src/class-jetpack-backup.php | 4 ++-- .../backup/src/class-rest-controller.php | 2 +- .../backup/tests/php/test-rest-controller.php | 4 ++-- .../tests/php/test-storage-addon-upsell.php | 2 +- projects/packages/transport-helper/actions.php | 4 ++-- .../changelog/backup-change-log-label | 4 ++++ .../packages/transport-helper/package.json | 2 +- .../src/class-package-version.php | 2 +- .../src/class-rest-controller.php | 4 ++-- .../tests/php/test-rest-controller.php | 4 ++-- .../backup/changelog/backup-change-log-label | 4 ++++ projects/plugins/backup/jetpack-backup.php | 4 ++-- .../jetpack/changelog/backup-change-log-label | 4 ++++ ...pi-delete-backup-helper-script-endpoint.php | 2 +- ...i-install-backup-helper-script-endpoint.php | 2 +- projects/plugins/jetpack/uninstall.php | 2 +- .../changelog/backup-change-log-label | 4 ++++ .../migration/src/class-wpcom-migration.php | 2 +- 28 files changed, 66 insertions(+), 40 deletions(-) create mode 100644 projects/packages/backup-helper-script-manager/changelog/backup-change-log-label create mode 100644 projects/packages/backup/changelog/backup-change-log-label create mode 100644 projects/packages/transport-helper/changelog/backup-change-log-label create mode 100644 projects/plugins/backup/changelog/backup-change-log-label create mode 100644 projects/plugins/jetpack/changelog/backup-change-log-label create mode 100644 projects/plugins/migration/changelog/backup-change-log-label diff --git a/projects/packages/backup-helper-script-manager/changelog/backup-change-log-label b/projects/packages/backup-helper-script-manager/changelog/backup-change-log-label new file mode 100644 index 0000000000000..abe37d7ec52e8 --- /dev/null +++ b/projects/packages/backup-helper-script-manager/changelog/backup-change-log-label @@ -0,0 +1,4 @@ +Significance: patch +Type: fixed + +Backup: change some error messages to not trigger security scanners diff --git a/projects/packages/backup-helper-script-manager/src/class-helper-script-manager-impl.php b/projects/packages/backup-helper-script-manager/src/class-helper-script-manager-impl.php index b41c11c7c48df..adab13b8167bb 100644 --- a/projects/packages/backup-helper-script-manager/src/class-helper-script-manager-impl.php +++ b/projects/packages/backup-helper-script-manager/src/class-helper-script-manager-impl.php @@ -9,7 +9,7 @@ // order to ensure that the specific version of this file always get loaded. Otherwise, Jetpack autoloader might decide // to load an older/newer version of the class (if, for example, both the standalone and bundled versions of the plugin // are installed, or in some other cases). -namespace Automattic\Jetpack\Backup\V0003; +namespace Automattic\Jetpack\Backup\V0004; use Exception; use WP_Error; diff --git a/projects/packages/backup-helper-script-manager/src/class-helper-script-manager.php b/projects/packages/backup-helper-script-manager/src/class-helper-script-manager.php index 73b37a2911ea0..5833abaffb662 100644 --- a/projects/packages/backup-helper-script-manager/src/class-helper-script-manager.php +++ b/projects/packages/backup-helper-script-manager/src/class-helper-script-manager.php @@ -9,7 +9,7 @@ // order to ensure that the specific version of this file always get loaded. Otherwise, Jetpack autoloader might decide // to load an older/newer version of the class (if, for example, both the standalone and bundled versions of the plugin // are installed, or in some other cases). -namespace Automattic\Jetpack\Backup\V0003; +namespace Automattic\Jetpack\Backup\V0004; /** * Manage installation, deletion and cleanup of Helper Scripts to assist with backing up Jetpack Sites. diff --git a/projects/packages/backup-helper-script-manager/src/class-throw-on-errors.php b/projects/packages/backup-helper-script-manager/src/class-throw-on-errors.php index 552c9cdd4e456..1f59694f4c487 100644 --- a/projects/packages/backup-helper-script-manager/src/class-throw-on-errors.php +++ b/projects/packages/backup-helper-script-manager/src/class-throw-on-errors.php @@ -8,7 +8,7 @@ // order to ensure that the specific version of this file always get loaded. Otherwise, Jetpack autoloader might decide // to load an older/newer version of the class (if, for example, both the standalone and bundled versions of the plugin // are installed, or in some other cases). -namespace Automattic\Jetpack\Backup\V0003; +namespace Automattic\Jetpack\Backup\V0004; use Exception; use Throwable; @@ -430,7 +430,7 @@ public static function t_file_put_contents( $filename, $data ) { // PHP 5.x won't complain about parameter being unset, so let's do it ourselves. if ( ! $filename ) { - throw new Exception( 'Filename for file_put_contents() is unset' ); + throw new Exception( 'Filename for f_p_c() is unset' ); } if ( $data === null ) { throw new Exception( 'Data to write is null' ); @@ -438,7 +438,8 @@ public static function t_file_put_contents( $filename, $data ) { $data_length = strlen( $data ); - $label = "file_put_contents( '$filename', $data_length bytes of data )"; + // Weird label is intentional, otherwise security scanners find this label suspicious. + $label = "f_p_c( '$filename', $data_length bytes of data )"; $number_of_bytes_written = static::throw_on_warnings( function () use ( $filename, $data ) { @@ -474,12 +475,13 @@ public static function t_file_get_contents( $filename ) { // PHP 5.x won't complain about parameter being unset, so let's do it ourselves. if ( ! $filename ) { - throw new Exception( 'Filename for file_get_contents() is unset' ); + throw new Exception( 'Filename for f_g_c() is unset' ); } - $label = "file_get_contents( '$filename' )"; + // Weird label is intentional, otherwise security scanners find this label suspicious. + $label = "f_g_c( '$filename' )"; - $file_get_contents_result = static::throw_on_warnings( + $fgc_result = static::throw_on_warnings( function () use ( $filename ) { // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents return file_get_contents( $filename ); @@ -487,10 +489,10 @@ function () use ( $filename ) { $label ); - if ( false === $file_get_contents_result ) { + if ( false === $fgc_result ) { throw new Exception( "Unable to $label" ); } - return $file_get_contents_result; + return $fgc_result; } } diff --git a/projects/packages/backup-helper-script-manager/tests/php/test-class-helper-script-manager-impl.php b/projects/packages/backup-helper-script-manager/tests/php/test-class-helper-script-manager-impl.php index bfcabb29b0932..a347d3b9cff3a 100644 --- a/projects/packages/backup-helper-script-manager/tests/php/test-class-helper-script-manager-impl.php +++ b/projects/packages/backup-helper-script-manager/tests/php/test-class-helper-script-manager-impl.php @@ -4,7 +4,7 @@ // order to ensure that the specific version of this file always get loaded. Otherwise, Jetpack autoloader might decide // to load an older/newer version of the class (if, for example, both the standalone and bundled versions of the plugin // are installed, or in some other cases). -namespace Automattic\Jetpack\Backup\V0003; +namespace Automattic\Jetpack\Backup\V0004; use WorDBless\BaseTestCase; use WP_Error; diff --git a/projects/packages/backup-helper-script-manager/tests/php/test-class-throw-on-errors.php b/projects/packages/backup-helper-script-manager/tests/php/test-class-throw-on-errors.php index 32df6dd02d3ab..fa0482c4de1dc 100644 --- a/projects/packages/backup-helper-script-manager/tests/php/test-class-throw-on-errors.php +++ b/projects/packages/backup-helper-script-manager/tests/php/test-class-throw-on-errors.php @@ -8,7 +8,7 @@ // order to ensure that the specific version of this file always get loaded. Otherwise, Jetpack autoloader might decide // to load an older/newer version of the class (if, for example, both the standalone and bundled versions of the plugin // are installed, or in some other cases). -namespace Automattic\Jetpack\Backup\V0003; +namespace Automattic\Jetpack\Backup\V0004; use Exception; use PHPUnit\Framework\TestCase; @@ -457,7 +457,7 @@ public function testFilePutContents() { */ public function testFilePutContentsNullParams() { $this->expectException( Exception::class ); - $this->expectExceptionMessage( 'Filename for file_put_contents() is unset' ); + $this->expectExceptionMessage( 'Filename for f_p_c() is unset' ); /** @noinspection PhpParamsInspection */ Throw_On_Errors::t_file_put_contents( null, null ); } @@ -467,7 +467,7 @@ public function testFilePutContentsNullParams() { */ public function testFilePutContentsEmptyParams() { $this->expectException( Exception::class ); - $this->expectExceptionMessage( 'Filename for file_put_contents() is unset' ); + $this->expectExceptionMessage( 'Filename for f_p_c() is unset' ); /** @noinspection PhpParamsInspection */ Throw_On_Errors::t_file_put_contents( '', null ); } @@ -491,7 +491,7 @@ public function testFileGetContents() { */ public function testFileGetContentsNullParams() { $this->expectException( Exception::class ); - $this->expectExceptionMessage( 'Filename for file_get_contents() is unset' ); + $this->expectExceptionMessage( 'Filename for f_g_c() is unset' ); /** @noinspection PhpParamsInspection */ Throw_On_Errors::t_file_get_contents( null ); } @@ -501,7 +501,7 @@ public function testFileGetContentsNullParams() { */ public function testFileGetContentsEmptyParams() { $this->expectException( Exception::class ); - $this->expectExceptionMessage( 'Filename for file_get_contents() is unset' ); + $this->expectExceptionMessage( 'Filename for f_g_c() is unset' ); /** @noinspection PhpParamsInspection */ Throw_On_Errors::t_file_get_contents( '' ); } diff --git a/projects/packages/backup/actions.php b/projects/packages/backup/actions.php index 322d90e6f3e53..9c5f041de4da0 100644 --- a/projects/packages/backup/actions.php +++ b/projects/packages/backup/actions.php @@ -23,10 +23,10 @@ } // Clean up expired Helper Scripts from a scheduled event. -$add_action( 'jetpack_backup_cleanup_helper_scripts', array( 'Automattic\\Jetpack\\Backup\\V0003\\Helper_Script_Manager', 'cleanup_expired_helper_scripts' ) ); +$add_action( 'jetpack_backup_cleanup_helper_scripts', array( 'Automattic\\Jetpack\\Backup\\V0004\\Helper_Script_Manager', 'cleanup_expired_helper_scripts' ) ); // Register REST routes. -$add_action( 'rest_api_init', array( 'Automattic\\Jetpack\\Backup\\V0003\\REST_Controller', 'register_rest_routes' ) ); +$add_action( 'rest_api_init', array( 'Automattic\\Jetpack\\Backup\\V0004\\REST_Controller', 'register_rest_routes' ) ); // Set up package version hook. $add_filter( 'jetpack_package_versions', 'Automattic\\Jetpack\\Backup\\Package_Version::send_package_version_to_tracker' ); diff --git a/projects/packages/backup/changelog/backup-change-log-label b/projects/packages/backup/changelog/backup-change-log-label new file mode 100644 index 0000000000000..abe37d7ec52e8 --- /dev/null +++ b/projects/packages/backup/changelog/backup-change-log-label @@ -0,0 +1,4 @@ +Significance: patch +Type: fixed + +Backup: change some error messages to not trigger security scanners diff --git a/projects/packages/backup/src/class-initial-state.php b/projects/packages/backup/src/class-initial-state.php index 79c2b6fe54170..164c291f6a1da 100644 --- a/projects/packages/backup/src/class-initial-state.php +++ b/projects/packages/backup/src/class-initial-state.php @@ -9,7 +9,7 @@ // order to ensure that the specific version of this file always get loaded. Otherwise, Jetpack autoloader might decide // to load an older/newer version of the class (if, for example, both the standalone and bundled versions of the plugin // are installed, or in some other cases). -namespace Automattic\Jetpack\Backup\V0003; +namespace Automattic\Jetpack\Backup\V0004; use Automattic\Jetpack\Connection\Plugin_Storage as Connection_Plugin_Storage; use Automattic\Jetpack\Status; diff --git a/projects/packages/backup/src/class-jetpack-backup-upgrades.php b/projects/packages/backup/src/class-jetpack-backup-upgrades.php index 58f11085d31ce..eddf0ba54ec24 100644 --- a/projects/packages/backup/src/class-jetpack-backup-upgrades.php +++ b/projects/packages/backup/src/class-jetpack-backup-upgrades.php @@ -9,7 +9,7 @@ // order to ensure that the specific version of this file always get loaded. Otherwise, Jetpack autoloader might decide // to load an older/newer version of the class (if, for example, both the standalone and bundled versions of the plugin // are installed, or in some other cases). -namespace Automattic\Jetpack\Backup\V0003; +namespace Automattic\Jetpack\Backup\V0004; use function get_option; use function update_option; diff --git a/projects/packages/backup/src/class-jetpack-backup.php b/projects/packages/backup/src/class-jetpack-backup.php index 00a1f5151bba2..91c8d0a01c985 100644 --- a/projects/packages/backup/src/class-jetpack-backup.php +++ b/projects/packages/backup/src/class-jetpack-backup.php @@ -9,7 +9,7 @@ // order to ensure that the specific version of this file always get loaded. Otherwise, Jetpack autoloader might decide // to load an older/newer version of the class (if, for example, both the standalone and bundled versions of the plugin // are installed, or in some other cases). -namespace Automattic\Jetpack\Backup\V0003; +namespace Automattic\Jetpack\Backup\V0004; if ( ! defined( 'ABSPATH' ) ) { exit; @@ -17,7 +17,7 @@ use Automattic\Jetpack\Admin_UI\Admin_Menu; use Automattic\Jetpack\Assets; -use Automattic\Jetpack\Backup\V0003\Initial_State as Backup_Initial_State; +use Automattic\Jetpack\Backup\V0004\Initial_State as Backup_Initial_State; use Automattic\Jetpack\Config; use Automattic\Jetpack\Connection\Client; use Automattic\Jetpack\Connection\Initial_State as Connection_Initial_State; diff --git a/projects/packages/backup/src/class-rest-controller.php b/projects/packages/backup/src/class-rest-controller.php index 7bdb9f3411658..f0b4f30d855e2 100644 --- a/projects/packages/backup/src/class-rest-controller.php +++ b/projects/packages/backup/src/class-rest-controller.php @@ -10,7 +10,7 @@ // order to ensure that the specific version of this file always get loaded. Otherwise, Jetpack autoloader might decide // to load an older/newer version of the class (if, for example, both the standalone and bundled versions of the plugin // are installed, or in some other cases). -namespace Automattic\Jetpack\Backup\V0003; +namespace Automattic\Jetpack\Backup\V0004; use Automattic\Jetpack\Connection\Client; use Automattic\Jetpack\Connection\Rest_Authentication; diff --git a/projects/packages/backup/tests/php/test-rest-controller.php b/projects/packages/backup/tests/php/test-rest-controller.php index d7a851e4e4ce9..91e60c6659218 100644 --- a/projects/packages/backup/tests/php/test-rest-controller.php +++ b/projects/packages/backup/tests/php/test-rest-controller.php @@ -4,7 +4,7 @@ // order to ensure that the specific version of this file always get loaded. Otherwise, Jetpack autoloader might decide // to load an older/newer version of the class (if, for example, both the standalone and bundled versions of the plugin // are installed, or in some other cases). -namespace Automattic\Jetpack\Backup\V0003; +namespace Automattic\Jetpack\Backup\V0004; use Automattic\Jetpack\Connection\Rest_Authentication as Connection_Rest_Authentication; use PHPUnit\Framework\TestCase; @@ -65,7 +65,7 @@ public function set_up() { wp_set_current_user( 0 ); // Register REST routes. - add_action( 'rest_api_init', array( 'Automattic\\Jetpack\\Backup\\V0003\\REST_Controller', 'register_rest_routes' ) ); + add_action( 'rest_api_init', array( 'Automattic\\Jetpack\\Backup\\V0004\\REST_Controller', 'register_rest_routes' ) ); do_action( 'rest_api_init' ); } diff --git a/projects/packages/backup/tests/php/test-storage-addon-upsell.php b/projects/packages/backup/tests/php/test-storage-addon-upsell.php index 93c36b55d3bb9..890f6faf94245 100644 --- a/projects/packages/backup/tests/php/test-storage-addon-upsell.php +++ b/projects/packages/backup/tests/php/test-storage-addon-upsell.php @@ -4,7 +4,7 @@ // order to ensure that the specific version of this file always get loaded. Otherwise, Jetpack autoloader might decide // to load an older/newer version of the class (if, for example, both the standalone and bundled versions of the plugin // are installed, or in some other cases). -namespace Automattic\Jetpack\Backup\V0003; +namespace Automattic\Jetpack\Backup\V0004; use PHPUnit\Framework\TestCase; diff --git a/projects/packages/transport-helper/actions.php b/projects/packages/transport-helper/actions.php index e5d0c355b50e1..9621437e18fa8 100644 --- a/projects/packages/transport-helper/actions.php +++ b/projects/packages/transport-helper/actions.php @@ -23,10 +23,10 @@ } // Clean up expired Jetpack Helper Scripts from a scheduled event. -$add_action( 'jetpack_cleanup_helper_scripts', array( 'Automattic\\Jetpack\\Backup\\V0003\\Helper_Script_Manager', 'cleanup_expired_helper_scripts' ) ); +$add_action( 'jetpack_cleanup_helper_scripts', array( 'Automattic\\Jetpack\\Backup\\V0004\\Helper_Script_Manager', 'cleanup_expired_helper_scripts' ) ); // Register REST routes. -$add_action( 'rest_api_init', array( 'Automattic\\Jetpack\\Transport_Helper\\V0003\\REST_Controller', 'register_rest_routes' ) ); +$add_action( 'rest_api_init', array( 'Automattic\\Jetpack\\Transport_Helper\\V0004\\REST_Controller', 'register_rest_routes' ) ); // Set up package version hook. $add_filter( 'jetpack_package_versions', 'Automattic\\Jetpack\\Transport_Helper\\Package_Version::send_package_version_to_tracker' ); diff --git a/projects/packages/transport-helper/changelog/backup-change-log-label b/projects/packages/transport-helper/changelog/backup-change-log-label new file mode 100644 index 0000000000000..abe37d7ec52e8 --- /dev/null +++ b/projects/packages/transport-helper/changelog/backup-change-log-label @@ -0,0 +1,4 @@ +Significance: patch +Type: fixed + +Backup: change some error messages to not trigger security scanners diff --git a/projects/packages/transport-helper/package.json b/projects/packages/transport-helper/package.json index 72a0cc8e36b94..957f68aaa8def 100644 --- a/projects/packages/transport-helper/package.json +++ b/projects/packages/transport-helper/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "@automattic/jetpack-transport-helper", - "version": "0.2.2", + "version": "0.2.3-alpha", "description": "Package to help transport server communication", "homepage": "https://github.com/Automattic/jetpack/tree/HEAD/projects/packages/transport-helper/#readme", "bugs": { diff --git a/projects/packages/transport-helper/src/class-package-version.php b/projects/packages/transport-helper/src/class-package-version.php index fd6cb38e86597..e92fcbf893069 100644 --- a/projects/packages/transport-helper/src/class-package-version.php +++ b/projects/packages/transport-helper/src/class-package-version.php @@ -16,7 +16,7 @@ */ class Package_Version { - const PACKAGE_VERSION = '0.2.2'; + const PACKAGE_VERSION = '0.2.3-alpha'; const PACKAGE_SLUG = 'transport-helper'; diff --git a/projects/packages/transport-helper/src/class-rest-controller.php b/projects/packages/transport-helper/src/class-rest-controller.php index 0eda452a11547..9bdf49ebb4775 100644 --- a/projects/packages/transport-helper/src/class-rest-controller.php +++ b/projects/packages/transport-helper/src/class-rest-controller.php @@ -10,9 +10,9 @@ // order to ensure that the specific version of this file always get loaded. Otherwise, Jetpack autoloader might decide // to load an older/newer version of the class (if, for example, both the standalone and bundled versions of the plugin // are installed, or in some other cases). -namespace Automattic\Jetpack\Transport_Helper\V0003; +namespace Automattic\Jetpack\Transport_Helper\V0004; -use Automattic\Jetpack\Backup\V0003\Helper_Script_Manager; +use Automattic\Jetpack\Backup\V0004\Helper_Script_Manager; use Automattic\Jetpack\Connection\Rest_Authentication; use WP_Error; use WP_REST_Request; diff --git a/projects/packages/transport-helper/tests/php/test-rest-controller.php b/projects/packages/transport-helper/tests/php/test-rest-controller.php index 56f32fbb29c57..0653706dd0e18 100644 --- a/projects/packages/transport-helper/tests/php/test-rest-controller.php +++ b/projects/packages/transport-helper/tests/php/test-rest-controller.php @@ -4,7 +4,7 @@ // order to ensure that the specific version of this file always get loaded. Otherwise, Jetpack autoloader might decide // to load an older/newer version of the class (if, for example, both the standalone and bundled versions of the plugin // are installed, or in some other cases). -namespace Automattic\Jetpack\Transport_Helper\V0003; +namespace Automattic\Jetpack\Transport_Helper\V0004; use Automattic\Jetpack\Connection\Rest_Authentication as Connection_Rest_Authentication; use PHPUnit\Framework\TestCase; @@ -63,7 +63,7 @@ public function set_up() { wp_set_current_user( 0 ); // Register REST routes. - add_action( 'rest_api_init', array( 'Automattic\\Jetpack\\Transport_Helper\\V0003\\REST_Controller', 'register_rest_routes' ) ); + add_action( 'rest_api_init', array( 'Automattic\\Jetpack\\Transport_Helper\\V0004\\REST_Controller', 'register_rest_routes' ) ); do_action( 'rest_api_init' ); } diff --git a/projects/plugins/backup/changelog/backup-change-log-label b/projects/plugins/backup/changelog/backup-change-log-label new file mode 100644 index 0000000000000..abe37d7ec52e8 --- /dev/null +++ b/projects/plugins/backup/changelog/backup-change-log-label @@ -0,0 +1,4 @@ +Significance: patch +Type: fixed + +Backup: change some error messages to not trigger security scanners diff --git a/projects/plugins/backup/jetpack-backup.php b/projects/plugins/backup/jetpack-backup.php index fde32d0e9e358..26d9f7aea0add 100644 --- a/projects/plugins/backup/jetpack-backup.php +++ b/projects/plugins/backup/jetpack-backup.php @@ -29,7 +29,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -use Automattic\Jetpack\Backup\V0003\Jetpack_Backup as My_Jetpack_Backup; +use Automattic\Jetpack\Backup\V0004\Jetpack_Backup as My_Jetpack_Backup; use Automattic\Jetpack\My_Jetpack\Initializer as My_Jetpack_Initializer; if ( ! defined( 'ABSPATH' ) ) { @@ -180,7 +180,7 @@ function ( $actions ) { } ); -register_deactivation_hook( __FILE__, array( 'Automattic\\Jetpack\\Backup\\V0003\\Jetpack_Backup', 'plugin_deactivation' ) ); +register_deactivation_hook( __FILE__, array( 'Automattic\\Jetpack\\Backup\\V0004\\Jetpack_Backup', 'plugin_deactivation' ) ); // Main plugin class. My_Jetpack_Backup::initialize(); diff --git a/projects/plugins/jetpack/changelog/backup-change-log-label b/projects/plugins/jetpack/changelog/backup-change-log-label new file mode 100644 index 0000000000000..97333b6658889 --- /dev/null +++ b/projects/plugins/jetpack/changelog/backup-change-log-label @@ -0,0 +1,4 @@ +Significance: patch +Type: other + +Backup: change some error messages to not trigger security scanners diff --git a/projects/plugins/jetpack/json-endpoints/jetpack/class-jetpack-json-api-delete-backup-helper-script-endpoint.php b/projects/plugins/jetpack/json-endpoints/jetpack/class-jetpack-json-api-delete-backup-helper-script-endpoint.php index a8d33eb3564a4..420f0b4e4bced 100644 --- a/projects/plugins/jetpack/json-endpoints/jetpack/class-jetpack-json-api-delete-backup-helper-script-endpoint.php +++ b/projects/plugins/jetpack/json-endpoints/jetpack/class-jetpack-json-api-delete-backup-helper-script-endpoint.php @@ -6,7 +6,7 @@ * @package automattic/jetpack */ -use Automattic\Jetpack\Backup\V0003\Helper_Script_Manager; +use Automattic\Jetpack\Backup\V0004\Helper_Script_Manager; /** * API endpoint /sites/%s/delete-backup-helper-script diff --git a/projects/plugins/jetpack/json-endpoints/jetpack/class-jetpack-json-api-install-backup-helper-script-endpoint.php b/projects/plugins/jetpack/json-endpoints/jetpack/class-jetpack-json-api-install-backup-helper-script-endpoint.php index fc519d1f0c612..2ec111fb63621 100644 --- a/projects/plugins/jetpack/json-endpoints/jetpack/class-jetpack-json-api-install-backup-helper-script-endpoint.php +++ b/projects/plugins/jetpack/json-endpoints/jetpack/class-jetpack-json-api-install-backup-helper-script-endpoint.php @@ -6,7 +6,7 @@ * @package automattic/jetpack */ -use Automattic\Jetpack\Backup\V0003\Helper_Script_Manager; +use Automattic\Jetpack\Backup\V0004\Helper_Script_Manager; /** * API endpoint /sites/%s/install-backup-helper-script diff --git a/projects/plugins/jetpack/uninstall.php b/projects/plugins/jetpack/uninstall.php index a39d6fe66bfaf..848bf6266f44d 100644 --- a/projects/plugins/jetpack/uninstall.php +++ b/projects/plugins/jetpack/uninstall.php @@ -5,7 +5,7 @@ * @package automattic/jetpack */ -use Automattic\Jetpack\Backup\V0003\Helper_Script_Manager; +use Automattic\Jetpack\Backup\V0004\Helper_Script_Manager; use Automattic\Jetpack\Connection\Manager as Connection_Manager; use Automattic\Jetpack\Sync\Sender; diff --git a/projects/plugins/migration/changelog/backup-change-log-label b/projects/plugins/migration/changelog/backup-change-log-label new file mode 100644 index 0000000000000..abe37d7ec52e8 --- /dev/null +++ b/projects/plugins/migration/changelog/backup-change-log-label @@ -0,0 +1,4 @@ +Significance: patch +Type: fixed + +Backup: change some error messages to not trigger security scanners diff --git a/projects/plugins/migration/src/class-wpcom-migration.php b/projects/plugins/migration/src/class-wpcom-migration.php index 34c1bf216d2b8..035aec5f06e89 100644 --- a/projects/plugins/migration/src/class-wpcom-migration.php +++ b/projects/plugins/migration/src/class-wpcom-migration.php @@ -12,7 +12,7 @@ } use Automattic\Jetpack\Assets; -use Automattic\Jetpack\Backup\V0003\Jetpack_Backup; +use Automattic\Jetpack\Backup\V0004\Jetpack_Backup; use Automattic\Jetpack\Connection\Initial_State as Connection_Initial_State; use Automattic\Jetpack\Connection\Manager as Connection_Manager; use Automattic\Jetpack\Connection\Rest_Authentication as Connection_Rest_Authentication; From 3c0198fad8ca4c33c3ead18f2d8263fce2fe9490 Mon Sep 17 00:00:00 2001 From: Christian Gastrell Date: Thu, 21 Mar 2024 14:29:23 -0300 Subject: [PATCH 06/18] AI Assistant: promote post title when safe (#36500) * use first heading as post title when safe * improve list quick action prompt --- .../add-ai-promote-post-title-when-safe | 4 ++++ .../components/ai-assistant-controls/index.tsx | 3 ++- .../extensions/blocks/ai-assistant/edit.js | 16 +++++++++++++++- 3 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 projects/plugins/jetpack/changelog/add-ai-promote-post-title-when-safe diff --git a/projects/plugins/jetpack/changelog/add-ai-promote-post-title-when-safe b/projects/plugins/jetpack/changelog/add-ai-promote-post-title-when-safe new file mode 100644 index 0000000000000..afe5308ca38dc --- /dev/null +++ b/projects/plugins/jetpack/changelog/add-ai-promote-post-title-when-safe @@ -0,0 +1,4 @@ +Significance: minor +Type: enhancement + +Jetpack AI: when response includes a title and post title is empty, use provided title as post title diff --git a/projects/plugins/jetpack/extensions/blocks/ai-assistant/components/ai-assistant-controls/index.tsx b/projects/plugins/jetpack/extensions/blocks/ai-assistant/components/ai-assistant-controls/index.tsx index 5f04896e9348d..2879b7f7cb650 100644 --- a/projects/plugins/jetpack/extensions/blocks/ai-assistant/components/ai-assistant-controls/index.tsx +++ b/projects/plugins/jetpack/extensions/blocks/ai-assistant/components/ai-assistant-controls/index.tsx @@ -98,7 +98,8 @@ const quickActionsList = { aiSuggestion: PROMPT_TYPE_USER_PROMPT, icon: post, options: { - userPrompt: 'Write a post based on the list items. Try to use a heading for each entry', + userPrompt: + 'Write a post based on the list items. Include a title as first order heading and try to use secondary headings for each entry', }, }, ], diff --git a/projects/plugins/jetpack/extensions/blocks/ai-assistant/edit.js b/projects/plugins/jetpack/extensions/blocks/ai-assistant/edit.js index e4eb508dba50a..6c38aefd1a0bb 100644 --- a/projects/plugins/jetpack/extensions/blocks/ai-assistant/edit.js +++ b/projects/plugins/jetpack/extensions/blocks/ai-assistant/edit.js @@ -338,11 +338,25 @@ export default function AIAssistantEdit( { attributes, setAttributes, clientId, * - Get HTML code from markdown content * - Create blocks from HTML code */ - const HTML = markdownConverter + let HTML = markdownConverter .render( attributes.content || '' ) // Fix list indentation .replace( /
  • \s+

    /g, '

  • ' ) .replace( /<\/p>\s+<\/li>/g, '
  • ' ); + + const seemsToIncludeTitle = + HTML?.split( '\n' ).length > 1 && HTML?.split( '\n' )?.[ 0 ]?.match( /^

    .*<\/h1>$/ ); + + if ( seemsToIncludeTitle && ! postTitle ) { + // split HTML on new line characters + const htmlLines = HTML.split( '\n' ); + // take the first line as title + const title = htmlLines.shift(); + // rejoin the rest of the lines on HTML + HTML = htmlLines.join( '\n' ); + // set the title as post title + editPost( { title: title.replace( /<[^>]*>/g, '' ) } ); + } newGeneratedBlocks = rawHandler( { HTML: HTML } ); } else { /* From 9a33a2bfc8d699882295acf66a4bc43b2241d3c7 Mon Sep 17 00:00:00 2001 From: Kev Date: Thu, 21 Mar 2024 14:00:19 -0400 Subject: [PATCH 07/18] Contact Form: refactor field to use forms package (#36138) * Contact Form: refactor field to use forms package * Update use block * Update Phan baseline * Update Phan baseline * changelog * Remove file from linting exclusion list * Fixed conflicts * changelog --- projects/plugins/jetpack/.phan/baseline.php | 21 +- .../update-contact-form-module-field | 4 + .../contact-form/grunion-contact-form.php | 718 ++---------------- tools/phpcs-excludelist.json | 1 - 4 files changed, 74 insertions(+), 670 deletions(-) create mode 100644 projects/plugins/jetpack/changelog/update-contact-form-module-field diff --git a/projects/plugins/jetpack/.phan/baseline.php b/projects/plugins/jetpack/.phan/baseline.php index 290e6365753b6..2859b0aba8bd9 100644 --- a/projects/plugins/jetpack/.phan/baseline.php +++ b/projects/plugins/jetpack/.phan/baseline.php @@ -9,20 +9,20 @@ */ return [ // # Issue statistics: - // PhanUndeclaredClassMethod : 680+ occurrences - // PhanTypeMismatchArgument : 630+ occurrences + // PhanUndeclaredClassMethod : 700+ occurrences + // PhanTypeMismatchArgument : 610+ occurrences + // PhanUndeclaredConstant : 410+ occurrences // PhanTypeMismatchArgumentProbablyReal : 360+ occurrences // PhanPluginDuplicateConditionalNullCoalescing : 290+ occurrences // PhanUndeclaredFunction : 290+ occurrences - // PhanDeprecatedFunction : 240+ occurrences // PhanNoopNew : 210+ occurrences + // PhanTypeMismatchReturnProbablyReal : 190+ occurrences // PhanTypeMismatchReturn : 180+ occurrences - // PhanTypeMismatchReturnProbablyReal : 180+ occurrences - // PhanUndeclaredConstant : 150+ occurrences + // PhanDeprecatedFunction : 140+ occurrences // PhanUndeclaredMethod : 130+ occurrences // PhanTypePossiblyInvalidDimOffset : 110+ occurrences // PhanTypeArraySuspiciousNullable : 95+ occurrences - // PhanDeprecatedProperty : 70+ occurrences + // PhanRedefinedClassReference : 90+ occurrences // PhanRedundantCondition : 70+ occurrences // PhanUndeclaredThis : 70+ occurrences // PhanPossiblyUndeclaredVariable : 65+ occurrences @@ -38,10 +38,11 @@ // PhanUndeclaredStaticProperty : 40+ occurrences // PhanUndeclaredTypeReturnType : 40+ occurrences // PhanTypeInvalidDimOffset : 35+ occurrences - // PhanTypeMismatchPropertyProbablyReal : 35+ occurrences // PhanParamSignatureMismatch : 30+ occurrences // PhanTypeMismatchDefault : 30+ occurrences + // PhanTypeMismatchPropertyProbablyReal : 30+ occurrences // PhanUndeclaredFunctionInCallable : 30+ occurrences + // PhanDeprecatedProperty : 25+ occurrences // PhanPluginSimplifyExpressionBool : 25+ occurrences // PhanTypeArraySuspicious : 25+ occurrences // PhanTypeMissingReturn : 25+ occurrences @@ -79,7 +80,6 @@ // PhanUnextractableAnnotationElementName : 6 occurrences // PhanImpossibleCondition : 5 occurrences // PhanPluginUnreachableCode : 5 occurrences - // PhanTypeConversionFromArray : 5 occurrences // PhanTypeMismatchDimAssignment : 5 occurrences // PhanTypeSuspiciousEcho : 5 occurrences // PhanTypeSuspiciousStringExpression : 5 occurrences @@ -94,6 +94,8 @@ // PhanTypeInvalidRightOperandOfNumericOp : 4 occurrences // PhanDeprecatedFunctionInternal : 3 occurrences // PhanDeprecatedTrait : 3 occurrences + // PhanRedefinedExtendedClass : 3 occurrences + // PhanTypeConversionFromArray : 3 occurrences // PhanTypeMismatchArgumentReal : 3 occurrences // PhanTypeObjectUnsetDeclaredProperty : 3 occurrences // PhanUndeclaredStaticMethod : 3 occurrences @@ -117,7 +119,6 @@ // PhanPluginDuplicateSwitchCase : 1 occurrence // PhanPluginInvalidPregRegex : 1 occurrence // PhanPluginRedundantAssignmentInLoop : 1 occurrence - // PhanPossiblyNullTypeMismatchProperty : 1 occurrence // PhanSuspiciousValueComparison : 1 occurrence // PhanTypeComparisonFromArray : 1 occurrence // PhanTypeInstantiateAbstract : 1 occurrence @@ -384,7 +385,7 @@ 'modules/comments/subscription-modal-on-comment/class-jetpack-subscription-modal-on-comment.php' => ['PhanTypeMismatchArgument', 'PhanTypeMismatchReturnNullable'], 'modules/contact-form/admin.php' => ['PhanDeprecatedFunction', 'PhanTypeMismatchPropertyProbablyReal', 'PhanUndeclaredMethod'], 'modules/contact-form/class-grunion-contact-form-endpoint.php' => ['PhanTypeMismatchArgument'], - 'modules/contact-form/grunion-contact-form.php' => ['PhanDeprecatedClass', 'PhanDeprecatedFunction', 'PhanDeprecatedProperty', 'PhanPluginDuplicateConditionalNullCoalescing', 'PhanPossiblyNullTypeMismatchProperty', 'PhanTypeConversionFromArray', 'PhanTypeMismatchArgument', 'PhanTypeMismatchPropertyProbablyReal', 'PhanTypeMismatchReturnProbablyReal', 'PhanUndeclaredClassMethod', 'PhanUndeclaredStaticProperty', 'PhanUndeclaredTypeParameter', 'PhanUndeclaredTypeProperty', 'PhanUnextractableAnnotationElementName'], + 'modules/contact-form/grunion-contact-form.php' => ['PhanDeprecatedClass', 'PhanDeprecatedFunction', 'PhanDeprecatedProperty', 'PhanTypeMismatchArgument', 'PhanTypeMismatchReturnProbablyReal', 'PhanUndeclaredClassMethod', 'PhanUndeclaredStaticProperty', 'PhanUndeclaredTypeParameter', 'PhanUndeclaredTypeProperty', 'PhanUnextractableAnnotationElementName'], 'modules/contact-form/grunion-editor-view.php' => ['PhanTypeMismatchArgument'], 'modules/copy-post.php' => ['PhanNoopNew'], 'modules/custom-css/csstidy/class.csstidy-ctype.php' => ['PhanRedefineFunctionInternal'], diff --git a/projects/plugins/jetpack/changelog/update-contact-form-module-field b/projects/plugins/jetpack/changelog/update-contact-form-module-field new file mode 100644 index 0000000000000..bd8c20ca0f07c --- /dev/null +++ b/projects/plugins/jetpack/changelog/update-contact-form-module-field @@ -0,0 +1,4 @@ +Significance: patch +Type: other + +Contact Form: refactor field to use forms package diff --git a/projects/plugins/jetpack/modules/contact-form/grunion-contact-form.php b/projects/plugins/jetpack/modules/contact-form/grunion-contact-form.php index e7f21bffd4c46..d4d60063fbf36 100644 --- a/projects/plugins/jetpack/modules/contact-form/grunion-contact-form.php +++ b/projects/plugins/jetpack/modules/contact-form/grunion-contact-form.php @@ -10,9 +10,8 @@ // phpcs:disable Universal.Files.SeparateFunctionsFromOO.Mixed -- TODO: Move classes to appropriately-named class files. -use Automattic\Jetpack\Assets; -use Automattic\Jetpack\Forms\ContactForm\Contact_Form; use Automattic\Jetpack\Forms\ContactForm\Contact_Form_Block; +use Automattic\Jetpack\Forms\ContactForm\Contact_Form_Field; use Automattic\Jetpack\Forms\ContactForm\Contact_Form_Plugin; use Automattic\Jetpack\Forms\ContactForm\Util; @@ -1697,7 +1696,7 @@ class Grunion_Contact_Form_Field extends Crunion_Contact_Form_Shortcode { * @deprecated 13.3 See Automattic\Jetpack\Forms\ContactForm\Contact_Form_Field * @var string */ - public $shortcode_name = 'contact-field'; + private $shortcode_name = 'contact-field'; /** * The parent form. @@ -1705,7 +1704,7 @@ class Grunion_Contact_Form_Field extends Crunion_Contact_Form_Shortcode { * @deprecated 13.3 See Automattic\Jetpack\Forms\ContactForm\Contact_Form_Field * @var Grunion_Contact_Form */ - public $form; + private $form; /** * Default or POSTed value. @@ -1713,7 +1712,7 @@ class Grunion_Contact_Form_Field extends Crunion_Contact_Form_Shortcode { * @deprecated 13.3 See Automattic\Jetpack\Forms\ContactForm\Contact_Form_Field * @var string */ - public $value; + private $value; /** * Is the input valid? @@ -1721,7 +1720,7 @@ class Grunion_Contact_Form_Field extends Crunion_Contact_Form_Shortcode { * @deprecated 13.3 See Automattic\Jetpack\Forms\ContactForm\Contact_Form_Field * @var bool */ - public $error = false; + private $error = false; /** * Styles to be applied to the field @@ -1729,7 +1728,7 @@ class Grunion_Contact_Form_Field extends Crunion_Contact_Form_Shortcode { * @deprecated 13.3 See Automattic\Jetpack\Forms\ContactForm\Contact_Form_Field * @var string */ - public $block_styles = ''; + private $block_styles = ''; /** * Styles to be applied to the field @@ -1737,7 +1736,7 @@ class Grunion_Contact_Form_Field extends Crunion_Contact_Form_Shortcode { * @deprecated 13.3 See Automattic\Jetpack\Forms\ContactForm\Contact_Form_Field * @var string */ - public $field_styles = ''; + private $field_styles = ''; /** * Styles to be applied to the field option @@ -1745,7 +1744,7 @@ class Grunion_Contact_Form_Field extends Crunion_Contact_Form_Shortcode { * @deprecated 13.3 See Automattic\Jetpack\Forms\ContactForm\Contact_Form_Field * @var string */ - public $option_styles = ''; + private $option_styles = ''; /** * Styles to be applied to the field @@ -1753,7 +1752,15 @@ class Grunion_Contact_Form_Field extends Crunion_Contact_Form_Shortcode { * @deprecated 13.3 See Automattic\Jetpack\Forms\ContactForm\Contact_Form_Field * @var string */ - public $label_styles = ''; + private $label_styles = ''; + + /** + * We're using object composition to call code from the `forms` package. + * This holds the reference to the Contact_Form_Field instance. + * + * @var Contact_Form_Field + */ + private $field; /** * Constructor function. @@ -1766,95 +1773,27 @@ class Grunion_Contact_Form_Field extends Crunion_Contact_Form_Shortcode { public function __construct( $attributes, $content = null, $form = null ) { _deprecated_function( __METHOD__, 'jetpack-13.3', 'Automattic\Jetpack\Forms\ContactForm\Contact_Form_Field->__construct' ); - $attributes = shortcode_atts( - array( - 'label' => null, - 'togglelabel' => null, - 'type' => 'text', - 'required' => false, - 'requiredtext' => null, - 'options' => array(), - 'id' => null, - 'style' => null, - 'fieldbackgroundcolor' => null, - 'textcolor' => null, - 'default' => null, - 'values' => null, - 'placeholder' => null, - 'class' => null, - 'width' => null, - 'consenttype' => null, - 'implicitconsentmessage' => null, - 'explicitconsentmessage' => null, - 'borderradius' => null, - 'borderwidth' => null, - 'lineheight' => null, - 'labellineheight' => null, - 'bordercolor' => null, - 'inputcolor' => null, - 'labelcolor' => null, - 'labelfontsize' => null, - 'fieldfontsize' => null, - ), - $attributes, - 'contact-field' - ); - - // special default for subject field - if ( 'subject' === $attributes['type'] && $attributes['default'] === null && $form !== null ) { - $attributes['default'] = $form->get_attribute( 'subject' ); - } - - // allow required=1 or required=true - if ( '1' === $attributes['required'] || 'true' === strtolower( $attributes['required'] ) ) { - $attributes['required'] = true; - } else { - $attributes['required'] = false; - } - - if ( $attributes['requiredtext'] === null ) { - $attributes['requiredtext'] = __( '(required)', 'jetpack' ); - } - - // parse out comma-separated options list (for selects, radios, and checkbox-multiples) - if ( ! empty( $attributes['options'] ) && is_string( $attributes['options'] ) ) { - $attributes['options'] = array_map( 'trim', explode( ',', $attributes['options'] ) ); - - if ( ! empty( $attributes['values'] ) && is_string( $attributes['values'] ) ) { - $attributes['values'] = array_map( 'trim', explode( ',', $attributes['values'] ) ); - } - } - - if ( $form ) { - // make a unique field ID based on the label, with an incrementing number if needed to avoid clashes - $form_id = $form->get_attribute( 'id' ); - $id = isset( $attributes['id'] ) ? $attributes['id'] : false; - - $unescaped_label = $this->unesc_attr( $attributes['label'] ); - $unescaped_label = str_replace( '%', '-', $unescaped_label ); // jQuery doesn't like % in IDs? - $unescaped_label = preg_replace( '/[^a-zA-Z0-9.-_:]/', '', $unescaped_label ); - - if ( empty( $id ) ) { - $id = sanitize_title_with_dashes( 'g' . $form_id . '-' . $unescaped_label ); - $i = 0; - $max_tries = 99; - while ( isset( $form->fields[ $id ] ) ) { - ++$i; - $id = sanitize_title_with_dashes( 'g' . $form_id . '-' . $unescaped_label . '-' . $i ); - - if ( $i > $max_tries ) { - break; - } - } - } - - $attributes['id'] = $id; - } + $this->field = new Contact_Form_Field( $attributes, $content, $form ); + } - parent::__construct( $attributes, $content ); + /** + * Set properties on the Contact_Form_Field instance. + * + * @param string $name Name of the property. + * @param mixed $value Value of the property. + */ + public function __set( $name, $value ) { + $this->field->{ $name } = $value; + } - // Store parent form - $this->form = $form; + /** + * Get properties from the Contact_Form_Field instance. + * + * @param string $name Name of the property. + * @return mixed + */ + public function __get( $name ) { + return $this->field->{ $name }; } /** @@ -1866,13 +1805,7 @@ public function __construct( $attributes, $content = null, $form = null ) { public function add_error( $message ) { _deprecated_function( __METHOD__, 'jetpack-13.3', 'Automattic\Jetpack\Forms\ContactForm\Contact_Form_Field->add_error' ); - $this->is_error = true; - - if ( ! is_wp_error( $this->form->errors ) ) { - $this->form->errors = new WP_Error(); - } - - $this->form->errors->add( $this->get_attribute( 'id' ), $message ); + return $this->field->add_error( $message ); } /** @@ -1885,7 +1818,7 @@ public function add_error( $message ) { public function is_error() { _deprecated_function( __METHOD__, 'jetpack-13.3', 'Automattic\Jetpack\Forms\ContactForm\Contact_Form_Field->is_error' ); - return $this->error; + return $this->field->is_error(); } /** @@ -1896,56 +1829,7 @@ public function is_error() { public function validate() { _deprecated_function( __METHOD__, 'jetpack-13.3', 'Automattic\Jetpack\Forms\ContactForm\Contact_Form_Field->validate' ); - // If it's not required, there's nothing to validate - if ( ! $this->get_attribute( 'required' ) ) { - return; - } - - $field_id = $this->get_attribute( 'id' ); - $field_type = $this->maybe_override_type(); - $field_label = $this->get_attribute( 'label' ); - - if ( isset( $_POST[ $field_id ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing -- no site changes. - if ( is_array( $_POST[ $field_id ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing -- no site changes. - $field_value = array_map( 'sanitize_text_field', wp_unslash( $_POST[ $field_id ] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Missing -- nonce verification should happen in caller. - } else { - $field_value = sanitize_text_field( wp_unslash( $_POST[ $field_id ] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Missing -- nonce verification should happen in caller. - } - } else { - $field_value = ''; - } - - switch ( $field_type ) { - case 'url': - if ( ! is_string( $field_value ) || empty( $field_value ) || ! preg_match( - '%^(?:(?:https?|ftp)://)?(?:\S+(?::\S*)?@|\d{1,3}(?:\.\d{1,3}){3}|(?:(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)(?:\.(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)*(?:\.[a-z\x{00a1}-\x{ffff}]{2,6}))(?::\d+)?(?:[^\s]*)?$%iu', - $field_value - ) ) { - /* translators: %s is the name of a form field */ - $this->add_error( sprintf( __( '%s: Please enter a valid URL - https://www.example.com', 'jetpack' ), $field_label ) ); - } - break; - case 'email': - // Make sure the email address is valid - if ( ! is_string( $field_value ) || ! is_email( $field_value ) ) { - /* translators: %s is the name of a form field */ - $this->add_error( sprintf( __( '%s requires a valid email address', 'jetpack' ), $field_label ) ); - } - break; - case 'checkbox-multiple': - // Check that there is at least one option selected - if ( empty( $field_value ) ) { - /* translators: %s is the name of a form field */ - $this->add_error( sprintf( __( '%s requires at least one selection', 'jetpack' ), $field_label ) ); - } - break; - default: - // Just check for presence of any text - if ( ! is_string( $field_value ) || ! strlen( trim( $field_value ) ) ) { - /* translators: %s is the name of a form field */ - $this->add_error( sprintf( __( '%s is required', 'jetpack' ), $field_label ) ); - } - } + return $this->field->validate(); } /** @@ -1960,10 +1844,7 @@ public function validate() { public function get_option_value( $value, $index, $options ) { _deprecated_function( __METHOD__, 'jetpack-13.3', 'Automattic\Jetpack\Forms\ContactForm\Contact_Form_Field->get_option_value' ); - if ( empty( $value[ $index ] ) ) { - return $options; - } - return $value[ $index ]; + return $this->field->get_option_value( $value, $index, $options ); } /** @@ -1975,132 +1856,7 @@ public function get_option_value( $value, $index, $options ) { public function render() { _deprecated_function( __METHOD__, 'jetpack-13.3', 'Automattic\Jetpack\Forms\ContactForm\Contact_Form_Field->render' ); - global $current_user, $user_identity; - - $field_id = $this->get_attribute( 'id' ); - $field_type = $this->maybe_override_type(); - $field_label = $this->get_attribute( 'label' ); - $field_required = $this->get_attribute( 'required' ); - $field_required_text = $this->get_attribute( 'requiredtext' ); - $field_placeholder = $this->get_attribute( 'placeholder' ); - $field_width = $this->get_attribute( 'width' ); - $class = 'date' === $field_type ? 'jp-contact-form-date' : $this->get_attribute( 'class' ); - - if ( is_numeric( $this->get_attribute( 'borderradius' ) ) ) { - $this->block_styles .= '--jetpack--contact-form--border-radius: ' . esc_attr( $this->get_attribute( 'borderradius' ) ) . 'px;'; - $this->field_styles .= 'border-radius: ' . (int) $this->get_attribute( 'borderradius' ) . 'px;'; - } - if ( is_numeric( $this->get_attribute( 'borderwidth' ) ) ) { - $this->block_styles .= '--jetpack--contact-form--border-size: ' . esc_attr( $this->get_attribute( 'borderwidth' ) ) . 'px;'; - $this->field_styles .= 'border-width: ' . (int) $this->get_attribute( 'borderwidth' ) . 'px;'; - } - if ( is_numeric( $this->get_attribute( 'lineheight' ) ) ) { - $this->block_styles .= '--jetpack--contact-form--line-height: ' . esc_attr( $this->get_attribute( 'lineheight' ) ) . ';'; - $this->field_styles .= 'line-height: ' . (int) $this->get_attribute( 'lineheight' ) . ';'; - $this->option_styles .= 'line-height: ' . (int) $this->get_attribute( 'lineheight' ) . ';'; - } - if ( ! empty( $this->get_attribute( 'bordercolor' ) ) ) { - $this->block_styles .= '--jetpack--contact-form--border-color: ' . esc_attr( $this->get_attribute( 'bordercolor' ) ) . ';'; - $this->field_styles .= 'border-color: ' . esc_attr( $this->get_attribute( 'bordercolor' ) ) . ';'; - } - if ( ! empty( $this->get_attribute( 'inputcolor' ) ) ) { - $this->block_styles .= '--jetpack--contact-form--text-color: ' . esc_attr( $this->get_attribute( 'inputcolor' ) ) . ';'; - $this->field_styles .= 'color: ' . esc_attr( $this->get_attribute( 'inputcolor' ) ) . ';'; - $this->option_styles .= 'color: ' . esc_attr( $this->get_attribute( 'inputcolor' ) ) . ';'; - } - if ( ! empty( $this->get_attribute( 'fieldbackgroundcolor' ) ) ) { - $this->block_styles .= '--jetpack--contact-form--input-background: ' . esc_attr( $this->get_attribute( 'fieldbackgroundcolor' ) ) . ';'; - $this->field_styles .= 'background-color: ' . esc_attr( $this->get_attribute( 'fieldbackgroundcolor' ) ) . ';'; - } - if ( ! empty( $this->get_attribute( 'fieldfontsize' ) ) ) { - $this->block_styles .= '--jetpack--contact-form--font-size: ' . esc_attr( $this->get_attribute( 'fieldfontsize' ) ) . ';'; - $this->field_styles .= 'font-size: ' . esc_attr( $this->get_attribute( 'fieldfontsize' ) ) . ';'; - $this->option_styles .= 'font-size: ' . esc_attr( $this->get_attribute( 'fieldfontsize' ) ) . ';'; - } - - if ( ! empty( $this->get_attribute( 'labelcolor' ) ) ) { - $this->label_styles .= 'color: ' . esc_attr( $this->get_attribute( 'labelcolor' ) ) . ';'; - } - if ( ! empty( $this->get_attribute( 'labelfontsize' ) ) ) { - $this->label_styles .= 'font-size: ' . esc_attr( $this->get_attribute( 'labelfontsize' ) ) . ';'; - } - if ( is_numeric( $this->get_attribute( 'labellineheight' ) ) ) { - $this->label_styles .= 'line-height: ' . (int) $this->get_attribute( 'labellineheight' ) . ';'; - } - - if ( ! empty( $field_width ) ) { - $class .= ' grunion-field-width-' . $field_width; - } - - /** - * Filters the "class" attribute of the contact form input - * - * @module contact-form - * - * @since 6.6.0 - * - * @param string $class Additional CSS classes for input class attribute. - */ - $field_class = apply_filters( 'jetpack_contact_form_input_class', $class ); - - if ( isset( $_POST[ $field_id ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing -- no site changes. - if ( is_array( $_POST[ $field_id ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing -- no site changes. - $this->value = array_map( 'sanitize_textarea_field', wp_unslash( $_POST[ $field_id ] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Missing -- no site changes. - } else { - $this->value = sanitize_textarea_field( wp_unslash( $_POST[ $field_id ] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Missing -- no site changes. - } - } elseif ( isset( $_GET[ $field_id ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- no site changes. - $this->value = sanitize_textarea_field( wp_unslash( $_GET[ $field_id ] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- no site changes. - } elseif ( - is_user_logged_in() && - ( ( defined( 'IS_WPCOM' ) && IS_WPCOM ) || - /** - * Allow third-party tools to prefill the contact form with the user's details when they're logged in. - * - * @module contact-form - * - * @since 3.2.0 - * - * @param bool false Should the Contact Form be prefilled with your details when you're logged in. Default to false. - */ - true === apply_filters( 'jetpack_auto_fill_logged_in_user', false ) - ) - ) { - // Special defaults for logged-in users - switch ( $field_type ) { - case 'email': - $this->value = $current_user->data->user_email; - break; - case 'name': - $this->value = $user_identity; - break; - case 'url': - $this->value = $current_user->data->user_url; - break; - default: - $this->value = $this->get_attribute( 'default' ); - } - } else { - $this->value = $this->get_attribute( 'default' ); - } - - $field_value = Grunion_Contact_Form_Plugin::strip_tags( $this->value ); - $field_label = Grunion_Contact_Form_Plugin::strip_tags( $field_label ); - - $rendered_field = $this->render_field( $field_type, $field_id, $field_label, $field_value, $field_class, $field_placeholder, $field_required, $field_required_text ); - - /** - * Filter the HTML of the Contact Form. - * - * @module contact-form - * - * @since 2.6.0 - * - * @param string $rendered_field Contact Form HTML output. - * @param string $field_label Field label. - * @param int|null $id Post ID. - */ - return apply_filters( 'grunion_contact_form_field_html', $rendered_field, $field_label, ( in_the_loop() ? get_the_ID() : null ) ); + return $this->field->render(); } /** @@ -2118,32 +1874,7 @@ public function render() { public function render_label( $type, $id, $label, $required, $required_field_text, $extra_attrs = array() ) { _deprecated_function( __METHOD__, 'jetpack-13.3', 'Automattic\Jetpack\Forms\ContactForm\Contact_Form_Field->render_label' ); - $form_style = $this->get_form_style(); - - if ( ! empty( $form_style ) && $form_style !== 'default' ) { - return ''; - } - - if ( ! empty( $this->label_styles ) ) { - $extra_attrs['style'] = $this->label_styles; - } - - $extra_attrs_string = ''; - if ( is_array( $extra_attrs ) && ! empty( $extra_attrs ) ) { - foreach ( $extra_attrs as $attr => $val ) { - $extra_attrs_string .= sprintf( '%s="%s" ', esc_attr( $attr ), esc_attr( $val ) ); - } - } - - $type_class = $type ? ' ' . $type : ''; - return "\n"; + return $this->field->render_label( $type, $id, $label, $required, $required_field_text, $extra_attrs ); } /** @@ -2162,26 +1893,7 @@ class='grunion-field-label{$type_class}" . ( $this->is_error() ? ' form-error' : public function render_input_field( $type, $id, $value, $class, $placeholder, $required, $extra_attrs = array() ) { _deprecated_function( __METHOD__, 'jetpack-13.3', 'Automattic\Jetpack\Forms\ContactForm\Contact_Form_Field->render_input_field' ); - $extra_attrs_string = ''; - - if ( ! empty( $this->field_styles ) ) { - $extra_attrs['style'] = $this->field_styles; - } - - if ( is_array( $extra_attrs ) && ! empty( $extra_attrs ) ) { - foreach ( $extra_attrs as $attr => $val ) { - $extra_attrs_string .= sprintf( '%s="%s" ', esc_attr( $attr ), esc_attr( $val ) ); - } - } - return "\n"; + return $this->field->render_input_field( $type, $id, $value, $class, $placeholder, $required, $extra_attrs ); } /** @@ -2200,9 +1912,7 @@ public function render_input_field( $type, $id, $value, $class, $placeholder, $r public function render_email_field( $id, $label, $value, $class, $required, $required_field_text, $placeholder ) { _deprecated_function( __METHOD__, 'jetpack-13.3', 'Automattic\Jetpack\Forms\ContactForm\Contact_Form_Field->render_email_field' ); - $field = $this->render_label( 'email', $id, $label, $required, $required_field_text ); - $field .= $this->render_input_field( 'email', $id, $value, $class, $placeholder, $required ); - return $field; + return $this->field->render_email_field( $id, $label, $value, $class, $required, $required_field_text, $placeholder ); } /** @@ -2221,9 +1931,7 @@ public function render_email_field( $id, $label, $value, $class, $required, $req public function render_telephone_field( $id, $label, $value, $class, $required, $required_field_text, $placeholder ) { _deprecated_function( __METHOD__, 'jetpack-13.3', 'Automattic\Jetpack\Forms\ContactForm\Contact_Form_Field->render_telephone_field' ); - $field = $this->render_label( 'telephone', $id, $label, $required, $required_field_text ); - $field .= $this->render_input_field( 'tel', $id, $value, $class, $placeholder, $required ); - return $field; + return $this->field->render_telephone_field( $id, $label, $value, $class, $required, $required_field_text, $placeholder ); } /** @@ -2242,18 +1950,7 @@ public function render_telephone_field( $id, $label, $value, $class, $required, public function render_url_field( $id, $label, $value, $class, $required, $required_field_text, $placeholder ) { _deprecated_function( __METHOD__, 'jetpack-13.3', 'Automattic\Jetpack\Forms\ContactForm\Contact_Form_Field->render_url_field' ); - $custom_validation_message = __( 'Please enter a valid URL - https://www.example.com', 'jetpack' ); - $validation_attrs = array( - 'title' => $custom_validation_message, - 'oninvalid' => 'setCustomValidity("' . $custom_validation_message . '")', - 'oninput' => 'setCustomValidity("")', - 'pattern' => '(([:\/a-zA-Z0-9_\-]+)?(\.[a-zA-Z0-9_\-\/]+)+)', - 'data-type-override' => 'url', - ); - - $field = $this->render_label( 'url', $id, $label, $required, $required_field_text ); - $field .= $this->render_input_field( 'text', $id, $value, $class, $placeholder, $required, $validation_attrs ); - return $field; + return $this->field->render_url_field( $id, $label, $value, $class, $required, $required_field_text, $placeholder ); } /** @@ -2272,18 +1969,7 @@ public function render_url_field( $id, $label, $value, $class, $required, $requi public function render_textarea_field( $id, $label, $value, $class, $required, $required_field_text, $placeholder ) { _deprecated_function( __METHOD__, 'jetpack-13.3', 'Automattic\Jetpack\Forms\ContactForm\Contact_Form_Field->render_textarea_field' ); - $field = $this->render_label( 'textarea', 'contact-form-comment-' . $id, $label, $required, $required_field_text ); - $field .= "\n"; - return $field; + return $this->field->render_textarea_field( $id, $label, $value, $class, $required, $required_field_text, $placeholder ); } /** @@ -2301,28 +1987,7 @@ public function render_textarea_field( $id, $label, $value, $class, $required, $ public function render_radio_field( $id, $label, $value, $class, $required, $required_field_text ) { _deprecated_function( __METHOD__, 'jetpack-13.3', 'Automattic\Jetpack\Forms\ContactForm\Contact_Form_Field->render_radio_field' ); - $field = $this->render_label( '', $id, $label, $required, $required_field_text ); - $field .= '
    '; - - $field_style = 'style="' . $this->option_styles . '"'; - - foreach ( (array) $this->get_attribute( 'options' ) as $option_index => $option ) { - $option = Grunion_Contact_Form_Plugin::strip_tags( $option ); - if ( is_string( $option ) && $option !== '' ) { - $field .= "\t\t\n"; - } - } - $field .= '
    '; - return $field; + return $this->field->render_radio_field( $id, $label, $value, $class, $required, $required_field_text ); } /** @@ -2340,12 +2005,7 @@ public function render_radio_field( $id, $label, $value, $class, $required, $req public function render_checkbox_field( $id, $label, $value, $class, $required, $required_field_text ) { _deprecated_function( __METHOD__, 'jetpack-13.3', 'Automattic\Jetpack\Forms\ContactForm\Contact_Form_Field->render_checkbox_field' ); - $field = "\n"; - $field .= "
    \n"; - return $field; + return $this->field->render_checkbox_field( $id, $label, $value, $class, $required, $required_field_text ); } /** @@ -2386,22 +2046,7 @@ private function render_consent_field( $id, $class ) { public function render_checkbox_multiple_field( $id, $label, $value, $class, $required, $required_field_text ) { _deprecated_function( __METHOD__, 'jetpack-13.3', 'Automattic\Jetpack\Forms\ContactForm\Contact_Form_Field->render_checkbox_multiple_field' ); - $field = $this->render_label( '', $id, $label, $required, $required_field_text ); - $field .= '
    '; - - $field_style = 'style="' . $this->option_styles . '"'; - - foreach ( (array) $this->get_attribute( 'options' ) as $option_index => $option ) { - $option = Grunion_Contact_Form_Plugin::strip_tags( $option ); - if ( is_string( $option ) && $option !== '' ) { - $field .= "\t\t\n"; - } - } - $field .= '
    '; - - return $field; + return $this->field->render_checkbox_multiple_field( $id, $label, $value, $class, $required, $required_field_text ); } /** @@ -2419,43 +2064,7 @@ public function render_checkbox_multiple_field( $id, $label, $value, $class, $re public function render_select_field( $id, $label, $value, $class, $required, $required_field_text ) { _deprecated_function( __METHOD__, 'jetpack-13.3', 'Automattic\Jetpack\Forms\ContactForm\Contact_Form_Field->render_select_field' ); - $field = $this->render_label( 'select', $id, $label, $required, $required_field_text ); - $field .= "\t\n"; - - wp_enqueue_style( - 'jquery-ui-selectmenu', - plugins_url( 'css/jquery-ui-selectmenu.css', __FILE__ ), - array(), - '1.13.2' - ); - - wp_enqueue_script( 'jquery-ui-selectmenu' ); - - wp_enqueue_script( - 'contact-form-dropdown', - plugins_url( 'js/dropdown.js', __FILE__ ), - array( 'jquery', 'jquery-ui-selectmenu' ), - JETPACK__VERSION, - true - ); - - return $field; + return $this->field->render_select_field( $id, $label, $value, $class, $required, $required_field_text ); } /** @@ -2474,34 +2083,7 @@ public function render_select_field( $id, $label, $value, $class, $required, $re public function render_date_field( $id, $label, $value, $class, $required, $required_field_text, $placeholder ) { _deprecated_function( __METHOD__, 'jetpack-13.3', 'Automattic\Jetpack\Forms\ContactForm\Contact_Form_Field->render_date_field' ); - $field = $this->render_label( 'date', $id, $label, $required, $required_field_text ); - $field .= $this->render_input_field( 'text', $id, $value, $class, $placeholder, $required ); - - /* For AMP requests, use amp-date-picker element: https://amp.dev/documentation/components/amp-date-picker */ - if ( class_exists( 'Jetpack_AMP_Support' ) && Jetpack_AMP_Support::is_amp_request() ) { - return sprintf( - '<%1$s mode="overlay" layout="container" type="single" input-selector="[name=%2$s]">%3$s', - 'amp-date-picker', - esc_attr( $id ), - $field - ); - } - - wp_enqueue_script( - 'grunion-frontend', - Assets::get_file_url_for_environment( - '_inc/build/contact-form/js/grunion-frontend.min.js', - 'modules/contact-form/js/grunion-frontend.js' - ), - array( 'jquery', 'jquery-ui-datepicker' ), - JETPACK__VERSION, - false - ); - wp_enqueue_style( 'jp-jquery-ui-datepicker', plugins_url( 'css/jquery-ui-datepicker.css', __FILE__ ), array( 'dashicons' ), '1.0' ); - - // Using Core's built-in datepicker localization routine - wp_localize_jquery_ui_datepicker(); - return $field; + return $this->field->render_date_field( $id, $label, $value, $class, $required, $required_field_text, $placeholder ); } /** @@ -2521,9 +2103,7 @@ public function render_date_field( $id, $label, $value, $class, $required, $requ public function render_default_field( $id, $label, $value, $class, $required, $required_field_text, $placeholder, $type ) { _deprecated_function( __METHOD__, 'jetpack-13.3', 'Automattic\Jetpack\Forms\ContactForm\Contact_Form_Field->render_default_field' ); - $field = $this->render_label( $type, $id, $label, $required, $required_field_text ); - $field .= $this->render_input_field( 'text', $id, $value, $class, $placeholder, $required ); - return $field; + return $this->field->render_default_field( $id, $label, $value, $class, $required, $required_field_text, $placeholder, $type ); } /** @@ -2539,21 +2119,7 @@ public function render_default_field( $id, $label, $value, $class, $required, $r public function render_outline_label( $id, $label, $required, $required_field_text ) { _deprecated_function( __METHOD__, 'jetpack-13.3', 'Automattic\Jetpack\Forms\ContactForm\Contact_Form_Field->render_outline_label' ); - return ' -
    -
    -
    - -
    -
    -
    '; + return $this->field->render_outline_label( $id, $label, $required, $required_field_text ); } /** @@ -2569,15 +2135,7 @@ class="notched-label__label ' . ( $this->is_error() ? ' form-error' : '' ) . '" public function render_animated_label( $id, $label, $required, $required_field_text ) { _deprecated_function( __METHOD__, 'jetpack-13.3', 'Automattic\Jetpack\Forms\ContactForm\Contact_Form_Field->render_animated_label' ); - return ' - '; + return $this->field->render_animated_label( $id, $label, $required, $required_field_text ); } /** @@ -2593,14 +2151,7 @@ class="animated-label__label ' . ( $this->is_error() ? ' form-error' : '' ) . '" public function render_below_label( $id, $label, $required, $required_field_text ) { _deprecated_function( __METHOD__, 'jetpack-13.3', 'Automattic\Jetpack\Forms\ContactForm\Contact_Form_Field->render_below_label' ); - return ' - '; + return $this->field->render_below_label( $id, $label, $required, $required_field_text ); } /** @@ -2620,107 +2171,7 @@ class="below-label__label ' . ( $this->is_error() ? ' form-error' : '' ) . '" public function render_field( $type, $id, $label, $value, $class, $placeholder, $required, $required_field_text ) { _deprecated_function( __METHOD__, 'jetpack-13.3', 'Automattic\Jetpack\Forms\ContactForm\Contact_Form_Field->render_field' ); - $class .= ' grunion-field'; - - if ( $type === 'select' ) { - $class .= ' contact-form-dropdown'; - } - - $form_style = $this->get_form_style(); - if ( ! empty( $form_style ) && $form_style !== 'default' ) { - if ( empty( $placeholder ) ) { - $placeholder .= ' '; - } else { - $class .= ' has-placeholder'; - } - } - - $field_placeholder = ( ! empty( $placeholder ) ) ? "placeholder='" . esc_attr( $placeholder ) . "'" : ''; - $field_class = "class='" . trim( esc_attr( $type ) . ' ' . esc_attr( $class ) ) . "' "; - $wrap_classes = empty( $class ) ? '' : implode( '-wrap ', array_filter( explode( ' ', $class ) ) ) . '-wrap'; // this adds - - if ( $type === 'select' ) { - $wrap_classes .= ' ui-front'; - } - - if ( empty( $label ) ) { - $wrap_classes .= ' no-label'; - } - - $shell_field_class = "class='grunion-field-" . trim( esc_attr( $type ) . '-wrap ' . esc_attr( $wrap_classes ) ) . "' "; - - /** - * Filter the Contact Form required field text - * - * @module contact-form - * - * @since 3.8.0 - * - * @param string $var Required field text. Default is "(required)". - */ - $required_field_text = esc_html( apply_filters( 'jetpack_required_field_text', $required_field_text ) ); - - $block_style = 'style="' . $this->block_styles . '"'; - - $field = "\n
    \n"; // new in Jetpack 6.8.0 - - // If they are logged in, and this is their site, don't pre-populate fields - if ( current_user_can( 'manage_options' ) ) { - $value = ''; - } - - switch ( $type ) { - case 'email': - $field .= $this->render_email_field( $id, $label, $value, $field_class, $required, $required_field_text, $field_placeholder ); - break; - case 'telephone': - $field .= $this->render_telephone_field( $id, $label, $value, $field_class, $required, $required_field_text, $field_placeholder ); - break; - case 'url': - $field .= $this->render_url_field( $id, $label, $value, $field_class, $required, $required_field_text, $field_placeholder ); - break; - case 'textarea': - $field .= $this->render_textarea_field( $id, $label, $value, $field_class, $required, $required_field_text, $field_placeholder ); - break; - case 'radio': - $field .= $this->render_radio_field( $id, $label, $value, $field_class, $required, $required_field_text ); - break; - case 'checkbox': - $field .= $this->render_checkbox_field( $id, $label, $value, $field_class, $required, $required_field_text ); - break; - case 'checkbox-multiple': - $field .= $this->render_checkbox_multiple_field( $id, $label, $value, $field_class, $required, $required_field_text ); - break; - case 'select': - $field .= $this->render_select_field( $id, $label, $value, $field_class, $required, $required_field_text ); - break; - case 'date': - $field .= $this->render_date_field( $id, $label, $value, $field_class, $required, $required_field_text, $field_placeholder ); - break; - case 'consent': - $field .= $this->render_consent_field( $id, $field_class ); - break; - default: // text field - $field .= $this->render_default_field( $id, $label, $value, $field_class, $required, $required_field_text, $field_placeholder, $type ); - break; - } - - if ( ! empty( $form_style ) && $form_style !== 'default' && ! in_array( $type, array( 'checkbox', 'consent' ), true ) ) { - switch ( $form_style ) { - case 'outlined': - $field .= $this->render_outline_label( $id, $label, $required, $required_field_text ); - break; - case 'animated': - $field .= $this->render_animated_label( $id, $label, $required, $required_field_text ); - break; - case 'below': - $field .= $this->render_below_label( $id, $label, $required, $required_field_text ); - break; - } - } - - $field .= "\t
    \n"; - return $field; + return $this->field->render_field( $type, $id, $label, $value, $class, $placeholder, $required, $required_field_text ); } /** @@ -2778,50 +2229,7 @@ private function get_form_style() { function grunion_delete_old_spam() { _deprecated_function( __FUNCTION__, 'jetpack-13.3', 'Automattic\Jetpack\Forms\ContactForm\Util::grunion_delete_old_spam' ); - global $wpdb; - - $grunion_delete_limit = 100; - - $now_gmt = current_time( 'mysql', 1 ); - $sql = $wpdb->prepare( - " - SELECT `ID` - FROM $wpdb->posts - WHERE DATE_SUB( %s, INTERVAL 15 DAY ) > `post_date_gmt` - AND `post_type` = 'feedback' - AND `post_status` = 'spam' - LIMIT %d - ", - $now_gmt, - $grunion_delete_limit - ); - $post_ids = $wpdb->get_col( $sql ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - - foreach ( (array) $post_ids as $post_id ) { - // force a full delete, skip the trash - wp_delete_post( $post_id, true ); - } - - if ( - /** - * Filter if the module run OPTIMIZE TABLE on the core WP tables. - * - * @module contact-form - * - * @since 1.3.1 - * @since 6.4.0 Set to false by default. - * - * @param bool $filter Should Jetpack optimize the table, defaults to false. - */ - apply_filters( 'grunion_optimize_table', false ) - ) { - $wpdb->query( "OPTIMIZE TABLE $wpdb->posts" ); - } - - // if we hit the max then schedule another run - if ( is_countable( $post_ids ) && count( $post_ids ) >= $grunion_delete_limit ) { - wp_schedule_single_event( time() + 700, 'grunion_scheduled_delete' ); - } + return Util::grunion_delete_old_spam(); } /** @@ -2834,14 +2242,6 @@ function grunion_delete_old_spam() { function jetpack_tracks_record_grunion_pre_message_sent( $post_id ) { _deprecated_function( __FUNCTION__, 'jetpack-13.3', 'Automattic\Jetpack\Forms\ContactForm\Util::jetpack_tracks_record_grunion_pre_message_sent' ); - $post = get_post( $post_id ); - if ( $post ) { - $extra = gmdate( 'Y-W', strtotime( $post->post_date_gmt ) ); - } else { - $extra = 'no-post'; - } - - /** This action is documented in modules/widgets/social-media-icons.php */ - do_action( 'jetpack_bump_stats_extras', 'jetpack_forms_message_sent', $extra ); + return Util::jetpack_tracks_record_grunion_pre_message_sent( $post_id ); } add_action( 'grunion_pre_message_sent', 'jetpack_tracks_record_grunion_pre_message_sent', 12 ); diff --git a/tools/phpcs-excludelist.json b/tools/phpcs-excludelist.json index ae5de68562b51..c0e7d342658fa 100644 --- a/tools/phpcs-excludelist.json +++ b/tools/phpcs-excludelist.json @@ -272,7 +272,6 @@ "projects/plugins/jetpack/json-endpoints/jetpack/class.jetpack-json-api-get-option-backup-endpoint.php", "projects/plugins/jetpack/json-endpoints/jetpack/class.jetpack-json-api-get-post-backup-endpoint.php", "projects/plugins/jetpack/modules/comments/base.php", - "projects/plugins/jetpack/modules/contact-form/grunion-contact-form.php", "projects/plugins/jetpack/modules/markdown/easy-markdown.php", "projects/plugins/jetpack/modules/sharedaddy/sharing-sources.php", "projects/plugins/jetpack/modules/sitemaps/sitemap-librarian.php", From 51775e2c27fddd55c9b5600f24bf719d1602a4e8 Mon Sep 17 00:00:00 2001 From: Kosta Date: Thu, 21 Mar 2024 20:04:34 +0100 Subject: [PATCH 08/18] SSO: Add sso disable modal (#36387) Co-authored-by: Anthony Grullon --- .../jetpack/_inc/client/security/sso.jsx | 238 ++++++++++++------ .../jetpack/_inc/client/security/style.scss | 99 ++++++++ .../jetpack/changelog/add-sso-disable-notice | 4 + 3 files changed, 265 insertions(+), 76 deletions(-) create mode 100644 projects/plugins/jetpack/changelog/add-sso-disable-notice diff --git a/projects/plugins/jetpack/_inc/client/security/sso.jsx b/projects/plugins/jetpack/_inc/client/security/sso.jsx index bad59eb4413d0..540f262e592bb 100644 --- a/projects/plugins/jetpack/_inc/client/security/sso.jsx +++ b/projects/plugins/jetpack/_inc/client/security/sso.jsx @@ -1,4 +1,6 @@ -import { getRedirectUrl, ToggleControl } from '@automattic/jetpack-components'; +import { getRedirectUrl, ToggleControl, Gridicon } from '@automattic/jetpack-components'; +import { useConnection } from '@automattic/jetpack-connection'; +import { Button } from '@wordpress/components'; import { __, _x } from '@wordpress/i18n'; import ConnectUserBar from 'components/connect-user-bar'; import { FormFieldset } from 'components/forms'; @@ -6,7 +8,80 @@ import { withModuleSettingsFormHelpers } from 'components/module-settings/with-m import { ModuleToggle } from 'components/module-toggle'; import SettingsCard from 'components/settings-card'; import SettingsGroup from 'components/settings-group'; -import React, { Component } from 'react'; +import cookie from 'cookie'; +import { useState, Component } from 'react'; +import ReactDOM from 'react-dom'; + +const SSOSurveyNotice = () => { + const { userConnectionData } = useConnection(); + const userId = userConnectionData?.currentUser?.wpcomUser?.ID; + const href = `https://wordpressdotcom.survey.fm/disable-sso-survey?initiated-from=jetpack&user-id=${ userId }`; + const [ hideNotice, setHideNotice ] = useState( + 'dismissed' === cookie.parse( document.cookie )?.sso_disable + ); + + const setSSOSurveyCookie = ( value, maxAge ) => { + document.cookie = cookie.serialize( 'sso_disable', value, { + path: '/', + maxAge, + } ); + }; + + const onClose = () => { + setSSOSurveyCookie( 'dismissed', 365 * 24 * 60 * 60 ); // 1 year + setHideNotice( true ); + }; + + if ( hideNotice ) { + return null; + } + + return ( +
    + { /* eslint-disable-next-line react/jsx-no-bind */ } + +
    +
    +
    + { __( 'Hi there!', 'jetpack' ) } +
    +
    + { __( + "Spare a moment? We'd love to hear why you want to disable SSO in a quick survey.", + 'jetpack' + ) } +
    +
    + + +
    +
    + + + ); +}; export const SSO = withModuleSettingsFormHelpers( class extends Component { @@ -26,6 +101,7 @@ export const SSO = withModuleSettingsFormHelpers( 'sso', false ), + showSSODisableModal: false, }; handleTwoStepToggleChange = () => { @@ -54,85 +130,95 @@ export const SSO = withModuleSettingsFormHelpers( const isSSOActive = this.props.getOptionValue( 'sso' ), unavailableInOfflineMode = this.props.isUnavailableInOfflineMode( 'sso' ); return ( - - + -

    - { __( - 'Add an extra layer of security to your website by enabling WordPress.com login and secure authentication. If you have multiple sites with this option enabled, you will be able to log in to every one of them with the same credentials.', - 'jetpack' - ) } -

    - - - { this.props.getModule( 'sso' ).description } - - - - - + { __( + 'Add an extra layer of security to your website by enabling WordPress.com login and secure authentication. If you have multiple sites with this option enabled, you will be able to log in to every one of them with the same credentials.', 'jetpack' ) } - /> - -
    +

    + { + if ( isSSOActive ) { + this.setState( { showSSODisableModal: true } ); + } + this.props.toggleModuleNow( name ); + } } + > + + { this.props.getModule( 'sso' ).description } + + + + + + + - { ! this.props.hasConnectedOwner && ! this.props.isOfflineMode && ( - - ) } -
    + { ! this.props.hasConnectedOwner && ! this.props.isOfflineMode && ( + + ) } + + { this.state.showSSODisableModal && + ReactDOM.createPortal( , document.body ) } + ); } } diff --git a/projects/plugins/jetpack/_inc/client/security/style.scss b/projects/plugins/jetpack/_inc/client/security/style.scss index b5a9a2d93dbcf..f2306fff68914 100644 --- a/projects/plugins/jetpack/_inc/client/security/style.scss +++ b/projects/plugins/jetpack/_inc/client/security/style.scss @@ -101,3 +101,102 @@ white-space: nowrap; } } + + +.modal-survey-notice { + position: fixed; + left: 0; + top: 0; + height: 100%; + width: 100%; + z-index: 1000; + + .modal-survey-notice__backdrop { + background: var(--studio-black); + opacity: 0.2; + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + cursor: default; + } + + + .modal-survey-notice__popup { + position: absolute; + right: 25px; + bottom: 25px; + width: 416px; + max-width: calc(100% - 50px); + z-index: 2; + border-radius: 2px; + box-shadow: 0 3px 1px 0 rgba(0, 0, 0, 0.04), 0 3px 8px 0 rgba(0, 0, 0, 0.12); + overflow: hidden; + + .modal-survey-notice__popup-head { + background: #0675c4; + border-bottom: 1px solid #f6f7f7; + height: 56px; + padding: 0 14px 0 16px; + display: flex; + align-items: center; + justify-content: space-between; + + .modal-survey-notice__popup-head-title { + color: var(--studio-white); + font-size: rem(14px); + font-weight: 500; + line-height: 20px; + letter-spacing: -0.15px; + } + + .modal-survey-notice__popup-head-close svg { + fill: var(--studio-white); + } + } + + .modal-survey-notice__popup-content { + padding: 1rem; + background: var(--studio-white); + + .modal-survey-notice__popup-content-title { + font-size: rem(16px); + font-weight: 500; + line-height: 24px; + letter-spacing: -0.32px; + padding-bottom: 8px; + } + + .modal-survey-notice__popup-content-description { + font-size: rem(14px); + line-height: 20px; + letter-spacing: -0.15px; + padding-bottom: 18px; + } + + .modal-survey-notice__popup-content-buttons { + display: flex; + justify-content: flex-end; + + .modal-survey-notice__popup-content-buttons-ok { + padding: 8px 14px; + background: var(--studio-blue-50); + color: var(--studio-white); + font-size: rem(14px); + line-height: 20px; + letter-spacing: -0.15px; + } + + .modal-survey-notice__popup-content-buttons-cancel { + padding: 8px 14px; + color: var(--studio-blue-50); + text-align: center; + font-size: rem(14px); + line-height: 20px; + letter-spacing: -0.15px; + } + } + } + } +} diff --git a/projects/plugins/jetpack/changelog/add-sso-disable-notice b/projects/plugins/jetpack/changelog/add-sso-disable-notice new file mode 100644 index 0000000000000..ddf8c748b3fba --- /dev/null +++ b/projects/plugins/jetpack/changelog/add-sso-disable-notice @@ -0,0 +1,4 @@ +Significance: patch +Type: other + +Add sso survey modal for users that disable the module From 27603f7ebec0c7a3c30620e27cb7fea474cdd683 Mon Sep 17 00:00:00 2001 From: Nate Weller Date: Thu, 21 Mar 2024 15:30:17 -0600 Subject: [PATCH 09/18] Connection: Add additional valid "source" value to the Jetpack connection URL for A4A (#36491) * Allow 'a8c-for-agencies' as a valid source param value --- .../changelog/add-a4a-source-to-jetpack-connect-url | 4 ++++ projects/packages/status/composer.json | 2 +- projects/packages/status/src/class-host.php | 2 +- projects/packages/status/tests/php/test-host.php | 11 ++++++----- .../changelog/add-a4a-source-to-jetpack-connect-url | 5 +++++ .../automattic-for-agencies-client/composer.lock | 4 ++-- .../changelog/add-a4a-source-to-jetpack-connect-url | 5 +++++ projects/plugins/backup/composer.lock | 4 ++-- .../changelog/add-a4a-source-to-jetpack-connect-url | 5 +++++ projects/plugins/boost/composer.lock | 4 ++-- .../changelog/add-a4a-source-to-jetpack-connect-url | 5 +++++ projects/plugins/inspect/composer.lock | 4 ++-- .../changelog/add-a4a-source-to-jetpack-connect-url | 5 +++++ projects/plugins/jetpack/composer.lock | 4 ++-- .../changelog/add-a4a-source-to-jetpack-connect-url | 5 +++++ projects/plugins/migration/composer.lock | 4 ++-- .../changelog/add-a4a-source-to-jetpack-connect-url | 5 +++++ projects/plugins/protect/composer.lock | 4 ++-- .../changelog/add-a4a-source-to-jetpack-connect-url | 5 +++++ projects/plugins/search/composer.lock | 4 ++-- .../changelog/add-a4a-source-to-jetpack-connect-url | 5 +++++ projects/plugins/social/composer.lock | 4 ++-- .../changelog/add-a4a-source-to-jetpack-connect-url | 5 +++++ projects/plugins/starter-plugin/composer.lock | 4 ++-- .../changelog/add-a4a-source-to-jetpack-connect-url | 5 +++++ projects/plugins/videopress/composer.lock | 4 ++-- 26 files changed, 89 insertions(+), 29 deletions(-) create mode 100644 projects/packages/status/changelog/add-a4a-source-to-jetpack-connect-url create mode 100644 projects/plugins/automattic-for-agencies-client/changelog/add-a4a-source-to-jetpack-connect-url create mode 100644 projects/plugins/backup/changelog/add-a4a-source-to-jetpack-connect-url create mode 100644 projects/plugins/boost/changelog/add-a4a-source-to-jetpack-connect-url create mode 100644 projects/plugins/inspect/changelog/add-a4a-source-to-jetpack-connect-url create mode 100644 projects/plugins/jetpack/changelog/add-a4a-source-to-jetpack-connect-url create mode 100644 projects/plugins/migration/changelog/add-a4a-source-to-jetpack-connect-url create mode 100644 projects/plugins/protect/changelog/add-a4a-source-to-jetpack-connect-url create mode 100644 projects/plugins/search/changelog/add-a4a-source-to-jetpack-connect-url create mode 100644 projects/plugins/social/changelog/add-a4a-source-to-jetpack-connect-url create mode 100644 projects/plugins/starter-plugin/changelog/add-a4a-source-to-jetpack-connect-url create mode 100644 projects/plugins/videopress/changelog/add-a4a-source-to-jetpack-connect-url diff --git a/projects/packages/status/changelog/add-a4a-source-to-jetpack-connect-url b/projects/packages/status/changelog/add-a4a-source-to-jetpack-connect-url new file mode 100644 index 0000000000000..d04dea953414a --- /dev/null +++ b/projects/packages/status/changelog/add-a4a-source-to-jetpack-connect-url @@ -0,0 +1,4 @@ +Significance: minor +Type: added + +Add support for A8C for Agencies source parameter. diff --git a/projects/packages/status/composer.json b/projects/packages/status/composer.json index 3f5a5762aae54..444ab5434111e 100644 --- a/projects/packages/status/composer.json +++ b/projects/packages/status/composer.json @@ -47,7 +47,7 @@ "link-template": "https://github.com/Automattic/jetpack-status/compare/v${old}...v${new}" }, "branch-alias": { - "dev-trunk": "2.1.x-dev" + "dev-trunk": "2.2.x-dev" } } } diff --git a/projects/packages/status/src/class-host.php b/projects/packages/status/src/class-host.php index 04d78904e2017..9597fd34120be 100644 --- a/projects/packages/status/src/class-host.php +++ b/projects/packages/status/src/class-host.php @@ -127,7 +127,7 @@ public function get_calypso_env() { */ public function get_source_query() { // phpcs:disable WordPress.Security.NonceVerification.Recommended - $allowed_sources = array( 'jetpack-manage' ); + $allowed_sources = array( 'jetpack-manage', 'a8c-for-agencies' ); if ( isset( $_GET['source'] ) && in_array( $_GET['source'], $allowed_sources, true ) ) { return sanitize_key( $_GET['source'] ); } diff --git a/projects/packages/status/tests/php/test-host.php b/projects/packages/status/tests/php/test-host.php index ff24b0b21db4e..3cc1ad2f07982 100644 --- a/projects/packages/status/tests/php/test-host.php +++ b/projects/packages/status/tests/php/test-host.php @@ -233,10 +233,11 @@ function ( $value ) { * @return array */ public function get_source_query_params() { - return array( - 'empty' => array( '', '' ), - 'valid' => array( 'jetpack-manage', 'jetpack-manage' ), - 'invalid' => array( 'invalid-param', '' ), - ); + return array( + 'empty' => array( '', '' ), + 'valid_manage' => array( 'jetpack-manage', 'jetpack-manage' ), + 'valid_a4a' => array( 'a8c-for-agencies', 'a8c-for-agencies' ), + 'invalid' => array( 'invalid-param', '' ), + ); } } diff --git a/projects/plugins/automattic-for-agencies-client/changelog/add-a4a-source-to-jetpack-connect-url b/projects/plugins/automattic-for-agencies-client/changelog/add-a4a-source-to-jetpack-connect-url new file mode 100644 index 0000000000000..9aa70e3ec1f75 --- /dev/null +++ b/projects/plugins/automattic-for-agencies-client/changelog/add-a4a-source-to-jetpack-connect-url @@ -0,0 +1,5 @@ +Significance: patch +Type: changed +Comment: Updated composer.lock. + + diff --git a/projects/plugins/automattic-for-agencies-client/composer.lock b/projects/plugins/automattic-for-agencies-client/composer.lock index a2a91f33cfe4a..658090b14e260 100644 --- a/projects/plugins/automattic-for-agencies-client/composer.lock +++ b/projects/plugins/automattic-for-agencies-client/composer.lock @@ -873,7 +873,7 @@ "dist": { "type": "path", "url": "../../packages/status", - "reference": "462582ef61f3f6be46574acb34c8d7f59adcdae9" + "reference": "90b8d62a2a976c5a39114c1e6f295faaa5ebb2d0" }, "require": { "automattic/jetpack-constants": "@dev", @@ -896,7 +896,7 @@ "link-template": "https://github.com/Automattic/jetpack-status/compare/v${old}...v${new}" }, "branch-alias": { - "dev-trunk": "2.1.x-dev" + "dev-trunk": "2.2.x-dev" } }, "autoload": { diff --git a/projects/plugins/backup/changelog/add-a4a-source-to-jetpack-connect-url b/projects/plugins/backup/changelog/add-a4a-source-to-jetpack-connect-url new file mode 100644 index 0000000000000..9aa70e3ec1f75 --- /dev/null +++ b/projects/plugins/backup/changelog/add-a4a-source-to-jetpack-connect-url @@ -0,0 +1,5 @@ +Significance: patch +Type: changed +Comment: Updated composer.lock. + + diff --git a/projects/plugins/backup/composer.lock b/projects/plugins/backup/composer.lock index eb4503d69cce2..543433247fb70 100644 --- a/projects/plugins/backup/composer.lock +++ b/projects/plugins/backup/composer.lock @@ -1491,7 +1491,7 @@ "dist": { "type": "path", "url": "../../packages/status", - "reference": "462582ef61f3f6be46574acb34c8d7f59adcdae9" + "reference": "90b8d62a2a976c5a39114c1e6f295faaa5ebb2d0" }, "require": { "automattic/jetpack-constants": "@dev", @@ -1514,7 +1514,7 @@ "link-template": "https://github.com/Automattic/jetpack-status/compare/v${old}...v${new}" }, "branch-alias": { - "dev-trunk": "2.1.x-dev" + "dev-trunk": "2.2.x-dev" } }, "autoload": { diff --git a/projects/plugins/boost/changelog/add-a4a-source-to-jetpack-connect-url b/projects/plugins/boost/changelog/add-a4a-source-to-jetpack-connect-url new file mode 100644 index 0000000000000..9aa70e3ec1f75 --- /dev/null +++ b/projects/plugins/boost/changelog/add-a4a-source-to-jetpack-connect-url @@ -0,0 +1,5 @@ +Significance: patch +Type: changed +Comment: Updated composer.lock. + + diff --git a/projects/plugins/boost/composer.lock b/projects/plugins/boost/composer.lock index 8902212488dc7..03729425eeba9 100644 --- a/projects/plugins/boost/composer.lock +++ b/projects/plugins/boost/composer.lock @@ -1481,7 +1481,7 @@ "dist": { "type": "path", "url": "../../packages/status", - "reference": "462582ef61f3f6be46574acb34c8d7f59adcdae9" + "reference": "90b8d62a2a976c5a39114c1e6f295faaa5ebb2d0" }, "require": { "automattic/jetpack-constants": "@dev", @@ -1504,7 +1504,7 @@ "link-template": "https://github.com/Automattic/jetpack-status/compare/v${old}...v${new}" }, "branch-alias": { - "dev-trunk": "2.1.x-dev" + "dev-trunk": "2.2.x-dev" } }, "autoload": { diff --git a/projects/plugins/inspect/changelog/add-a4a-source-to-jetpack-connect-url b/projects/plugins/inspect/changelog/add-a4a-source-to-jetpack-connect-url new file mode 100644 index 0000000000000..9aa70e3ec1f75 --- /dev/null +++ b/projects/plugins/inspect/changelog/add-a4a-source-to-jetpack-connect-url @@ -0,0 +1,5 @@ +Significance: patch +Type: changed +Comment: Updated composer.lock. + + diff --git a/projects/plugins/inspect/composer.lock b/projects/plugins/inspect/composer.lock index c37eba8fe7065..539d7b60bc8f4 100644 --- a/projects/plugins/inspect/composer.lock +++ b/projects/plugins/inspect/composer.lock @@ -582,7 +582,7 @@ "dist": { "type": "path", "url": "../../packages/status", - "reference": "462582ef61f3f6be46574acb34c8d7f59adcdae9" + "reference": "90b8d62a2a976c5a39114c1e6f295faaa5ebb2d0" }, "require": { "automattic/jetpack-constants": "@dev", @@ -605,7 +605,7 @@ "link-template": "https://github.com/Automattic/jetpack-status/compare/v${old}...v${new}" }, "branch-alias": { - "dev-trunk": "2.1.x-dev" + "dev-trunk": "2.2.x-dev" } }, "autoload": { diff --git a/projects/plugins/jetpack/changelog/add-a4a-source-to-jetpack-connect-url b/projects/plugins/jetpack/changelog/add-a4a-source-to-jetpack-connect-url new file mode 100644 index 0000000000000..a1c1831fa1ef7 --- /dev/null +++ b/projects/plugins/jetpack/changelog/add-a4a-source-to-jetpack-connect-url @@ -0,0 +1,5 @@ +Significance: patch +Type: other +Comment: Updated composer.lock. + + diff --git a/projects/plugins/jetpack/composer.lock b/projects/plugins/jetpack/composer.lock index bf7a84b801618..bbbf6633cc1e6 100644 --- a/projects/plugins/jetpack/composer.lock +++ b/projects/plugins/jetpack/composer.lock @@ -2404,7 +2404,7 @@ "dist": { "type": "path", "url": "../../packages/status", - "reference": "462582ef61f3f6be46574acb34c8d7f59adcdae9" + "reference": "90b8d62a2a976c5a39114c1e6f295faaa5ebb2d0" }, "require": { "automattic/jetpack-constants": "@dev", @@ -2427,7 +2427,7 @@ "link-template": "https://github.com/Automattic/jetpack-status/compare/v${old}...v${new}" }, "branch-alias": { - "dev-trunk": "2.1.x-dev" + "dev-trunk": "2.2.x-dev" } }, "autoload": { diff --git a/projects/plugins/migration/changelog/add-a4a-source-to-jetpack-connect-url b/projects/plugins/migration/changelog/add-a4a-source-to-jetpack-connect-url new file mode 100644 index 0000000000000..9aa70e3ec1f75 --- /dev/null +++ b/projects/plugins/migration/changelog/add-a4a-source-to-jetpack-connect-url @@ -0,0 +1,5 @@ +Significance: patch +Type: changed +Comment: Updated composer.lock. + + diff --git a/projects/plugins/migration/composer.lock b/projects/plugins/migration/composer.lock index 86bc768e06c8d..78c73b5c8acd0 100644 --- a/projects/plugins/migration/composer.lock +++ b/projects/plugins/migration/composer.lock @@ -1491,7 +1491,7 @@ "dist": { "type": "path", "url": "../../packages/status", - "reference": "462582ef61f3f6be46574acb34c8d7f59adcdae9" + "reference": "90b8d62a2a976c5a39114c1e6f295faaa5ebb2d0" }, "require": { "automattic/jetpack-constants": "@dev", @@ -1514,7 +1514,7 @@ "link-template": "https://github.com/Automattic/jetpack-status/compare/v${old}...v${new}" }, "branch-alias": { - "dev-trunk": "2.1.x-dev" + "dev-trunk": "2.2.x-dev" } }, "autoload": { diff --git a/projects/plugins/protect/changelog/add-a4a-source-to-jetpack-connect-url b/projects/plugins/protect/changelog/add-a4a-source-to-jetpack-connect-url new file mode 100644 index 0000000000000..9aa70e3ec1f75 --- /dev/null +++ b/projects/plugins/protect/changelog/add-a4a-source-to-jetpack-connect-url @@ -0,0 +1,5 @@ +Significance: patch +Type: changed +Comment: Updated composer.lock. + + diff --git a/projects/plugins/protect/composer.lock b/projects/plugins/protect/composer.lock index b6ef4a663f6ad..66a419d2b6036 100644 --- a/projects/plugins/protect/composer.lock +++ b/projects/plugins/protect/composer.lock @@ -1404,7 +1404,7 @@ "dist": { "type": "path", "url": "../../packages/status", - "reference": "462582ef61f3f6be46574acb34c8d7f59adcdae9" + "reference": "90b8d62a2a976c5a39114c1e6f295faaa5ebb2d0" }, "require": { "automattic/jetpack-constants": "@dev", @@ -1427,7 +1427,7 @@ "link-template": "https://github.com/Automattic/jetpack-status/compare/v${old}...v${new}" }, "branch-alias": { - "dev-trunk": "2.1.x-dev" + "dev-trunk": "2.2.x-dev" } }, "autoload": { diff --git a/projects/plugins/search/changelog/add-a4a-source-to-jetpack-connect-url b/projects/plugins/search/changelog/add-a4a-source-to-jetpack-connect-url new file mode 100644 index 0000000000000..9aa70e3ec1f75 --- /dev/null +++ b/projects/plugins/search/changelog/add-a4a-source-to-jetpack-connect-url @@ -0,0 +1,5 @@ +Significance: patch +Type: changed +Comment: Updated composer.lock. + + diff --git a/projects/plugins/search/composer.lock b/projects/plugins/search/composer.lock index b89d794e5306a..e1f64c344d4ff 100644 --- a/projects/plugins/search/composer.lock +++ b/projects/plugins/search/composer.lock @@ -1492,7 +1492,7 @@ "dist": { "type": "path", "url": "../../packages/status", - "reference": "462582ef61f3f6be46574acb34c8d7f59adcdae9" + "reference": "90b8d62a2a976c5a39114c1e6f295faaa5ebb2d0" }, "require": { "automattic/jetpack-constants": "@dev", @@ -1515,7 +1515,7 @@ "link-template": "https://github.com/Automattic/jetpack-status/compare/v${old}...v${new}" }, "branch-alias": { - "dev-trunk": "2.1.x-dev" + "dev-trunk": "2.2.x-dev" } }, "autoload": { diff --git a/projects/plugins/social/changelog/add-a4a-source-to-jetpack-connect-url b/projects/plugins/social/changelog/add-a4a-source-to-jetpack-connect-url new file mode 100644 index 0000000000000..9aa70e3ec1f75 --- /dev/null +++ b/projects/plugins/social/changelog/add-a4a-source-to-jetpack-connect-url @@ -0,0 +1,5 @@ +Significance: patch +Type: changed +Comment: Updated composer.lock. + + diff --git a/projects/plugins/social/composer.lock b/projects/plugins/social/composer.lock index 59f4d6a2ec0e7..76de28bec3fd1 100644 --- a/projects/plugins/social/composer.lock +++ b/projects/plugins/social/composer.lock @@ -1486,7 +1486,7 @@ "dist": { "type": "path", "url": "../../packages/status", - "reference": "462582ef61f3f6be46574acb34c8d7f59adcdae9" + "reference": "90b8d62a2a976c5a39114c1e6f295faaa5ebb2d0" }, "require": { "automattic/jetpack-constants": "@dev", @@ -1509,7 +1509,7 @@ "link-template": "https://github.com/Automattic/jetpack-status/compare/v${old}...v${new}" }, "branch-alias": { - "dev-trunk": "2.1.x-dev" + "dev-trunk": "2.2.x-dev" } }, "autoload": { diff --git a/projects/plugins/starter-plugin/changelog/add-a4a-source-to-jetpack-connect-url b/projects/plugins/starter-plugin/changelog/add-a4a-source-to-jetpack-connect-url new file mode 100644 index 0000000000000..9aa70e3ec1f75 --- /dev/null +++ b/projects/plugins/starter-plugin/changelog/add-a4a-source-to-jetpack-connect-url @@ -0,0 +1,5 @@ +Significance: patch +Type: changed +Comment: Updated composer.lock. + + diff --git a/projects/plugins/starter-plugin/composer.lock b/projects/plugins/starter-plugin/composer.lock index e3355af7cb2e0..f92f375c29091 100644 --- a/projects/plugins/starter-plugin/composer.lock +++ b/projects/plugins/starter-plugin/composer.lock @@ -1347,7 +1347,7 @@ "dist": { "type": "path", "url": "../../packages/status", - "reference": "462582ef61f3f6be46574acb34c8d7f59adcdae9" + "reference": "90b8d62a2a976c5a39114c1e6f295faaa5ebb2d0" }, "require": { "automattic/jetpack-constants": "@dev", @@ -1370,7 +1370,7 @@ "link-template": "https://github.com/Automattic/jetpack-status/compare/v${old}...v${new}" }, "branch-alias": { - "dev-trunk": "2.1.x-dev" + "dev-trunk": "2.2.x-dev" } }, "autoload": { diff --git a/projects/plugins/videopress/changelog/add-a4a-source-to-jetpack-connect-url b/projects/plugins/videopress/changelog/add-a4a-source-to-jetpack-connect-url new file mode 100644 index 0000000000000..9aa70e3ec1f75 --- /dev/null +++ b/projects/plugins/videopress/changelog/add-a4a-source-to-jetpack-connect-url @@ -0,0 +1,5 @@ +Significance: patch +Type: changed +Comment: Updated composer.lock. + + diff --git a/projects/plugins/videopress/composer.lock b/projects/plugins/videopress/composer.lock index 19b2814164175..12229a6c0deb5 100644 --- a/projects/plugins/videopress/composer.lock +++ b/projects/plugins/videopress/composer.lock @@ -1347,7 +1347,7 @@ "dist": { "type": "path", "url": "../../packages/status", - "reference": "462582ef61f3f6be46574acb34c8d7f59adcdae9" + "reference": "90b8d62a2a976c5a39114c1e6f295faaa5ebb2d0" }, "require": { "automattic/jetpack-constants": "@dev", @@ -1370,7 +1370,7 @@ "link-template": "https://github.com/Automattic/jetpack-status/compare/v${old}...v${new}" }, "branch-alias": { - "dev-trunk": "2.1.x-dev" + "dev-trunk": "2.2.x-dev" } }, "autoload": { From cfcc23259710584ce96f0728416b3482c77b1638 Mon Sep 17 00:00:00 2001 From: Anthony Grullon Date: Thu, 21 Mar 2024 17:56:25 -0400 Subject: [PATCH 10/18] SSO: Add function exists check for wp_admin_notice (#36511) --- .../update-jetpack-sso-admin-wp-notice-function-check | 4 ++++ .../jetpack/modules/sso/class.jetpack-sso-user-admin.php | 8 +++++++- 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 projects/plugins/jetpack/changelog/update-jetpack-sso-admin-wp-notice-function-check diff --git a/projects/plugins/jetpack/changelog/update-jetpack-sso-admin-wp-notice-function-check b/projects/plugins/jetpack/changelog/update-jetpack-sso-admin-wp-notice-function-check new file mode 100644 index 0000000000000..67c02eed2b62b --- /dev/null +++ b/projects/plugins/jetpack/changelog/update-jetpack-sso-admin-wp-notice-function-check @@ -0,0 +1,4 @@ +Significance: patch +Type: other + +Add function exists check for wp_admin_notice diff --git a/projects/plugins/jetpack/modules/sso/class.jetpack-sso-user-admin.php b/projects/plugins/jetpack/modules/sso/class.jetpack-sso-user-admin.php index 6a6789b9ac3fb..ce0149a485de3 100644 --- a/projects/plugins/jetpack/modules/sso/class.jetpack-sso-user-admin.php +++ b/projects/plugins/jetpack/modules/sso/class.jetpack-sso-user-admin.php @@ -137,7 +137,7 @@ public function revoke_user_invite( $user_id ) { public function handle_invitation_results() { $valid_nonce = isset( $_GET['_wpnonce'] ) ? wp_verify_nonce( $_GET['_wpnonce'], 'jetpack-sso-invite-user' ) : false; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput -- WP core doesn't pre-sanitize nonces either. - if ( ! $valid_nonce || ! isset( $_GET['jetpack-sso-invite-user'] ) ) { + if ( ! $valid_nonce || ! isset( $_GET['jetpack-sso-invite-user'] ) || ! function_exists( 'wp_admin_notice' ) ) { return; } if ( $_GET['jetpack-sso-invite-user'] === 'success' ) { @@ -575,6 +575,9 @@ public function jetpack_user_table_row_actions( $actions, $user_object ) { * Render the invitation email message. */ public function render_invitation_email_message() { + if ( ! function_exists( 'wp_admin_notice' ) ) { + return; + } $message = wp_kses( __( 'We highly recommend inviting users to join WordPress.com and log in securely using Secure Sign On to ensure maximum security and efficiency.', @@ -604,6 +607,9 @@ public function render_invitation_email_message() { * Render a note that wp.com invites will be automatically revoked. */ public function render_invitations_notices_for_deleted_users() { + if ( ! function_exists( 'wp_admin_notice' ) ) { + return; + } check_admin_referer( 'bulk-users' ); // When one user is deleted, the param is `user`, when multiple users are deleted, the param is `users`. From 5e890bd3aca4f785173eae3caa277f4b50f2e855 Mon Sep 17 00:00:00 2001 From: Peter Petrov Date: Fri, 22 Mar 2024 04:35:19 +0200 Subject: [PATCH 11/18] Boost: Update getting started and upgrade pages copy (#36475) * Update getting started features list * Update upgrade screen copy * add changelog * Update label * Fix showing "auto css optimization" as included in the free version --- .../boost-pricing-table/lib/features.tsx | 61 +++++++++--------- .../assets/src/js/pages/upgrade/upgrade.tsx | 64 ++++++++++++++++--- .../update-activation-upgrade-screens-copy | 4 ++ 3 files changed, 92 insertions(+), 37 deletions(-) create mode 100644 projects/plugins/boost/changelog/update-activation-upgrade-screens-copy diff --git a/projects/plugins/boost/app/assets/src/js/features/boost-pricing-table/lib/features.tsx b/projects/plugins/boost/app/assets/src/js/features/boost-pricing-table/lib/features.tsx index b09c844b9fa07..6ddf7e4532764 100644 --- a/projects/plugins/boost/app/assets/src/js/features/boost-pricing-table/lib/features.tsx +++ b/projects/plugins/boost/app/assets/src/js/features/boost-pricing-table/lib/features.tsx @@ -114,14 +114,14 @@ type FeatureItem = { export const boostFeatureList: FeatureItem[] = [ { description: { - name: __( 'Optimize CSS Loading', 'jetpack-boost' ), + name: __( 'Auto CSS Optimization', 'jetpack-boost' ), tooltipInfo: cssOptimizationContext, tooltipPlacement: 'bottom-start', }, free: ( { __( 'Automatically updated', 'jetpack-boost' ) } } + label={ { __( 'Included', 'jetpack-boost' ) } } tooltipTitle={ __( 'Automatic Critical CSS regeneration', 'jetpack-boost' ) } tooltipInfo={ automaticallyUpdatedContext } tooltipClassName="wide-tooltip" @@ -139,32 +139,26 @@ export const boostFeatureList: FeatureItem[] = [ }, { description: { - name: __( 'Image CDN', 'jetpack-boost' ), - tooltipInfo: imageCdnContext, + name: __( 'Automatic image size analysis', 'jetpack-boost' ), + tooltipInfo: isaContext, tooltipPlacement: 'bottom-start', }, - free: , - premium: ( - { __( 'Included + quality settings', 'jetpack-boost' ) } } - tooltipInfo={ __( 'Fine-tune image quality settings to your liking.', 'jetpack-boost' ) } - /> - ), + free: , + premium: , }, { description: { - name: __( 'Page Cache', 'jetpack-boost' ), - tooltipInfo: pageCacheContext, + name: __( 'Historical performance scores', 'jetpack-boost' ), + tooltipInfo: performanceHistoryContext, tooltipPlacement: 'bottom-start', }, - free: , + free: , premium: , }, { description: { - name: __( 'Automatic image size analysis', 'jetpack-boost' ), - tooltipInfo: isaContext, + name: __( 'Dedicated email support', 'jetpack-boost' ), + tooltipInfo: , tooltipPlacement: 'bottom-start', }, free: , @@ -172,17 +166,26 @@ export const boostFeatureList: FeatureItem[] = [ }, { description: { - name: __( 'Historical performance scores', 'jetpack-boost' ), - tooltipInfo: performanceHistoryContext, + name: __( 'Page Cache', 'jetpack-boost' ), + tooltipInfo: pageCacheContext, tooltipPlacement: 'bottom-start', }, - free: , + free: , premium: , }, { description: { - name: __( 'Defer non-essential JavaScript', 'jetpack-boost' ), - tooltipInfo: deferJSContext, + name: __( 'Image CDN Quality Settings', 'jetpack-boost' ), + tooltipInfo: __( 'Fine-tune image quality settings to your liking.', 'jetpack-boost' ), + tooltipPlacement: 'bottom-start', + }, + free: , + premium: , + }, + { + description: { + name: __( 'Image CDN', 'jetpack-boost' ), + tooltipInfo: imageCdnContext, tooltipPlacement: 'bottom-start', }, free: , @@ -199,8 +202,8 @@ export const boostFeatureList: FeatureItem[] = [ }, { description: { - name: __( 'Concatenate JS and CSS', 'jetpack-boost' ), - tooltipInfo: concatenateContext, + name: __( 'Defer non-essential JavaScript', 'jetpack-boost' ), + tooltipInfo: deferJSContext, tooltipPlacement: 'bottom-start', }, free: , @@ -208,11 +211,11 @@ export const boostFeatureList: FeatureItem[] = [ }, { description: { - name: __( 'Dedicated email support', 'jetpack-boost' ), - tooltipInfo: , + name: __( 'Concatenate JS and CSS', 'jetpack-boost' ), + tooltipInfo: concatenateContext, tooltipPlacement: 'bottom-start', }, - free: , + free: , premium: , }, ]; diff --git a/projects/plugins/boost/app/assets/src/js/pages/upgrade/upgrade.tsx b/projects/plugins/boost/app/assets/src/js/pages/upgrade/upgrade.tsx index 7378e73c8fadf..2a238c1062de1 100644 --- a/projects/plugins/boost/app/assets/src/js/pages/upgrade/upgrade.tsx +++ b/projects/plugins/boost/app/assets/src/js/pages/upgrade/upgrade.tsx @@ -6,6 +6,7 @@ import './upgrade.module.scss'; import Forward from '$svg/forward'; import { usePricing } from '$lib/stores/pricing'; import CardPage from '$layout/card-page/card-page'; +import { createInterpolateElement } from '@wordpress/element'; const Upgrade: React.FC = () => { const { @@ -52,24 +53,71 @@ const Upgrade: React.FC = () => { 'jetpack-boost' ) } > -

    { __( "Optimize your website's performance", 'jetpack-boost' ) }

    +

    + { __( "Optimize your website's performance on the go", 'jetpack-boost' ) } +

    { __( - 'Automatically regenerate critical CSS after site changes, and hunt down image issues with ease.', + 'Unlock the full potential of Jetpack Boost with automated performance optimization tools and more.', 'jetpack-boost' ) }

      -
    • { __( 'Automatic critical CSS regeneration', 'jetpack-boost' ) }
    • -
    • { __( 'Performance scores are recalculated after each change', 'jetpack-boost' ) }
    • -
    • { __( 'Automatically scan your site for image size issues', 'jetpack-boost' ) }
    • - { __( 'Historical performance scores with Core Web Vitals data', 'jetpack-boost' ) } + { createInterpolateElement( + __( + "Automated Critical CSS Generation: Improve your site's load time. Say goodbye to manual tweaks and boost your speed scores with zero effort.", + 'jetpack-boost' + ), + { + strong: , + } + ) }
    • - { __( 'Fine-tune your CDN images with customizable quality settings.', 'jetpack-boost' ) } + { createInterpolateElement( + __( + 'Automated Image Scanning: Always be on top of potential image size issues that might impact your site load time and SEO ranking.', + 'jetpack-boost' + ), + { + strong: , + } + ) } +
    • +
    • + { createInterpolateElement( + __( + 'In-depth Performance Insights: Track your success with historical performance and Core Web Vitals scores to see how your site improves over time.', + 'jetpack-boost' + ), + { + strong: , + } + ) } +
    • +
    • + { createInterpolateElement( + __( + 'Customizable Image Optimization: Control your image quality and loading speeds with customizable CDN settings, balancing aesthetics with efficiency.', + 'jetpack-boost' + ), + { + strong: , + } + ) } +
    • +
    • + { createInterpolateElement( + __( + 'Expert Support With a Personal Touch: Enjoy dedicated email support from our Happiness Engineers, ensuring a smoother experience and peace of mind.', + 'jetpack-boost' + ), + { + strong: , + } + ) }
    • -
    • { __( 'Dedicated email support', 'jetpack-boost' ) }
    ); diff --git a/projects/plugins/boost/changelog/update-activation-upgrade-screens-copy b/projects/plugins/boost/changelog/update-activation-upgrade-screens-copy new file mode 100644 index 0000000000000..91bb809ad14c7 --- /dev/null +++ b/projects/plugins/boost/changelog/update-activation-upgrade-screens-copy @@ -0,0 +1,4 @@ +Significance: patch +Type: changed + +Update getting started and upgrade copies. From cccb93c1bbde68f8d6f5d60681bb0dd572227a50 Mon Sep 17 00:00:00 2001 From: Emanuele Buccelli Date: Fri, 22 Mar 2024 05:14:13 +0100 Subject: [PATCH 12/18] User management: Add a checkbox for stating if the user is a contractor (#36479) Co-authored-by: Anthony Grullon --- .../changelog/update-user-new-contractor | 4 + .../sso/class.jetpack-sso-user-admin.php | 76 +++++++++++++++++++ .../sso/jetpack-sso-admin-create-user.js | 13 +++- 3 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 projects/plugins/jetpack/changelog/update-user-new-contractor diff --git a/projects/plugins/jetpack/changelog/update-user-new-contractor b/projects/plugins/jetpack/changelog/update-user-new-contractor new file mode 100644 index 0000000000000..617b31c504284 --- /dev/null +++ b/projects/plugins/jetpack/changelog/update-user-new-contractor @@ -0,0 +1,4 @@ +Significance: minor +Type: other + +Added the possibility of stating if a new invited user is a contractor. diff --git a/projects/plugins/jetpack/modules/sso/class.jetpack-sso-user-admin.php b/projects/plugins/jetpack/modules/sso/class.jetpack-sso-user-admin.php index ce0149a485de3..7224fb10b351f 100644 --- a/projects/plugins/jetpack/modules/sso/class.jetpack-sso-user-admin.php +++ b/projects/plugins/jetpack/modules/sso/class.jetpack-sso-user-admin.php @@ -41,6 +41,7 @@ public function __construct() { add_filter( 'wp_send_new_user_notification_to_user', array( $this, 'should_send_wp_mail_new_user' ) ); add_action( 'user_new_form', array( $this, 'render_invitation_email_message' ) ); add_action( 'user_new_form', array( $this, 'render_wpcom_invite_checkbox' ), 1 ); + add_action( 'user_new_form', array( $this, 'render_wpcom_external_user_checkbox' ), 1 ); add_action( 'user_new_form', array( $this, 'render_custom_email_message_form_field' ), 1 ); add_action( 'delete_user_form', array( $this, 'render_invitations_notices_for_deleted_users' ) ); add_action( 'delete_user', array( $this, 'revoke_user_invite' ) ); @@ -125,6 +126,12 @@ public function revoke_user_invite( $user_id ) { } return $response; + } else { + // Delete external contributor if it exists. + $wpcom_user_data = Jetpack::connection()->get_connected_user_data( $user_id ); + if ( isset( $wpcom_user_data['ID'] ) ) { + return self::delete_external_contributor( $wpcom_user_data['ID'] ); + } } } catch ( Exception $e ) { return false; @@ -695,6 +702,40 @@ public function render_wpcom_invite_checkbox( $type ) { } } + /** + * Render a checkbox to differentiate if a user is external. + * + * @param string $type The type of new user form the hook follows. + */ + public function render_wpcom_external_user_checkbox( $type ) { + if ( $type === 'add-new-user' ) { + ?> + + + + + +
    + + +
    + + + + +
    +
    + 'POST', + ), + array( + 'user_id' => $user_id, + ), + 'wpcom' + ); + + if ( 200 !== wp_remote_retrieve_response_code( $response ) ) { + return false; + } + + return true; + } + /** * Show Jetpack SSO user connection status. * diff --git a/projects/plugins/jetpack/modules/sso/jetpack-sso-admin-create-user.js b/projects/plugins/jetpack/modules/sso/jetpack-sso-admin-create-user.js index 458dca1a9a885..a6728fc2d31a8 100644 --- a/projects/plugins/jetpack/modules/sso/jetpack-sso-admin-create-user.js +++ b/projects/plugins/jetpack/modules/sso/jetpack-sso-admin-create-user.js @@ -1,13 +1,19 @@ jQuery( document ).ready( function ( $ ) { var sendUserNotificationCheckbox = $( '#send_user_notification' ); + var userExternalContractorCheckbox = $( '#user_external_contractor' ); var inviteUserWpcomCheckbox = $( '#invite_user_wpcom' ); - if ( inviteUserWpcomCheckbox && sendUserNotificationCheckbox ) { + if ( inviteUserWpcomCheckbox && sendUserNotificationCheckbox && userExternalContractorCheckbox ) { // Toggle Send User Notification checkbox enabled/disabled based on Invite User checkbox + // Enable External Contractor checkbox if Invite User checkbox is checked inviteUserWpcomCheckbox.on( 'change', function () { sendUserNotificationCheckbox.prop( 'disabled', inviteUserWpcomCheckbox.prop( 'checked' ) ); if ( inviteUserWpcomCheckbox.prop( 'checked' ) ) { sendUserNotificationCheckbox.prop( 'checked', false ); + userExternalContractorCheckbox.prop( 'disabled', false ); + } else { + userExternalContractorCheckbox.prop( 'disabled', true ); + userExternalContractorCheckbox.prop( 'checked', false ); } } ); @@ -16,5 +22,10 @@ jQuery( document ).ready( function ( $ ) { sendUserNotificationCheckbox.prop( 'disabled', true ); sendUserNotificationCheckbox.prop( 'checked', false ); } + + // On load, disable External Contractor checkbox if Invite User checkbox is unchecked + if ( ! inviteUserWpcomCheckbox.prop( 'checked' ) ) { + userExternalContractorCheckbox.prop( 'disabled', true ); + } } } ); From 11b2a22cb5f378000689a6318fdb39347c2d11d0 Mon Sep 17 00:00:00 2001 From: Brandon Kraft Date: Fri, 22 Mar 2024 04:47:04 -0500 Subject: [PATCH 13/18] Enhanced Distribution: begin deprecation (#36168) * Enhanced Distribution: begin deprecation * Remove from module list * Move Reader hooks to 3rd-party * Update version * Remove mention in My Jetpack * Update projects/plugins/jetpack/modules/enhanced-distribution.php Co-authored-by: Jeremy Herve * Remove additional reference to a JP Dash test * Remove from array of modules that lack UI * Update RSS feed addition hooks * Ver bumps * Ensure Reader utilities load on most recent RSS feeds See https://github.com/Automattic/jetpack/pull/36168#issuecomment-2004421624 * Simplify output of each function * Remove redundant casting --------- Co-authored-by: Jeremy Herve --- .../my-jetpack/changelog/remove-enhdist | 4 + .../my-jetpack/src/products/class-creator.php | 14 ---- .../plugins/jetpack/3rd-party/3rd-party.php | 3 + .../jetpack/3rd-party/wpcom-reader.php | 66 +++++++++++++++ .../settings-card/test/component.js | 1 - .../settings-group/test/component.js | 1 - .../_inc/client/searchable-modules/index.jsx | 2 +- .../plugins/jetpack/changelog/remove-enhdist | 4 + projects/plugins/jetpack/class.jetpack.php | 11 +-- .../jetpack/modules/enhanced-distribution.php | 80 ++----------------- .../plugins/jetpack/modules/module-info.php | 20 ----- projects/plugins/jetpack/readme.txt | 1 - .../jetpack/tests/php/test-get-modules.php | 1 - tools/e2e-commons/helpers/plan-helper.js | 1 - 14 files changed, 89 insertions(+), 120 deletions(-) create mode 100644 projects/packages/my-jetpack/changelog/remove-enhdist create mode 100644 projects/plugins/jetpack/3rd-party/wpcom-reader.php create mode 100644 projects/plugins/jetpack/changelog/remove-enhdist diff --git a/projects/packages/my-jetpack/changelog/remove-enhdist b/projects/packages/my-jetpack/changelog/remove-enhdist new file mode 100644 index 0000000000000..f8e9f8d513519 --- /dev/null +++ b/projects/packages/my-jetpack/changelog/remove-enhdist @@ -0,0 +1,4 @@ +Significance: patch +Type: removed + +Removed reference to Creator Network, which is being deprecated. diff --git a/projects/packages/my-jetpack/src/products/class-creator.php b/projects/packages/my-jetpack/src/products/class-creator.php index 44259932713db..2d54bfbb9ba27 100644 --- a/projects/packages/my-jetpack/src/products/class-creator.php +++ b/projects/packages/my-jetpack/src/products/class-creator.php @@ -156,20 +156,6 @@ public static function get_features_by_tier() { ), ), ), - array( - 'name' => __( 'Creator network', 'jetpack-my-jetpack' ), - 'info' => array( - 'content' => __( - '

    The creator network is the network of websites either hosted with WordPress.com or self-hosted and connected with Jetpack.

    -

    Sites that are part of the creator network can gain exposure to new readers. Sites on the Creator plan have enhanced distribution to more areas of the Reader.

    ', - 'jetpack-my-jetpack' - ), - ), - 'tiers' => array( - self::FREE_TIER_SLUG => array( 'included' => true ), - self::UPGRADED_TIER_SLUG => array( 'included' => true ), - ), - ), array( 'name' => __( 'Jetpack Blocks', 'jetpack-my-jetpack' ), 'info' => array( diff --git a/projects/plugins/jetpack/3rd-party/3rd-party.php b/projects/plugins/jetpack/3rd-party/3rd-party.php index 36f4ad2f6465a..281b25c3dca0e 100644 --- a/projects/plugins/jetpack/3rd-party/3rd-party.php +++ b/projects/plugins/jetpack/3rd-party/3rd-party.php @@ -90,6 +90,9 @@ function load_3rd_party_compat_filters() { require_once JETPACK__PLUGIN_DIR . '/3rd-party/atomic.php'; } + // WordPress.com Reader + require_once JETPACK__PLUGIN_DIR . '/3rd-party/wpcom-reader.php'; + // WPML if ( defined( 'ICL_SITEPRESS_VERSION' ) ) { require_once JETPACK__PLUGIN_DIR . '/3rd-party/wpml.php'; diff --git a/projects/plugins/jetpack/3rd-party/wpcom-reader.php b/projects/plugins/jetpack/3rd-party/wpcom-reader.php new file mode 100644 index 0000000000000..e01fd781978f0 --- /dev/null +++ b/projects/plugins/jetpack/3rd-party/wpcom-reader.php @@ -0,0 +1,66 @@ +is_wpcom_simple() + || ( + ( new Connection_Manager() )->is_connected() + && ! ( new Status() )->is_offline_mode() + ) + ) { + $blog_id = Connection_Manager::get_site_id( true ); // Silence since we're not wanting to handle the error state. + if ( ! $blog_id ) { + return; + } + + printf( + '%d', + (int) $blog_id + ); + } +} + +/** + * Output feed item identifier based on current post ID. + * + * @return void + */ +function jetpack_wpcomreader_post_id() { + $id = get_the_ID(); + if ( ! $id ) { + return; + } + + printf( + '%d', + (int) $id + ); +} diff --git a/projects/plugins/jetpack/_inc/client/components/settings-card/test/component.js b/projects/plugins/jetpack/_inc/client/components/settings-card/test/component.js index 4872bb8ff55db..97a19d5ddb783 100644 --- a/projects/plugins/jetpack/_inc/client/components/settings-card/test/component.js +++ b/projects/plugins/jetpack/_inc/client/components/settings-card/test/component.js @@ -59,7 +59,6 @@ describe( 'SettingsCard', () => { 'notes', 'subscriptions', 'protect', - 'enhanced-distribution', 'comments', 'json-api', 'photon', diff --git a/projects/plugins/jetpack/_inc/client/components/settings-group/test/component.js b/projects/plugins/jetpack/_inc/client/components/settings-group/test/component.js index 4e5f7129b1818..368959bd5c180 100644 --- a/projects/plugins/jetpack/_inc/client/components/settings-group/test/component.js +++ b/projects/plugins/jetpack/_inc/client/components/settings-group/test/component.js @@ -35,7 +35,6 @@ describe( 'SettingsGroup', () => { 'notes', 'subscriptions', 'protect', - 'enhanced-distribution', 'comments', 'json-api', 'photon', diff --git a/projects/plugins/jetpack/_inc/client/searchable-modules/index.jsx b/projects/plugins/jetpack/_inc/client/searchable-modules/index.jsx index 6ea2e8dce88e7..69ac65264db73 100644 --- a/projects/plugins/jetpack/_inc/client/searchable-modules/index.jsx +++ b/projects/plugins/jetpack/_inc/client/searchable-modules/index.jsx @@ -36,7 +36,7 @@ export const SearchableModules = withModuleSettingsFormHelpers( } // Only should be features that don't already have a UI, and we want to reveal in search. - const safelist = [ 'contact-form', 'enhanced-distribution', 'json-api', 'notes' ]; + const safelist = [ 'contact-form', 'json-api', 'notes' ]; const allModules = this.props.modules, results = []; diff --git a/projects/plugins/jetpack/changelog/remove-enhdist b/projects/plugins/jetpack/changelog/remove-enhdist new file mode 100644 index 0000000000000..764c87c21fbbe --- /dev/null +++ b/projects/plugins/jetpack/changelog/remove-enhdist @@ -0,0 +1,4 @@ +Significance: minor +Type: bugfix + +Enhanced Distribution: begin deprecation process as the Firehose is winding down diff --git a/projects/plugins/jetpack/class.jetpack.php b/projects/plugins/jetpack/class.jetpack.php index 74adcd78ba48c..62b0da71bc615 100644 --- a/projects/plugins/jetpack/class.jetpack.php +++ b/projects/plugins/jetpack/class.jetpack.php @@ -2289,11 +2289,12 @@ public static function get_default_modules( $min_version = false, $max_version = */ public function handle_deprecated_modules( $modules ) { $deprecated_modules = array( - 'debug' => null, // Closed out and moved to the debugger library. - 'wpcc' => 'sso', // Closed out in 2.6 -- SSO provides the same functionality. - 'gplus-authorship' => null, // Closed out in 3.2 -- Google dropped support. - 'minileven' => null, // Closed out in 8.3 -- Responsive themes are common now, and so is AMP. - 'lazy-images' => null, // Closed out in 12.8 -- WordPress core now has native lazy loading. + 'debug' => null, // Closed out and moved to the debugger library. + 'wpcc' => 'sso', // Closed out in 2.6 -- SSO provides the same functionality. + 'gplus-authorship' => null, // Closed out in 3.2 -- Google dropped support. + 'minileven' => null, // Closed out in 8.3 -- Responsive themes are common now, and so is AMP. + 'lazy-images' => null, // Closed out in 12.8 -- WordPress core now has native lazy loading. + 'enhanced-distribution' => null, // Closed out in 13.3 -- WP.com is winding down the firehose. ); // Don't activate SSO if they never completed activating WPCC. diff --git a/projects/plugins/jetpack/modules/enhanced-distribution.php b/projects/plugins/jetpack/modules/enhanced-distribution.php index 58c4a331556de..9552b31e3ab0a 100644 --- a/projects/plugins/jetpack/modules/enhanced-distribution.php +++ b/projects/plugins/jetpack/modules/enhanced-distribution.php @@ -1,81 +1,11 @@ =' ) ) { - return; - } - - Jetpack::check_privacy( __FILE__ ); -} - -add_action( 'jetpack_before_activate_default_modules', 'jetpack_enhanced_distribution_before_activate_default_modules' ); - -if ( isset( $_GET['get_freshly_pressed_data'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended - /** - * If a request has ?get_freshly_pressed_data=true appended - * to the end, then let's provide the necessary data back via JSON. - */ - function jetpack_get_freshly_pressed_data() { - if ( is_single() ) { - wp_send_json_success( - array( - 'blog_id' => Jetpack_Options::get_option( 'id' ), - 'post_id' => get_the_ID(), - ) - ); - } else { - wp_send_json_error( - array( - 'message' => 'Not Singular', - ) - ); - } - } - add_action( 'template_redirect', 'jetpack_get_freshly_pressed_data' ); -} - -add_action( 'rss_head', 'jetpack_enhanced_distribution_feed_id' ); -add_action( 'rss_item', 'jetpack_enhanced_distribution_post_id' ); -add_action( 'rss2_head', 'jetpack_enhanced_distribution_feed_id' ); -add_action( 'rss2_item', 'jetpack_enhanced_distribution_post_id' ); - -/** - * Output feed identifier based on blog ID. - */ -function jetpack_enhanced_distribution_feed_id() { - $id = (int) Jetpack_Options::get_option( 'id' ); - if ( $id > 0 ) { - $output = sprintf( '%d', $id ); - echo $output; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped - } -} - -/** - * Output feed item identifier based on current post ID. - */ -function jetpack_enhanced_distribution_post_id() { - $id = (int) get_the_ID(); - if ( $id ) { - $output = sprintf( '%d', $id ); - echo $output; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped - } -} +_deprecated_file( basename( __FILE__ ), 'jetpack-$$next-version$$' ); +// Silence is golden. Left here to ensure no fatals on some seemingly misconfigured opcache setups. diff --git a/projects/plugins/jetpack/modules/module-info.php b/projects/plugins/jetpack/modules/module-info.php index dfca5da8b0993..ad2593daa0f54 100644 --- a/projects/plugins/jetpack/modules/module-info.php +++ b/projects/plugins/jetpack/modules/module-info.php @@ -240,26 +240,6 @@ function jetpack_subscriptions_more_info() { } add_action( 'jetpack_module_more_info_subscriptions', 'jetpack_subscriptions_more_info' ); -/** - * Enhanced Distribution support link. - */ -function jetpack_enhanced_distribution_more_link() { - echo esc_url( Redirect::get_url( 'jetpack-support-enhanced-distribution' ) ); -} -add_action( 'jetpack_learn_more_button_enhanced-distribution', 'jetpack_enhanced_distribution_more_link' ); - -/** - * Enhanced Distribution description. - */ -function jetpack_enhanced_distribution_more_info() { - esc_html_e( - 'Jetpack will automatically take your great published content and share it instantly with third-party services - like search engines, increasing your reach and traffic.', - 'jetpack' - ); -} -add_action( 'jetpack_module_more_info_enhanced-distribution', 'jetpack_enhanced_distribution_more_info' ); - /** * Protect support link. */ diff --git a/projects/plugins/jetpack/readme.txt b/projects/plugins/jetpack/readme.txt index a7847d44e9f60..bf8404dd9d4b2 100644 --- a/projects/plugins/jetpack/readme.txt +++ b/projects/plugins/jetpack/readme.txt @@ -216,7 +216,6 @@ Jetpack is the ultimate toolkit for WP for both the classic editor and the block * Custom CSS — Customize the appearance of your theme without creating a child theme or worrying about updates overwriting your customizations. * Custom Content Types — Adds custom post types (CPTs) to your site. * Downtime Monitor — Alerts you via electronic mail if your site goes down to ensure you keep uptime. -* Enhanced Distribution — Increase your reach by allowing your content to be included in the WordPress.com “firehose” of public blog content. * Extra Sidebar Widgets — Extra widgets you can add to your blog, including RSS Links and Facebook Like Boxes. * Gravatar Hovercards — Make your Gravatar profile visible to those viewing your blog. * Google Analytics (GA) — Track your WordPress site statistics thanks to Google Analytics. diff --git a/projects/plugins/jetpack/tests/php/test-get-modules.php b/projects/plugins/jetpack/tests/php/test-get-modules.php index b782c6dfbc7bd..995a7eb534630 100644 --- a/projects/plugins/jetpack/tests/php/test-get-modules.php +++ b/projects/plugins/jetpack/tests/php/test-get-modules.php @@ -39,7 +39,6 @@ public function test_get_available_modules() { 'copy-post', 'custom-content-types', 'custom-css', - 'enhanced-distribution', 'google-analytics', 'gravatar-hovercards', 'infinite-scroll', diff --git a/tools/e2e-commons/helpers/plan-helper.js b/tools/e2e-commons/helpers/plan-helper.js index 780a5ec9b66ad..17c9b91f3094e 100644 --- a/tools/e2e-commons/helpers/plan-helper.js +++ b/tools/e2e-commons/helpers/plan-helper.js @@ -171,7 +171,6 @@ function getPlanData( 'contact-form', 'custom-content-types', 'custom-css', - 'enhanced-distribution', 'gravatar-hovercards', 'json-api', 'latex', From 7c6900f187b33d0218ae28e9ccc20d7afd64a40c Mon Sep 17 00:00:00 2001 From: arthur791004 Date: Fri, 22 Mar 2024 18:32:01 +0800 Subject: [PATCH 14/18] Block Patterns: Fix the starter patterns modal isn't shown on a new post (#36516) * Block Patterns: Fix the modal of the starter patterns isn't shown owhen you're creating a new post * changelog --- .../fix-start-page-options-modal-for-new-post | 4 ++++ .../class-wpcom-block-patterns-from-api.php | 10 ++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 projects/packages/jetpack-mu-wpcom/changelog/fix-start-page-options-modal-for-new-post diff --git a/projects/packages/jetpack-mu-wpcom/changelog/fix-start-page-options-modal-for-new-post b/projects/packages/jetpack-mu-wpcom/changelog/fix-start-page-options-modal-for-new-post new file mode 100644 index 0000000000000..295f1c4e6792a --- /dev/null +++ b/projects/packages/jetpack-mu-wpcom/changelog/fix-start-page-options-modal-for-new-post @@ -0,0 +1,4 @@ +Significance: patch +Type: fixed + +Block Patterns: The modal of the starter patterns isn't shown when you're creating a new post diff --git a/projects/packages/jetpack-mu-wpcom/src/features/block-patterns/class-wpcom-block-patterns-from-api.php b/projects/packages/jetpack-mu-wpcom/src/features/block-patterns/class-wpcom-block-patterns-from-api.php index 1e124fb6ba62d..889ff87cbd5ef 100644 --- a/projects/packages/jetpack-mu-wpcom/src/features/block-patterns/class-wpcom-block-patterns-from-api.php +++ b/projects/packages/jetpack-mu-wpcom/src/features/block-patterns/class-wpcom-block-patterns-from-api.php @@ -139,7 +139,12 @@ function ( $a, $b ) { } } - $this->update_pattern_block_types(); + // We prefer to show the starter page patterns modal of wpcom instead of core + // if it's available. Hence, we have to update the block types of patterns + // to disable the core's. + if ( class_exists( '\A8C\FSE\Starter_Page_Templates' ) ) { + $this->update_pattern_block_types(); + } // Temporarily removing the call to `update_pattern_post_types` while we investigate // https://github.com/Automattic/wp-calypso/issues/79145. @@ -280,7 +285,8 @@ private function update_pattern_block_types() { } $post_content_offset = array_search( 'core/post-content', $pattern['blockTypes'], true ); - if ( $post_content_offset !== false ) { + $is_page_pattern = empty( $pattern['postTypes'] ) || in_array( 'page', $pattern['postTypes'], true ); + if ( $post_content_offset !== false && $is_page_pattern ) { unregister_block_pattern( $pattern['name'] ); array_splice( $pattern['blockTypes'], $post_content_offset, 1 ); From 3bb70fef874b6016a74bd0bc9d898b480c54b7d5 Mon Sep 17 00:00:00 2001 From: Tim Broddin Date: Fri, 22 Mar 2024 12:29:07 +0100 Subject: [PATCH 15/18] Plugin update manager: transfers the status when editing a schedule (#36521) * Transfer status when updating schedule * Transfer status when updating schedule * Account for null * Account for null * Bump version --- .../fix-plugin-update-mgr-edit-status | 4 ++ .../src/class-scheduled-updates.php | 2 +- ...-rest-api-v2-endpoint-update-schedules.php | 11 ++++- ...-api-v2-endpoint-update-schedules-test.php | 49 +++++++++++++++++++ 4 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 projects/packages/scheduled-updates/changelog/fix-plugin-update-mgr-edit-status diff --git a/projects/packages/scheduled-updates/changelog/fix-plugin-update-mgr-edit-status b/projects/packages/scheduled-updates/changelog/fix-plugin-update-mgr-edit-status new file mode 100644 index 0000000000000..a156a2e74fd89 --- /dev/null +++ b/projects/packages/scheduled-updates/changelog/fix-plugin-update-mgr-edit-status @@ -0,0 +1,4 @@ +Significance: patch +Type: fixed + +Transfer status when editing a schedule. diff --git a/projects/packages/scheduled-updates/src/class-scheduled-updates.php b/projects/packages/scheduled-updates/src/class-scheduled-updates.php index bbefd19c82003..cfd1e8147ab3c 100644 --- a/projects/packages/scheduled-updates/src/class-scheduled-updates.php +++ b/projects/packages/scheduled-updates/src/class-scheduled-updates.php @@ -20,7 +20,7 @@ class Scheduled_Updates { * * @var string */ - const PACKAGE_VERSION = '0.5.0'; + const PACKAGE_VERSION = '0.5.1-alpha'; /** * The cron event hook for the scheduled plugins update. * diff --git a/projects/packages/scheduled-updates/src/wpcom-endpoints/class-wpcom-rest-api-v2-endpoint-update-schedules.php b/projects/packages/scheduled-updates/src/wpcom-endpoints/class-wpcom-rest-api-v2-endpoint-update-schedules.php index 79bdcf846af17..286d9b12eaba6 100644 --- a/projects/packages/scheduled-updates/src/wpcom-endpoints/class-wpcom-rest-api-v2-endpoint-update-schedules.php +++ b/projects/packages/scheduled-updates/src/wpcom-endpoints/class-wpcom-rest-api-v2-endpoint-update-schedules.php @@ -331,12 +331,21 @@ public function update_item( $request ) { return $result; } + $previous_schedule_status = Scheduled_Updates::get_scheduled_update_status( $request['schedule_id'] ); + $deleted = $this->delete_item( $request ); if ( is_wp_error( $deleted ) ) { return $deleted; } - return $this->create_item( $request ); + $item = $this->create_item( $request ); + + // Sets the previous status + if ( $previous_schedule_status ) { + Scheduled_Updates::set_scheduled_update_status( $item->data, $previous_schedule_status['last_run_timestamp'], $previous_schedule_status['last_run_status'] ); + } + + return $item; } /** diff --git a/projects/packages/scheduled-updates/tests/php/class-wpcom-rest-api-v2-endpoint-update-schedules-test.php b/projects/packages/scheduled-updates/tests/php/class-wpcom-rest-api-v2-endpoint-update-schedules-test.php index efc0968a9ac87..d701555870574 100644 --- a/projects/packages/scheduled-updates/tests/php/class-wpcom-rest-api-v2-endpoint-update-schedules-test.php +++ b/projects/packages/scheduled-updates/tests/php/class-wpcom-rest-api-v2-endpoint-update-schedules-test.php @@ -563,6 +563,55 @@ public function test_update_item() { $this->assertSame( $schedule_id, $result->get_data() ); } + /** + * Test update item. + * + * @covers ::update_item + */ + public function test_update_item_with_status() { + $plugins = array( + 'custom-plugin/custom-plugin.php', + 'gutenberg/gutenberg.php', + ); + $timestamp = strtotime( 'last Monday 8:00' ); + $status = 'success'; + + $schedule_id = Scheduled_Updates::generate_schedule_id( $plugins ); + + wp_schedule_event( strtotime( 'next Monday 8:00' ), 'weekly', Scheduled_Updates::PLUGIN_CRON_HOOK, $plugins ); + + Scheduled_Updates::set_scheduled_update_status( $schedule_id, $timestamp, $status ); + + $request = new WP_REST_Request( 'PUT', '/wpcom/v2/update-schedules/' . $schedule_id ); + $request->set_body_params( + array( + 'plugins' => $plugins, + 'schedule' => array( + 'timestamp' => strtotime( 'next Tuesday 9:00' ), + 'interval' => 'daily', + ), + ) + ); + + // Successful request. + wp_set_current_user( $this->admin_id ); + $result = rest_do_request( $request ); + + $this->assertSame( 200, $result->get_status() ); + $schedule_id = $result->get_data(); + + // Get the updated status + $updated_status = Scheduled_Updates::get_scheduled_update_status( $schedule_id ); + if ( $updated_status === null ) { + $this->fail( 'Scheduled_Updates::get_scheduled_update_status() returned null.' ); + } else { + $this->assertIsArray( $updated_status, 'Scheduled_Updates::get_scheduled_update_status() should return an array.' ); + // doing these null checks for the static analyzer + $this->assertSame( $timestamp, $updated_status['last_run_timestamp'] ?? null ); + $this->assertSame( $status, $updated_status['last_run_status'] ?? null ); + } + } + /** * Test update_item with invalid schedule ID. * From ae42cc84baa682d2a40a19fd7caa709788466233 Mon Sep 17 00:00:00 2001 From: Jeremy Herve Date: Fri, 22 Mar 2024 14:01:04 +0100 Subject: [PATCH 16/18] Boost: fix typo in tooltip string. (#36520) --- .../boost-card/use-boost-tooltip-copy.ts | 4 ++-- .../packages/my-jetpack/changelog/update-boost-strings-css | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 projects/packages/my-jetpack/changelog/update-boost-strings-css diff --git a/projects/packages/my-jetpack/_inc/components/product-cards-section/boost-card/use-boost-tooltip-copy.ts b/projects/packages/my-jetpack/_inc/components/product-cards-section/boost-card/use-boost-tooltip-copy.ts index f19cfbc47b7e2..c28cbf7b1f35d 100644 --- a/projects/packages/my-jetpack/_inc/components/product-cards-section/boost-card/use-boost-tooltip-copy.ts +++ b/projects/packages/my-jetpack/_inc/components/product-cards-section/boost-card/use-boost-tooltip-copy.ts @@ -37,12 +37,12 @@ export const useBoostTooltipCopy = ( { speedLetterGrade } ): string => { switch ( speedLetterGrade ) { case 'A': return __( - 'Your site is fast! But maintaining a high speed isn’t easy. Upgrade Boost to use automated CCS and image optimization tools to improve your performance on the go.', + 'Your site is fast! But maintaining a high speed isn’t easy. Upgrade Boost to use automated CSS and image optimization tools to improve your performance on the go.', 'jetpack-my-jetpack' ); case 'B': return __( - 'You are one step away from making your site blazing fast. Upgrade Boost to use automated CCS and image optimization tools to improve your performance.', + 'You are one step away from making your site blazing fast. Upgrade Boost to use automated CSS and image optimization tools to improve your performance.', 'jetpack-my-jetpack' ); default: diff --git a/projects/packages/my-jetpack/changelog/update-boost-strings-css b/projects/packages/my-jetpack/changelog/update-boost-strings-css new file mode 100644 index 0000000000000..eabcc70518a44 --- /dev/null +++ b/projects/packages/my-jetpack/changelog/update-boost-strings-css @@ -0,0 +1,4 @@ +Significance: patch +Type: fixed + +Boost tooltips: fix typo in string. From 5eaab12859863a11252f5b8f7449de87e16be3fd Mon Sep 17 00:00:00 2001 From: Konstantin Obenland Date: Fri, 22 Mar 2024 14:11:59 +0100 Subject: [PATCH 17/18] Scheduled Updates: Fix off-by-one error for Sunday schedules (#36524) * Scheduled Updates: Fix off-by-one error for Sunday schedules * Fix automated tools feedback * Add unit test. * Looks like data providers need to be public * Update get_scheduled_update_text to use wp_date * Use new wp_date for improved compat Props @TimBroddin --------- Co-authored-by: Tim Broddin --- .../changelog/fix-day-of-week | 4 ++ .../src/class-scheduled-updates.php | 22 +++---- .../php/class-scheduled-updates-test.php | 64 ++++++++++++++++--- 3 files changed, 69 insertions(+), 21 deletions(-) create mode 100644 projects/packages/scheduled-updates/changelog/fix-day-of-week diff --git a/projects/packages/scheduled-updates/changelog/fix-day-of-week b/projects/packages/scheduled-updates/changelog/fix-day-of-week new file mode 100644 index 0000000000000..7b15b591fb4db --- /dev/null +++ b/projects/packages/scheduled-updates/changelog/fix-day-of-week @@ -0,0 +1,4 @@ +Significance: patch +Type: fixed + +Fixed a bug where the weekday index was not properly accounted for in list of weekdays. diff --git a/projects/packages/scheduled-updates/src/class-scheduled-updates.php b/projects/packages/scheduled-updates/src/class-scheduled-updates.php index cfd1e8147ab3c..8dd1076299bc6 100644 --- a/projects/packages/scheduled-updates/src/class-scheduled-updates.php +++ b/projects/packages/scheduled-updates/src/class-scheduled-updates.php @@ -221,30 +221,30 @@ public static function get_scheduled_update_text( $schedule ) { $html = sprintf( /* translators: %s is the time of day. Daily at 10 am. */ esc_html__( 'Daily at %s.', 'jetpack-scheduled-updates' ), - get_date_from_gmt( gmdate( 'Y-m-d H:i:s', $schedule->timestamp ), get_option( 'time_format' ) ) + wp_date( get_option( 'time_format' ), $schedule->timestamp ) ); } else { // Not getting smart about passing in weekdays makes it easier to translate. $weekdays = array( - /* translators: %s is the time of day. Sundays at 10 am. */ - __( 'Sundays at %s.', 'jetpack-scheduled-updates' ), /* translators: %s is the time of day. Mondays at 10 am. */ - __( 'Mondays at %s.', 'jetpack-scheduled-updates' ), + 1 => __( 'Mondays at %s.', 'jetpack-scheduled-updates' ), /* translators: %s is the time of day. Tuesdays at 10 am. */ - __( 'Tuesdays at %s.', 'jetpack-scheduled-updates' ), + 2 => __( 'Tuesdays at %s.', 'jetpack-scheduled-updates' ), /* translators: %s is the time of day. Wednesdays at 10 am. */ - __( 'Wednesdays at %s.', 'jetpack-scheduled-updates' ), + 3 => __( 'Wednesdays at %s.', 'jetpack-scheduled-updates' ), /* translators: %s is the time of day. Thursdays at 10 am. */ - __( 'Thursdays at %s.', 'jetpack-scheduled-updates' ), + 4 => __( 'Thursdays at %s.', 'jetpack-scheduled-updates' ), /* translators: %s is the time of day. Fridays at 10 am. */ - __( 'Fridays at %s.', 'jetpack-scheduled-updates' ), + 5 => __( 'Fridays at %s.', 'jetpack-scheduled-updates' ), /* translators: %s is the time of day. Saturdays at 10 am. */ - __( 'Saturdays at %s.', 'jetpack-scheduled-updates' ), + 6 => __( 'Saturdays at %s.', 'jetpack-scheduled-updates' ), + /* translators: %s is the time of day. Sundays at 10 am. */ + 7 => __( 'Sundays at %s.', 'jetpack-scheduled-updates' ), ); $html = sprintf( - $weekdays[ date_i18n( 'N', $schedule->timestamp ) ], - get_date_from_gmt( gmdate( 'Y-m-d H:i:s', $schedule->timestamp ), get_option( 'time_format' ) ) + $weekdays[ wp_date( 'N', $schedule->timestamp ) ], + wp_date( get_option( 'time_format' ), $schedule->timestamp ) ); } diff --git a/projects/packages/scheduled-updates/tests/php/class-scheduled-updates-test.php b/projects/packages/scheduled-updates/tests/php/class-scheduled-updates-test.php index 8bae36af10326..ced9d0f49c857 100644 --- a/projects/packages/scheduled-updates/tests/php/class-scheduled-updates-test.php +++ b/projects/packages/scheduled-updates/tests/php/class-scheduled-updates-test.php @@ -63,7 +63,7 @@ protected function set_up() { // Ensure plugin directory exists. $this->wp_filesystem->mkdir( $this->plugin_dir ); - // init the hook + // Init the hook. add_action( 'rest_api_init', array( 'Automattic\Jetpack\Scheduled_Updates', 'add_is_managed_extension_field' ) ); do_action( 'rest_api_init' ); @@ -75,10 +75,10 @@ protected function set_up() { * @after */ protected function tear_down() { - // Clean up the temporary plugin directory + // Clean up the temporary plugin directory. $this->wp_filesystem->rmdir( $this->plugin_dir, true ); - // Clean up the plugins cache created by get_plugins() + // Clean up the plugins cache created by get_plugins(). wp_cache_delete( 'plugins', 'plugins' ); wp_clear_scheduled_hook( Scheduled_Updates::PLUGIN_CRON_HOOK ); @@ -94,12 +94,12 @@ protected function tear_down() { * @covers ::add_is_managed_extension_field */ public function test_unmanaged_plugins() { - // direct + // Direct. $plugin_name = 'direct-plugin'; $this->wp_filesystem->mkdir( "$this->plugin_dir/$plugin_name" ); $this->populate_file_with_plugin_header( "$this->plugin_dir/$plugin_name/$plugin_name.php", 'direct-plugin' ); - // make sure the directory exists + // Make sure the directory exists. $this->assertTrue( $this->wp_filesystem->is_dir( "$this->plugin_dir/direct-plugin" ) ); $request = new \WP_REST_Request( 'GET', '/wp/v2/plugins' ); @@ -117,7 +117,7 @@ public function test_unmanaged_plugins() { * @covers ::add_is_managed_extension_field */ public function test_unmanaged_plugins_not_in_root_directory() { - // we simulate a symlink to a subdirectory inside a wp directory + // We simulate a symlink to a subdirectory inside a wp directory. $plugin_name = 'managed-plugin'; $target_dir = "$this->plugin_dir/wordpress"; $this->wp_filesystem->mkdir( $target_dir ); @@ -125,7 +125,7 @@ public function test_unmanaged_plugins_not_in_root_directory() { $this->populate_file_with_plugin_header( "$target_dir/$plugin_name/$plugin_name.php", 'managed-plugin' ); symlink( "$target_dir/$plugin_name", "$this->plugin_dir/$plugin_name" ); - // make sure the symlink exists + // Make sure the symlink exists. $this->assertFalse( $this->wp_filesystem->is_dir( "$this->plugin_dir/direct-plugin" ) ); $this->assertTrue( is_link( "$this->plugin_dir/managed-plugin" ) ); @@ -144,7 +144,7 @@ public function test_unmanaged_plugins_not_in_root_directory() { * @covers ::add_is_managed_extension_field */ public function test_managed_plugins() { - // we simulate a symlink to a subdirectory inside a wp directory + // We simulate a symlink to a subdirectory inside a wp directory. $plugin_name = 'managed-plugin'; $target_dir = "$this->plugin_dir/wordpress"; $this->wp_filesystem->mkdir( $target_dir ); @@ -152,11 +152,11 @@ public function test_managed_plugins() { $this->populate_file_with_plugin_header( "$target_dir/$plugin_name/$plugin_name.php", 'managed-plugin' ); symlink( "$target_dir/$plugin_name", "$this->plugin_dir/$plugin_name" ); - // make sure the symlink exists + // Make sure the symlink exists. $this->assertFalse( $this->wp_filesystem->is_dir( "$this->plugin_dir/direct-plugin" ) ); $this->assertTrue( is_link( "$this->plugin_dir/managed-plugin" ) ); - // tweak realpath so that it returns `/wordpress/...` + // Tweak realpath so that it returns `/wordpress/...`. $realpath = $this->getFunctionMock( __NAMESPACE__, 'realpath' ); $realpath->expects( $this->once() )->willReturn( "/wordpress/plugins/$plugin_name" ); @@ -554,6 +554,50 @@ public function test_delete_plugin_new_events_inherit_statuses() { } } + /** + * Test get_scheduled_update_text. + * + * @dataProvider update_text_provider + * @covers ::get_scheduled_update_text + * + * @param object $schedule The schedule object. + * @param string $expected The expected text. + */ + public function test_get_scheduled_update_text( $schedule, $expected ) { + $this->assertSame( $expected, Scheduled_Updates::get_scheduled_update_text( $schedule ) ); + } + + /** + * Data provider for test_get_scheduled_update_text. + * + * @return array[] + */ + public function update_text_provider() { + return array( + array( + (object) array( + 'timestamp' => strtotime( 'next Monday 00:00' ), + 'interval' => WEEK_IN_SECONDS, + ), + sprintf( 'Mondays at %s.', gmdate( get_option( 'time_format' ), strtotime( 'next Monday 8:00' ) ) ), + ), + array( + (object) array( + 'timestamp' => strtotime( 'next Tuesday 00:00' ), + 'interval' => DAY_IN_SECONDS, + ), + sprintf( 'Daily at %s.', gmdate( get_option( 'time_format' ), strtotime( 'next Tuesday 8:00' ) ) ), + ), + array( + (object) array( + 'timestamp' => strtotime( 'next Sunday 00:00' ), + 'interval' => WEEK_IN_SECONDS, + ), + sprintf( 'Sundays at %s.', gmdate( get_option( 'time_format' ), strtotime( 'next Sunday 8:00' ) ) ), + ), + ); + } + /** * Create a list of plugins to be deleted. * From eed6dfc7e3129c130885a1916e073b1231719550 Mon Sep 17 00:00:00 2001 From: Tim Broddin Date: Fri, 22 Mar 2024 14:42:39 +0100 Subject: [PATCH 18/18] Changelog and readme.txt edits. (#36529) --- projects/packages/connection/CHANGELOG.md | 5 +++++ .../connection/changelog/add-a4a-plugin-skeleton | 4 ---- .../packages/connection/src/class-package-version.php | 2 +- projects/packages/jetpack-mu-wpcom/CHANGELOG.md | 10 ++++++++++ .../jetpack-mu-wpcom/changelog/add-verbum-settings | 4 ---- .../fix-start-page-options-modal-for-new-post | 4 ---- .../changelog/untangle-launchpad-newsletter | 4 ---- .../changelog/update-gutenberg-verbum-all-users | 4 ---- projects/packages/jetpack-mu-wpcom/package.json | 2 +- .../jetpack-mu-wpcom/src/class-jetpack-mu-wpcom.php | 2 +- projects/packages/scheduled-updates/CHANGELOG.md | 6 ++++++ .../scheduled-updates/changelog/fix-day-of-week | 4 ---- .../changelog/fix-plugin-update-mgr-edit-status | 4 ---- .../scheduled-updates/src/class-scheduled-updates.php | 2 +- projects/packages/status/CHANGELOG.md | 5 +++++ .../changelog/add-a4a-source-to-jetpack-connect-url | 4 ---- projects/plugins/mu-wpcom-plugin/CHANGELOG.md | 4 ++++ .../mu-wpcom-plugin/changelog/add-verbum-settings | 5 ----- projects/plugins/mu-wpcom-plugin/composer.json | 2 +- projects/plugins/mu-wpcom-plugin/mu-wpcom-plugin.php | 2 +- projects/plugins/mu-wpcom-plugin/package.json | 2 +- 21 files changed, 37 insertions(+), 44 deletions(-) delete mode 100644 projects/packages/connection/changelog/add-a4a-plugin-skeleton delete mode 100644 projects/packages/jetpack-mu-wpcom/changelog/add-verbum-settings delete mode 100644 projects/packages/jetpack-mu-wpcom/changelog/fix-start-page-options-modal-for-new-post delete mode 100644 projects/packages/jetpack-mu-wpcom/changelog/untangle-launchpad-newsletter delete mode 100644 projects/packages/jetpack-mu-wpcom/changelog/update-gutenberg-verbum-all-users delete mode 100644 projects/packages/scheduled-updates/changelog/fix-day-of-week delete mode 100644 projects/packages/scheduled-updates/changelog/fix-plugin-update-mgr-edit-status delete mode 100644 projects/packages/status/changelog/add-a4a-source-to-jetpack-connect-url delete mode 100644 projects/plugins/mu-wpcom-plugin/changelog/add-verbum-settings diff --git a/projects/packages/connection/CHANGELOG.md b/projects/packages/connection/CHANGELOG.md index 0cfb80c61aae8..fad1a457194a5 100644 --- a/projects/packages/connection/CHANGELOG.md +++ b/projects/packages/connection/CHANGELOG.md @@ -5,6 +5,10 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [2.6.1] - 2024-03-22 +### Changed +- yUpdate Phan config. [#36353] + ## [2.6.0] - 2024-03-20 ### Added - Add the 'remote_connect' REST endpoint. [#36329] @@ -996,6 +1000,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Separate the connection library into its own package. +[2.6.1]: https://github.com/Automattic/jetpack-connection/compare/v2.6.0...v2.6.1 [2.6.0]: https://github.com/Automattic/jetpack-connection/compare/v2.5.0...v2.6.0 [2.5.0]: https://github.com/Automattic/jetpack-connection/compare/v2.4.1...v2.5.0 [2.4.1]: https://github.com/Automattic/jetpack-connection/compare/v2.4.0...v2.4.1 diff --git a/projects/packages/connection/changelog/add-a4a-plugin-skeleton b/projects/packages/connection/changelog/add-a4a-plugin-skeleton deleted file mode 100644 index ac545b7b59239..0000000000000 --- a/projects/packages/connection/changelog/add-a4a-plugin-skeleton +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: changed - -yUpdate Phan config. diff --git a/projects/packages/connection/src/class-package-version.php b/projects/packages/connection/src/class-package-version.php index 3a40946b92c0b..7a767c6775e0f 100644 --- a/projects/packages/connection/src/class-package-version.php +++ b/projects/packages/connection/src/class-package-version.php @@ -12,7 +12,7 @@ */ class Package_Version { - const PACKAGE_VERSION = '2.6.1-alpha'; + const PACKAGE_VERSION = '2.6.1'; const PACKAGE_SLUG = 'connection'; diff --git a/projects/packages/jetpack-mu-wpcom/CHANGELOG.md b/projects/packages/jetpack-mu-wpcom/CHANGELOG.md index b4aeee286c12b..a728333625d2e 100644 --- a/projects/packages/jetpack-mu-wpcom/CHANGELOG.md +++ b/projects/packages/jetpack-mu-wpcom/CHANGELOG.md @@ -5,6 +5,15 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [5.19.0] - 2024-03-22 +### Changed +- Added additional settings for commenting on simple sites [#36367] +- Releasing Gutenberg to all Verbum users. [#36476] + +### Fixed +- Block Patterns: The modal of the starter patterns isn't shown when you're creating a new post [#36516] +- Untangle: update launchpad links for newsletter setting to go to Jetpack's [#36495] + ## [5.18.0] - 2024-03-20 ### Changed - The GitHub deployments feature check has been removed. [#36383] @@ -666,6 +675,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Testing initial package release. +[5.19.0]: https://github.com/Automattic/jetpack-mu-wpcom/compare/v5.18.0...v5.19.0 [5.18.0]: https://github.com/Automattic/jetpack-mu-wpcom/compare/v5.17.0...v5.18.0 [5.17.0]: https://github.com/Automattic/jetpack-mu-wpcom/compare/v5.16.1...v5.17.0 [5.16.1]: https://github.com/Automattic/jetpack-mu-wpcom/compare/v5.16.0...v5.16.1 diff --git a/projects/packages/jetpack-mu-wpcom/changelog/add-verbum-settings b/projects/packages/jetpack-mu-wpcom/changelog/add-verbum-settings deleted file mode 100644 index c4bdd7ec44632..0000000000000 --- a/projects/packages/jetpack-mu-wpcom/changelog/add-verbum-settings +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: changed - -Added additional settings for commenting on simple sites diff --git a/projects/packages/jetpack-mu-wpcom/changelog/fix-start-page-options-modal-for-new-post b/projects/packages/jetpack-mu-wpcom/changelog/fix-start-page-options-modal-for-new-post deleted file mode 100644 index 295f1c4e6792a..0000000000000 --- a/projects/packages/jetpack-mu-wpcom/changelog/fix-start-page-options-modal-for-new-post +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: fixed - -Block Patterns: The modal of the starter patterns isn't shown when you're creating a new post diff --git a/projects/packages/jetpack-mu-wpcom/changelog/untangle-launchpad-newsletter b/projects/packages/jetpack-mu-wpcom/changelog/untangle-launchpad-newsletter deleted file mode 100644 index b612f4cb870b6..0000000000000 --- a/projects/packages/jetpack-mu-wpcom/changelog/untangle-launchpad-newsletter +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: fixed - -Untangle: update launchpad links for newsletter setting to go to Jetpack's diff --git a/projects/packages/jetpack-mu-wpcom/changelog/update-gutenberg-verbum-all-users b/projects/packages/jetpack-mu-wpcom/changelog/update-gutenberg-verbum-all-users deleted file mode 100644 index 477f71982f911..0000000000000 --- a/projects/packages/jetpack-mu-wpcom/changelog/update-gutenberg-verbum-all-users +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: changed - -Releasing Gutenberg to all Verbum users. diff --git a/projects/packages/jetpack-mu-wpcom/package.json b/projects/packages/jetpack-mu-wpcom/package.json index 0c0a0107df360..22374f6f53849 100644 --- a/projects/packages/jetpack-mu-wpcom/package.json +++ b/projects/packages/jetpack-mu-wpcom/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "@automattic/jetpack-mu-wpcom", - "version": "5.19.0-alpha", + "version": "5.19.0", "description": "Enhances your site with features powered by WordPress.com", "homepage": "https://github.com/Automattic/jetpack/tree/HEAD/projects/packages/jetpack-mu-wpcom/#readme", "bugs": { diff --git a/projects/packages/jetpack-mu-wpcom/src/class-jetpack-mu-wpcom.php b/projects/packages/jetpack-mu-wpcom/src/class-jetpack-mu-wpcom.php index 162f9b51be409..3dc557176d723 100644 --- a/projects/packages/jetpack-mu-wpcom/src/class-jetpack-mu-wpcom.php +++ b/projects/packages/jetpack-mu-wpcom/src/class-jetpack-mu-wpcom.php @@ -13,7 +13,7 @@ * Jetpack_Mu_Wpcom main class. */ class Jetpack_Mu_Wpcom { - const PACKAGE_VERSION = '5.19.0-alpha'; + const PACKAGE_VERSION = '5.19.0'; const PKG_DIR = __DIR__ . '/../'; const BASE_DIR = __DIR__ . '/'; const BASE_FILE = __FILE__; diff --git a/projects/packages/scheduled-updates/CHANGELOG.md b/projects/packages/scheduled-updates/CHANGELOG.md index aca6428280e70..91c8ef8b5b77a 100644 --- a/projects/packages/scheduled-updates/CHANGELOG.md +++ b/projects/packages/scheduled-updates/CHANGELOG.md @@ -5,6 +5,11 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.5.1] - 2024-03-22 +### Fixed +- Fixed a bug where the weekday index was not properly accounted for in list of weekdays. [#36524] +- Transfer status when editing a schedule. [#36521] + ## [0.5.0] - 2024-03-20 ### Added - Add a new plugin deletion hook that remove the plugin from the scheduled updates. [#36458] @@ -81,6 +86,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Generate initial package for Scheduled Updates [#35796] +[0.5.1]: https://github.com/Automattic/scheduled-updates/compare/v0.5.0...v0.5.1 [0.5.0]: https://github.com/Automattic/scheduled-updates/compare/v0.4.1...v0.5.0 [0.4.1]: https://github.com/Automattic/scheduled-updates/compare/v0.4.0...v0.4.1 [0.4.0]: https://github.com/Automattic/scheduled-updates/compare/v0.3.4...v0.4.0 diff --git a/projects/packages/scheduled-updates/changelog/fix-day-of-week b/projects/packages/scheduled-updates/changelog/fix-day-of-week deleted file mode 100644 index 7b15b591fb4db..0000000000000 --- a/projects/packages/scheduled-updates/changelog/fix-day-of-week +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: fixed - -Fixed a bug where the weekday index was not properly accounted for in list of weekdays. diff --git a/projects/packages/scheduled-updates/changelog/fix-plugin-update-mgr-edit-status b/projects/packages/scheduled-updates/changelog/fix-plugin-update-mgr-edit-status deleted file mode 100644 index a156a2e74fd89..0000000000000 --- a/projects/packages/scheduled-updates/changelog/fix-plugin-update-mgr-edit-status +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: fixed - -Transfer status when editing a schedule. diff --git a/projects/packages/scheduled-updates/src/class-scheduled-updates.php b/projects/packages/scheduled-updates/src/class-scheduled-updates.php index 8dd1076299bc6..9256db192e337 100644 --- a/projects/packages/scheduled-updates/src/class-scheduled-updates.php +++ b/projects/packages/scheduled-updates/src/class-scheduled-updates.php @@ -20,7 +20,7 @@ class Scheduled_Updates { * * @var string */ - const PACKAGE_VERSION = '0.5.1-alpha'; + const PACKAGE_VERSION = '0.5.1'; /** * The cron event hook for the scheduled plugins update. * diff --git a/projects/packages/status/CHANGELOG.md b/projects/packages/status/CHANGELOG.md index 2f38f96192867..19d01b54aaa4c 100644 --- a/projects/packages/status/CHANGELOG.md +++ b/projects/packages/status/CHANGELOG.md @@ -5,6 +5,10 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [2.2.0] - 2024-03-22 +### Added +- Add support for A8C for Agencies source parameter. [#36491] + ## [2.1.3] - 2024-03-20 ### Changed - Internal updates. @@ -318,6 +322,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Packages: Introduce a status package +[2.2.0]: https://github.com/Automattic/jetpack-status/compare/v2.1.3...v2.2.0 [2.1.3]: https://github.com/Automattic/jetpack-status/compare/v2.1.2...v2.1.3 [2.1.2]: https://github.com/Automattic/jetpack-status/compare/v2.1.1...v2.1.2 [2.1.1]: https://github.com/Automattic/jetpack-status/compare/v2.1.0...v2.1.1 diff --git a/projects/packages/status/changelog/add-a4a-source-to-jetpack-connect-url b/projects/packages/status/changelog/add-a4a-source-to-jetpack-connect-url deleted file mode 100644 index d04dea953414a..0000000000000 --- a/projects/packages/status/changelog/add-a4a-source-to-jetpack-connect-url +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: added - -Add support for A8C for Agencies source parameter. diff --git a/projects/plugins/mu-wpcom-plugin/CHANGELOG.md b/projects/plugins/mu-wpcom-plugin/CHANGELOG.md index abc17aabd1e2e..6adfe6fed9083 100644 --- a/projects/plugins/mu-wpcom-plugin/CHANGELOG.md +++ b/projects/plugins/mu-wpcom-plugin/CHANGELOG.md @@ -5,6 +5,10 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## 2.1.8 - 2024-03-22 +### Changed +- Internal updates. + ## 2.1.7 - 2024-03-20 ### Changed - Comment: Updated composer.lock. [#36458] diff --git a/projects/plugins/mu-wpcom-plugin/changelog/add-verbum-settings b/projects/plugins/mu-wpcom-plugin/changelog/add-verbum-settings deleted file mode 100644 index 9aa70e3ec1f75..0000000000000 --- a/projects/plugins/mu-wpcom-plugin/changelog/add-verbum-settings +++ /dev/null @@ -1,5 +0,0 @@ -Significance: patch -Type: changed -Comment: Updated composer.lock. - - diff --git a/projects/plugins/mu-wpcom-plugin/composer.json b/projects/plugins/mu-wpcom-plugin/composer.json index d99de8c1093b0..dac4422df7a7e 100644 --- a/projects/plugins/mu-wpcom-plugin/composer.json +++ b/projects/plugins/mu-wpcom-plugin/composer.json @@ -46,6 +46,6 @@ ] }, "config": { - "autoloader-suffix": "d9d132a783958a00a2c7cccff60ca42d_jetpack_mu_wpcom_pluginⓥ2_1_8_alpha" + "autoloader-suffix": "d9d132a783958a00a2c7cccff60ca42d_jetpack_mu_wpcom_pluginⓥ2_1_8" } } diff --git a/projects/plugins/mu-wpcom-plugin/mu-wpcom-plugin.php b/projects/plugins/mu-wpcom-plugin/mu-wpcom-plugin.php index 48e4f401473d5..a8d54ad9633a6 100644 --- a/projects/plugins/mu-wpcom-plugin/mu-wpcom-plugin.php +++ b/projects/plugins/mu-wpcom-plugin/mu-wpcom-plugin.php @@ -3,7 +3,7 @@ * * Plugin Name: WordPress.com Features * Description: Test plugin for the jetpack-mu-wpcom package - * Version: 2.1.8-alpha + * Version: 2.1.8 * Author: Automattic * License: GPLv2 or later * Text Domain: jetpack-mu-wpcom-plugin diff --git a/projects/plugins/mu-wpcom-plugin/package.json b/projects/plugins/mu-wpcom-plugin/package.json index 0c0433b4f181e..d26a03d7bf6d8 100644 --- a/projects/plugins/mu-wpcom-plugin/package.json +++ b/projects/plugins/mu-wpcom-plugin/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "@automattic/jetpack-mu-wpcom-plugin", - "version": "2.1.8-alpha", + "version": "2.1.8", "description": "Test plugin for the jetpack-mu-wpcom package", "homepage": "https://jetpack.com", "bugs": {