Mercurial > hg > CAPTCHAmiddleware
comparison captchamiddleware/middleware.py @ 3:b0ef5452a740
beginning of captcha checking
author | k0s <k0scist@gmail.com> |
---|---|
date | Tue, 23 Feb 2010 20:08:22 -0500 |
parents | c861518b2a44 |
children | ce757057961c |
comparison
equal
deleted
inserted
replaced
2:c861518b2a44 | 3:b0ef5452a740 |
---|---|
41 f = file(self.dictionary) | 41 f = file(self.dictionary) |
42 | 42 |
43 # characters skimpygimpy doesnt know about | 43 # characters skimpygimpy doesnt know about |
44 forbidden_characters = set(["'"]) | 44 forbidden_characters = set(["'"]) |
45 | 45 |
46 self.words = [ i.strip() for i in f.readlines() | 46 self.words = [ i.strip().lower() for i in f.readlines() |
47 if (len(i.strip()) > self.minimum_length) | 47 if (len(i.strip()) > self.minimum_length) |
48 and not forbidden_characters.intersection(i) ] | 48 and not forbidden_characters.intersection(i) ] |
49 random.shuffle(self.words) | 49 random.shuffle(self.words) |
50 | 50 |
51 def check_captcha(self, request): | |
52 captcha = request.POST.get('captcha', '').lower() | |
53 key = request.POST.get('key') | |
54 if not key: return False | |
55 try: | |
56 key = int(key) | |
57 except ValueError: | |
58 return False | |
59 try: | |
60 value = self.words[key] | |
61 except IndexError: | |
62 raise # TODO: better error handling | |
63 return value == captcha | |
51 | 64 |
52 def __call__(self, environ, start_response): | 65 def __call__(self, environ, start_response): |
53 request = Request(environ) | 66 request = Request(environ) |
54 if request.method == 'POST' and not request.remote_user: | 67 if request.method == 'POST' and not request.remote_user: |
55 import pdb; pdb.set_trace() | 68 return self.app(environ, start_response) |
56 pass # TODO: check CAPTCHA | |
57 | 69 |
58 return LXMLMiddleware.__call__(self, environ, start_response) | 70 return LXMLMiddleware.__call__(self, environ, start_response) |
59 | 71 |
60 def manipulate(self, environ, tree): | 72 def manipulate(self, environ, tree): |
61 """manipulate the DOM; should return an etree._Element""" | 73 """manipulate the DOM; should return an etree._Element""" |
68 | 80 |
69 for element in tree.findall(".//form[@method='post']"): | 81 for element in tree.findall(".//form[@method='post']"): |
70 key = random.Random().randint(0, len(self.words)) | 82 key = random.Random().randint(0, len(self.words)) |
71 word = self.words[key] | 83 word = self.words[key] |
72 captcha = skimpyAPI.Pre(word).data() | 84 captcha = skimpyAPI.Pre(word).data() |
73 string = '<div class="captcha">%s<input type="hidden" value="%s"/><input type="text" name="captcha"/></div>' % (captcha, key) | 85 string = '<div class="captcha">%s<input type="hidden" name="key" value="%s"/><input type="text" name="captcha"/></div>' % (captcha, key) |
74 addition = etree.fromstring(string) | 86 addition = etree.fromstring(string) |
75 insertion_point = element.find('.' + self.path) | 87 insertion_point = element.find('.' + self.path) |
76 insertion_point.addprevious(addition) | 88 insertion_point.addprevious(addition) |
77 | 89 |
78 return tree | 90 return tree |