recaptcha-client-1.0.6/0000755030162400116100000000000011551121502014047 5ustar mcmillenengrecaptcha-client-1.0.6/recaptcha/0000755030162400116100000000000011551121502016001 5ustar mcmillenengrecaptcha-client-1.0.6/recaptcha/client/0000755030162400116100000000000011551121502017257 5ustar mcmillenengrecaptcha-client-1.0.6/recaptcha/client/__init__.py0000644030162400116100000000000011551117647021375 0ustar mcmillenengrecaptcha-client-1.0.6/recaptcha/client/captcha.py0000644030162400116100000000605411551117647021260 0ustar mcmillenengimport urllib2, urllib 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 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]) recaptcha-client-1.0.6/recaptcha/client/mailhide.py0000644030162400116100000000433011551117647021424 0ustar mcmillenengimport base64 import cgi try: from Crypto.Cipher import AES except: raise Exception ("You need the pycrpyto library: http://cheeseshop.python.org/pypi/pycrypto/") MAIL_HIDE_BASE="http://www.google.com/recaptcha/mailhide" def asurl (email, public_key, private_key): """Wraps an email address with reCAPTCHA mailhide and returns the url. public_key is the public key from reCAPTCHA (in the base 64 encoded format). Private key is the AES key, and should be 32 hex chars.""" cryptmail = _encrypt_string (email, base64.b16decode (private_key, casefold=True), '\0' * 16) base64crypt = base64.urlsafe_b64encode (cryptmail) return "%s/d?k=%s&c=%s" % (MAIL_HIDE_BASE, public_key, base64crypt) def ashtml (email, public_key, private_key): """Wraps an email address with reCAPTCHA Mailhide and returns html that displays the email""" url = asurl (email, public_key, private_key) (userpart, domainpart) = _doterizeemail (email) return """%(user)s...@%(domain)s""" % { 'user' : cgi.escape (userpart), 'domain' : cgi.escape (domainpart), 'url' : cgi.escape (url), } def _pad_string (str, block_size): numpad = block_size - (len (str) % block_size) return str + numpad * chr (numpad) def _encrypt_string (str, aes_key, aes_iv): if len (aes_key) != 16: raise Exception ("expecting key of length 16") if len (aes_iv) != 16: raise Exception ("expecting iv of length 16") return AES.new (aes_key, AES.MODE_CBC, aes_iv).encrypt (_pad_string (str, 16)) def _doterizeemail (email): """replaces part of the username with dots""" try: [user, domain] = email.split ('@') except: # handle invalid emails... sorta user = email domain = "" if len(user) <= 4: user_prefix = user[:1] elif len(user) <= 6: user_prefix = user[:3] else: user_prefix = user[:4] return (user_prefix, domain) recaptcha-client-1.0.6/recaptcha/__init__.py0000644030162400116100000000007011551117647020126 0ustar mcmilleneng__import__('pkg_resources').declare_namespace(__name__) recaptcha-client-1.0.6/recaptcha_client.egg-info/0000755030162400116100000000000011551121502021031 5ustar mcmillenengrecaptcha-client-1.0.6/recaptcha_client.egg-info/PKG-INFO0000644030162400116100000000340611551121502022131 0ustar mcmillenengMetadata-Version: 1.0 Name: recaptcha-client Version: 1.0.6 Summary: A plugin for reCAPTCHA and reCAPTCHA Mailhide Home-page: http://recaptcha.net Author: Ben Maurer Author-email: support@recaptcha.net License: MIT/X11 Description: Provides a CAPTCHA for Python using the reCAPTCHA service. Does not require any imaging libraries because the CAPTCHA is served directly from reCAPTCHA. Also allows you to securely obfuscate emails with Mailhide. This functionality requires pycrypto. This library requires two types of API keys. If you'd like to use the CAPTCHA, you'll need a key from https://www.google.com/recaptcha/admin/create. For Mailhide, you'll need a key from http://www.google.com/recaptcha/mailhide/apikey. The trunk can be checked out from http://recaptcha.googlecode.com/svn/trunk/recaptcha-plugins/python, and the associated Google Code project lives at http://code.google.com/p/recaptcha. Note that this is a shared project/repository for reCAPTCHA clients for several languages/environments. There is also a Google Group at http://groups.google.com/group/recaptcha/. Please use the associated mailing list for any questions or comments: recaptcha@googlegroups.com. Like the Google Code project, the Google Group mailing list is also shared among the several reCAPTCHA client implementations. reCAPTCHA is written by Ben Maurer and maintained by Josh Bronson. It is licensed under an MIT/X11 license. Platform: UNKNOWN Classifier: Topic :: Security Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content :: CGI Tools/Libraries Classifier: Development Status :: 4 - Beta Classifier: Environment :: Web Environment recaptcha-client-1.0.6/recaptcha_client.egg-info/SOURCES.txt0000644030162400116100000000057011551121502022717 0ustar mcmillenengez_setup.py setup.py recaptcha/__init__.py recaptcha/client/__init__.py recaptcha/client/captcha.py recaptcha/client/mailhide.py recaptcha_client.egg-info/PKG-INFO recaptcha_client.egg-info/SOURCES.txt recaptcha_client.egg-info/dependency_links.txt recaptcha_client.egg-info/namespace_packages.txt recaptcha_client.egg-info/requires.txt recaptcha_client.egg-info/top_level.txtrecaptcha-client-1.0.6/recaptcha_client.egg-info/dependency_links.txt0000644030162400116100000000000111551121502025077 0ustar mcmilleneng recaptcha-client-1.0.6/recaptcha_client.egg-info/namespace_packages.txt0000644030162400116100000000001211551121502025355 0ustar mcmillenengrecaptcha recaptcha-client-1.0.6/recaptcha_client.egg-info/requires.txt0000644030162400116100000000002511551121502023426 0ustar mcmilleneng [mailhide] pycryptorecaptcha-client-1.0.6/recaptcha_client.egg-info/top_level.txt0000644030162400116100000000001211551121502023554 0ustar mcmillenengrecaptcha recaptcha-client-1.0.6/ez_setup.py0000644030162400116100000002405511551117647016304 0ustar mcmilleneng#!python """Bootstrap setuptools installation If you want to use setuptools in your package's setup.py, just include this file in the same directory with it, and add this to the top of your setup.py:: from ez_setup import use_setuptools use_setuptools() If you want to require a specific version of setuptools, set a download mirror, or use an alternate download directory, you can do so by supplying the appropriate options to ``use_setuptools()``. This file can also be run as a script to install or upgrade setuptools. """ import sys DEFAULT_VERSION = "0.6c11" DEFAULT_URL = "http://pypi.python.org/packages/%s/s/setuptools/" % sys.version[:3] md5_data = { 'setuptools-0.6b1-py2.3.egg': '8822caf901250d848b996b7f25c6e6ca', 'setuptools-0.6b1-py2.4.egg': 'b79a8a403e4502fbb85ee3f1941735cb', 'setuptools-0.6b2-py2.3.egg': '5657759d8a6d8fc44070a9d07272d99b', 'setuptools-0.6b2-py2.4.egg': '4996a8d169d2be661fa32a6e52e4f82a', 'setuptools-0.6b3-py2.3.egg': 'bb31c0fc7399a63579975cad9f5a0618', 'setuptools-0.6b3-py2.4.egg': '38a8c6b3d6ecd22247f179f7da669fac', 'setuptools-0.6b4-py2.3.egg': '62045a24ed4e1ebc77fe039aa4e6f7e5', 'setuptools-0.6b4-py2.4.egg': '4cb2a185d228dacffb2d17f103b3b1c4', 'setuptools-0.6c1-py2.3.egg': 'b3f2b5539d65cb7f74ad79127f1a908c', 'setuptools-0.6c1-py2.4.egg': 'b45adeda0667d2d2ffe14009364f2a4b', 'setuptools-0.6c10-py2.3.egg': 'ce1e2ab5d3a0256456d9fc13800a7090', 'setuptools-0.6c10-py2.4.egg': '57d6d9d6e9b80772c59a53a8433a5dd4', 'setuptools-0.6c10-py2.5.egg': 'de46ac8b1c97c895572e5e8596aeb8c7', 'setuptools-0.6c10-py2.6.egg': '58ea40aef06da02ce641495523a0b7f5', 'setuptools-0.6c11-py2.3.egg': '2baeac6e13d414a9d28e7ba5b5a596de', 'setuptools-0.6c11-py2.4.egg': 'bd639f9b0eac4c42497034dec2ec0c2b', 'setuptools-0.6c11-py2.5.egg': '64c94f3bf7a72a13ec83e0b24f2749b2', 'setuptools-0.6c11-py2.6.egg': 'bfa92100bd772d5a213eedd356d64086', 'setuptools-0.6c2-py2.3.egg': 'f0064bf6aa2b7d0f3ba0b43f20817c27', 'setuptools-0.6c2-py2.4.egg': '616192eec35f47e8ea16cd6a122b7277', 'setuptools-0.6c3-py2.3.egg': 'f181fa125dfe85a259c9cd6f1d7b78fa', 'setuptools-0.6c3-py2.4.egg': 'e0ed74682c998bfb73bf803a50e7b71e', 'setuptools-0.6c3-py2.5.egg': 'abef16fdd61955514841c7c6bd98965e', 'setuptools-0.6c4-py2.3.egg': 'b0b9131acab32022bfac7f44c5d7971f', 'setuptools-0.6c4-py2.4.egg': '2a1f9656d4fbf3c97bf946c0a124e6e2', 'setuptools-0.6c4-py2.5.egg': '8f5a052e32cdb9c72bcf4b5526f28afc', 'setuptools-0.6c5-py2.3.egg': 'ee9fd80965da04f2f3e6b3576e9d8167', 'setuptools-0.6c5-py2.4.egg': 'afe2adf1c01701ee841761f5bcd8aa64', 'setuptools-0.6c5-py2.5.egg': 'a8d3f61494ccaa8714dfed37bccd3d5d', 'setuptools-0.6c6-py2.3.egg': '35686b78116a668847237b69d549ec20', 'setuptools-0.6c6-py2.4.egg': '3c56af57be3225019260a644430065ab', 'setuptools-0.6c6-py2.5.egg': 'b2f8a7520709a5b34f80946de5f02f53', 'setuptools-0.6c7-py2.3.egg': '209fdf9adc3a615e5115b725658e13e2', 'setuptools-0.6c7-py2.4.egg': '5a8f954807d46a0fb67cf1f26c55a82e', 'setuptools-0.6c7-py2.5.egg': '45d2ad28f9750e7434111fde831e8372', 'setuptools-0.6c8-py2.3.egg': '50759d29b349db8cfd807ba8303f1902', 'setuptools-0.6c8-py2.4.egg': 'cba38d74f7d483c06e9daa6070cce6de', 'setuptools-0.6c8-py2.5.egg': '1721747ee329dc150590a58b3e1ac95b', 'setuptools-0.6c9-py2.3.egg': 'a83c4020414807b496e4cfbe08507c03', 'setuptools-0.6c9-py2.4.egg': '260a2be2e5388d66bdaee06abec6342a', 'setuptools-0.6c9-py2.5.egg': 'fe67c3e5a17b12c0e7c541b7ea43a8e6', 'setuptools-0.6c9-py2.6.egg': 'ca37b1ff16fa2ede6e19383e7b59245a', } import sys, os try: from hashlib import md5 except ImportError: from md5 import md5 def _validate_md5(egg_name, data): if egg_name in md5_data: digest = md5(data).hexdigest() if digest != md5_data[egg_name]: print >>sys.stderr, ( "md5 validation of %s failed! (Possible download problem?)" % egg_name ) sys.exit(2) return data def use_setuptools( version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir, download_delay=15 ): """Automatically find/download setuptools and make it available on sys.path `version` should be a valid setuptools version number that is available as an egg for download under the `download_base` URL (which should end with a '/'). `to_dir` is the directory where setuptools will be downloaded, if it is not already available. If `download_delay` is specified, it should be the number of seconds that will be paused before initiating a download, should one be required. If an older version of setuptools is installed, this routine will print a message to ``sys.stderr`` and raise SystemExit in an attempt to abort the calling script. """ was_imported = 'pkg_resources' in sys.modules or 'setuptools' in sys.modules def do_download(): egg = download_setuptools(version, download_base, to_dir, download_delay) sys.path.insert(0, egg) import setuptools; setuptools.bootstrap_install_from = egg try: import pkg_resources except ImportError: return do_download() try: pkg_resources.require("setuptools>="+version); return except pkg_resources.VersionConflict, e: if was_imported: print >>sys.stderr, ( "The required version of setuptools (>=%s) is not available, and\n" "can't be installed while this script is running. Please install\n" " a more recent version first, using 'easy_install -U setuptools'." "\n\n(Currently using %r)" ) % (version, e.args[0]) sys.exit(2) else: del pkg_resources, sys.modules['pkg_resources'] # reload ok return do_download() except pkg_resources.DistributionNotFound: return do_download() def download_setuptools( version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir, delay = 15 ): """Download setuptools from a specified location and return its filename `version` should be a valid setuptools version number that is available as an egg for download under the `download_base` URL (which should end with a '/'). `to_dir` is the directory where the egg will be downloaded. `delay` is the number of seconds to pause before an actual download attempt. """ import urllib2, shutil egg_name = "setuptools-%s-py%s.egg" % (version,sys.version[:3]) url = download_base + egg_name saveto = os.path.join(to_dir, egg_name) src = dst = None if not os.path.exists(saveto): # Avoid repeated downloads try: from distutils import log if delay: log.warn(""" --------------------------------------------------------------------------- This script requires setuptools version %s to run (even to display help). I will attempt to download it for you (from %s), but you may need to enable firewall access for this script first. I will start the download in %d seconds. (Note: if this machine does not have network access, please obtain the file %s and place it in this directory before rerunning this script.) ---------------------------------------------------------------------------""", version, download_base, delay, url ); from time import sleep; sleep(delay) log.warn("Downloading %s", url) src = urllib2.urlopen(url) # Read/write all in one block, so we don't create a corrupt file # if the download is interrupted. data = _validate_md5(egg_name, src.read()) dst = open(saveto,"wb"); dst.write(data) finally: if src: src.close() if dst: dst.close() return os.path.realpath(saveto) def main(argv, version=DEFAULT_VERSION): """Install or upgrade setuptools and EasyInstall""" try: import setuptools except ImportError: egg = None try: egg = download_setuptools(version, delay=0) sys.path.insert(0,egg) from setuptools.command.easy_install import main return main(list(argv)+[egg]) # we're done here finally: if egg and os.path.exists(egg): os.unlink(egg) else: if setuptools.__version__ == '0.0.1': print >>sys.stderr, ( "You have an obsolete version of setuptools installed. Please\n" "remove it from your system entirely before rerunning this script." ) sys.exit(2) req = "setuptools>="+version import pkg_resources try: pkg_resources.require(req) except pkg_resources.VersionConflict: try: from setuptools.command.easy_install import main except ImportError: from easy_install import main main(list(argv)+[download_setuptools(delay=0)]) sys.exit(0) # try to force an exit else: if argv: from setuptools.command.easy_install import main main(argv) else: print "Setuptools version",version,"or greater has been installed." print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)' def update_md5(filenames): """Update our built-in md5 registry""" import re for name in filenames: base = os.path.basename(name) f = open(name,'rb') md5_data[base] = md5(f.read()).hexdigest() f.close() data = [" %r: %r,\n" % it for it in md5_data.items()] data.sort() repl = "".join(data) import inspect srcfile = inspect.getsourcefile(sys.modules[__name__]) f = open(srcfile, 'rb'); src = f.read(); f.close() match = re.search("\nmd5_data = {\n([^}]+)}", src) if not match: print >>sys.stderr, "Internal error!" sys.exit(2) src = src[:match.start(1)] + repl + src[match.end(1):] f = open(srcfile,'w') f.write(src) f.close() if __name__=='__main__': if len(sys.argv)>2 and sys.argv[1]=='--md5update': update_md5(sys.argv[2:]) else: main(sys.argv[1:]) recaptcha-client-1.0.6/setup.py0000755030162400116100000000400611551117647015603 0ustar mcmillenengtry: from setuptools import setup, find_packages except ImportError: from ez_setup import use_setuptools use_setuptools() from setuptools import setup, find_packages setup(name='recaptcha-client', version='1.0.6', url = "http://recaptcha.net", author = "Ben Maurer", author_email = "support@recaptcha.net", description = "A plugin for reCAPTCHA and reCAPTCHA Mailhide", long_description = """\ Provides a CAPTCHA for Python using the reCAPTCHA service. Does not require any imaging libraries because the CAPTCHA is served directly from reCAPTCHA. Also allows you to securely obfuscate emails with Mailhide. This functionality requires pycrypto. This library requires two types of API keys. If you'd like to use the CAPTCHA, you'll need a key from https://www.google.com/recaptcha/admin/create. For Mailhide, you'll need a key from http://www.google.com/recaptcha/mailhide/apikey. The trunk can be checked out from http://recaptcha.googlecode.com/svn/trunk/recaptcha-plugins/python, and the associated Google Code project lives at http://code.google.com/p/recaptcha. Note that this is a shared project/repository for reCAPTCHA clients for several languages/environments. There is also a Google Group at http://groups.google.com/group/recaptcha/. Please use the associated mailing list for any questions or comments: recaptcha@googlegroups.com. Like the Google Code project, the Google Group mailing list is also shared among the several reCAPTCHA client implementations. reCAPTCHA is written by Ben Maurer and maintained by Josh Bronson. It is licensed under an MIT/X11 license. """, license = "MIT/X11", classifiers = [ "Topic :: Security", "Topic :: Internet :: WWW/HTTP :: Dynamic Content :: CGI Tools/Libraries", "Development Status :: 4 - Beta", "Environment :: Web Environment", ], packages = find_packages(), extras_require = { 'mailhide' : ['pycrypto'], }, namespace_packages = ['recaptcha'], ) recaptcha-client-1.0.6/PKG-INFO0000644030162400116100000000340611551121502015147 0ustar mcmillenengMetadata-Version: 1.0 Name: recaptcha-client Version: 1.0.6 Summary: A plugin for reCAPTCHA and reCAPTCHA Mailhide Home-page: http://recaptcha.net Author: Ben Maurer Author-email: support@recaptcha.net License: MIT/X11 Description: Provides a CAPTCHA for Python using the reCAPTCHA service. Does not require any imaging libraries because the CAPTCHA is served directly from reCAPTCHA. Also allows you to securely obfuscate emails with Mailhide. This functionality requires pycrypto. This library requires two types of API keys. If you'd like to use the CAPTCHA, you'll need a key from https://www.google.com/recaptcha/admin/create. For Mailhide, you'll need a key from http://www.google.com/recaptcha/mailhide/apikey. The trunk can be checked out from http://recaptcha.googlecode.com/svn/trunk/recaptcha-plugins/python, and the associated Google Code project lives at http://code.google.com/p/recaptcha. Note that this is a shared project/repository for reCAPTCHA clients for several languages/environments. There is also a Google Group at http://groups.google.com/group/recaptcha/. Please use the associated mailing list for any questions or comments: recaptcha@googlegroups.com. Like the Google Code project, the Google Group mailing list is also shared among the several reCAPTCHA client implementations. reCAPTCHA is written by Ben Maurer and maintained by Josh Bronson. It is licensed under an MIT/X11 license. Platform: UNKNOWN Classifier: Topic :: Security Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content :: CGI Tools/Libraries Classifier: Development Status :: 4 - Beta Classifier: Environment :: Web Environment recaptcha-client-1.0.6/setup.cfg0000644030162400116100000000007311551121502015670 0ustar mcmilleneng[egg_info] tag_build = tag_date = 0 tag_svn_revision = 0