Automattic /
jetpack
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
|
|||
| 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 |
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
@ignorePhpDoc annotation to the duplicate definition and it will be ignored.