]>
Commit | Line | Data |
---|---|---|
1 | from twisted.web import resource, server, static | |
2 | from twisted.mail.smtp import SMTPSenderFactory, ESMTPSenderFactory | |
3 | from twisted.internet import defer, reactor | |
4 | from StringIO import StringIO | |
5 | from email.mime.text import MIMEText | |
6 | import qwebirc.util as util | |
7 | import config | |
8 | ||
9 | class FeedbackException(Exception): | |
10 | pass | |
11 | ||
12 | class FeedbackEngine(resource.Resource): | |
13 | isLeaf = True | |
14 | ||
15 | def __init__(self, prefix): | |
16 | self.prefix = prefix | |
17 | self.__hit = util.HitCounter() | |
18 | ||
19 | @property | |
20 | def adminEngine(self): | |
21 | return dict(Sent=[(self.__hit,)]) | |
22 | ||
23 | def render_POST(self, request): | |
24 | text = request.args.get("feedback") | |
25 | if text is None: | |
26 | raise FeedbackException("No text.") | |
27 | if len(text) > 50000: | |
28 | raise FeedbackException("Too much text.") | |
29 | ||
30 | text = text[0] | |
31 | ||
32 | # basic checksum to stop really lame kiddies spamming, see feedback.js for js version | |
33 | checksum = 0; | |
34 | text = text.decode("utf-8", "ignore") | |
35 | for x in text: | |
36 | checksum = ((checksum + 1) % 256) ^ (ord(x) % 256); | |
37 | ||
38 | sentchecksum = int(request.args.get("c", [0])[0]) | |
39 | if checksum != sentchecksum: | |
40 | raise FeedbackException("Bad checksum: %d vs. %d" % (sentchecksum, checksum)) | |
41 | ||
42 | msg = MIMEText(text.encode("utf-8"), _charset="utf-8") | |
43 | msg["Subject"] = "qwebirc feedback from %s" % request.getClientIP() | |
44 | msg["From"] = config.FEEDBACK_FROM | |
45 | msg["To"] = config.FEEDBACK_TO | |
46 | email = StringIO(msg.as_string()) | |
47 | email.seek(0, 0) | |
48 | ||
49 | factorytype = SMTPSenderFactory | |
50 | factory = factorytype(fromEmail=config.FEEDBACK_FROM, toEmail=config.FEEDBACK_TO, file=email, deferred=defer.Deferred()) | |
51 | reactor.connectTCP(config.FEEDBACK_SMTP_HOST, config.FEEDBACK_SMTP_PORT, factory) | |
52 | self.__hit() | |
53 | return "1" |