author | Christophe de Vienne <christophe@unlish.com> |
Wed, 09 Jul 2014 17:14:32 +0200 | |
changeset 11484 | 39768d122f97 |
child 11485 | 3905c9f06d0e |
permissions | -rw-r--r-- |
11484
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
1 |
from pyramid import security |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
2 |
from pyramid.httpexceptions import HTTPSeeOther |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
3 |
|
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
4 |
from cubicweb.web.application import CubicWebPublisher |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
5 |
|
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
6 |
from cubicweb.web import ( |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
7 |
StatusResponse, DirectResponse, Redirect, NotFound, LogOut, |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
8 |
RemoteCallFailed, InvalidSession, RequestError, PublishException) |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
9 |
|
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
10 |
|
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
11 |
class PyramidSessionHandler(object): |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
12 |
"""A CW Session handler that rely on the pyramid API to fetch the needed |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
13 |
informations""" |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
14 |
|
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
15 |
def __init__(self, appli): |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
16 |
self.appli = appli |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
17 |
|
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
18 |
def get_session(self, req): |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
19 |
return req._request.cw_session |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
20 |
|
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
21 |
def logout(self, req, goto_url): |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
22 |
raise LogOut(url=goto_url) |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
23 |
|
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
24 |
|
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
25 |
class CubicWebPyramidHandler(object): |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
26 |
def __init__(self, appli): |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
27 |
self.appli = appli |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
28 |
|
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
29 |
def __call__(self, request): |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
30 |
""" |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
31 |
Handler that mimics what CubicWebPublisher.main_handle_request does and |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
32 |
call CubicWebPyramidHandler.core_handle. |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
33 |
|
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
34 |
""" |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
35 |
# XXX In a later version of this handler, we need to by-pass |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
36 |
# core_handle and CubicWebPublisher altogether so that the various CW |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
37 |
# exceptions are converted to their pyramid equivalent. |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
38 |
|
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
39 |
req = request.cw_request() |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
40 |
req.set_cnx(request.cw_cnx) |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
41 |
|
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
42 |
# XXX The main handler of CW forbid anonymous https connections |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
43 |
# I guess we can drop this "feature" but in doubt I leave this comment |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
44 |
# so we don't forget about it. (cdevienne) |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
45 |
|
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
46 |
try: |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
47 |
content = self.appli.core_handle(req, req.path) |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
48 |
|
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
49 |
if content is not None: |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
50 |
request.response.body = content |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
51 |
request.response.headers.clear() |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
52 |
for k, v in req.headers_out.getAllRawHeaders(): |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
53 |
for item in v: |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
54 |
request.response.headers.add(k, item) |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
55 |
except LogOut as ex: |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
56 |
# The actual 'logging out' logic should be in separated function |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
57 |
# that is accessible by the pyramid views |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
58 |
del req._request.session['cubicweb.sessionid'] |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
59 |
if not req.session.closed: |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
60 |
req.session.repo.close(req.session.sessionid) |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
61 |
headers = security.forget(request) |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
62 |
raise HTTPSeeOther(ex.url, headers=headers) |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
63 |
except Redirect as ex: |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
64 |
raise HTTPSeeOther(ex.url) |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
65 |
# except AuthenticationError: |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
66 |
# XXX I don't think it makes sens to catch this ex here (cdevienne) |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
67 |
|
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
68 |
return request.response |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
69 |
|
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
70 |
|
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
71 |
def includeme(config): |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
72 |
# Set up a defaut route to handle non-catched urls. |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
73 |
# This is to keep legacy compatibility for cubes that makes use of the |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
74 |
# cubicweb controllers. |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
75 |
cwconfig = config.registry['cubicweb.config'] |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
76 |
repository = config.registry['cubicweb.repository'] |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
77 |
cwappli = CubicWebPublisher( |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
78 |
repository, cwconfig, |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
79 |
session_handler_fact=PyramidSessionHandler) |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
80 |
handler = CubicWebPyramidHandler(cwappli) |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
81 |
|
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
82 |
config.registry['cubicweb.appli'] = cwappli |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
83 |
config.registry['cubicweb.handler'] = handler |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
84 |
|
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
85 |
config.add_route('catchall', pattern='*path') |
39768d122f97
Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff
changeset
|
86 |
config.add_view(handler, route_name='catchall') |