]>
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 |
85f01e3f | 6 | import qwebirc.util as util |
391f51ff CP |
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 | |
85f01e3f CP |
17 | self.__hit = util.HitCounter() |
18 | ||
19 | @property | |
20 | def adminEngine(self): | |
21 | return dict(Sent=[(self.__hit,)]) | |
22 | ||
391f51ff CP |
23 | def render_POST(self, request): |
24 | text = request.args.get("feedback") | |
25 | if text is None: | |
6d66b5de | 26 | raise FeedbackException("No text.") |
391f51ff | 27 | if len(text) > 50000: |
6d66b5de | 28 | raise FeedbackException("Too much text.") |
391f51ff CP |
29 | |
30 | text = text[0] | |
31 | ||
32 | # basic checksum to stop really lame kiddies spamming, see feedback.js for js version | |
33 | checksum = 0; | |
6d66b5de | 34 | text = text.decode("utf-8", "ignore") |
391f51ff | 35 | for x in text: |
6d66b5de | 36 | checksum = ((checksum + 1) % 256) ^ (ord(x) % 256); |
391f51ff | 37 | |
6d66b5de CP |
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") | |
8eecfef7 | 43 | msg["Subject"] = "qwebirc feedback from %s" % request.getClientIP() |
6d66b5de CP |
44 | msg["From"] = config.FEEDBACK_FROM |
45 | msg["To"] = config.FEEDBACK_TO | |
46 | email = StringIO(msg.as_string()) | |
391f51ff CP |
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) | |
85f01e3f | 52 | self.__hit() |
8eecfef7 | 53 | return "1" |