Package: moin
Severity: normal
Tags: patch

Moin 1.3.5 and 1.5.0beta3 fail to correctly handle the use of
PythonOption to overcome problems with being run as a handler (incorrect
script_name and path_info).

RequestModPy uses a get method that's not always available with a
mod_python table object (worked around elsewhere in request.py, but not
here), and ignores the fact that script_name is not set correctly (or
usefully, at least) by Apache.

The script_name bug bites when the wiki is not at the top level
(e.g. "www.foo.com/wikis/moinwiki" instead of "www.foo.com/moinwiki",
which would work).

Patch provided *shouldn't* break anything on any other OS/webserver/config.

Patch follows:

--- MoinMoin/request.py 2005-10-30 11:55:39.000000000 +1300
+++ MoinMoin/request.py-new     2005-11-17 14:10:45.000000000 +1300
@@ -1786,8 +1786,9 @@
         except Exception, err:
             self.fail(err)
             
-    def rewriteURI(self, env):
-        """ Use PythonOption directive to rewrite URI
+    def fixURI(self, env):
+        """ Fix problems with script_name and path_info using
+        PythonOption directive to rewrite URI.
         
         This is needed when using Apache 1 or other server which does
         not support adding custom headers per request. With mod python we
@@ -1795,16 +1796,31 @@
         
             <Location /url/to/mywiki/>
                 PythonOption X-Moin-Location /url/to/mywiki/
-            </location>            
+            </location>
+
+        Note that *neither* script_name *nor* path_info can be trusted
+        when Moin is invoked as a mod_python handler with apache1, so we
+        must build both using request_uri and the provided PythonOption.
         """
         # Be compatible with release 1.3.5 "Location" option 
         # TODO: Remove in later release, we should have one option only.
         old_location = 'Location'
-        options = self.mpyreq.get_options()
+        options_table = self.mpyreq.get_options()
+        if not hasattr(options_table,'get'):
+            options=dict(options_table)
+        else:
+            options=options_table
         location = options.get(self.moin_location) or options.get(old_location)
         if location:
             env[self.moin_location] = location
-        RequestBase.rewriteURI(self, env)
+            # Try to recreate script_name and path_info from request_uri.
+            import urlparse
+            scriptAndPath = urlparse.urlparse(self.request_uri)[2]
+            self.script_name = location.rstrip('/')
+            path = scriptAndPath.replace(self.script_name, '', 1)            
+            self.path_info = wikiutil.url_unquote(path, want_unicode=False)
+
+        RequestBase.fixURI(self, env)
 
     def _setup_args_from_cgi_form(self, form=None):
         """ Override to use mod_python.util.FieldStorage 


-- System Information:
Debian Release: 3.1
  APT prefers testing
  APT policy: (500, 'testing')
Architecture: i386 (i686)
Kernel: Linux 2.6.11nwp1
Locale: LANG=en_NZ.UTF-8, LC_CTYPE=en_NZ.UTF-8 (charmap=UTF-8)


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to