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