PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 8.9.4
Jetpack – WP Security, Backup, Speed, & Growth v8.9.4
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 13.7.2 13.8.3 13.9.2 14.0.1 14.1.1 14.2.2 14.3.1 14.4.2 All 500 releases
← All changes | modules/sharedaddy/sharedaddy.php +166 -106 13.9.28.9.4 View file →
@@ -1,20 +1,116 @@
1 1 <?php
2 -/**
3 - * Jetpack's Sharing feature, nee Sharedaddy.
4 - * The most super duper sharing tool on the interwebs.
5 - *
6 - * @package automattic/jetpack
7 - */
2 +/*
3 +Plugin Name: Sharedaddy
4 +Description: The most super duper sharing tool on the interwebs.
5 +Version: 0.3.1
6 +Author: Automattic, Inc.
7 +Author URI: https://automattic.com/
8 +Plugin URI: https://en.blog.wordpress.com/2010/08/24/more-ways-to-share/
9 +*/
8 10
9 -// Set up Sharing in wp-admin.
10 -require_once plugin_dir_path( __FILE__ ) . 'sharing.php';
11 +require_once plugin_dir_path( __FILE__ ).'sharing.php';
11 12
12 -/**
13 - * Add a meta box to the post editing screen for sharing.
14 - *
15 - * @return void
16 - */
13 +function sharing_email_send_post( $data ) {
14 +
15 + $content = sharing_email_send_post_content( $data );
16 + // Borrowed from wp_mail();
17 + $sitename = strtolower( $_SERVER['SERVER_NAME'] );
18 + if ( substr( $sitename, 0, 4 ) == 'www.' ) {
19 + $sitename = substr( $sitename, 4 );
20 + }
21 +
22 + /** This filter is documented in core/src/wp-includes/pluggable.php */
23 + $from_email = apply_filters( 'wp_mail_from', 'wordpress@' . $sitename );
24 +
25 + if ( ! empty( $data['name'] ) ) {
26 + $s_name = (string) $data['name'];
27 + $name_needs_encoding_regex =
28 + '/[' .
29 + // SpamAssasin's list of characters which "need MIME" encoding
30 + '\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\xff' .
31 + // Our list of "unsafe" characters
32 + '<\r\n' .
33 + ']/';
34 +
35 + $needs_encoding =
36 + // If it contains any blocked chars.
37 + preg_match( $name_needs_encoding_regex, $s_name ) ||
38 + // Or if we can't use `mb_convert_encoding`
39 + ! function_exists( 'mb_convert_encoding' ) ||
40 + // Or if it's not already ASCII
41 + mb_convert_encoding( $data['name'], 'ASCII' ) !== $s_name;
42 +
43 + if ( $needs_encoding ) {
44 + $data['name'] = sprintf( '=?UTF-8?B?%s?=', base64_encode( $data['name'] ) );
45 + }
46 + }
47 +
48 + $headers[] = sprintf( 'From: %1$s <%2$s>', $data['name'], $from_email );
49 + $headers[] = sprintf( 'Reply-To: %1$s <%2$s>', $data['name'], $data['source'] );
50 +
51 + // Make sure to pass the title through the normal sharing filters.
52 + $title = $data['sharing_source']->get_share_title( $data['post']->ID );
53 +
54 + /**
55 + * Filter the Sharing Email Send Post Subject.
56 + *
57 + * @module sharedaddy
58 + *
59 + * @since 5.8.0
60 + *
61 + * @param string $var Sharing Email Send Post Subject. Default is "Shared Post".
62 + */
63 + $subject = apply_filters( 'wp_sharing_email_send_post_subject', '[' . __( 'Shared Post', 'jetpack' ) . '] ' . $title );
64 +
65 + wp_mail( $data['target'], $subject, $content, $headers );
66 +}
67 +
68 +
69 +/* Checks for spam using akismet if available. */
70 +/* Return $data as it if email about to be send out is not spam. */
71 +function sharing_email_check_for_spam_via_akismet( $data ) {
72 +
73 + if ( ! Jetpack::is_akismet_active() )
74 + return $data;
75 +
76 + // Prepare the body_request for akismet
77 + $body_request = array(
78 + 'blog' => get_option( 'home' ),
79 + 'permalink' => $data['sharing_source']->get_share_url( $data['post']->ID ),
80 + 'comment_type' => 'share',
81 + 'comment_author' => $data['name'],
82 + 'comment_author_email' => $data['source'],
83 + 'comment_content' => sharing_email_send_post_content( $data ),
84 + 'user_agent' => ( isset( $_SERVER['HTTP_USER_AGENT'] ) ? $_SERVER['HTTP_USER_AGENT'] : null ),
85 + );
86 +
87 + if ( method_exists( 'Akismet', 'http_post' ) ) {
88 + $body_request['user_ip'] = Akismet::get_ip_address();
89 + $response = Akismet::http_post( build_query( $body_request ), 'comment-check' );
90 + } else {
91 + global $akismet_api_host, $akismet_api_port;
92 + $body_request['user_ip'] = ( isset( $_SERVER['REMOTE_ADDR'] ) ? $_SERVER['REMOTE_ADDR'] : null );
93 + $response = akismet_http_post( build_query( $body_request ), $akismet_api_host, '/1.1/comment-check', $akismet_api_port );
94 + }
95 +
96 + // The Response is spam lets not send the email.
97 + if ( ! empty( $response ) && isset( $response[1] ) && 'true' == trim( $response[1] ) ) { // 'true' is spam
98 + return false; // don't send the email
99 + }
100 + return $data;
101 +}
102 +
103 +function sharing_email_send_post_content( $data ) {
104 + /* translators: included in email when post is shared via email. First item is sender's name. Second is sender's email address. */
105 + $content = sprintf( __( '%1$s (%2$s) thinks you may be interested in the following post:', 'jetpack' ), $data['name'], $data['source'] );
106 + $content .= "\n\n";
107 + // Make sure to pass the title and URL through the normal sharing filters.
108 + $content .= $data['sharing_source']->get_share_title( $data['post']->ID ) . "\n";
109 + $content .= $data['sharing_source']->get_share_url( $data['post']->ID ) . "\n";
110 + return $content;
111 +}
112 +
17 113 function sharing_add_meta_box() {
18 114 global $post;
19 115 if ( empty( $post ) ) { // If a current post is not defined, such as when editing a comment.
20 116 return;
@@ -45,21 +141,15 @@
45 141 * @param string $var Sharing Meta Box title. Default is "Sharing".
46 142 */
47 143 $title = apply_filters( 'sharing_meta_box_title', __( 'Sharing', 'jetpack' ) );
48 144 if ( $post->ID !== get_option( 'page_for_posts' ) ) {
49 - foreach ( $post_types as $post_type ) {
145 + foreach( $post_types as $post_type ) {
50 146 add_meta_box( 'sharing_meta', $title, 'sharing_meta_box_content', $post_type, 'side', 'default', array( '__back_compat_meta_box' => true ) );
51 147 }
52 148 }
53 149 }
54 150
55 -/**
56 - * Content of the meta box.
57 - *
58 - * @param WP_Post $post The post to share.
59 - *
60 - * @return void
61 - */
151 +
62 152 function sharing_meta_box_content( $post ) {
63 153 /**
64 154 * Fires before the sharing meta box content.
65 155 *
@@ -74,10 +164,10 @@
74 164 $disabled = get_post_meta( $post->ID, 'sharing_disabled', true ); ?>
75 165
76 166 <p>
77 167 <label for="enable_post_sharing">
78 - <input type="checkbox" name="enable_post_sharing" id="enable_post_sharing" value="1" <?php checked( ! $disabled ); ?>>
79 - <?php esc_html_e( 'Show sharing buttons.', 'jetpack' ); ?>
168 + <input type="checkbox" name="enable_post_sharing" id="enable_post_sharing" value="1" <?php checked( !$disabled ); ?>>
169 + <?php _e( 'Show sharing buttons.' , 'jetpack'); ?>
80 170 </label>
81 171 <input type="hidden" name="sharing_status_hidden" value="1" />
82 172 </p>
83 173
@@ -89,86 +179,49 @@
89 179 *
90 180 * @since 2.2.0
91 181 *
92 182 * @param WP_Post $post The post to share.
93 - */
183 + */
94 184 do_action( 'end_sharing_meta_box_content', $post );
95 185 }
96 186
97 -/**
98 - * Save new sharing status in post meta in the meta box.
99 - *
100 - * @param int $post_id Post ID.
101 - *
102 - * @return int
103 - */
104 187 function sharing_meta_box_save( $post_id ) {
105 - if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
188 + if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )
106 189 return $post_id;
107 - }
108 190
109 - if ( ! isset( $_POST['post_type'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Core takes care of the validation.
110 - return $post_id;
111 - }
112 -
113 - $post_type_object = get_post_type_object( sanitize_key( $_POST['post_type'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Core takes care of the validation.
114 -
115 - // Record sharing disable.
116 - if (
117 - $post_type_object->public
118 - && current_user_can( 'edit_post', $post_id )
119 - && isset( $_POST['sharing_status_hidden'] ) // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Core takes care of the validation.
120 - ) {
121 - if ( ! isset( $_POST['enable_post_sharing'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Core takes care of the validation.
122 - update_post_meta( $post_id, 'sharing_disabled', 1 );
123 - } else {
124 - delete_post_meta( $post_id, 'sharing_disabled' );
191 + // Record sharing disable
192 + if ( isset( $_POST['post_type'] ) && ( $post_type_object = get_post_type_object( $_POST['post_type'] ) ) && $post_type_object->public ) {
193 + if ( current_user_can( 'edit_post', $post_id ) ) {
194 + if ( isset( $_POST['sharing_status_hidden'] ) ) {
195 + if ( !isset( $_POST['enable_post_sharing'] ) ) {
196 + update_post_meta( $post_id, 'sharing_disabled', 1 );
197 + } else {
198 + delete_post_meta( $post_id, 'sharing_disabled' );
199 + }
200 + }
125 201 }
126 202 }
127 203
128 - return $post_id;
204 + return $post_id;
129 205 }
130 206
131 -/**
132 - * If Sharing is disabled, disable the meta box.
133 - *
134 - * @param bool $protected Whether the key is considered protected.
135 - * @param string $meta_key Metadata key.
136 - *
137 - * @return bool
138 - */
139 207 function sharing_meta_box_protected( $protected, $meta_key ) {
140 - if ( 'sharing_disabled' === $meta_key ) {
208 + if ( 'sharing_disabled' == $meta_key )
141 209 $protected = true;
142 - }
143 210
144 211 return $protected;
145 212 }
213 +
146 214 add_filter( 'is_protected_meta', 'sharing_meta_box_protected', 10, 2 );
147 215
148 -/**
149 - * Add link to sharing settings in the Plugins screen.
150 - *
151 - * @param array $links An array of plugin action links.
152 - *
153 - * @return array
154 - */
155 216 function sharing_plugin_settings( $links ) {
156 - $settings_link = '<a href="options-general.php?page=sharing.php">' . __( 'Settings', 'jetpack' ) . '</a>';
217 + $settings_link = '<a href="options-general.php?page=sharing.php">'.__( 'Settings', 'jetpack' ).'</a>';
157 218 array_unshift( $links, $settings_link );
158 219 return $links;
159 220 }
160 221
161 -/**
162 - * Add links to settings and support in the plugin row.
163 - *
164 - * @param array $links An array of the plugin's metadata, including the version, author, author URI, and plugin URI.
165 - * @param string $file Path to the plugin file relative to the plugins directory.
166 - *
167 - * @return array
168 - */
169 -function sharing_add_plugin_settings( $links, $file ) {
170 - if ( $file === basename( __DIR__ ) . '/' . basename( __FILE__ ) ) {
222 +function sharing_add_plugin_settings($links, $file) {
223 + if ( $file == basename( dirname( __FILE__ ) ).'/'.basename( __FILE__ ) ) {
171 224 $links[] = '<a href="options-general.php?page=sharing.php">' . __( 'Settings', 'jetpack' ) . '</a>';
172 225 $links[] = '<a href="https://support.wordpress.com/sharing/" rel="noopener noreferrer" target="_blank">' . __( 'Support', 'jetpack' ) . '</a>';
173 226 }
174 227
@@ -174,56 +227,63 @@
174 227
175 228 return $links;
176 229 }
177 230
178 -/**
179 - * Disable sharing on the frontend if disabled in the admin.
180 - *
181 - * @return void
182 - */
183 231 function sharing_init() {
184 232 if ( Jetpack_Options::get_option_and_ensure_autoload( 'sharedaddy_disable_resources', '0' ) ) {
185 - add_filter( 'sharing_js', '__return_false' );
233 + add_filter( 'sharing_js', 'sharing_disable_js' );
186 234 remove_action( 'wp_head', 'sharing_add_header', 1 );
187 235 }
188 236 }
189 237
190 -/**
191 - * Add settings to disable CSS and JS normally enqueued by our feature.
192 - *
193 - * @return void
194 - */
238 +function sharing_disable_js() {
239 + return false;
240 +}
241 +
195 242 function sharing_global_resources() {
196 243 $disable = get_option( 'sharedaddy_disable_resources' );
197 - ?>
244 +?>
198 245 <tr valign="top">
199 - <th scope="row"><label for="disable_css"><?php esc_html_e( 'Disable CSS and JS', 'jetpack' ); ?></label></th>
246 + <th scope="row"><label for="disable_css"><?php _e( 'Disable CSS and JS', 'jetpack' ); ?></label></th>
200 247 <td>
201 - <?php
202 - printf(
203 - '<input id="disable_css" type="checkbox" name="disable_resources"%1$s /> <small><em>%2$s</em></small>',
204 - ( 1 == $disable ) ? ' checked="checked"' : '', // phpcs:ignore Universal.Operators.StrictComparisons.LooseEqual
205 - esc_html__( 'Advanced. If this option is checked, you must include these files in your theme manually for the sharing links to work.', 'jetpack' )
206 - );
207 - ?>
248 + <input id="disable_css" type="checkbox" name="disable_resources" <?php if ( $disable == 1 ) echo ' checked="checked"'; ?>/> <small><em><?php _e( 'Advanced. If this option is checked, you must include these files in your theme manually for the sharing links to work.', 'jetpack' ); ?></em></small>
208 249 </td>
209 250 </tr>
210 - <?php
251 +<?php
211 252 }
212 253
213 -/**
214 - * Save settings to disable CSS and JS normally enqueued by our feature.
215 - *
216 - * @return void
217 - */
218 254 function sharing_global_resources_save() {
219 - update_option( 'sharedaddy_disable_resources', isset( $_POST['disable_resources'] ) ? 1 : 0 ); // phpcs:ignore WordPress.Security.NonceVerification.Missing -- nonce handling is handled for all elements at once.
255 + update_option( 'sharedaddy_disable_resources', isset( $_POST['disable_resources'] ) ? 1 : 0 );
220 256 }
221 257
258 +function sharing_email_dialog() {
259 + require_once plugin_dir_path( __FILE__ ) . 'recaptcha.php';
260 +
261 + $recaptcha = new Jetpack_ReCaptcha( RECAPTCHA_PUBLIC_KEY, RECAPTCHA_PRIVATE_KEY );
262 + echo $recaptcha->get_recaptcha_html(); // xss ok
263 +}
264 +
265 +function sharing_email_check( $true, $post, $data ) {
266 + require_once plugin_dir_path( __FILE__ ) . 'recaptcha.php';
267 +
268 + $recaptcha = new Jetpack_ReCaptcha( RECAPTCHA_PUBLIC_KEY, RECAPTCHA_PRIVATE_KEY );
269 + $response = ! empty( $_POST['g-recaptcha-response'] ) ? $_POST['g-recaptcha-response'] : '';
270 + $result = $recaptcha->verify( $response, $_SERVER['REMOTE_ADDR'] );
271 +
272 + return ( true === $result );
273 +}
274 +
222 275 add_action( 'init', 'sharing_init' );
223 276 add_action( 'add_meta_boxes', 'sharing_add_meta_box' );
224 277 add_action( 'save_post', 'sharing_meta_box_save' );
225 278 add_action( 'edit_attachment', 'sharing_meta_box_save' );
279 +add_action( 'sharing_email_send_post', 'sharing_email_send_post' );
280 +add_filter( 'sharing_email_can_send', 'sharing_email_check_for_spam_via_akismet' );
226 281 add_action( 'sharing_global_options', 'sharing_global_resources', 30 );
227 282 add_action( 'sharing_admin_update', 'sharing_global_resources_save' );
228 -add_action( 'plugin_action_links_' . basename( __DIR__ ) . '/' . basename( __FILE__ ), 'sharing_plugin_settings', 10, 4 );
283 +add_action( 'plugin_action_links_'.basename( dirname( __FILE__ ) ).'/'.basename( __FILE__ ), 'sharing_plugin_settings', 10, 4 );
229 284 add_filter( 'plugin_row_meta', 'sharing_add_plugin_settings', 10, 2 );
285 +
286 +if ( defined( 'RECAPTCHA_PUBLIC_KEY' ) && defined( 'RECAPTCHA_PRIVATE_KEY' ) ) {
287 + add_action( 'sharing_email_dialog', 'sharing_email_dialog' );
288 + add_filter( 'sharing_email_check', 'sharing_email_check', 10, 3 );
289 +}