Added
Link Here
|
1 |
--- MoinMoin/security/sec_recaptcha.py.orig 2018-05-02 03:24:23 UTC |
2 |
+++ MoinMoin/security/sec_recaptcha.py |
3 |
@@ -0,0 +1,93 @@ |
4 |
+# -*- coding: iso-8859-1 -*- |
5 |
+""" |
6 |
+ MoinMoin - recaptcha support |
7 |
+ |
8 |
+ Based heavily on the textcha support in textcha.py |
9 |
+ |
10 |
+ @copyright: 2011 by Steve McIntyre |
11 |
+ @copyright: 2018 by d42 |
12 |
+ @license: GNU GPL, see COPYING for details. |
13 |
+""" |
14 |
+import json |
15 |
+import urllib |
16 |
+import urllib2 |
17 |
+from textwrap import dedent |
18 |
+ |
19 |
+from MoinMoin import log |
20 |
+ |
21 |
+logging = log.getLogger(__name__) |
22 |
+ |
23 |
+ |
24 |
+class ReCaptcha(object): |
25 |
+ """ Recaptcha support """ |
26 |
+ |
27 |
+ VERIFY_URL = "https://www.google.com/recaptcha/api/siteverify" |
28 |
+ |
29 |
+ def __init__(self, request): |
30 |
+ """ Initialize the Recaptcha setup. |
31 |
+ |
32 |
+ @param request: the request object |
33 |
+ """ |
34 |
+ self.request = request |
35 |
+ self.user_info = request.user.valid and request.user.name or request.remote_addr |
36 |
+ |
37 |
+ self.site_key = getattr(request.cfg, "recaptcha_site_key", None) |
38 |
+ self.secret_key = getattr(request.cfg, "recaptcha_secret_key", None) |
39 |
+ |
40 |
+ def is_enabled(self): |
41 |
+ """ check if we're configured, i.e. we have a key |
42 |
+ """ |
43 |
+ return self.site_key and self.secret_key |
44 |
+ |
45 |
+ def check_answer_from_form(self, form=None): |
46 |
+ form = self.request.form if form is None else form |
47 |
+ |
48 |
+ if not self.is_enabled(): |
49 |
+ return True |
50 |
+ |
51 |
+ return self._submit( |
52 |
+ response=form.get("g-recaptcha-response"), |
53 |
+ remoteip=self.request.remote_addr |
54 |
+ ) |
55 |
+ |
56 |
+ def _submit(self, response, remoteip): |
57 |
+ |
58 |
+ def encode_if_necessary(s): |
59 |
+ return s.encode("utf-8") if isinstance(s, unicode) else s |
60 |
+ |
61 |
+ data = urllib.urlencode({ |
62 |
+ "secret": encode_if_necessary(self.secret_key), |
63 |
+ "response": encode_if_necessary(response), |
64 |
+ "remoteip": encode_if_necessary(remoteip), |
65 |
+ }) |
66 |
+ |
67 |
+ request = urllib2.Request( |
68 |
+ url=self.VERIFY_URL, |
69 |
+ data=data, |
70 |
+ headers={"Content-type": "application/x-www-form-urlencoded"} |
71 |
+ ) |
72 |
+ |
73 |
+ try: |
74 |
+ resp = urllib2.urlopen(request) |
75 |
+ http_code = resp.getcode() |
76 |
+ resp_json = json.loads(resp.read()) |
77 |
+ return resp_json["success"] if http_code == 200 else False |
78 |
+ except urllib2.URLError as e: |
79 |
+ logging.exception(e) |
80 |
+ return False |
81 |
+ finally: |
82 |
+ resp.close() |
83 |
+ |
84 |
+ def render(self, form=None): |
85 |
+ """ Checks if ReCaptchas are enabled and returns HTML for one, |
86 |
+ or an empty string if they are not enabled. |
87 |
+ |
88 |
+ @return: unicode result html |
89 |
+ """ |
90 |
+ if not self.is_enabled(): |
91 |
+ return u"" |
92 |
+ |
93 |
+ return dedent(u""" |
94 |
+ <script src='//www.google.com/recaptcha/api.js'></script> |
95 |
+ <div class="g-recaptcha" data-sitekey="{SITE_KEY}"></div> |
96 |
+ """.format(SITE_KEY=self.site_key)) |