diff --git a/rhodecode/lib/recaptcha.py b/rhodecode/lib/recaptcha.py new file mode 100644 --- /dev/null +++ b/rhodecode/lib/recaptcha.py @@ -0,0 +1,98 @@ +# -*- coding: utf-8 -*- +import urllib +import urllib2 + +API_SSL_SERVER = "https://www.google.com/recaptcha/api" +API_SERVER = "http://www.google.com/recaptcha/api" +VERIFY_SERVER = "www.google.com" + + +class RecaptchaResponse(object): + def __init__(self, is_valid, error_code=None): + self.is_valid = is_valid + self.error_code = error_code + + def __repr__(self): + return '' % (self.is_valid) + + +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 + + 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/recaptcha/api/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])