|  | @@ -1,141 +0,0 @@
 | 
	
		
			
				|  |  | -#!/usr/bin/python2.5
 | 
	
		
			
				|  |  | -# -*- coding: utf-8 -*-
 | 
	
		
			
				|  |  | -"""
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | - gettor.py by Jacob Appelbaum <jacob@appelbaum.net>
 | 
	
		
			
				|  |  | - 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 <jacob@appelbaum.net>'
 | 
	
		
			
				|  |  | -__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)
 |