]> jfr.im git - irc/quakenet/qwebirc.git/blame_incremental - qwebirc/engines/feedbackengine.py
Merge.
[irc/quakenet/qwebirc.git] / qwebirc / engines / feedbackengine.py
... / ...
CommitLineData
1from twisted.web import resource, server, static
2from twisted.mail.smtp import SMTPSenderFactory, ESMTPSenderFactory
3from twisted.internet import defer, reactor
4from StringIO import StringIO
5from email.mime.text import MIMEText
6import qwebirc.util as util
7import config
8
9class FeedbackException(Exception):
10 pass
11
12class 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"