diff --git a/direct/src/http/recaptcha.py b/direct/src/http/recaptcha.py new file mode 100755 index 0000000000..4a31bdd0f1 --- /dev/null +++ b/direct/src/http/recaptcha.py @@ -0,0 +1,99 @@ +# copied from recaptcha-client-1.0.5 +# http://pypi.python.org/pypi/recaptcha-client +# http://recaptcha.net/resources.html + +import urllib2, urllib + +API_SSL_SERVER="https://api-secure.recaptcha.net" +API_SERVER="http://api.recaptcha.net" +VERIFY_SERVER="api-verify.recaptcha.net" + +class RecaptchaResponse(object): + def __init__(self, is_valid, error_code=None): + self.is_valid = is_valid + self.error_code = error_code + +def displayhtml (public_key, + use_ssl = False, + error = None): + """Gets the HTML to display for reCAPTCHA + + public_key -- The public api key + use_ssl -- Should the request be sent over ssl? + error -- An error message to display (from RecaptchaResponse.error_code)""" + + error_param = '' + if error: + error_param = '&error=%s' % error + + if use_ssl: + server = API_SSL_SERVER + else: + server = API_SERVER + + # DCR: added comment to force ElementTree to emit tag closer + return """ + + +""" % { + 'ApiServer' : server, + 'PublicKey' : public_key, + 'ErrorParam' : error_param, + } + + +def submit (recaptcha_challenge_field, + recaptcha_response_field, + private_key, + remoteip): + """ + Submits a reCAPTCHA request for verification. Returns RecaptchaResponse + for the request + + recaptcha_challenge_field -- The value of recaptcha_challenge_field from the form + recaptcha_response_field -- The value of recaptcha_response_field from the form + private_key -- your reCAPTCHA private key + remoteip -- the user's ip address + """ + + if not (recaptcha_response_field and recaptcha_challenge_field and + len (recaptcha_response_field) and len (recaptcha_challenge_field)): + return RecaptchaResponse (is_valid = False, error_code = 'incorrect-captcha-sol') + + + def encode_if_necessary(s): + if isinstance(s, unicode): + return s.encode('utf-8') + return s + + params = urllib.urlencode ({ + 'privatekey': encode_if_necessary(private_key), + 'remoteip' : encode_if_necessary(remoteip), + 'challenge': encode_if_necessary(recaptcha_challenge_field), + 'response' : encode_if_necessary(recaptcha_response_field), + }) + + request = urllib2.Request ( + url = "http://%s/verify" % VERIFY_SERVER, + data = params, + headers = { + "Content-type": "application/x-www-form-urlencoded", + "User-agent": "reCAPTCHA Python" + } + ) + + httpresp = urllib2.urlopen (request) + + return_values = httpresp.read ().splitlines (); + httpresp.close(); + + return_code = return_values [0] + + if (return_code == "true"): + return RecaptchaResponse (is_valid=True) + else: + return RecaptchaResponse (is_valid=False, error_code = return_values [1])