]> jfr.im git - irc/quakenet/qwebirc.git/blame - qwebirc/engines/feedbackengine.py
npe fix
[irc/quakenet/qwebirc.git] / qwebirc / engines / feedbackengine.py
CommitLineData
391f51ff
CP
1from twisted.web import resource, server, static
2from twisted.mail.smtp import SMTPSenderFactory, ESMTPSenderFactory
3from twisted.internet import defer, reactor
4from StringIO import StringIO
6d66b5de 5from email.mime.text import MIMEText
85f01e3f 6import qwebirc.util as util
391f51ff
CP
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
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"