Mercurial > p > roundup > code
annotate roundup/cgi/apache.py @ 5201:a9ace22e0a2f
issue 2550690 - Adding anti-csrf measures to roundup following
https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet
and
https://seclab.stanford.edu/websec/csrf/csrf.pdf
Basically implement Synchronizer (CSRF) Tokens per form on a page.
Single use (destroyed once used). Random input data for the token
includes:
system random implementation in python using /dev/urandom
(fallback to random based on timestamp as the seed. Not
as good, but should be ok for the short lifetime of the
token??)
the id (in cpython it's the memory address) of the object
requesting a token. In theory this depends on memory layout, the
history of the process (how many previous objects have been
allocated from the heap etc.) I claim without any proof that for
long running processes this is another source of randomness. For
short running processes with little activity it could be guessed.
last the floating point time.time() value is added. This may
only have 1 second resolution so may be guessable.
Hopefully for a short lived (2 week by default) token this is
sufficient. Also in the current implementation the user is notified when
validation fails and is told why. This allows the roundup admin to find
the log entry (at error level) and try to resolve the issue. In the
future user notification may change but for now this is probably best.
| author | John Rouillard <rouilj@ieee.org> |
|---|---|
| date | Sat, 18 Mar 2017 16:59:01 -0400 |
| parents | 302bc481ceb1 |
| children | 92757447dcf0 86b6cea7a975 |
| rev | line source |
|---|---|
|
2552
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
1 # mod_python interface for Roundup Issue Tracker |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
2 # |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
3 # This module is free software, you may redistribute it |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
4 # and/or modify under the same terms as Python. |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
5 # |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
6 # This module provides Roundup Web User Interface |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
7 # using mod_python Apache module. Initially written |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
8 # with python 2.3.3, mod_python 3.1.3, roundup 0.7.0. |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
9 # |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
10 # This module operates with only one tracker |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
11 # and must be placed in the tracker directory. |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
12 # |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
13 |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
14 import cgi |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
15 import os |
|
4213
302bc481ceb1
Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents:
4047
diff
changeset
|
16 import threading |
|
2552
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
17 |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
18 from mod_python import apache |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
19 |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
20 import roundup.instance |
|
2560
d45f1669599c
added 'TrackerLanguage' option;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2552
diff
changeset
|
21 from roundup.cgi import TranslationService |
|
2552
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
22 |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
23 class Headers(dict): |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
24 |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
25 """HTTP headers wrapper""" |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
26 |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
27 def __init__(self, headers): |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
28 """Initialize with `apache.table`""" |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
29 super(Headers, self).__init__(headers) |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
30 self.getheader = self.get |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
31 |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
32 class Request(object): |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
33 |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
34 """`apache.Request` object wrapper providing roundup client interface""" |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
35 |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
36 def __init__(self, request): |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
37 """Initialize with `apache.Request` object""" |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
38 self._req = request |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
39 # .headers.getheader() |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
40 self.headers = Headers(request.headers_in) |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
41 # .wfile.write() |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
42 self.wfile = self._req |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
43 |
|
3736
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
3735
diff
changeset
|
44 def start_response(self, headers, response): |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
3735
diff
changeset
|
45 self.send_response(response) |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
3735
diff
changeset
|
46 for key, value in headers: |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
3735
diff
changeset
|
47 self.send_header(key, value) |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
3735
diff
changeset
|
48 self.end_headers() |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
3735
diff
changeset
|
49 |
|
2552
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
50 def send_response(self, response_code): |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
51 """Set HTTP response code""" |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
52 self._req.status = response_code |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
53 |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
54 def send_header(self, name, value): |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
55 """Set output header""" |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
56 # value may be an instance of roundup.cgi.exceptions.HTTPException |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
57 value = str(value) |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
58 # XXX default content_type is "text/plain", |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
59 # and ain't overrided by "Content-Type" header |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
60 if name == "Content-Type": |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
61 self._req.content_type = value |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
62 else: |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
63 self._req.headers_out.add(name, value) |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
64 |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
65 def end_headers(self): |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
66 """NOOP. There aint no such thing as 'end_headers' in mod_python""" |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
67 pass |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
68 |
|
4047
e70643990e9c
Support the use of sendfile() for file transfer, if available.
Stefan Seefeld <stefan@seefeld.name>
parents:
3736
diff
changeset
|
69 |
|
e70643990e9c
Support the use of sendfile() for file transfer, if available.
Stefan Seefeld <stefan@seefeld.name>
parents:
3736
diff
changeset
|
70 def sendfile(self, filename, offset = 0, len = -1): |
|
e70643990e9c
Support the use of sendfile() for file transfer, if available.
Stefan Seefeld <stefan@seefeld.name>
parents:
3736
diff
changeset
|
71 """Send 'filename' to the user.""" |
|
e70643990e9c
Support the use of sendfile() for file transfer, if available.
Stefan Seefeld <stefan@seefeld.name>
parents:
3736
diff
changeset
|
72 |
|
e70643990e9c
Support the use of sendfile() for file transfer, if available.
Stefan Seefeld <stefan@seefeld.name>
parents:
3736
diff
changeset
|
73 return self._req.sendfile(filename, offset, len) |
|
e70643990e9c
Support the use of sendfile() for file transfer, if available.
Stefan Seefeld <stefan@seefeld.name>
parents:
3736
diff
changeset
|
74 |
|
4213
302bc481ceb1
Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents:
4047
diff
changeset
|
75 __tracker_cache = {} |
|
302bc481ceb1
Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents:
4047
diff
changeset
|
76 """A cache of optimized tracker instances. |
|
302bc481ceb1
Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents:
4047
diff
changeset
|
77 |
|
302bc481ceb1
Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents:
4047
diff
changeset
|
78 The keys are strings giving the directories containing the trackers. |
|
302bc481ceb1
Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents:
4047
diff
changeset
|
79 The values are tracker instances.""" |
|
302bc481ceb1
Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents:
4047
diff
changeset
|
80 |
|
302bc481ceb1
Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents:
4047
diff
changeset
|
81 __tracker_cache_lock = threading.Lock() |
|
302bc481ceb1
Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents:
4047
diff
changeset
|
82 """A lock used to guard access to the cache.""" |
|
302bc481ceb1
Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents:
4047
diff
changeset
|
83 |
|
4047
e70643990e9c
Support the use of sendfile() for file transfer, if available.
Stefan Seefeld <stefan@seefeld.name>
parents:
3736
diff
changeset
|
84 |
|
2552
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
85 def handler(req): |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
86 """HTTP request handler""" |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
87 _options = req.get_options() |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
88 _home = _options.get("TrackerHome") |
|
2560
d45f1669599c
added 'TrackerLanguage' option;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2552
diff
changeset
|
89 _lang = _options.get("TrackerLanguage") |
|
2944
835ac4013578
added options TrackerDebug and TrackerTiming;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2809
diff
changeset
|
90 _timing = _options.get("TrackerTiming", "no") |
|
835ac4013578
added options TrackerDebug and TrackerTiming;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2809
diff
changeset
|
91 if _timing.lower() in ("no", "false"): |
|
835ac4013578
added options TrackerDebug and TrackerTiming;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2809
diff
changeset
|
92 _timing = "" |
|
835ac4013578
added options TrackerDebug and TrackerTiming;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2809
diff
changeset
|
93 _debug = _options.get("TrackerDebug", "no") |
|
3735
e8d4ac23692f
fix debug flag detection
Richard Jones <richard@users.sourceforge.net>
parents:
2944
diff
changeset
|
94 _debug = _debug.lower() not in ("no", "false") |
|
4213
302bc481ceb1
Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents:
4047
diff
changeset
|
95 |
|
302bc481ceb1
Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents:
4047
diff
changeset
|
96 # We do not need to take a lock here (the fast path) because reads |
|
302bc481ceb1
Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents:
4047
diff
changeset
|
97 # from dictionaries are atomic. |
|
302bc481ceb1
Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents:
4047
diff
changeset
|
98 if not _debug and _home in __tracker_cache: |
|
302bc481ceb1
Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents:
4047
diff
changeset
|
99 _tracker = __tracker_cache[_home] |
|
302bc481ceb1
Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents:
4047
diff
changeset
|
100 else: |
|
302bc481ceb1
Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents:
4047
diff
changeset
|
101 if not (_home and os.path.isdir(_home)): |
|
302bc481ceb1
Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents:
4047
diff
changeset
|
102 apache.log_error( |
|
302bc481ceb1
Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents:
4047
diff
changeset
|
103 "PythonOption TrackerHome missing or invalid for %(uri)s" |
|
302bc481ceb1
Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents:
4047
diff
changeset
|
104 % {'uri': req.uri}) |
|
302bc481ceb1
Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents:
4047
diff
changeset
|
105 return apache.HTTP_INTERNAL_SERVER_ERROR |
|
302bc481ceb1
Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents:
4047
diff
changeset
|
106 if _debug: |
|
302bc481ceb1
Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents:
4047
diff
changeset
|
107 _tracker = roundup.instance.open(_home, optimize=0) |
|
302bc481ceb1
Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents:
4047
diff
changeset
|
108 else: |
|
302bc481ceb1
Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents:
4047
diff
changeset
|
109 __tracker_cache_lock.acquire() |
|
302bc481ceb1
Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents:
4047
diff
changeset
|
110 try: |
|
302bc481ceb1
Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents:
4047
diff
changeset
|
111 # The tracker may have been added while we were acquiring |
|
302bc481ceb1
Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents:
4047
diff
changeset
|
112 # the lock. |
|
302bc481ceb1
Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents:
4047
diff
changeset
|
113 if _home in __tracker_cache: |
|
302bc481ceb1
Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents:
4047
diff
changeset
|
114 _tracker = __tracker_cache[home] |
|
302bc481ceb1
Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents:
4047
diff
changeset
|
115 else: |
|
302bc481ceb1
Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents:
4047
diff
changeset
|
116 _tracker = roundup.instance.open(_home, optimize=1) |
|
302bc481ceb1
Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents:
4047
diff
changeset
|
117 __tracker_cache[_home] = _tracker |
|
302bc481ceb1
Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents:
4047
diff
changeset
|
118 finally: |
|
302bc481ceb1
Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents:
4047
diff
changeset
|
119 __tracker_cache_lock.release() |
|
2552
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
120 # create environment |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
121 # Note: cookies are read from HTTP variables, so we need all HTTP vars |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
122 req.add_common_vars() |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
123 _env = dict(req.subprocess_env) |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
124 # XXX classname must be the first item in PATH_INFO. roundup.cgi does: |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
125 # path = string.split(os.environ.get('PATH_INFO', '/'), '/') |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
126 # os.environ['PATH_INFO'] = string.join(path[2:], '/') |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
127 # we just remove the first character ('/') |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
128 _env["PATH_INFO"] = req.path_info[1:] |
|
2944
835ac4013578
added options TrackerDebug and TrackerTiming;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2809
diff
changeset
|
129 if _timing: |
|
835ac4013578
added options TrackerDebug and TrackerTiming;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2809
diff
changeset
|
130 _env["CGI_SHOW_TIMING"] = _timing |
|
2552
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
131 _form = cgi.FieldStorage(req, environ=_env) |
|
2560
d45f1669599c
added 'TrackerLanguage' option;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2552
diff
changeset
|
132 _client = _tracker.Client(_tracker, Request(req), _env, _form, |
|
2809
353dc16a49b2
pass tracker home directory to get_translation()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2560
diff
changeset
|
133 translator=TranslationService.get_translation(_lang, |
|
353dc16a49b2
pass tracker home directory to get_translation()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2560
diff
changeset
|
134 tracker_home=_home)) |
|
2552
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
135 _client.main() |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
136 return apache.OK |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
137 |
|
41fbe26aa2df
mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
138 # vim: set et sts=4 sw=4 : |
