#!/usr/bin/python2.5 # -*- coding: utf-8 -*- """ gettor.py by Jacob Appelbaum This program will hand out Tor via email to supported systems. This program is Free Software released under the GPLv3. It is intended to be used in a .forward file as part of a pipe like so: cat <<'EOF'> .forward |/usr/local/bin/gettor.py EOF You should have a dist/current/ mirror in a directory that gettor can read. Such a mirror can be created like so: cd /usr/local/ rsync -av rsync://rsync.torproject.org/tor/dist/current tor-dist-current/ You can keep it updated with a cronjob like so: MirrorDir=/usr/local/tor-dist-current/ 0 3 * * * rsync -a rsync://rsync.torproject.org/tor/dist/current/ $MirrorDir You should ensure that for each file and signature pair you wish to distribute, you have created a zip file containing both. While this program isn't written in a threaded manner per se, it is designed to function as if it will be called as a pipe many times at once. There is a slight desynchronization with blacklist entry checking and may result in false negatives. This isn't perfect but it is designed to be lightweight. It could be fixed easily with a shared locking system but this isn't implemented yet. """ __program__ = 'gettor.py' __version__ = '20080713.00' __url__ = 'https://tor-svn.freehaven.net/svn/tor/trunk/contrib/gettor/' __author__ = 'Jacob Appelbaum ' __copyright__ = 'Copyright (c) 2008, Jacob Appelbaum' __license__ = 'See LICENSE for licensing information' try: from future import antigravity except ImportError: antigravity = None import syslog import gettor_blacklist import gettor_requests import gettor_responses if __name__ == "__main__": rawMessage = gettor_requests.getMessage() parsedMessage = gettor_requests.parseMessage(rawMessage) if not parsedMessage: syslog.syslog("gettor: No parsed message. Dropping message.") print "gettor: No parsed message. Dropping message." exit(1) signature = False signature = gettor_requests.verifySignature(rawMessage) print "Signature is : " + str(signature) replyTo = False srcEmail = "gettor@torproject.org" # TODO XXX: # Make the zip files and ensure they match packageList # Make each zip file like so: # zip -9 windows-bindle.z \ # vidalia-bundle-0.2.0.29-rc-0.1.6.exe \ # vidalia-bundle-0.2.0.29-rc-0.1.6.exe.asc # packageList = { "windows-bundle": "/tmp/windows-bundle.z", "macosx-bundle": "/tmp/macosx-bundle.z", "linux-bundle": "/tmp/linux-bundle.z", "source-bundle": "/tmp/source-bundle.z" } # XXX TODO: Ensure we have a proper replyTO or bail out (majorly malformed mail). replyTo = gettor_requests.parseReply(parsedMessage) if not signature: # Check to see if we've helped them to understand that they need DKIM in the past previouslyHelped = gettor_blacklist.blackList(replyTo) if not replyTo: syslog.syslog("No help dispatched. Invalid reply address for user.") print "No help dispatched. Invalid reply address for user." exit(1) if not signature and previouslyHelped: syslog.syslog("gettor: Unsigned messaged to gettor by blacklisted user dropped.") print "No help dispatched. Unsigned and unhelped for blacklisted user." exit(1) if not signature and not previouslyHelped: # Reply with some help and bail out # Someday call blackList(replyTo) message = """ You should try your request again with a provider that implements DKIM. Sorry. """ gettor_responses.sendHelp(message, srcEmail, replyTo) print "attempting to send email from: " + srcEmail + "The mail is sent to: " + replyTo syslog.syslog("gettor: Unsigned messaged to gettor. We issued some help about using DKIM.") print "gettor: Unsigned messaged to gettor. We issued some help about using DKIM." exit(0) if signature: syslog.syslog("gettor: Signed messaged to gettor.") print "gettor: Signed messaged to gettor." try: print "gettor: Parsing now." package = gettor_requests.parseRequest(parsedMessage, packageList) except: package = None if package == "windows-bundle": print "gettor: " + package + " selected." syslog.syslog("gettor: " + package + " selected.") message = "Here's your requested software as a zip file. Please \ verify the signature." print "attempting to send email from: " + srcEmail + "The mail is sent to: " + replyTo gettor_responses.sendPackage(message, srcEmail, replyTo, packageList[package]) exit(0) else: print "Package request is unknown: " + package message = " Your request was misunderstood. Please select one of the \ following packages: " + packageList.keys() gettor_responses.sendHelp(message, srcEmail, replyTo) print "attempting to send email from: " + srcEmail + "The mail is sent to: " + replyTo syslog.syslog("gettor: Signed messaged to gettor. We issued some help about proper email formatting.") print "gettor: Signed messaged to gettor. We issued some help about proper email formatting." exit(0)