aboutsummaryrefslogtreecommitdiffstats
path: root/Mailman/Cgi/subscribe.py
diff options
context:
space:
mode:
authorDavid Siebörger <drs@sieborger.nom.za>2018-01-29 14:58:42 +0200
committerDavid Siebörger <drs@sieborger.nom.za>2018-01-29 14:58:42 +0200
commit993d81c2ce98a6579b3110a6013c00090dfddaea (patch)
tree4dc585e377553f711eb22678eddd79460b3755a1 /Mailman/Cgi/subscribe.py
parente76749fe918f58c453aab77f0c53ac0342afdadf (diff)
downloadmailman2-993d81c2ce98a6579b3110a6013c00090dfddaea.tar.gz
mailman2-993d81c2ce98a6579b3110a6013c00090dfddaea.tar.xz
mailman2-993d81c2ce98a6579b3110a6013c00090dfddaea.zip
Allow the list subscription form to be protected from spam bots using
reCAPTCHA.
Diffstat (limited to 'Mailman/Cgi/subscribe.py')
-rwxr-xr-xMailman/Cgi/subscribe.py22
1 files changed, 22 insertions, 0 deletions
diff --git a/Mailman/Cgi/subscribe.py b/Mailman/Cgi/subscribe.py
index 232048d7..a53efefd 100755
--- a/Mailman/Cgi/subscribe.py
+++ b/Mailman/Cgi/subscribe.py
@@ -22,6 +22,9 @@ import os
import cgi
import time
import signal
+import urllib
+import urllib2
+import json
from Mailman import mm_cfg
from Mailman import Utils
@@ -131,6 +134,25 @@ def process_form(mlist, doc, cgidata, lang):
os.environ.get('HTTP_X_FORWARDED_FOR',
os.environ.get('REMOTE_ADDR',
'unidentified origin')))
+
+ # Check reCAPTCHA submission, if enabled
+ if mm_cfg.RECAPTCHA_SECRET_KEY:
+ request = urllib2.Request(
+ url = 'https://www.google.com/recaptcha/api/siteverify',
+ data = urllib.urlencode({
+ 'secret': mm_cfg.RECAPTCHA_SECRET_KEY,
+ 'response': cgidata.getvalue('g-recaptcha-response', ''),
+ 'remoteip': remote}))
+ try:
+ httpresp = urllib2.urlopen(request)
+ captcha_response = json.load(httpresp)
+ httpresp.close()
+ if not captcha_response['success']:
+ results.append(_('reCAPTCHA validation failed: %s' %
+ ', '.join(captcha_response['error-codes'])))
+ except urllib2.URLError as e:
+ results.append(_('reCAPTCHA could not be validated: %s' % e.reason))
+
# Are we checking the hidden data?
if mm_cfg.SUBSCRIBE_FORM_SECRET:
now = int(time.time())