-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinbound.py
More file actions
71 lines (59 loc) · 2.56 KB
/
Copy pathinbound.py
File metadata and controls
71 lines (59 loc) · 2.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
from django.utils import simplejson as json
from google.appengine.api.labs import taskqueue
from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
from models import *
import settings
from utils import render
# https://github.com/simonw/json-time/blob/master/jsontime.py
import re
# Allow 'abc' and 'abc.def' but not '.abc' or 'abc.'
valid_callback = re.compile('^\w+(\.\w+)*$')
class MessageHandler(webapp.RequestHandler):
def get(self):
result = {'status': 'failed'}
raw_sender_ip = self.request.remote_addr
sender_ip = IP.get_or_insert(raw_sender_ip)
if not sender_ip.blocked:
site = self.request.get('site', None)
access_key = self.request.get('key', None)
sender = self.request.get('sender', None)
subject = self.request.get('subject', None)
body = self.request.get('body', None)
referrer = self.request.referrer
if not referrer:
referrer = self.request.referer
if site and access_key:
site = Site.all().filter('domain =', site).filter('access_key =', access_key).fetch(1)
if len(site) == 1:
site = site[0]
else:
site = None
if site and sender and subject and body:
message = Message(site=site, sender=sender, subject=subject, body=body, sender_ip=sender_ip, referrer=referrer)
message.put()
if site.dispatch and site.recipients:
taskqueue.add(url='/tasks/dispatch/', params={ 'message_id': str(message.key()) })
result = {'status': 'success'}
sender_ip.count += 1
else:
sender_ip.blocked_count += 1
else:
sender_ip.blocked_count += 1
if not sender_ip.ip:
sender_ip.ip = raw_sender_ip
sender_ip.put()
if not sender_ip.geo and settings.IPINFODB_KEY:
taskqueue.add(url='/tasks/geolocate/', params={ 'ip_id': str(sender_ip.key()) })
self.response.headers["Content-Type"] = "application/javascript"
callback = self.request.get('callback', None)
if callback and valid_callback.match(callback):
result = '%s(%s)' % (callback, result)
self.response.out.write(result)
def main():
application = webapp.WSGIApplication([
('/inbound/', MessageHandler),
], debug=settings.DEBUG)
util.run_wsgi_app(application)
if __name__ == '__main__':
main()