X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=cgi-bin%2Froundup.cgi;h=1518c400b98111965ddeb1bc662dddc9103afc2b;hb=7520e02f86cafa83c87f69a0c671a583aae14368;hp=7e38c42d38433e00b74442ccf44fe39d48f9f837;hpb=2ff85c558ac895c7fe94eea6cc5486eca7a31344;p=roundup.git diff --git a/cgi-bin/roundup.cgi b/cgi-bin/roundup.cgi index 7e38c42..1518c40 100755 --- a/cgi-bin/roundup.cgi +++ b/cgi-bin/roundup.cgi @@ -16,21 +16,37 @@ # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. # -# $Id: roundup.cgi,v 1.17 2001-11-06 21:51:19 richard Exp $ +# $Id: roundup.cgi,v 1.33 2002-09-23 00:50:32 richard Exp $ # python version check +from roundup import version_check +from roundup.i18n import _ import sys -if int(sys.version[0]) < 2: - print "Content-Type: text/plain\n" - print "Roundup requires Python 2.0 or newer." - sys.exit(0) # ## Configuration # +# Configuration can also be provided through the OS environment (or via +# the Apache "SetEnv" configuration directive). If the variables +# documented below are set, they _override_ any configuation defaults +# given in this file. + +# TRACKER_HOMES is a list of instances, in the form +# "NAME=DIRNAME2=DIR2...", where is the directory path +# separator (";" on Windows, ":" on Unix). + +# Make sure the NAME part doesn't include any url-unsafe characters like +# spaces, as these confuse the cookie handling in browsers like IE. + +# ROUNDUP_LOG is the name of the logfile; if it's empty or does not exist, +# logging is turned off (unless you changed the default below). + +# ROUNDUP_DEBUG is a debug level, currently only 0 (OFF) and 1 (ON) are +# used in the code. Higher numbers means more debugging output. + # This indicates where the Roundup instance lives -ROUNDUP_INSTANCE_HOMES = { +TRACKER_HOMES = { 'demo': '/var/roundup/instances/demo', } @@ -39,6 +55,8 @@ ROUNDUP_INSTANCE_HOMES = { class DevNull: def write(self, info): pass + def close(self): + pass #LOG = open('/var/log/roundup.cgi.log', 'a') LOG = DevNull() @@ -46,75 +64,140 @@ LOG = DevNull() ## end configuration # + # # Set up the error handler # try: import traceback, StringIO, cgi - from roundup import cgitb + from roundup.cgi import cgitb except: - print "Content-Type: text/html\n" - print "Failed to import cgitb.
"
+    print "Content-Type: text/plain\n"
+    print _("Failed to import cgitb!\n\n")
     s = StringIO.StringIO()
     traceback.print_exc(None, s)
-    print cgi.escape(s.getvalue()), "
" + print s.getvalue() + +# +# Check environment for config items +# +def checkconfig(): + import os, string + global TRACKER_HOMES, LOG + + # see if there's an environment var. ROUNDUP_INSTANCE_HOMES is the + # old name for it. + if os.environ.has_key('ROUNDUP_INSTANCE_HOMES'): + homes = os.environ.get('ROUNDUP_INSTANCE_HOMES') + else: + homes = os.environ.get('TRACKER_HOMES', '') + if homes: + TRACKER_HOMES = {} + for home in string.split(homes, os.pathsep): + try: + name, dir = string.split(home, '=', 1) + except ValueError: + # ignore invalid definitions + continue + if name and dir: + TRACKER_HOMES[name] = dir + + logname = os.environ.get('ROUNDUP_LOG', '') + if logname: + LOG = open(logname, 'a') + + # ROUNDUP_DEBUG is checked directly in "roundup.cgi.client" + + +# +# Provide interface to CGI HTTP response handling +# class RequestWrapper: '''Used to make the CGI server look like a BaseHTTPRequestHandler ''' def __init__(self, wfile): self.wfile = wfile + def write(self, data): + self.wfile.write(data) def send_response(self, code): - self.wfile.write('Status: %s\r\n'%code) + self.write('Status: %s\r\n'%code) def send_header(self, keyword, value): - self.wfile.write("%s: %s\r\n" % (keyword, value)) + self.write("%s: %s\r\n" % (keyword, value)) def end_headers(self): - self.wfile.write("\r\n") + self.write("\r\n") +# +# Main CGI handler +# def main(out, err): import os, string import roundup.instance path = string.split(os.environ.get('PATH_INFO', '/'), '/') + request = RequestWrapper(out) + request.path = os.environ.get('PATH_INFO', '/') instance = path[1] - os.environ['INSTANCE_NAME'] = instance + os.environ['TRACKER_NAME'] = instance os.environ['PATH_INFO'] = string.join(path[2:], '/') - request = RequestWrapper(out) - if ROUNDUP_INSTANCE_HOMES.has_key(instance): - instance_home = ROUNDUP_INSTANCE_HOMES[instance] - instance = roundup.instance.open(instance_home) - from roundup import cgi_client - client = instance.Client(instance, request, os.environ) - try: - client.main() - except cgi_client.Unauthorised: - request.send_response(403) - request.send_header('Content-Type', 'text/html') - request.end_headers() - out.write('Unauthorised') - except cgi_client.NotFound: - request.send_response(404) - request.send_header('Content-Type', 'text/html') + if TRACKER_HOMES.has_key(instance): + # redirect if we need a trailing '/' + if len(path) == 2: + request.send_response(301) + # redirect + if os.environ.get('HTTPS', '') == 'on': + protocol = 'https' + else: + protocol = 'http' + absolute_url = '%s://%s%s/'%(protocol, os.environ['HTTP_HOST'], + os.environ['REQUEST_URI']) + request.send_header('Location', absolute_url) request.end_headers() - out.write('Not found: %s'%client.path) + out.write('Moved Permanently') + else: + instance_home = TRACKER_HOMES[instance] + instance = roundup.instance.open(instance_home) + from roundup.cgi.client import Unauthorised, NotFound + client = instance.Client(instance, request, os.environ) + try: + client.main() + except Unauthorised: + request.send_response(403) + request.send_header('Content-Type', 'text/html') + request.end_headers() + out.write('Unauthorised') + except NotFound: + request.send_response(404) + request.send_header('Content-Type', 'text/html') + request.end_headers() + out.write('Not found: %s'%client.path) + else: import urllib request.send_response(200) request.send_header('Content-Type', 'text/html') request.end_headers() - w = request.wfile.write - w('Roundup instances index\n') - w('

Roundup instances index

    \n') - for instance in ROUNDUP_INSTANCE_HOMES.keys(): - w('
  1. %s\n'%( - os.environ['SCRIPT_NAME'], urllib.quote(instance), - cgi.escape(instance))) - w('
') + w = request.write + w(_('Roundup instances index\n')) + w(_('

Roundup instances index

    \n')) + homes = TRACKER_HOMES.keys() + homes.sort() + for instance in homes: + w(_('
  1. %(instance_name)s\n')%{ + 'instance_url': os.environ['SCRIPT_NAME']+'/'+urllib.quote(instance), + 'instance_name': cgi.escape(instance)}) + w(_('
')) # # Now do the actual CGI handling -# +# out, err = sys.stdout, sys.stderr try: + # force input/output to binary (important for file up/downloads) + if sys.platform == "win32": + import os, msvcrt + msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY) + msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY) + checkconfig() sys.stdout = sys.stderr = LOG main(out, err) except SystemExit: @@ -125,82 +208,6 @@ except: cgitb.handler() sys.stdout.flush() sys.stdout, sys.stderr = out, err +LOG.close() -# -# $Log: not supported by cvs2svn $ -# Revision 1.16 2001/11/01 22:04:37 richard -# Started work on supporting a pop3-fetching server -# Fixed bugs: -# . bug #477104 ] HTML tag error in roundup-server -# . bug #477107 ] HTTP header problem -# -# Revision 1.15 2001/10/29 23:55:44 richard -# Fix to CGI top-level index (thanks Juergen Hermann) -# -# Revision 1.14 2001/10/27 00:22:35 richard -# Fixed some URL issues in roundup.cgi, again thanks Juergen Hermann. -# -# Revision 1.13 2001/10/05 02:23:24 richard -# . roundup-admin create now prompts for property info if none is supplied -# on the command-line. -# . hyperdb Class getprops() method may now return only the mutable -# properties. -# . Login now uses cookies, which makes it a whole lot more flexible. We can -# now support anonymous user access (read-only, unless there's an -# "anonymous" user, in which case write access is permitted). Login -# handling has been moved into cgi_client.Client.main() -# . The "extended" schema is now the default in roundup init. -# . The schemas have had their page headings modified to cope with the new -# login handling. Existing installations should copy the interfaces.py -# file from the roundup lib directory to their instance home. -# . Incorrectly had a Bizar Software copyright on the cgitb.py module from -# Ping - has been removed. -# . Fixed a whole bunch of places in the CGI interface where we should have -# been returning Not Found instead of throwing an exception. -# . Fixed a deviation from the spec: trying to modify the 'id' property of -# an item now throws an exception. -# -# Revision 1.12 2001/10/01 05:55:41 richard -# Fixes to the top-level index -# -# Revision 1.11 2001/09/29 13:27:00 richard -# CGI interfaces now spit up a top-level index of all the instances they can -# serve. -# -# Revision 1.10 2001/08/07 00:24:42 richard -# stupid typo -# -# Revision 1.9 2001/08/07 00:15:51 richard -# Added the copyright/license notice to (nearly) all files at request of -# Bizar Software. -# -# Revision 1.8 2001/08/05 07:43:52 richard -# Instances are now opened by a special function that generates a unique -# module name for the instances on import time. -# -# Revision 1.7 2001/08/03 01:28:33 richard -# Used the much nicer load_package, pointed out by Steve Majewski. -# -# Revision 1.6 2001/08/03 00:59:34 richard -# Instance import now imports the instance using imp.load_module so that -# we can have instance homes of "roundup" or other existing python package -# names. -# -# Revision 1.5 2001/07/29 07:01:39 richard -# Added vim command to all source so that we don't get no steenkin' tabs :) -# -# Revision 1.4 2001/07/23 04:47:27 anthonybaxter -# renamed ROUNDUPS to ROUNDUP_INSTANCE_HOMES -# sys.exit(0) if python version wrong. -# -# Revision 1.3 2001/07/23 04:33:30 richard -# brought the CGI instance config dict in line with roundup-server -# -# Revision 1.2 2001/07/23 04:31:40 richard -# Fixed the roundup CGI script for updates to cgi_client.py -# -# Revision 1.1 2001/07/22 11:47:07 richard -# More Grande Splite -# -# # vim: set filetype=python ts=4 sw=4 et si