MediaWiki REL1_33
recaptchalib.php
Go to the documentation of this file.
1<?php
38define( "RECAPTCHA_API_SERVER", "http://www.google.com/recaptcha/api" );
39define( "RECAPTCHA_API_SECURE_SERVER", "https://www.google.com/recaptcha/api" );
40define( "RECAPTCHA_VERIFY_SERVER", "www.google.com" );
41
48 $req = "";
49 foreach ( $data as $key => $value )
50 $req .= $key . '=' . urlencode( stripslashes( $value ) ) . '&';
51
52 // Cut the last '&'
53 $req = substr( $req, 0, strlen( $req ) -1 );
54 return $req;
55}
56
57
58
67function _recaptcha_http_post( $host, $path, $data, $port = 80 ) {
68
70
71 $http_request = "POST $path HTTP/1.0\r\n";
72 $http_request .= "Host: $host\r\n";
73 $http_request .= "Content-Type: application/x-www-form-urlencoded;\r\n";
74 $http_request .= "Content-Length: " . strlen( $req ) . "\r\n";
75 $http_request .= "User-Agent: reCAPTCHA/PHP\r\n";
76 $http_request .= "\r\n";
77 $http_request .= $req;
78
79 $response = '';
80 if ( false == ( $fs = @fsockopen( $host, $port, $errno, $errstr, 10 ) ) ) {
81 die ( 'Could not open socket' );
82 }
83
84 fwrite( $fs, $http_request );
85
86 while ( !feof( $fs ) )
87 $response .= fgets( $fs, 1160 ); // One TCP-IP packet
88 fclose( $fs );
89 $response = explode( "\r\n\r\n", $response, 2 );
90
91 return $response;
92}
93
94
95
106function recaptcha_get_html ( $pubkey, $error = null, $use_ssl = false )
107{
108 if ( $pubkey == null || $pubkey == '' ) {
109 die ( "To use reCAPTCHA you must get an API key from <a href='https://www.google.com/recaptcha/admin/create'>https://www.google.com/recaptcha/admin/create</a>" );
110 }
111
112 if ( $use_ssl ) {
114 } else {
115 $server = RECAPTCHA_API_SERVER;
116 }
117
118 $errorpart = "";
119 if ( $error ) {
120 $errorpart = "&amp;error=" . $error;
121 }
122 return '<script type="text/javascript" src="' . $server . '/challenge?k=' . $pubkey . $errorpart . '"></script>
123
124 <noscript>
125 <iframe src="' . $server . '/noscript?k=' . $pubkey . $errorpart . '" height="300" width="500" frameborder="0"></iframe><br/>
126 <textarea name="recaptcha_challenge_field" rows="3" cols="40"></textarea>
127 <input type="hidden" name="recaptcha_response_field" value="manual_challenge"/>
128 </noscript>';
129}
130
131
132
133
138 public $is_valid;
139 public $error;
140}
141
142
152function recaptcha_check_answer ( $privkey, $remoteip, $challenge, $response, $extra_params = array() )
153{
154 if ( $privkey == null || $privkey == '' ) {
155 die ( "To use reCAPTCHA you must get an API key from <a href='https://www.google.com/recaptcha/admin/create'>https://www.google.com/recaptcha/admin/create</a>" );
156 }
157
158 if ( $remoteip == null || $remoteip == '' ) {
159 die ( "For security reasons, you must pass the remote ip to reCAPTCHA" );
160 }
161
162
163
164 // discard spam submissions
165 if ( $challenge == null || strlen( $challenge ) == 0 || $response == null || strlen( $response ) == 0 ) {
166 $recaptcha_response = new ReCaptchaResponse();
167 $recaptcha_response->is_valid = false;
168 $recaptcha_response->error = 'incorrect-captcha-sol';
169 return $recaptcha_response;
170 }
171
172 $response = _recaptcha_http_post ( RECAPTCHA_VERIFY_SERVER, "/recaptcha/api/verify",
173 array (
174 'privatekey' => $privkey,
175 'remoteip' => $remoteip,
176 'challenge' => $challenge,
177 'response' => $response
178 ) + $extra_params
179 );
180
181 $answers = explode ( "\n", $response [1] );
182 $recaptcha_response = new ReCaptchaResponse();
183
184 if ( trim ( $answers [0] ) == 'true' ) {
185 $recaptcha_response->is_valid = true;
186 }
187 else {
188 $recaptcha_response->is_valid = false;
189 $recaptcha_response->error = $answers [1];
190 }
191 return $recaptcha_response;
192
193}
194
202function recaptcha_get_signup_url ( $domain = null, $appname = null ) {
203 return "https://www.google.com/recaptcha/admin/create?" . _recaptcha_qsencode ( array ( 'domains' => $domain, 'app' => $appname ) );
204}
205
206function _recaptcha_aes_pad( $val ) {
207 $block_size = 16;
208 $numpad = $block_size - ( strlen ( $val ) % $block_size );
209 return str_pad( $val, strlen ( $val ) + $numpad, chr( $numpad ) );
210}
211
212/* Mailhide related code */
213
214function _recaptcha_aes_encrypt( $val, $ky ) {
215 if ( ! function_exists ( "mcrypt_encrypt" ) ) {
216 die ( "To use reCAPTCHA Mailhide, you need to have the mcrypt php module installed." );
217 }
218 $mode = MCRYPT_MODE_CBC;
219 $enc = MCRYPT_RIJNDAEL_128;
220 $val = _recaptcha_aes_pad( $val );
221 return mcrypt_encrypt( $enc, $ky, $val, $mode, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" );
222}
223
224
226 return strtr( base64_encode ( $x ), '+/', '-_' );
227}
228
229/* gets the reCAPTCHA Mailhide url for a given email, public key and private key */
230function recaptcha_mailhide_url( $pubkey, $privkey, $email ) {
231 if ( $pubkey == '' || $pubkey == null || $privkey == "" || $privkey == null ) {
232 die ( "To use reCAPTCHA Mailhide, you have to sign up for a public and private key, " .
233 "you can do so at <a href='http://www.google.com/recaptcha/mailhide/apikey'>http://www.google.com/recaptcha/mailhide/apikey</a>" );
234 }
235
236
237 $ky = pack( 'H*', $privkey );
238 $cryptmail = _recaptcha_aes_encrypt ( $email, $ky );
239
240 return "http://www.google.com/recaptcha/mailhide/d?k=" . $pubkey . "&c=" . _recaptcha_mailhide_urlbase64 ( $cryptmail );
241}
242
249 $arr = preg_split( "/@/", $email );
250
251 if ( strlen ( $arr[0] ) <= 4 ) {
252 $arr[0] = substr ( $arr[0], 0, 1 );
253 } elseif ( strlen ( $arr[0] ) <= 6 ) {
254 $arr[0] = substr ( $arr[0], 0, 3 );
255 } else {
256 $arr[0] = substr ( $arr[0], 0, 4 );
257 }
258 return $arr;
259}
260
267function recaptcha_mailhide_html( $pubkey, $privkey, $email ) {
268 $emailparts = _recaptcha_mailhide_email_parts ( $email );
269 $url = recaptcha_mailhide_url ( $pubkey, $privkey, $email );
270
271 return htmlentities( $emailparts[0] ) . "<a href='" . htmlentities ( $url ) .
272 "' onclick=\"window.open('" . htmlentities ( $url ) . "', '', 'toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width=500,height=300'); return false;\" title=\"Reveal this e-mail address\">...</a>@" . htmlentities ( $emailparts [1] );
273
274}
and that you know you can do these things To protect your we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights These restrictions translate to certain responsibilities for you if you distribute copies of the or if you modify it For if you distribute copies of such a whether gratis or for a you must give the recipients all the rights that you have You must make sure that receive or can get the source code And you must show them these terms so they know their rights We protect your rights with two and(2) offer you this license which gives you legal permission to copy
A ReCaptchaResponse is returned from recaptcha_check_answer()
this hook is for auditing only $req
Definition hooks.txt:979
this hook is for auditing only $response
Definition hooks.txt:780
$data
Utility to generate mapping file used in mw.Title (phpCharToUpper.json)
The wiki should then use memcached to cache various data To use multiple just add more items to the array To increase the weight of a make its entry a array("192.168.0.1:11211", 2))
const RECAPTCHA_VERIFY_SERVER
const RECAPTCHA_API_SECURE_SERVER
_recaptcha_mailhide_urlbase64( $x)
recaptcha_get_signup_url( $domain=null, $appname=null)
gets a URL where the user can sign up for reCAPTCHA.
_recaptcha_aes_pad( $val)
recaptcha_mailhide_html( $pubkey, $privkey, $email)
Gets html to display an email address given a public an private key.
const RECAPTCHA_API_SERVER
This is a PHP library that handles calling reCAPTCHA.
_recaptcha_mailhide_email_parts( $email)
_recaptcha_http_post( $host, $path, $data, $port=80)
Submits an HTTP POST to a reCAPTCHA server.
recaptcha_mailhide_url( $pubkey, $privkey, $email)
_recaptcha_qsencode( $data)
Encodes the given data into a query string format.
recaptcha_get_html( $pubkey, $error=null, $use_ssl=false)
Gets the challenge HTML (javascript and non-javascript version).
_recaptcha_aes_encrypt( $val, $ky)
recaptcha_check_answer( $privkey, $remoteip, $challenge, $response, $extra_params=array())
Calls an HTTP POST function to verify if the user's guess was correct.