[or-cvs] r21894: {check} Make TorBulkExitList.py and TorCheck.py work as wsgi applica (check/trunk/cgi-bin)

Peter Palfrader peter at palfrader.org
Tue Mar 9 18:16:36 UTC 2010


Author: weasel
Date: 2010-03-09 18:16:36 +0000 (Tue, 09 Mar 2010)
New Revision: 21894

Modified:
   check/trunk/cgi-bin/TorBulkExitList.py
   check/trunk/cgi-bin/TorCheck.py
Log:
Make TorBulkExitList.py and TorCheck.py work as wsgi applications

Modified: check/trunk/cgi-bin/TorBulkExitList.py
===================================================================
--- check/trunk/cgi-bin/TorBulkExitList.py	2010-03-09 18:16:15 UTC (rev 21893)
+++ check/trunk/cgi-bin/TorBulkExitList.py	2010-03-09 18:16:36 UTC (rev 21894)
@@ -1,3 +1,4 @@
+#!/usr/bin/python
 import re
 import socket
 import stat
@@ -4,8 +5,7 @@
 import os
 import time
 import DNS
-from mod_python import apache
-from mod_python import util
+import cgi
 
 DNS.ParseResolvConf()
 def bulkCheck(RemoteServerIP, RemotePort):
@@ -72,7 +72,7 @@
     RawExitListURL = "http://exitlist.torproject.org/exitAddresses"
 
     # Currently fake this and return a static file:
-    RawExitList = '/var/lib/tordnsel/state/exit-addresses'
+    RawExitList = '/srv/check.torproject.org/tordnsel/state/exit-addresses'
 
     return RawExitList
 
@@ -179,10 +179,9 @@
         # that we don't understand. Return a failure code.
         return 2
 
-def parseAddress(req):
+def parseAddress(formSubmission):
     # Get the ip from apache
     user_supplied_ip = None
-    formSubmission=util.FieldStorage(req)
     user_supplied_ip = formSubmission.getfirst("ip", None)
 
     # Check the IP, fail with a None
@@ -197,10 +196,9 @@
 
     return parsed_ip 
 
-def parsePort(req):
+def parsePort(formSubmission):
     # Get the port from apache
     user_supplied_port = None
-    formSubmission = util.FieldStorage(req)
     user_supplied_port = formSubmission.getfirst("port", "80")
 
     # Verify that the port is a number between 1 and 65535
@@ -215,15 +213,15 @@
 
     return parsed_port
     
-def handler(req):
-    
-    req.send_http_header()
-    req.content_type = 'text/plain; charset=utf-8'
+def handler(req, environ, start_response):
+    formSubmission = cgi.FieldStorage(fp=environ['wsgi.input'], environ=environ)
 
-    RemoteServerIP = parseAddress(req)
-    RemotePort = parsePort(req)
+    RemoteServerIP = parseAddress(formSubmission)
+    RemotePort = parsePort(formSubmission)
     
     if RemoteServerIP is not None:
+        response_headers = [('Content-type', 'text/plain; charset=utf-8')]
+        start_response('200 OK', response_headers)
 
         updateCache()
         TestedExits = bulkCheck(RemoteServerIP, RemotePort)
@@ -231,8 +229,8 @@
         " on Port " + RemotePort + " #\n")
 
         querystring = "ip=%s" % RemoteServerIP
-	if RemotePort != "80":
-		querystring += "&port=%s" % RemotePort
+        if RemotePort != "80":
+            querystring += "&port=%s" % RemotePort
 
         req.write("# You can update this list by visiting " + \
         "https://check.torproject.org/cgi-bin/TorBulkExitList.py?%s #\n" % querystring)
@@ -243,12 +241,11 @@
         for exit in TestedExits:
             req.write(str(exit))
 
-        return apache.OK
-
+        return
     else:
+        response_headers = [('Content-type', 'text/html; charset=utf-8')]
+        start_response('200 OK', response_headers)
 
-        req.send_http_header()
-        req.content_type = 'text/html; charset=utf-8'
         req.write('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" '\
         '"http://www.w3.org/TR/REC-html40/loose.dtd">\n')
         req.write('<html>\n')
@@ -273,7 +270,7 @@
         req.write('\n')
 
         req.write('<img alt="' + ("Tor icon") + \
-        '" src="https://check.torproject.org/images/tor-on.png">\n<br>')
+        '" src="/images/tor-on.png">\n<br>')
         req.write('<br>\n<br>\n')
        
         req.write('Welcome to the Tor Bulk Exit List exporting tool.<br><br>\n')
@@ -302,5 +299,15 @@
         req.write('</body>')
         req.write('</html>')
 
-        return apache.OK
+class FakeReq(list):
+    def write(self, str):
+        self.append(str)
 
+def application(environ, start_response):
+    req = FakeReq()
+    handler(req, environ, start_response)
+    return req
+
+# vim:set ts=4:
+# vim:set et:
+# vim:set shiftwidth=4:

Modified: check/trunk/cgi-bin/TorCheck.py
===================================================================
--- check/trunk/cgi-bin/TorCheck.py	2010-03-09 18:16:15 UTC (rev 21893)
+++ check/trunk/cgi-bin/TorCheck.py	2010-03-09 18:16:36 UTC (rev 21894)
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python
 # -*- coding: utf-8 -*-
 """
  TorCheck.py
@@ -30,15 +30,18 @@
 except ImportError:
     antigravity = None
 
-import DNS 
+import cgi
+import DNS
 # This is pydns and can be downloaded from http://pydns.sourceforge.net/ 
 # Or use the Debian package listed above
-from mod_python import apache
-from mod_python import util
 import cgitb; cgitb.enable()
 import gettext
 import locale
+import os
 
+#os.environ['LOCPATH']='/usr/share/locale:/srv/check.torproject.org/trunk/i18n/locale'
+localedir ='/srv/check.torproject.org/trunk/i18n/locale'
+
 # We could also explictly query the remote EL server
 # This is not as good as using a cache for obvious reasons
 DNS.DiscoverNameServers()
@@ -148,19 +151,16 @@
     # Fall back to default
     return default_locale
     
-def showLogo(req):
+def showLogo(formSubmission):
     # By default, we'll show a logo
     show_logo = True
-    formSubmission=util.FieldStorage(req)
     hide_logo = formSubmission.getfirst("small", None)
     # hide_logo isn't cleaned - do not use it for anything else
     if hide_logo:
         return False 
     return show_logo
 
-def parseLang(req):
-    user_supplied_lang = None
-    formSubmission=util.FieldStorage(req)
+def parseLang(formSubmission):
     user_supplied_lang = formSubmission.getfirst("lang", None)
 
     # Find the best match for the requested language
@@ -168,7 +168,7 @@
 
     # i18n with Unicode!
     # Ensure you have properly installed TorCheck.{po,pot,mo} files
-    lang = gettext.translation('TorCheck', languages=[locale])
+    lang = gettext.translation('TorCheck', localedir=localedir, languages=[locale], fallback=True)
     lang.install()
 
 def printTorButton(req, UsingTor):
@@ -182,23 +182,22 @@
     req.write('</body></html>')
 
 # Now that we know everything we need, lets print the website
-def handler(req):
-
+def handler(req, environ, start_response):
     # Make a DNS request to the EL and decide what to tell the user
-    UsingTor = isUsingTor(req.connection.remote_ip, "80")
+    UsingTor = isUsingTor(environ['REMOTE_ADDR'], "80")
     # Try to hit a cornercase where the user can exit to 443 but not 80
     if UsingTor != 0:
-        UsingTor = isUsingTor(req.connection.remote_ip, "443")
+        UsingTor = isUsingTor(environ['REMOTE_ADDR'], "443")
 
-    req.content_type = 'text/html; charset=utf-8'
-    req.send_http_header()
+    response_headers = [('Content-type', 'text/html; charset=utf-8')]
+    start_response('200 OK', response_headers)
 
     # We want to catch TorButton queries so they don't output overhead
     # This is to make all the data fit into one cell
-    formSubmission=util.FieldStorage(req)
+    formSubmission = cgi.FieldStorage(fp=environ['wsgi.input'], environ=environ)
     if formSubmission.getfirst("TorButton", None):
         printTorButton(req, UsingTor)
-        return apache.OK
+        return
 
     # First lets construct the simple webpage:
     req.write('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" '\
@@ -219,8 +218,8 @@
     req.write('</head>\n')
     req.write('<body>\n')
 
-    parseLang(req)
-    hideLogo = showLogo(req)
+    parseLang(formSubmission)
+    hideLogo = showLogo(formSubmission)
 
     req.write('<center>\n')
 
@@ -228,7 +227,7 @@
         req.write('\n')
         if hideLogo:
             req.write('<img alt="' + _("Congratulations. You are using Tor.") + \
-            '" src="https://check.torproject.org/images/tor-on.png">\n<br>')
+            '" src="/images/tor-on.png">\n<br>')
         req.write('<h1 style="color: #0A0">\n')
         req.write(_('Congratulations. You are using Tor.'))
         req.write('<br>\n<br>\n')
@@ -241,7 +240,7 @@
         req.write('\n')
         if hideLogo:
             req.write('<img alt="' + _("Sorry. You are not using Tor.") + '" '\
-            'src="https://check.torproject.org/images/tor-off.png">\n<br>')
+            'src="/images/tor-off.png">\n<br>')
         req.write('<h1 style="color: #A00">')
         req.write(_('Sorry. You are not using Tor.'))
         req.write('<br>\n<br>\n')
@@ -254,7 +253,7 @@
     elif UsingTor == 2:
         req.write('\n')
         req.write('<img alt="' + _("Sorry, your query failed or an unexpected response was received.") + '" '\
-        'src="https://check.torproject.org/images/tor-off.png">\n<br>')
+        'src="/images/tor-off.png">\n<br>')
         req.write('<h1 style="color: #A00">\n')
         req.write(_('Sorry, your query failed or an unexpected response was received.'))
         req.write('<br>\n')
@@ -270,7 +269,7 @@
     req.write(_('Additional information: '))
     req.write('<br>\n')
     req.write(_('Your IP address appears to be: '))
-    req.write('<b>%s</b><br>\n' % req.connection.remote_ip )
+    req.write('<b>%s</b><br>\n' % environ['REMOTE_ADDR'] )
     req.write(_('This small script is powered by <a href="http://exitlist.torproject.org/">tordnsel</a>'))
     req.write('<br>')
     req.write(_('You may also be interested in the <a href="/cgi-bin/TorBulkExitList.py">Tor Bulk Exit List Exporter</a>'))
@@ -294,4 +293,16 @@
     req.write('</body>')
     req.write('</html>')
 
-    return apache.OK
+
+class FakeReq(list):
+    def write(self, str):
+        self.append(str)
+
+def application(environ, start_response):
+    req = FakeReq()
+    handler(req, environ, start_response)
+    return req
+
+# vim:set ts=4:
+# vim:set et:
+# vim:set shiftwidth=4:



More information about the tor-commits mailing list