]> jfr.im git - irc/quakenet/qwebirc.git/blob - qwebirc/engines/feedbackengine.py
Clean up more error messages, hide directories and use proper error responses.
[irc/quakenet/qwebirc.git] / qwebirc / engines / feedbackengine.py
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.client[1])
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"