1: <?php
  2:   3:   4:   5:   6:   7:   8:   9:  10:  11:  12:  13:  14:  15:  16:  17:  18:  19:  20:  21:  22:  23:  24:  25:  26:  27:  28:  29:  30:  31:  32:  33: 
 34: 
 35:  36:  37: 
 38: define("RECAPTCHA_API_SERVER", "http://www.google.com/recaptcha/api");
 39: define("RECAPTCHA_API_SECURE_SERVER", "https://www.google.com/recaptcha/api");
 40: define("RECAPTCHA_VERIFY_SERVER", "www.google.com");
 41: 
 42:  43:  44:  45:  46: 
 47: function _recaptcha_qsencode ($data) {
 48:         $req = "";
 49:         foreach ( $data as $key => $value )
 50:                 $req .= $key . '=' . urlencode( stripslashes($value) ) . '&';
 51: 
 52:         
 53:         $req=substr($req,0,strlen($req)-1);
 54:         return $req;
 55: }
 56: 
 57: 
 58: 
 59:  60:  61:  62:  63:  64:  65:  66: 
 67: function _recaptcha_http_post($host, $path, $data, $port = 80) {
 68: 
 69:         $req = _recaptcha_qsencode ($data);
 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); 
 88:         fclose($fs);
 89:         $response = explode("\r\n\r\n", $response, 2);
 90: 
 91:         return $response;
 92: }
 93: 
 94: 
 95: 
 96:  97:  98:  99: 100: 101: 102: 103: 104: 105: 
106: function 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) {
113:         $server = RECAPTCHA_API_SECURE_SERVER;
114:     } else {
115:         $server = RECAPTCHA_API_SERVER;
116:     }
117: 
118:     $errorpart = "";
119:     if ($error) {
120:         $errorpart = "&error=" . $error;
121:     }
122:     return '<script type="text/javascript" src="'. $server . '/challenge?k=' . $pubkey . $errorpart . '"></script>
123:     <noscript>
124:         <iframe src="'. $server . '/noscript?k=' . $pubkey . $errorpart . '" seamless="seamless"></iframe><br/>
125:         <textarea name="recaptcha_challenge_field" rows="3" cols="40"></textarea>
126:         <input type="hidden" name="recaptcha_response_field" value="manual_challenge"/>
127:     </noscript>';
128: }
129: 
130: 
131: 
132: 
133: 134: 135: 
136: class ReCaptchaResponse {
137:         var $is_valid;
138:         var $error;
139: }
140: 
141: 
142: 143: 144: 145: 146: 147: 148: 149: 150: 
151: function recaptcha_check_answer ($privkey, $remoteip, $challenge, $response, $extra_params = array())
152: {
153:     if ($privkey == null || $privkey == '') {
154:         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>");
155:     }
156: 
157:     if ($remoteip == null || $remoteip == '') {
158:         die ("For security reasons, you must pass the remote ip to reCAPTCHA");
159:     }
160: 
161: 
162: 
163:         
164:         if ($challenge == null || strlen($challenge) == 0 || $response == null || strlen($response) == 0) {
165:                 $recaptcha_response = new ReCaptchaResponse();
166:                 $recaptcha_response->is_valid = false;
167:                 $recaptcha_response->error = 'incorrect-captcha-sol';
168:                 return $recaptcha_response;
169:         }
170: 
171:         $response = _recaptcha_http_post (RECAPTCHA_VERIFY_SERVER, "/recaptcha/api/verify",
172:                                           array (
173:                                                  'privatekey' => $privkey,
174:                                                  'remoteip' => $remoteip,
175:                                                  'challenge' => $challenge,
176:                                                  'response' => $response
177:                                                  ) + $extra_params
178:                                           );
179: 
180:         $answers = explode ("\n", $response [1]);
181:         $recaptcha_response = new ReCaptchaResponse();
182: 
183:         if (trim ($answers [0]) == 'true') {
184:                 $recaptcha_response->is_valid = true;
185:         }
186:         else {
187:                 $recaptcha_response->is_valid = false;
188:                 $recaptcha_response->error = $answers [1];
189:         }
190:         return $recaptcha_response;
191: 
192: }
193: 
194: 195: 196: 197: 198: 199: 200: 
201: function recaptcha_get_signup_url ($domain = null, $appname = null) {
202:     return "https://www.google.com/recaptcha/admin/create?" .  _recaptcha_qsencode (array ('domains' => $domain, 'app' => $appname));
203: }
204: 
205: function _recaptcha_aes_pad($val) {
206:     $block_size = 16;
207:     $numpad = $block_size - (strlen ($val) % $block_size);
208:     return str_pad($val, strlen ($val) + $numpad, chr($numpad));
209: }
210: 
211: 
212: 
213: function _recaptcha_aes_encrypt($val,$ky) {
214:     if (! function_exists ("mcrypt_encrypt")) {
215:         die ("To use reCAPTCHA Mailhide, you need to have the mcrypt php module installed.");
216:     }
217:     $mode=MCRYPT_MODE_CBC;
218:     $enc=MCRYPT_RIJNDAEL_128;
219:     $val=_recaptcha_aes_pad($val);
220:     return mcrypt_encrypt($enc, $ky, $val, $mode, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0");
221: }
222: 
223: 
224: function _recaptcha_mailhide_urlbase64 ($x) {
225:     return strtr(base64_encode ($x), '+/', '-_');
226: }
227: 
228: 
229: function recaptcha_mailhide_url($pubkey, $privkey, $email) {
230:     if ($pubkey == '' || $pubkey == null || $privkey == "" || $privkey == null) {
231:         die ("To use reCAPTCHA Mailhide, you have to sign up for a public and private key, " .
232:              "you can do so at <a href='http://www.google.com/recaptcha/mailhide/apikey'>http://www.google.com/recaptcha/mailhide/apikey</a>");
233:     }
234: 
235: 
236:     $ky = pack('H*', $privkey);
237:     $cryptmail = _recaptcha_aes_encrypt ($email, $ky);
238: 
239:     return "http://www.google.com/recaptcha/mailhide/d?k=" . $pubkey . "&c=" . _recaptcha_mailhide_urlbase64 ($cryptmail);
240: }
241: 
242: 243: 244: 245: 246: 
247: function _recaptcha_mailhide_email_parts ($email) {
248:     $arr = preg_split("/@/", $email );
249: 
250:     if (strlen ($arr[0]) <= 4) {
251:         $arr[0] = substr ($arr[0], 0, 1);
252:     } else if (strlen ($arr[0]) <= 6) {
253:         $arr[0] = substr ($arr[0], 0, 3);
254:     } else {
255:         $arr[0] = substr ($arr[0], 0, 4);
256:     }
257:     return $arr;
258: }
259: 
260: 261: 262: 263: 264: 265: 
266: function recaptcha_mailhide_html($pubkey, $privkey, $email) {
267:     $emailparts = _recaptcha_mailhide_email_parts ($email);
268:     $url = recaptcha_mailhide_url ($pubkey, $privkey, $email);
269: 
270:     return htmlentities($emailparts[0]) . "<a href='" . htmlentities ($url) .
271:         "' 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]);
272: 
273: }
274: 
275: 
276: ?>
277: