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