Completed
Push — update/editor-blocks-icon-colo... ( 093ab2...3cfb5e )
by
unknown
08:47
created

modules/sharedaddy/sharedaddy.php (1 issue)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
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
*/
10
11
require_once plugin_dir_path( __FILE__ ).'sharing.php';
12
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
113
function sharing_add_meta_box() {
114
	global $post;
115
	if ( empty( $post ) ) { // If a current post is not defined, such as when editing a comment.
116
		return;
117
	}
118
119
	/**
120
	 * Filter whether to display the Sharing Meta Box or not.
121
	 *
122
	 * @module sharedaddy
123
	 *
124
	 * @since 3.8.0
125
	 *
126
	 * @param bool true Display Sharing Meta Box.
127
	 * @param $post Post.
128
	 */
129
	if ( ! apply_filters( 'sharing_meta_box_show', true, $post ) ) {
0 ignored issues
show
The call to apply_filters() has too many arguments starting with $post.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
130
		return;
131
	}
132
133
	$post_types = get_post_types( array( 'public' => true ) );
134
	/**
135
	 * Filter the Sharing Meta Box title.
136
	 *
137
	 * @module sharedaddy
138
	 *
139
	 * @since 2.2.0
140
	 *
141
	 * @param string $var Sharing Meta Box title. Default is "Sharing".
142
	 */
143
	$title = apply_filters( 'sharing_meta_box_title', __( 'Sharing', 'jetpack' ) );
144
	if ( $post->ID !== get_option( 'page_for_posts' ) ) {
145
		foreach( $post_types as $post_type ) {
146
			add_meta_box( 'sharing_meta', $title, 'sharing_meta_box_content', $post_type, 'side', 'default', array( '__back_compat_meta_box' => true ) );
147
		}
148
	}
149
}
150
151
152
function sharing_meta_box_content( $post ) {
153
	/**
154
	 * Fires before the sharing meta box content.
155
	 *
156
	 * @module sharedaddy
157
	 *
158
	 * @since 2.2.0
159
	 *
160
	 * @param WP_Post $post The post to share.
161
	 */
162
	do_action( 'start_sharing_meta_box_content', $post );
163
164
	$disabled = get_post_meta( $post->ID, 'sharing_disabled', true ); ?>
165
166
	<p>
167
		<label for="enable_post_sharing">
168
			<input type="checkbox" name="enable_post_sharing" id="enable_post_sharing" value="1" <?php checked( !$disabled ); ?>>
169
			<?php _e( 'Show sharing buttons.' , 'jetpack'); ?>
170
		</label>
171
		<input type="hidden" name="sharing_status_hidden" value="1" />
172
	</p>
173
174
	<?php
175
	/**
176
	 * Fires after the sharing meta box content.
177
	 *
178
	 * @module sharedaddy
179
	 *
180
	 * @since 2.2.0
181
	 *
182
	 * @param WP_Post $post The post to share.
183
	*/
184
	do_action( 'end_sharing_meta_box_content', $post );
185
}
186
187
function sharing_meta_box_save( $post_id ) {
188
	if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )
189
		return $post_id;
190
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 View Code Duplication
				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
			}
201
		}
202
	}
203
204
  	return $post_id;
205
}
206
207
function sharing_meta_box_protected( $protected, $meta_key ) {
208
	if ( 'sharing_disabled' == $meta_key )
209
		$protected = true;
210
211
	return $protected;
212
}
213
214
add_filter( 'is_protected_meta', 'sharing_meta_box_protected', 10, 2 );
215
216
function sharing_plugin_settings( $links ) {
217
	$settings_link = '<a href="options-general.php?page=sharing.php">'.__( 'Settings', 'jetpack' ).'</a>';
218
	array_unshift( $links, $settings_link );
219
	return $links;
220
}
221
222
function sharing_add_plugin_settings($links, $file) {
223
	if ( $file == basename( dirname( __FILE__ ) ).'/'.basename( __FILE__ ) ) {
224
		$links[] = '<a href="options-general.php?page=sharing.php">' . __( 'Settings', 'jetpack' ) . '</a>';
225
		$links[] = '<a href="https://support.wordpress.com/sharing/" rel="noopener noreferrer" target="_blank">' . __( 'Support', 'jetpack' ) . '</a>';
226
	}
227
228
	return $links;
229
}
230
231
function sharing_init() {
232
	if ( Jetpack_Options::get_option_and_ensure_autoload( 'sharedaddy_disable_resources', '0' ) ) {
233
		add_filter( 'sharing_js', 'sharing_disable_js' );
234
		remove_action( 'wp_head', 'sharing_add_header', 1 );
235
	}
236
}
237
238
function sharing_disable_js() {
239
	return false;
240
}
241
242
function sharing_global_resources() {
243
	$disable = get_option( 'sharedaddy_disable_resources' );
244
?>
245
<tr valign="top">
246
	<th scope="row"><label for="disable_css"><?php _e( 'Disable CSS and JS', 'jetpack' ); ?></label></th>
247
	<td>
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>
249
	</td>
250
</tr>
251
<?php
252
}
253
254
function sharing_global_resources_save() {
255
	update_option( 'sharedaddy_disable_resources', isset( $_POST['disable_resources'] ) ? 1 : 0 );
256
}
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
275
add_action( 'init', 'sharing_init' );
276
add_action( 'add_meta_boxes', 'sharing_add_meta_box' );
277
add_action( 'save_post', 'sharing_meta_box_save' );
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' );
281
add_action( 'sharing_global_options', 'sharing_global_resources', 30 );
282
add_action( 'sharing_admin_update', 'sharing_global_resources_save' );
283
add_action( 'plugin_action_links_'.basename( dirname( __FILE__ ) ).'/'.basename( __FILE__ ), 'sharing_plugin_settings', 10, 4 );
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
}
290