PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 16.3
Jetpack – WP Security, Backup, Speed, & Growth v16.3
16.3 16.3-beta 16.3-a.5 16.3-a.7 16.3-a.3 16.3-a.1 16.2 16.2-beta 12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 All 508 releases
← All changes | modules/post-by-email/class-jetpack-post-by-email.php +256 -0 16.2-beta → 16.3 View file →
@@ -1,0 +1,256 @@
1 +<?php
2 +/**
3 + * Class Jetpack_Post_By_Email
4 + *
5 + * @package automattic/jetpack
6 + */
7 +
8 +use Automattic\Jetpack\Connection\Tokens;
9 +use Automattic\Jetpack\Redirect;
10 +
11 +/**
12 + * Class Jetpack_Post_By_Email
13 + */
14 +class Jetpack_Post_By_Email {
15 + /**
16 + * Initialize PBE.
17 + *
18 + * @return Jetpack_Post_By_Email
19 + */
20 + public static function init() {
21 + static $instance = null;
22 +
23 + if ( ! $instance ) {
24 + $instance = new Jetpack_Post_By_Email();
25 + }
26 +
27 + return $instance;
28 + }
29 +
30 + /**
31 + * Singleton
32 + */
33 + private function __construct() {
34 + add_action( 'init', array( $this, 'action_init' ) );
35 + }
36 +
37 + /**
38 + * Adds hooks for PBE.
39 + */
40 + public function action_init() {
41 + if ( ! current_user_can( 'edit_posts' ) ) {
42 + return;
43 + }
44 +
45 + add_action( 'profile_personal_options', array( $this, 'user_profile' ) );
46 + add_action( 'admin_print_scripts-profile.php', array( $this, 'profile_scripts' ) );
47 +
48 + add_action( 'wp_ajax_jetpack_post_by_email_enable', array( $this, 'create_post_by_email_address' ) );
49 + add_action( 'wp_ajax_jetpack_post_by_email_regenerate', array( $this, 'regenerate_post_by_email_address' ) );
50 + add_action( 'wp_ajax_jetpack_post_by_email_disable', array( $this, 'delete_post_by_email_address' ) );
51 + }
52 +
53 + /**
54 + * Enqueues scripts for user profile page.
55 + */
56 + public function profile_scripts() {
57 + wp_enqueue_script( 'post-by-email', plugins_url( 'post-by-email.js', __FILE__ ), array( 'jquery' ), JETPACK__VERSION, true );
58 + wp_localize_script(
59 + 'post-by-email',
60 + 'pbeVars',
61 + array(
62 + 'rest_nonce' => wp_create_nonce( 'wp_rest' ),
63 + )
64 + );
65 + wp_enqueue_style( 'post-by-email', plugins_url( 'post-by-email.css', __FILE__ ), array(), JETPACK__VERSION );
66 + // Inline styles. @see wp_maybe_inline_styles()
67 + if ( is_rtl() ) {
68 + wp_style_add_data( 'post-by-email', 'path', plugin_dir_path( __FILE__ ) . 'post-by-email-rtl.min.css' );
69 + } else {
70 + wp_style_add_data( 'post-by-email', 'path', plugin_dir_path( __FILE__ ) . 'post-by-email.min.css' );
71 + }
72 + }
73 +
74 + /**
75 + * Check if the user is connected.
76 + *
77 + * @return bool True if connected. False if not.
78 + */
79 + public function check_user_connection() {
80 + $user_token = ( new Tokens() )->get_access_token( get_current_user_id() );
81 +
82 + $is_user_connected = $user_token && ! is_wp_error( $user_token );
83 +
84 + // If the user is already connected via Jetpack, then we're good.
85 + if ( $is_user_connected ) {
86 + return true;
87 + }
88 +
89 + return false;
90 + }
91 +
92 + /**
93 + * Adds field to user profile page.
94 + */
95 + public function user_profile() {
96 + $blog_name = get_bloginfo( 'blogname' );
97 + if ( empty( $blog_name ) ) {
98 + $blog_name = home_url( '/' );
99 + }
100 +
101 + ?>
102 + <div id="post-by-email" class="jetpack-targetable">
103 + <h3><?php esc_html_e( 'Post by Email', 'jetpack' ); ?></h3>
104 + <table class="form-table">
105 + <tr>
106 + <th scope="row"><?php esc_html_e( 'Email Address', 'jetpack' ); ?><span id="jp-pbe-spinner" class="spinner"></span></th>
107 + <td>
108 + <div id="jp-pbe-error" class="jetpack-inline-error"></div>
109 + <?php
110 +
111 + if ( $this->check_user_connection() ) {
112 + $email = $this->get_post_by_email_address();
113 +
114 + $enable_button_style = empty( $email ) ? '' : 'display: none;';
115 + $info_style = empty( $email ) ? 'display: none;' : '';
116 + ?>
117 +
118 + <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 ); ?>" />
119 + <div id="jp-pbe-info" style="<?php echo esc_attr( $info_style ); ?>">
120 + <p id="jp-pbe-email-wrapper">
121 + <input type="text" id="jp-pbe-email" value="<?php echo esc_attr( $email ); ?>" readonly="readonly" class="regular-text" />
122 + <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>
123 + </p>
124 + <p>
125 + <input type="button" name="jp-pbe-regenerate" id="jp-pbe-regenerate" class="button" value="<?php esc_attr_e( 'Regenerate Address', 'jetpack' ); ?> " />
126 + <input type="button" name="jp-pbe-disable" id="jp-pbe-disable" class="button" value="<?php esc_attr_e( 'Disable Post By Email', 'jetpack' ); ?> " />
127 + </p>
128 + </div>
129 + <?php
130 + } else {
131 + $jetpack = Jetpack::init();
132 + ?>
133 +
134 + <p class="jetpack-inline-message">
135 + <?php
136 + printf(
137 + /* translators: Placeholder is the site's name from WordPress settings. */
138 + esc_html( wptexturize( __( 'To use Post By Email, you need to link your %s account to your WordPress.com account.', 'jetpack' ) ) ),
139 + '<strong>' . esc_html( $blog_name ) . '</strong>'
140 + );
141 + ?>
142 + <br />
143 + <?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' ) ) ); ?>
144 + </p>
145 + <p>
146 + <a href="<?php echo esc_url( $jetpack->build_connect_url( true, 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>
147 + </p>
148 + <?php
149 + }
150 + ?>
151 + </td>
152 + </tr>
153 + </table>
154 + </div>
155 + <?php
156 + }
157 +
158 + /**
159 + * XMLRPC Query to WP.com for PBE e-mail address for user.
160 + *
161 + * @return string|null PBE E-mail Address or null on error.
162 + */
163 + public function get_post_by_email_address() {
164 + $xml = $this->init_rest_connection();
165 +
166 + $xml->query( 'jetpack.getPostByEmailAddress' );
167 +
168 + if ( $xml->isError() ) {
169 + return null;
170 + }
171 +
172 + $response = $xml->getResponse();
173 + if ( empty( $response ) ) {
174 + return null;
175 + }
176 +
177 + return $response;
178 + }
179 +
180 + /**
181 + * Process the REST API request to modify the "Post by Email" settings.
182 + *
183 + * @param string $action Allowed values: 'create', 'regenerate', 'delete'.
184 + *
185 + * @return array|false
186 + */
187 + public function process_api_request( $action ) {
188 + $endpoint = null;
189 + $error_message = esc_html__( 'Please try again later.', 'jetpack' );
190 + $result = false;
191 +
192 + switch ( $action ) {
193 + case 'create':
194 + $endpoint = 'jetpack.createPostByEmailAddress';
195 + $error_message = esc_html__( 'Unable to create the Post by Email address. Please try again later.', 'jetpack' );
196 + break;
197 + case 'regenerate':
198 + $endpoint = 'jetpack.regeneratePostByEmailAddress';
199 + $error_message = esc_html__( 'Unable to regenerate the Post by Email address. Please try again later.', 'jetpack' );
200 + break;
201 + case 'delete':
202 + $endpoint = 'jetpack.deletePostByEmailAddress';
203 + $error_message = esc_html__( 'Unable to delete the Post by Email address. Please try again later.', 'jetpack' );
204 + break;
205 + }
206 +
207 + if ( $endpoint ) {
208 + $result = $this->process_rest_proxy_request( $endpoint, $error_message );
209 + }
210 +
211 + return $result;
212 + }
213 +
214 + /**
215 + * Calls WPCOM through authenticated request to create, regenerate or delete the Post by Email address.
216 + *
217 + * @since 4.3.0
218 + *
219 + * @param string $endpoint Process to call on WPCOM to create, regenerate or delete the Post by Email address.
220 + * @param string $error Error message to return.
221 + *
222 + * @return array
223 + */
224 + private function process_rest_proxy_request( $endpoint, $error ) {
225 + if ( ! current_user_can( 'edit_posts' ) ) {
226 + return array( 'message' => $error );
227 + }
228 +
229 + $xml = $this->init_rest_connection();
230 +
231 + $xml->query( $endpoint );
232 +
233 + if ( $xml->isError() ) {
234 + return array( 'message' => $error );
235 + }
236 +
237 + $response = $xml->getResponse();
238 + if ( empty( $response ) ) {
239 + return array( 'message' => $error );
240 + }
241 +
242 + // Used only in Jetpack_Core_Json_Api_Endpoints::get_remote_value.
243 + update_option( 'post_by_email_address' . get_current_user_id(), $response );
244 +
245 + return $response;
246 + }
247 +
248 + /**
249 + * Initialize the IXR client
250 + *
251 + * @return Jetpack_IXR_Client
252 + */
253 + private function init_rest_connection() {
254 + return new Jetpack_IXR_Client( array( 'user_id' => get_current_user_id() ) );
255 + }
256 +}