Uploaded image for project: 'mod_python'
  1. mod_python
  2. MODPYTHON-50

Session use outside of <Directory> directive.

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Closed
    • Minor
    • Resolution: Fixed
    • 3.1.4
    • 3.2.7
    • core
    • None

    Description

      MODPYTHON-31 was previously closed with outcome of "Won't Fix".
      The orginal problem as described in the report was actually not connected
      to the Python traceback which was supplied, but the Python traceback
      still identified a problem which shold be fixed. Have logged this separate
      report to cover this issue.

      The issue again came up recently on the mailing list as:

      http://www.modpython.org/pipermail/mod_python/2005-April/017933.html

      Specifically, if PythonHandler is specified outside of any <Directory>
      directive and sessions are used, you can get the error:

      Mod_python error: "PythonHandler mod_python.psp"

      Traceback (most recent call last):

      File "/usr/lib/python2.3/site-packages/mod_python/apache.py", line 299, in
      HandlerDispatch
      result = object(req)

      File "/usr/lib/python2.3/site-packages/mod_python/psp.py", line 297, in
      handler
      p.run()

      File "/usr/lib/python2.3/site-packages/mod_python/psp.py", line 191, in run
      session = Session.Session(req)

      File "/usr/lib/python2.3/site-packages/mod_python/Session.py", line 389, in
      Session
      timeout=timeout, lock=lock)

      File "/usr/lib/python2.3/site-packages/mod_python/Session.py", line 294, in
      _init_
      timeout=timeout, lock=lock)

      File "/usr/lib/python2.3/site-packages/mod_python/Session.py", line 132, in
      _init_
      Cookie.add_cookie(self._req, self.make_cookie())

      File "/usr/lib/python2.3/site-packages/mod_python/Session.py", line 160, in
      make_cookie
      c.path = dirpath[len(docroot):]

      TypeError: unsubscriptable object

      This is ultimately caused by code in BaseSession.make_cookie() which reads:

      def make_cookie(self):

      if self._secret:
      c = Cookie.SignedCookie(COOKIE_NAME, self._sid,
      secret=self._secret)
      else:
      c = Cookie.Cookie(COOKIE_NAME, self._sid)

      config = self._req.get_options()
      if config.has_key("ApplicationPath"):
      c.path = config["ApplicationPath"]
      else:
      docroot = self._req.document_root()

      1. the path where *Handler directive was specified
        dirpath = self._req.hlist.directory
        c.path = dirpath[len(docroot):]
      1. Sometimes there is no path, e.g. when Location
      2. is used. When Alias or UserDir are used, then
      3. the path wouldn't match the URI. In those cases
      4. just default to '/'
        if not c.path or not self._req.uri.startswith(c.path):
        c.path = '/'

      return c

      What happens when PythonHandler is defined outside of a <Directory>
      directive is that req.hlist.directory is None, thus indexing into dirpath
      fails.

      A workaround is to set ApplicationPath option, but true fix would be
      to write code something like:

      1. the path where *Handler directive was specified
        dirpath = self._req.hlist.directory
        if dirpath:
        docroot = self._req.document_root()
        c.path = dirpath[len(docroot):]
        else:
        c.path ='/'
      1. Sometimes there is no path, e.g. when Location
      2. is used. When Alias or UserDir are used, then
      3. the path wouldn't match the URI. In those cases
      4. just default to '/'
        if not c.path or not self._req.uri.startswith(c.path):
        c.path = '/'

      This would eliminate the problem altogether and avoid user having to
      use workaround of setting ApplicationPath option.

      Attachments

        Activity

          People

            nlehuen Nicolas Lehuen
            grahamd Graham Phillip Dumpleton
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: