Mercurial > moin > 1.9
annotate MoinMoin/wsgiapp.py @ 6080:236f7a9370c4
context always has context.request, no need to pass a request param
author | 'Karl O. Pinc' <kop@meme.com> |
---|---|
date | Tue, 16 Sep 2014 09:22:19 -0500 |
parents | 35473fe0967d |
children |
rev | line source |
---|---|
4134
719256a8db51
Initial code to track down the use of request objects in MoinMoin
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
diff
changeset
|
1 # -*- coding: iso-8859-1 -*- |
719256a8db51
Initial code to track down the use of request objects in MoinMoin
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
diff
changeset
|
2 """ |
719256a8db51
Initial code to track down the use of request objects in MoinMoin
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
diff
changeset
|
3 MoinMoin - WSGI application |
719256a8db51
Initial code to track down the use of request objects in MoinMoin
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
diff
changeset
|
4 |
4138
6bbc4beed793
Started with the HTTPContext (currently a reimplementation of request_wsgi with werkzeug)
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4134
diff
changeset
|
5 @copyright: 2003-2008 MoinMoin:ThomasWaldmann, |
4134
719256a8db51
Initial code to track down the use of request objects in MoinMoin
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
diff
changeset
|
6 2008-2008 MoinMoin:FlorianKrupicka |
719256a8db51
Initial code to track down the use of request objects in MoinMoin
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
diff
changeset
|
7 @license: GNU GPL, see COPYING for details. |
719256a8db51
Initial code to track down the use of request objects in MoinMoin
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
diff
changeset
|
8 """ |
5393
1472141fa7be
added missing config.umask support code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5373
diff
changeset
|
9 import os |
1472141fa7be
added missing config.umask support code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5373
diff
changeset
|
10 |
1472141fa7be
added missing config.umask support code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5373
diff
changeset
|
11 from MoinMoin import log |
1472141fa7be
added missing config.umask support code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5373
diff
changeset
|
12 logging = log.getLogger(__name__) |
1472141fa7be
added missing config.umask support code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5373
diff
changeset
|
13 |
4239
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
14 from MoinMoin.web.contexts import AllContext, Context, XMLRPCContext |
5984
e7136d5731df
Backed out changeset 9bd355d893f4
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5983
diff
changeset
|
15 from MoinMoin.web.exceptions import HTTPException |
4321
4476d5ca521c
Move imports of werkzeug solely into the MoinMoin.web package (to make bundled werkzeug really work)
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4309
diff
changeset
|
16 from MoinMoin.web.request import Request, MoinMoinFinish, HeaderSet |
4476d5ca521c
Move imports of werkzeug solely into the MoinMoin.web package (to make bundled werkzeug really work)
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4309
diff
changeset
|
17 from MoinMoin.web.utils import check_forbidden, check_surge_protect, fatal_response, \ |
4476d5ca521c
Move imports of werkzeug solely into the MoinMoin.web package (to make bundled werkzeug really work)
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4309
diff
changeset
|
18 redirect_last_visited |
4144
0a62a439d81b
Trying to port some of RequestBase.__init__ to a WSGI app (very crude right now)
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4141
diff
changeset
|
19 from MoinMoin.Page import Page |
5393
1472141fa7be
added missing config.umask support code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5373
diff
changeset
|
20 from MoinMoin import auth, config, i18n, user, wikiutil, xmlrpc, error |
4144
0a62a439d81b
Trying to port some of RequestBase.__init__ to a WSGI app (very crude right now)
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4141
diff
changeset
|
21 from MoinMoin.action import get_names, get_available_actions |
6065
bbbfb024a967
log abuse when abused action is not presented to user
'Karl O. Pinc' <kop@meme.com>
parents:
5989
diff
changeset
|
22 from MoinMoin.util.abuse import log_attempt |
4144
0a62a439d81b
Trying to port some of RequestBase.__init__ to a WSGI app (very crude right now)
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4141
diff
changeset
|
23 |
5393
1472141fa7be
added missing config.umask support code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5373
diff
changeset
|
24 |
1472141fa7be
added missing config.umask support code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5373
diff
changeset
|
25 def set_umask(new_mask=0777^config.umask): |
1472141fa7be
added missing config.umask support code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5373
diff
changeset
|
26 """ Set the OS umask value (and ignore potential failures on OSes where |
1472141fa7be
added missing config.umask support code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5373
diff
changeset
|
27 this is not supported). |
1472141fa7be
added missing config.umask support code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5373
diff
changeset
|
28 Default: the bitwise inverted value of config.umask |
1472141fa7be
added missing config.umask support code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5373
diff
changeset
|
29 """ |
1472141fa7be
added missing config.umask support code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5373
diff
changeset
|
30 try: |
1472141fa7be
added missing config.umask support code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5373
diff
changeset
|
31 old_mask = os.umask(new_mask) |
1472141fa7be
added missing config.umask support code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5373
diff
changeset
|
32 except: |
1472141fa7be
added missing config.umask support code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5373
diff
changeset
|
33 # maybe we are on win32? |
1472141fa7be
added missing config.umask support code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5373
diff
changeset
|
34 pass |
1472141fa7be
added missing config.umask support code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5373
diff
changeset
|
35 |
4166
500c58d0269b
Port RequestBase.run() into a function for use in wsgi-app
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4164
diff
changeset
|
36 |
500c58d0269b
Port RequestBase.run() into a function for use in wsgi-app
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4164
diff
changeset
|
37 def init(request): |
4239
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
38 """ |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
39 Wraps an incoming WSGI request in a Context object and initializes |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
40 several important attributes. |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
41 """ |
5393
1472141fa7be
added missing config.umask support code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5373
diff
changeset
|
42 set_umask() # do it once per request because maybe some server |
1472141fa7be
added missing config.umask support code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5373
diff
changeset
|
43 # software sets own umask |
1472141fa7be
added missing config.umask support code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5373
diff
changeset
|
44 |
4256
c9483e402491
Wrap request only if it's not already a Context-object
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4251
diff
changeset
|
45 if isinstance(request, Context): |
c9483e402491
Wrap request only if it's not already a Context-object
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4251
diff
changeset
|
46 context, request = request, request.request |
c9483e402491
Wrap request only if it's not already a Context-object
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4251
diff
changeset
|
47 else: |
c9483e402491
Wrap request only if it's not already a Context-object
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4251
diff
changeset
|
48 context = AllContext(request) |
4239
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
49 context.clock.start('total') |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
50 context.clock.start('init') |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
51 |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
52 context.lang = setup_i18n_preauth(context) |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
53 |
4531
83666cc9dc31
new cfg.session_dir setting, store sessions into cache_dir/__session__ by default
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
4530
diff
changeset
|
54 context.session = context.cfg.session_service.get_session(context) |
4239
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
55 |
4530
0ac99fdbe65d
fixed suid functionality, compute cfg.auth_methods only once
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
4441
diff
changeset
|
56 context.user = setup_user(context, context.session) |
4239
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
57 |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
58 context.lang = setup_i18n_postauth(context) |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
59 |
4751
09c345615cd8
Put the finish method back on the context object so we can delay process such as thread joined until the end
Andy Dawkins <andydawkins@gmail.com>
parents:
4605
diff
changeset
|
60 def finish(): |
09c345615cd8
Put the finish method back on the context object so we can delay process such as thread joined until the end
Andy Dawkins <andydawkins@gmail.com>
parents:
4605
diff
changeset
|
61 pass |
4753
5db0151a2df3
Done PEP-8 compilance
Cezary Krzyżanowski <cezary.krzyzanowski@gmail.com>
parents:
4751
diff
changeset
|
62 |
4751
09c345615cd8
Put the finish method back on the context object so we can delay process such as thread joined until the end
Andy Dawkins <andydawkins@gmail.com>
parents:
4605
diff
changeset
|
63 context.finish = finish |
4753
5db0151a2df3
Done PEP-8 compilance
Cezary Krzyżanowski <cezary.krzyzanowski@gmail.com>
parents:
4751
diff
changeset
|
64 |
4239
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
65 context.reset() |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
66 |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
67 context.clock.stop('init') |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
68 return context |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
69 |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
70 def run(context): |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
71 """ Run a context trough the application. """ |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
72 context.clock.start('run') |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
73 request = context.request |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
74 |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
75 # preliminary access checks (forbidden, bots, surge protection) |
4250
43da090ab838
Fixed exception-handling for MoinMoinFinish and relocated it to MoinMoin.web.request
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4248
diff
changeset
|
76 try: |
4330
b6d5bf04b9e6
try/except/finally is 2.5+ only, use try/try/except/finally
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
4321
diff
changeset
|
77 try: |
b6d5bf04b9e6
try/except/finally is 2.5+ only, use try/try/except/finally
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
4321
diff
changeset
|
78 check_forbidden(context) |
b6d5bf04b9e6
try/except/finally is 2.5+ only, use try/try/except/finally
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
4321
diff
changeset
|
79 check_surge_protect(context) |
4239
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
80 |
4330
b6d5bf04b9e6
try/except/finally is 2.5+ only, use try/try/except/finally
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
4321
diff
changeset
|
81 action_name = context.action |
4239
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
82 |
4330
b6d5bf04b9e6
try/except/finally is 2.5+ only, use try/try/except/finally
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
4321
diff
changeset
|
83 # handle XMLRPC calls |
b6d5bf04b9e6
try/except/finally is 2.5+ only, use try/try/except/finally
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
4321
diff
changeset
|
84 if action_name == 'xmlrpc': |
b6d5bf04b9e6
try/except/finally is 2.5+ only, use try/try/except/finally
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
4321
diff
changeset
|
85 response = xmlrpc.xmlrpc(XMLRPCContext(request)) |
b6d5bf04b9e6
try/except/finally is 2.5+ only, use try/try/except/finally
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
4321
diff
changeset
|
86 elif action_name == 'xmlrpc2': |
b6d5bf04b9e6
try/except/finally is 2.5+ only, use try/try/except/finally
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
4321
diff
changeset
|
87 response = xmlrpc.xmlrpc2(XMLRPCContext(request)) |
b6d5bf04b9e6
try/except/finally is 2.5+ only, use try/try/except/finally
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
4321
diff
changeset
|
88 else: |
b6d5bf04b9e6
try/except/finally is 2.5+ only, use try/try/except/finally
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
4321
diff
changeset
|
89 response = dispatch(request, context, action_name) |
b6d5bf04b9e6
try/except/finally is 2.5+ only, use try/try/except/finally
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
4321
diff
changeset
|
90 context.cfg.session_service.finalize(context, context.session) |
b6d5bf04b9e6
try/except/finally is 2.5+ only, use try/try/except/finally
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
4321
diff
changeset
|
91 return response |
b6d5bf04b9e6
try/except/finally is 2.5+ only, use try/try/except/finally
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
4321
diff
changeset
|
92 except MoinMoinFinish: |
b6d5bf04b9e6
try/except/finally is 2.5+ only, use try/try/except/finally
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
4321
diff
changeset
|
93 return request |
4250
43da090ab838
Fixed exception-handling for MoinMoinFinish and relocated it to MoinMoin.web.request
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4248
diff
changeset
|
94 finally: |
4751
09c345615cd8
Put the finish method back on the context object so we can delay process such as thread joined until the end
Andy Dawkins <andydawkins@gmail.com>
parents:
4605
diff
changeset
|
95 context.finish() |
4250
43da090ab838
Fixed exception-handling for MoinMoinFinish and relocated it to MoinMoin.web.request
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4248
diff
changeset
|
96 context.clock.stop('run') |
4239
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
97 |
5984
e7136d5731df
Backed out changeset 9bd355d893f4
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5983
diff
changeset
|
98 def remove_prefix(path, prefix=None): |
e7136d5731df
Backed out changeset 9bd355d893f4
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5983
diff
changeset
|
99 """ Remove an url prefix from the path info and return shortened path. """ |
4239
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
100 # we can have all action URLs like this: /action/ActionName/PageName?action=ActionName&... |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
101 # this is just for robots.txt being able to forbid them for crawlers |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
102 if prefix is not None: |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
103 prefix = '/%s/' % prefix # e.g. '/action/' |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
104 if path.startswith(prefix): |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
105 # remove prefix and action name |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
106 path = path[len(prefix):] |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
107 action, path = (path.split('/', 1) + ['', ''])[:2] |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
108 path = '/' + path |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
109 return path |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
110 |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
111 def dispatch(request, context, action_name='show'): |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
112 cfg = context.cfg |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
113 |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
114 # The last component in path_info is the page name, if any |
5984
e7136d5731df
Backed out changeset 9bd355d893f4
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5983
diff
changeset
|
115 path = remove_prefix(request.path, cfg.url_prefix_action) |
4239
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
116 |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
117 if path.startswith('/'): |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
118 pagename = wikiutil.normalize_pagename(path, cfg) |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
119 else: |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
120 pagename = None |
4144
0a62a439d81b
Trying to port some of RequestBase.__init__ to a WSGI app (very crude right now)
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4141
diff
changeset
|
121 |
4239
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
122 # need to inform caches that content changes based on: |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
123 # * cookie (even if we aren't sending one now) |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
124 # * User-Agent (because a bot might be denied and get no content) |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
125 # * Accept-Language (except if moin is told to ignore browser language) |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
126 hs = HeaderSet(('Cookie', 'User-Agent')) |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
127 if not cfg.language_ignore_browser: |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
128 hs.add('Accept-Language') |
5591
1dff6cfdcf90
http headers: for most cases, do not use .add, but .__setitem__
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5536
diff
changeset
|
129 request.headers['Vary'] = str(hs) |
4239
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
130 |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
131 # Handle request. We have these options: |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
132 # 1. jump to page where user left off |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
133 if not pagename and context.user.remember_last_visit and action_name == 'show': |
4321
4476d5ca521c
Move imports of werkzeug solely into the MoinMoin.web package (to make bundled werkzeug really work)
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4309
diff
changeset
|
134 response = redirect_last_visited(context) |
4239
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
135 # 2. handle action |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
136 else: |
6080
236f7a9370c4
context always has context.request, no need to pass a request param
'Karl O. Pinc' <kop@meme.com>
parents:
6078
diff
changeset
|
137 response = handle_action(context, pagename, action_name) |
4239
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
138 if isinstance(response, Context): |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
139 response = response.request |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
140 return response |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
141 |
6080
236f7a9370c4
context always has context.request, no need to pass a request param
'Karl O. Pinc' <kop@meme.com>
parents:
6078
diff
changeset
|
142 def handle_action(context, pagename, action_name='show'): |
4239
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
143 """ Actual dispatcher function for non-XMLRPC actions. |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
144 |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
145 Also sets up the Page object for this request, normalizes and |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
146 redirects to canonical pagenames and checks for non-allowed |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
147 actions. |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
148 """ |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
149 _ = context.getText |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
150 cfg = context.cfg |
4144
0a62a439d81b
Trying to port some of RequestBase.__init__ to a WSGI app (very crude right now)
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4141
diff
changeset
|
151 |
4239
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
152 # pagename could be empty after normalization e.g. '///' -> '' |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
153 # Use localized FrontPage if pagename is empty |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
154 if not pagename: |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
155 context.page = wikiutil.getFrontPage(context) |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
156 else: |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
157 context.page = Page(context, pagename) |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
158 if '_' in pagename and not context.page.exists(): |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
159 pagename = pagename.replace('_', ' ') |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
160 page = Page(context, pagename) |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
161 if page.exists(): |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
162 url = page.url(context) |
4321
4476d5ca521c
Move imports of werkzeug solely into the MoinMoin.web package (to make bundled werkzeug really work)
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4309
diff
changeset
|
163 return context.http_redirect(url) |
4239
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
164 |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
165 msg = None |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
166 # Complain about unknown actions |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
167 if not action_name in get_names(cfg): |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
168 msg = _("Unknown action %(action_name)s.") % { |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
169 'action_name': wikiutil.escape(action_name), } |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
170 |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
171 # Disallow non available actions |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
172 elif action_name[0].isupper() and not action_name in \ |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
173 get_available_actions(cfg, context.page, context.user): |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
174 msg = _("You are not allowed to do %(action_name)s on this page.") % { |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
175 'action_name': wikiutil.escape(action_name), } |
6067
082b1a458d55
log username, if exists, when abused action not presented to user
'Karl O. Pinc' <kop@meme.com>
parents:
6066
diff
changeset
|
176 if context.user.valid: |
6080
236f7a9370c4
context always has context.request, no need to pass a request param
'Karl O. Pinc' <kop@meme.com>
parents:
6078
diff
changeset
|
177 log_attempt(action_name + '/action unavailable', False, |
236f7a9370c4
context always has context.request, no need to pass a request param
'Karl O. Pinc' <kop@meme.com>
parents:
6078
diff
changeset
|
178 context.request, context.user.name, pagename=pagename) |
6067
082b1a458d55
log username, if exists, when abused action not presented to user
'Karl O. Pinc' <kop@meme.com>
parents:
6066
diff
changeset
|
179 else: |
6080
236f7a9370c4
context always has context.request, no need to pass a request param
'Karl O. Pinc' <kop@meme.com>
parents:
6078
diff
changeset
|
180 log_attempt(action_name + '/action unavailable', False, context.request, pagename=pagename) |
4239
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
181 # Suggest non valid user to login |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
182 msg += " " + _("Login and try again.") |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
183 |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
184 if msg: |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
185 context.theme.add_msg(msg, "error") |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
186 context.page.send_page() |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
187 # Try action |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
188 else: |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
189 from MoinMoin import action |
5168
61ce73eb13a0
action.getHandler(): make it moin 1.8 compatible again
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
4860
diff
changeset
|
190 handler = action.getHandler(context, action_name) |
4239
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
191 if handler is None: |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
192 msg = _("You are not allowed to do %(action_name)s on this page.") % { |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
193 'action_name': wikiutil.escape(action_name), } |
6067
082b1a458d55
log username, if exists, when abused action not presented to user
'Karl O. Pinc' <kop@meme.com>
parents:
6066
diff
changeset
|
194 if context.user.valid: |
6080
236f7a9370c4
context always has context.request, no need to pass a request param
'Karl O. Pinc' <kop@meme.com>
parents:
6078
diff
changeset
|
195 log_attempt(action_name + '/no handler', False, context.request, context.user.name, pagename=pagename) |
6067
082b1a458d55
log username, if exists, when abused action not presented to user
'Karl O. Pinc' <kop@meme.com>
parents:
6066
diff
changeset
|
196 else: |
6080
236f7a9370c4
context always has context.request, no need to pass a request param
'Karl O. Pinc' <kop@meme.com>
parents:
6078
diff
changeset
|
197 log_attempt(action_name + '/no handler', False, context.request, pagename=pagename) |
4239
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
198 # Suggest non valid user to login |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
199 msg += " " + _("Login and try again.") |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
200 context.theme.add_msg(msg, "error") |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
201 context.page.send_page() |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
202 else: |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
203 handler(context.page.page_name, context) |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
204 |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
205 return context |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
206 |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
207 def setup_user(context, session): |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
208 """ Try to retrieve a valid user object from the request, be it |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
209 either through the session or through a login. """ |
4194
9c80451df643
Setup user from stored session
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4193
diff
changeset
|
210 # first try setting up from session |
4239
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
211 userobj = auth.setup_from_session(context, session) |
4530
0ac99fdbe65d
fixed suid functionality, compute cfg.auth_methods only once
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
4441
diff
changeset
|
212 userobj, olduser = auth.setup_setuid(context, userobj) |
0ac99fdbe65d
fixed suid functionality, compute cfg.auth_methods only once
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
4441
diff
changeset
|
213 context._setuid_real_user = olduser |
4194
9c80451df643
Setup user from stored session
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4193
diff
changeset
|
214 |
4198
988b2b672219
Fix tests: source code (indentation, whitespace) mostly
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4197
diff
changeset
|
215 # then handle login/logout forms |
4239
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
216 form = context.request.values |
4193
1e954e802ed2
Start to make auth work again with the new session layer
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4192
diff
changeset
|
217 |
1e954e802ed2
Start to make auth work again with the new session layer
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4192
diff
changeset
|
218 if 'login' in form: |
1e954e802ed2
Start to make auth work again with the new session layer
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4192
diff
changeset
|
219 params = { |
1e954e802ed2
Start to make auth work again with the new session layer
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4192
diff
changeset
|
220 'username': form.get('name'), |
1e954e802ed2
Start to make auth work again with the new session layer
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4192
diff
changeset
|
221 'password': form.get('password'), |
1e954e802ed2
Start to make auth work again with the new session layer
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4192
diff
changeset
|
222 'attended': True, |
1e954e802ed2
Start to make auth work again with the new session layer
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4192
diff
changeset
|
223 'openid_identifier': form.get('openid_identifier'), |
1e954e802ed2
Start to make auth work again with the new session layer
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4192
diff
changeset
|
224 'stage': form.get('stage') |
1e954e802ed2
Start to make auth work again with the new session layer
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4192
diff
changeset
|
225 } |
4239
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
226 userobj = auth.handle_login(context, userobj, **params) |
4193
1e954e802ed2
Start to make auth work again with the new session layer
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4192
diff
changeset
|
227 elif 'logout' in form: |
4239
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
228 userobj = auth.handle_logout(context, userobj) |
4193
1e954e802ed2
Start to make auth work again with the new session layer
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4192
diff
changeset
|
229 else: |
4239
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
230 userobj = auth.handle_request(context, userobj) |
4193
1e954e802ed2
Start to make auth work again with the new session layer
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4192
diff
changeset
|
231 |
4534
0b176807b07c
bugfix: create dummy user obj at the right place
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
4531
diff
changeset
|
232 # if we still have no user obj, create a dummy: |
0b176807b07c
bugfix: create dummy user obj at the right place
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
4531
diff
changeset
|
233 if not userobj: |
0b176807b07c
bugfix: create dummy user obj at the right place
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
4531
diff
changeset
|
234 userobj = user.User(context, auth_method='invalid') |
0b176807b07c
bugfix: create dummy user obj at the right place
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
4531
diff
changeset
|
235 |
4239
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
236 return userobj |
4144
0a62a439d81b
Trying to port some of RequestBase.__init__ to a WSGI app (very crude right now)
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4141
diff
changeset
|
237 |
4239
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
238 def setup_i18n_preauth(context): |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
239 """ Determine language for the request in absence of any user info. """ |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
240 if i18n.languages is None: |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
241 i18n.i18n_init(context) |
5987
e06ce67bcaab
accept-language case-sensitivity bug fix (plus cleanup of duplicate code)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5984
diff
changeset
|
242 lang = i18n.requestLanguage(context) |
4239
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
243 return lang |
4166
500c58d0269b
Port RequestBase.run() into a function for use in wsgi-app
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4164
diff
changeset
|
244 |
4239
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
245 def setup_i18n_postauth(context): |
db15f98e3228
Split up wsgiapp.init and wsgiapp.run into smaller chunks
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4228
diff
changeset
|
246 """ Determine language for the request after user-id is established. """ |
5987
e06ce67bcaab
accept-language case-sensitivity bug fix (plus cleanup of duplicate code)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5984
diff
changeset
|
247 lang = i18n.userLanguage(context) or context.lang |
5373
7c9372ef5428
fix browser language detection
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5275
diff
changeset
|
248 return lang |
4166
500c58d0269b
Port RequestBase.run() into a function for use in wsgi-app
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4164
diff
changeset
|
249 |
4441
f02b3e7dffe6
fixed wsgiapplication tests
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
4330
diff
changeset
|
250 class Application(object): |
f02b3e7dffe6
fixed wsgiapplication tests
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
4330
diff
changeset
|
251 def __init__(self, app_config=None): |
f02b3e7dffe6
fixed wsgiapplication tests
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
4330
diff
changeset
|
252 |
f02b3e7dffe6
fixed wsgiapplication tests
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
4330
diff
changeset
|
253 class AppRequest(Request): |
f02b3e7dffe6
fixed wsgiapplication tests
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
4330
diff
changeset
|
254 given_config = app_config |
f02b3e7dffe6
fixed wsgiapplication tests
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
4330
diff
changeset
|
255 |
f02b3e7dffe6
fixed wsgiapplication tests
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
4330
diff
changeset
|
256 self.Request = AppRequest |
4166
500c58d0269b
Port RequestBase.run() into a function for use in wsgi-app
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4164
diff
changeset
|
257 |
4441
f02b3e7dffe6
fixed wsgiapplication tests
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
4330
diff
changeset
|
258 def __call__(self, environ, start_response): |
f02b3e7dffe6
fixed wsgiapplication tests
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
4330
diff
changeset
|
259 try: |
5275
adb58cd3ece2
main exception handler: include request url in log output
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5168
diff
changeset
|
260 request = None |
4441
f02b3e7dffe6
fixed wsgiapplication tests
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
4330
diff
changeset
|
261 request = self.Request(environ) |
f02b3e7dffe6
fixed wsgiapplication tests
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
4330
diff
changeset
|
262 context = init(request) |
5989
4790615ddfb6
reimplement log_timing functionality
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5988
diff
changeset
|
263 try: |
4790615ddfb6
reimplement log_timing functionality
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5988
diff
changeset
|
264 response = run(context) |
4790615ddfb6
reimplement log_timing functionality
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5988
diff
changeset
|
265 finally: |
4790615ddfb6
reimplement log_timing functionality
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5988
diff
changeset
|
266 context.clock.stop('total') |
4790615ddfb6
reimplement log_timing functionality
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5988
diff
changeset
|
267 if context.cfg.log_timing: |
4790615ddfb6
reimplement log_timing functionality
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5988
diff
changeset
|
268 dt = context.clock.timings['total'] |
4790615ddfb6
reimplement log_timing functionality
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5988
diff
changeset
|
269 logging.info("timing: %s %s %s %3.3f %s" % ( |
4790615ddfb6
reimplement log_timing functionality
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5988
diff
changeset
|
270 request.remote_addr, request.url, request.referrer, |
4790615ddfb6
reimplement log_timing functionality
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5988
diff
changeset
|
271 dt, "!" * int(dt) or ".")) |
4441
f02b3e7dffe6
fixed wsgiapplication tests
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
4330
diff
changeset
|
272 except HTTPException, e: |
f02b3e7dffe6
fixed wsgiapplication tests
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
4330
diff
changeset
|
273 response = e |
f02b3e7dffe6
fixed wsgiapplication tests
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
4330
diff
changeset
|
274 except error.ConfigurationError, e: |
4605
edb6cb2cac43
Environment variable MOIN_DEBUGGER=True will enable werkzeug's debugger for the standalone wikiserver
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
4534
diff
changeset
|
275 # this is stuff the user should see on the web interface: |
4441
f02b3e7dffe6
fixed wsgiapplication tests
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
4330
diff
changeset
|
276 response = fatal_response(e) |
4605
edb6cb2cac43
Environment variable MOIN_DEBUGGER=True will enable werkzeug's debugger for the standalone wikiserver
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
4534
diff
changeset
|
277 except Exception, e: |
5275
adb58cd3ece2
main exception handler: include request url in log output
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5168
diff
changeset
|
278 # we avoid raising more exceptions here to preserve the original exception |
adb58cd3ece2
main exception handler: include request url in log output
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5168
diff
changeset
|
279 url_info = request and ' [%s]' % request.url or '' |
4605
edb6cb2cac43
Environment variable MOIN_DEBUGGER=True will enable werkzeug's debugger for the standalone wikiserver
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
4534
diff
changeset
|
280 # have exceptions logged within the moin logging framework: |
5275
adb58cd3ece2
main exception handler: include request url in log output
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
5168
diff
changeset
|
281 logging.exception("An exception has occurred%s." % url_info) |
4605
edb6cb2cac43
Environment variable MOIN_DEBUGGER=True will enable werkzeug's debugger for the standalone wikiserver
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
4534
diff
changeset
|
282 # re-raise exception, so e.g. the debugger middleware gets it |
edb6cb2cac43
Environment variable MOIN_DEBUGGER=True will enable werkzeug's debugger for the standalone wikiserver
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents:
4534
diff
changeset
|
283 raise |
4228
d9b3c6585585
First implementation of standalone server using werkzeug.serving.run_simple
Florian Krupicka <florian.krupicka@googlemail.com>
parents:
4227
diff
changeset
|
284 |
4441
f02b3e7dffe6
fixed wsgiapplication tests
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
4330
diff
changeset
|
285 return response(environ, start_response) |
f02b3e7dffe6
fixed wsgiapplication tests
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
4330
diff
changeset
|
286 |
f02b3e7dffe6
fixed wsgiapplication tests
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
4330
diff
changeset
|
287 #XXX: default application using the default config from disk |
f02b3e7dffe6
fixed wsgiapplication tests
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
4330
diff
changeset
|
288 application = Application() |