Files
reddit/scripts/tracker.py
Neil Williams 93a65a6a3a Move onload out of the app.
We need onload to be able to get a client-IP based
tracking validation hash, but it doesn't actually need
to do any database work to make those hashes. It also
fails a huge number of times per day. This moves the hash
calculation out to an external app with no db dependencies.
2011-10-06 08:22:16 -07:00

66 lines
1.9 KiB
Python

#!/usr/bin/python
import time
import hashlib
from ConfigParser import RawConfigParser
from wsgiref.handlers import format_date_time
from flask import Flask, request, json, make_response, abort, redirect
application = Flask(__name__)
# fullname can include the sr name and a codename, leave room for those
MAX_FULLNAME_LENGTH = 128
def jsonpify(callback_name, data):
data = callback_name + '(' + json.dumps(data) + ')'
response = make_response(data)
response.mimetype = 'text/javascript'
return response
config = RawConfigParser()
config.read(['production.ini'])
tracking_secret = config.get('DEFAULT', 'tracking_secret')
adtracker_url = config.get('DEFAULT', 'adtracker_url')
@application.route('/fetch-trackers')
def fetch_trackers():
ip = request.environ['REMOTE_ADDR']
jsonp_callback = request.args['callback']
ids = request.args.getlist('ids[]')
if len(ids) > 32:
abort(400)
hashed = {}
for fullname in ids:
if len(fullname) > MAX_FULLNAME_LENGTH:
continue
text = ''.join((ip, fullname, tracking_secret))
hashed[fullname] = hashlib.sha1(text).hexdigest()
return jsonpify(jsonp_callback, hashed)
@application.route('/click')
def click_redirect():
ip = request.environ['REMOTE_ADDR']
destination = request.args['url']
fullname = request.args['id']
observed_hash = request.args['hash']
expected_hash_text = ''.join((ip, fullname, tracking_secret))
expected_hash = hashlib.sha1(expected_hash_text).hexdigest()
if expected_hash != observed_hash:
abort(403)
now = format_date_time(time.time())
response = redirect(destination)
response.headers['Cache-control'] = 'no-cache'
response.headers['Pragma'] = 'no-cache'
response.headers['Date'] = now
response.headers['Expires'] = now
return response
if __name__ == "__main__":
application.run()