| OLD | NEW | 
|---|
| 1 # coding: utf-8 | 1 # coding: utf-8 | 
| 2 | 2 | 
| 3 # This file is part of the Adblock Plus web scripts, | 3 # This file is part of the Adblock Plus web scripts, | 
| 4 # Copyright (C) 2006-2015 Eyeo GmbH | 4 # Copyright (C) 2006-2015 Eyeo GmbH | 
| 5 # | 5 # | 
| 6 # Adblock Plus is free software: you can redistribute it and/or modify | 6 # Adblock Plus is free software: you can redistribute it and/or modify | 
| 7 # it under the terms of the GNU General Public License version 3 as | 7 # it under the terms of the GNU General Public License version 3 as | 
| 8 # published by the Free Software Foundation. | 8 # published by the Free Software Foundation. | 
| 9 # | 9 # | 
| 10 # Adblock Plus is distributed in the hope that it will be useful, | 10 # Adblock Plus is distributed in the hope that it will be useful, | 
| 11 # but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 # but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| 12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
| 13 # GNU General Public License for more details. | 13 # GNU General Public License for more details. | 
| 14 # | 14 # | 
| 15 # You should have received a copy of the GNU General Public License | 15 # You should have received a copy of the GNU General Public License | 
| 16 # along with Adblock Plus.  If not, see <http://www.gnu.org/licenses/>. | 16 # along with Adblock Plus.  If not, see <http://www.gnu.org/licenses/>. | 
| 17 | 17 | 
| 18 import fcntl | 18 import fcntl | 
| 19 import hmac | 19 import hmac | 
| 20 import hashlib | 20 import hashlib | 
| 21 import wsgiref.util | 21 import wsgiref.util | 
| 22 from urlparse import parse_qsl, urljoin | 22 from urlparse import parse_qsl, urljoin | 
| 23 from urllib import urlencode, quote | 23 from urllib import urlencode, quote | 
| 24 | 24 | 
| 25 from sitescripts.utils import get_config, sendMail, encode_email_address | 25 from sitescripts.utils import get_config, sendMail, encode_email_address | 
| 26 from sitescripts.web import url_handler, form_handler, send_simple_response | 26 from sitescripts.web import url_handler, form_handler, send_simple_response | 
| 27 | 27 | 
| 28 VERIFICATION_PATH = '/verifyEmail' | 28 VERIFICATION_PATH = '/verifyEmail' | 
|  | 29 DEFAULT_PRODUCT = 'adblockbrowser' | 
| 29 | 30 | 
| 30 def sign(config, data): | 31 def sign(config, data): | 
| 31   secret = config.get('submit_email', 'secret') | 32   secret = config.get('submit_email', 'secret') | 
| 32   return hmac.new(secret, data, hashlib.sha1).hexdigest() | 33   return hmac.new(secret, data, hashlib.sha1).hexdigest() | 
| 33 | 34 | 
| 34 @url_handler('/submitEmail') | 35 @url_handler('/submitEmail') | 
| 35 @form_handler | 36 @form_handler | 
| 36 def submit_email(environ, start_response, data): | 37 def submit_email(environ, start_response, data): | 
| 37   email = data.get('email', '').strip() | 38   email = data.get('email', '').strip() | 
| 38   try: | 39   try: | 
| 39     email = encode_email_address(email) | 40     email = encode_email_address(email) | 
| 40   except ValueError: | 41   except ValueError: | 
| 41     return send_simple_response( | 42     return send_simple_response( | 
| 42       start_response, 400, | 43       start_response, 400, | 
| 43       'Please enter a valid email address.' | 44       'Please enter a valid email address.' | 
| 44     ) | 45     ) | 
| 45 | 46 | 
| 46   config = get_config() | 47   config = get_config() | 
| 47   params = [('email', email), ('signature', sign(config, email))] | 48   params = [('email', email), ('signature', sign(config, email))] | 
| 48   lang = data.get('lang') | 49   lang = data.get('lang') | 
| 49   if lang: | 50   if lang: | 
| 50     params.append(('lang', lang)) | 51     params.append(('lang', lang)) | 
| 51 | 52 | 
|  | 53   product = data.get('product', DEFAULT_PRODUCT) | 
|  | 54   email_template = product + '_verification_email_template' | 
|  | 55   params.append(('product', product)) | 
|  | 56 | 
| 52   sendMail( | 57   sendMail( | 
| 53     config.get('submit_email', 'verification_email_template'), | 58     config.get('submit_email', email_template), | 
| 54     { | 59     { | 
| 55       'recipient': email, | 60       'recipient': email, | 
| 56       'verification_url': '%s?%s' % ( | 61       'verification_url': '%s?%s' % ( | 
| 57         urljoin(wsgiref.util.application_uri(environ), VERIFICATION_PATH), | 62         urljoin(wsgiref.util.application_uri(environ), VERIFICATION_PATH), | 
| 58         urlencode(params) | 63         urlencode(params) | 
| 59       ) | 64       ) | 
| 60     } | 65     } | 
| 61   ) | 66   ) | 
| 62 | 67 | 
| 63   return send_simple_response( | 68   return send_simple_response( | 
| 64     start_response, 200, | 69     start_response, 200, | 
| 65     'A confirmation email has been sent. Please check ' | 70     'A confirmation email has been sent. Please check ' | 
| 66     'your email and click the confirmation link.' | 71     'your email and click the confirmation link.' | 
| 67   ) | 72   ) | 
| 68 | 73 | 
| 69 @url_handler(VERIFICATION_PATH) | 74 @url_handler(VERIFICATION_PATH) | 
| 70 def verify_email(environ, start_response): | 75 def verify_email(environ, start_response): | 
| 71   config = get_config() | 76   config = get_config() | 
| 72   params = dict(parse_qsl(environ.get('QUERY_STRING', ''))) | 77   params = dict(parse_qsl(environ.get('QUERY_STRING', ''))) | 
| 73 | 78 | 
| 74   email = params.get('email', '') | 79   email = params.get('email', '') | 
| 75   signature = params.get('signature', '') | 80   signature = params.get('signature', '') | 
| 76   if sign(config, email) != signature: | 81   if sign(config, email) != signature: | 
| 77     return send_simple_response( | 82     return send_simple_response( | 
| 78       start_response, 403, | 83       start_response, 403, | 
| 79       'Invalid signature in verification request.' | 84       'Invalid signature in verification request.' | 
| 80     ) | 85     ) | 
| 81 | 86 | 
| 82   filename = config.get('submit_email', 'filename') | 87   product = params.get('product', DEFAULT_PRODUCT) | 
|  | 88   filename = config.get('submit_email', product + '_filename') | 
|  | 89 | 
| 83   with open(filename, 'ab', 0) as file: | 90   with open(filename, 'ab', 0) as file: | 
| 84     fcntl.lockf(file, fcntl.LOCK_EX) | 91     fcntl.lockf(file, fcntl.LOCK_EX) | 
| 85     try: | 92     try: | 
| 86       print >>file, email | 93       print >>file, email | 
| 87     finally: | 94     finally: | 
| 88       fcntl.lockf(file, fcntl.LOCK_UN) | 95       fcntl.lockf(file, fcntl.LOCK_UN) | 
| 89 | 96 | 
| 90   location = config.get('submit_email', 'successful_verification_redirect_locati
     on') | 97   location = config.get('submit_email', 'successful_verification_redirect_locati
     on') | 
| 91   location = location.format(lang=quote(params.get('lang') or 'en', '')) | 98   location = location.format(lang=quote(params.get('lang') or 'en', '')) | 
| 92   start_response('303 See Other', [('Location', location)]) | 99   start_response('303 See Other', [('Location', location)]) | 
| 93   return [] | 100   return [] | 
| OLD | NEW | 
|---|