diff options
Diffstat (limited to 'plugins/jetpack/modules/post-by-email/class-jetpack-post-by-email.php')
-rw-r--r-- | plugins/jetpack/modules/post-by-email/class-jetpack-post-by-email.php | 251 |
1 files changed, 251 insertions, 0 deletions
diff --git a/plugins/jetpack/modules/post-by-email/class-jetpack-post-by-email.php b/plugins/jetpack/modules/post-by-email/class-jetpack-post-by-email.php new file mode 100644 index 00000000..25192939 --- /dev/null +++ b/plugins/jetpack/modules/post-by-email/class-jetpack-post-by-email.php @@ -0,0 +1,251 @@ +<?php +/** + * Class Jetpack_Post_By_Email + * + * @package automattic/jetpack + */ + +use Automattic\Jetpack\Connection\Tokens; +use Automattic\Jetpack\Redirect; + +/** + * Class Jetpack_Post_By_Email + */ +class Jetpack_Post_By_Email { + /** + * Initialize PBE. + * + * @return Jetpack_Post_By_Email + */ + public static function init() { + static $instance = null; + + if ( ! $instance ) { + $instance = new Jetpack_Post_By_Email(); + } + + return $instance; + } + + /** + * Singleton + */ + private function __construct() { + add_action( 'init', array( $this, 'action_init' ) ); + } + + /** + * Adds hooks for PBE. + */ + public function action_init() { + if ( ! current_user_can( 'edit_posts' ) ) { + return; + } + + add_action( 'profile_personal_options', array( $this, 'user_profile' ) ); + add_action( 'admin_print_scripts-profile.php', array( $this, 'profile_scripts' ) ); + + add_action( 'wp_ajax_jetpack_post_by_email_enable', array( $this, 'create_post_by_email_address' ) ); + add_action( 'wp_ajax_jetpack_post_by_email_regenerate', array( $this, 'regenerate_post_by_email_address' ) ); + add_action( 'wp_ajax_jetpack_post_by_email_disable', array( $this, 'delete_post_by_email_address' ) ); + } + + /** + * Enqueues scripts for user profile page. + */ + public function profile_scripts() { + wp_enqueue_script( 'post-by-email', plugins_url( 'post-by-email.js', __FILE__ ), array( 'jquery' ), JETPACK__VERSION, true ); + wp_localize_script( + 'post-by-email', + 'pbeVars', + array( + 'rest_nonce' => wp_create_nonce( 'wp_rest' ), + ) + ); + wp_enqueue_style( 'post-by-email', plugins_url( 'post-by-email.css', __FILE__ ), array(), JETPACK__VERSION ); + wp_style_add_data( 'post-by-email', 'jetpack-inline', true ); + } + + /** + * Check if the user is connected. + * + * @return bool True if connected. False if not. + */ + public function check_user_connection() { + $user_token = ( new Tokens() )->get_access_token( get_current_user_id() ); + + $is_user_connected = $user_token && ! is_wp_error( $user_token ); + + // If the user is already connected via Jetpack, then we're good. + if ( $is_user_connected ) { + return true; + } + + return false; + } + + /** + * Adds field to user profile page. + */ + public function user_profile() { + $blog_name = get_bloginfo( 'blogname' ); + if ( empty( $blog_name ) ) { + $blog_name = home_url( '/' ); + } + + ?> + <div id="post-by-email" class="jetpack-targetable"> + <h3><?php esc_html_e( 'Post by Email', 'jetpack' ); ?></h3> + <table class="form-table"> + <tr> + <th scope="row"><?php esc_html_e( 'Email Address', 'jetpack' ); ?><span id="jp-pbe-spinner" class="spinner"></span></th> + <td> + <div id="jp-pbe-error" class="jetpack-inline-error"></div> + <?php + + if ( $this->check_user_connection() ) { + $email = $this->get_post_by_email_address(); + + $enable_button_style = empty( $email ) ? '' : 'display: none;'; + $info_style = empty( $email ) ? 'display: none;' : ''; + ?> + + <input type="button" name="jp-pbe-enable" id="jp-pbe-enable" class="button" value="<?php esc_attr_e( 'Enable Post By Email', 'jetpack' ); ?>" style="<?php echo esc_attr( $enable_button_style ); ?>" /> + <div id="jp-pbe-info" style="<?php echo esc_attr( $info_style ); ?>"> + <p id="jp-pbe-email-wrapper"> + <input type="text" id="jp-pbe-email" value="<?php echo esc_attr( $email ); ?>" readonly="readonly" class="regular-text" /> + <span class="description"><a target="_blank" rel="noopener noreferrer" href="<?php echo esc_url( Redirect::get_url( 'jetpack-support-post-by-email' ) ); ?>"><?php esc_html_e( 'More information', 'jetpack' ); ?></a></span> + </p> + <p> + <input type="button" name="jp-pbe-regenerate" id="jp-pbe-regenerate" class="button" value="<?php esc_attr_e( 'Regenerate Address', 'jetpack' ); ?> " /> + <input type="button" name="jp-pbe-disable" id="jp-pbe-disable" class="button" value="<?php esc_attr_e( 'Disable Post By Email', 'jetpack' ); ?> " /> + </p> + </div> + <?php + } else { + $jetpack = Jetpack::init(); + ?> + + <p class="jetpack-inline-message"> + <?php + printf( + /* translators: Placeholder is the site's name from WordPress settings. */ + esc_html( wptexturize( __( 'To use Post By Email, you need to link your %s account to your WordPress.com account.', 'jetpack' ) ) ), + '<strong>' . esc_html( $blog_name ) . '</strong>' + ); + ?> + <br /> + <?php echo esc_html( wptexturize( __( "If you don't have a WordPress.com account yet, you can sign up for free in just a few seconds.", 'jetpack' ) ) ); ?> + </p> + <p> + <a href="<?php echo esc_url( $jetpack->build_connect_url( false, get_edit_profile_url( get_current_user_id() ) . '#post-by-email', 'unlinked-user-pbe' ) ); ?>" class="button button-connector" id="wpcom-connect"><?php esc_html_e( 'Link account with WordPress.com', 'jetpack' ); ?></a> + </p> + <?php + } + ?> + </td> + </tr> + </table> + </div> + <?php + } + + /** + * XMLRPC Query to WP.com for PBE e-mail address for user. + * + * @return string|null PBE E-mail Address or null on error. + */ + public function get_post_by_email_address() { + $xml = $this->init_rest_connection(); + + $xml->query( 'jetpack.getPostByEmailAddress' ); + + if ( $xml->isError() ) { + return null; + } + + $response = $xml->getResponse(); + if ( empty( $response ) ) { + return null; + } + + return $response; + } + + /** + * Process the REST API request to modify the "Post by Email" settings. + * + * @param string $action Allowed values: 'create', 'regenerate', 'delete'. + * + * @return array|false + */ + public function process_api_request( $action ) { + $endpoint = null; + $error_message = esc_html__( 'Please try again later.', 'jetpack' ); + $result = false; + + switch ( $action ) { + case 'create': + $endpoint = 'jetpack.createPostByEmailAddress'; + $error_message = esc_html__( 'Unable to create the Post by Email address. Please try again later.', 'jetpack' ); + break; + case 'regenerate': + $endpoint = 'jetpack.regeneratePostByEmailAddress'; + $error_message = esc_html__( 'Unable to regenerate the Post by Email address. Please try again later.', 'jetpack' ); + break; + case 'delete': + $endpoint = 'jetpack.deletePostByEmailAddress'; + $error_message = esc_html__( 'Unable to delete the Post by Email address. Please try again later.', 'jetpack' ); + break; + } + + if ( $endpoint ) { + $result = $this->process_rest_proxy_request( $endpoint, $error_message ); + } + + return $result; + } + + /** + * Calls WPCOM through authenticated request to create, regenerate or delete the Post by Email address. + * + * @since 4.3.0 + * + * @param string $endpoint Process to call on WPCOM to create, regenerate or delete the Post by Email address. + * @param string $error Error message to return. + * + * @return array + */ + private function process_rest_proxy_request( $endpoint, $error ) { + if ( ! current_user_can( 'edit_posts' ) ) { + return array( 'message' => $error ); + } + + $xml = $this->init_rest_connection(); + + $xml->query( $endpoint ); + + if ( $xml->isError() ) { + return array( 'message' => $error ); + } + + $response = $xml->getResponse(); + if ( empty( $response ) ) { + return array( 'message' => $error ); + } + + // Used only in Jetpack_Core_Json_Api_Endpoints::get_remote_value. + update_option( 'post_by_email_address' . get_current_user_id(), $response ); + + return $response; + } + + /** + * Initialize the IXR client + * + * @return Jetpack_IXR_Client + */ + private function init_rest_connection() { + return new Jetpack_IXR_Client( array( 'user_id' => get_current_user_id() ) ); + } +} |