PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 8.7.0.1
Jetpack – WP Security, Backup, Speed, & Growth v8.7.0.1
15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / modules / sharedaddy / recaptcha.php
jetpack / modules / sharedaddy Last commit date
images 5 years ago admin-sharing-rtl.css 7 years ago admin-sharing-rtl.min.css 7 years ago admin-sharing.css 7 years ago admin-sharing.js 6 years ago admin-sharing.min.css 7 years ago amp-sharing.css 5 years ago recaptcha.php 7 years ago sharedaddy.php 5 years ago sharing-service.php 6 years ago sharing-sources.php 5 years ago sharing.css 6 years ago sharing.js 6 years ago sharing.php 6 years ago
recaptcha.php
189 lines
1 <?php
2
3 /**
4 * Class that handles reCAPTCHA.
5 */
6 class Jetpack_ReCaptcha {
7
8 /**
9 * URL to which requests are POSTed.
10 *
11 * @const string
12 */
13 const VERIFY_URL = 'https://www.google.com/recaptcha/api/siteverify';
14
15 /**
16 * Site key to use in HTML code.
17 *
18 * @var string
19 */
20 private $site_key;
21
22 /**
23 * Shared secret for the site.
24 *
25 * @var string
26 */
27 private $secret_key;
28
29 /**
30 * Config for reCAPTCHA instance.
31 *
32 * @var array
33 */
34 private $config;
35
36 /**
37 * Error codes returned from reCAPTCHA API.
38 *
39 * @see https://developers.google.com/recaptcha/docs/verify
40 *
41 * @var array
42 */
43 private $error_codes;
44
45 /**
46 * Create a configured instance to use the reCAPTCHA service.
47 *
48 * @param string $site_key Site key to use in HTML code.
49 * @param string $secret_key Shared secret between site and reCAPTCHA server.
50 * @param array $config Config array to optionally configure reCAPTCHA instance.
51 */
52 public function __construct( $site_key, $secret_key, $config = array() ) {
53 $this->site_key = $site_key;
54 $this->secret_key = $secret_key;
55 $this->config = wp_parse_args( $config, $this->get_default_config() );
56
57 $this->error_codes = array(
58 'missing-input-secret' => __( 'The secret parameter is missing', 'jetpack' ),
59 'invalid-input-secret' => __( 'The secret parameter is invalid or malformed', 'jetpack' ),
60 'missing-input-response' => __( 'The response parameter is missing', 'jetpack' ),
61 'invalid-input-response' => __( 'The response parameter is invalid or malformed', 'jetpack' ),
62 'invalid-json' => __( 'Invalid JSON', 'jetpack' ),
63 'unexpected-response' => __( 'Unexpected response', 'jetpack' ),
64 'unexpected-hostname' => __( 'Unexpected hostname', 'jetpack' ),
65 );
66 }
67
68 /**
69 * Get default config for this reCAPTCHA instance.
70 *
71 * @return array Default config
72 */
73 public function get_default_config() {
74 return array(
75 'language' => get_locale(),
76 'script_async' => true,
77 'tag_class' => 'g-recaptcha',
78 'tag_attributes' => array(
79 'theme' => 'light',
80 'type' => 'image',
81 'tabindex' => 0,
82 ),
83 );
84 }
85
86 /**
87 * Calls the reCAPTCHA siteverify API to verify whether the user passes
88 * CAPTCHA test.
89 *
90 * @param string $response The value of 'g-recaptcha-response' in the submitted
91 * form.
92 * @param string $remote_ip The end user's IP address.
93 *
94 * @return bool|WP_Error Returns true if verified. Otherwise WP_Error is returned.
95 */
96 public function verify( $response, $remote_ip ) {
97 // No need make a request if response is empty.
98 if ( empty( $response ) ) {
99 return new WP_Error( 'missing-input-response', $this->error_codes['missing-input-response'], 400 );
100 }
101
102 $resp = wp_remote_post( self::VERIFY_URL, $this->get_verify_request_params( $response, $remote_ip ) );
103 if ( is_wp_error( $resp ) ) {
104 return $resp;
105 }
106
107 $resp_decoded = json_decode( wp_remote_retrieve_body( $resp ), true );
108 if ( ! $resp_decoded ) {
109 return new WP_Error( 'invalid-json', $this->error_codes['invalid-json'], 400 );
110 }
111
112 // Default error code and message.
113 $error_code = 'unexpected-response';
114 $error_message = $this->error_codes['unexpected-response'];
115
116 // Use the first error code if exists.
117 if ( isset( $resp_decoded['error-codes'] ) && is_array( $resp_decoded['error-codes'] ) ) {
118 if ( isset( $resp_decoded['error-codes'][0] ) && isset( $this->error_codes[ $resp_decoded['error-codes'][0] ] ) ) {
119 $error_message = $this->error_codes[ $resp_decoded['error-codes'][0] ];
120 $error_code = $resp_decoded['error-codes'][0];
121 }
122 }
123
124 if ( ! isset( $resp_decoded['success'] ) ) {
125 return new WP_Error( $error_code, $error_message );
126 }
127
128 if ( true !== $resp_decoded['success'] ) {
129 return new WP_Error( $error_code, $error_message );
130 }
131
132 // Validate the hostname matches expected source
133 if ( isset( $resp_decoded['hostname'] ) ) {
134 $url = wp_parse_url( get_home_url() );
135 if ( $url['host'] !== $resp_decoded['hostname'] ) {
136 return new WP_Error( 'unexpected-host', $this->error_codes['unexpected-hostname'] );
137 }
138 }
139
140 return true;
141 }
142
143 /**
144 * Get siteverify request parameters.
145 *
146 * @param string $response The value of 'g-recaptcha-response' in the submitted
147 * form.
148 * @param string $remote_ip The end user's IP address.
149 *
150 * @return array
151 */
152 public function get_verify_request_params( $response, $remote_ip ) {
153 return array(
154 'body' => array(
155 'secret' => $this->secret_key,
156 'response' => $response,
157 'remoteip' => $remote_ip,
158 ),
159 'sslverify' => true,
160 );
161 }
162
163 /**
164 * Get reCAPTCHA HTML to render.
165 *
166 * @return string
167 */
168 public function get_recaptcha_html() {
169 return sprintf(
170 '
171 <div
172 class="%s"
173 data-sitekey="%s"
174 data-theme="%s"
175 data-type="%s"
176 data-tabindex="%s"></div>
177 <script type="text/javascript" src="https://www.google.com/recaptcha/api.js?hl=%s"%s></script>
178 ',
179 esc_attr( $this->config['tag_class'] ),
180 esc_attr( $this->site_key ),
181 esc_attr( $this->config['tag_attributes']['theme'] ),
182 esc_attr( $this->config['tag_attributes']['type'] ),
183 esc_attr( $this->config['tag_attributes']['tabindex'] ),
184 rawurlencode( $this->config['language'] ),
185 $this->config['script_async'] ? ' async' : ''
186 );
187 }
188 }
189