~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to ivle/dispatch/__init__.py

  • Committer: me at id
  • Date: 2009-01-14 22:59:55 UTC
  • mto: This revision was merged to the branch mainline in revision 1090.
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:branches%2Fstorm:1134
apps/debuginfo: Don't use req.user as a dict, and otherwise make it work
    properly. Also cgi.escape some things that need it.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# IVLE - Informatics Virtual Learning Environment
2
 
# Copyright (C) 2007-2009 The University of Melbourne
 
1
# IVLE
 
2
# Copyright (C) 2007-2008 The University of Melbourne
3
3
#
4
4
# This program is free software; you can redistribute it and/or modify
5
5
# it under the terms of the GNU General Public License as published by
15
15
# along with this program; if not, write to the Free Software
16
16
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17
17
 
18
 
# Author: Matt Giuca, Will Grant
19
 
 
20
 
"""
21
 
This is a mod_python handler program. The correct way to call it is to have
22
 
Apache send all requests to be handled by the module 'dispatch'.
23
 
 
24
 
Top-level handler. Handles all requests to all pages in IVLE.
25
 
Handles authentication (not authorization).
26
 
Then passes the request along to the appropriate ivle app.
27
 
"""
 
18
# Module: dispatch
 
19
# Author: Matt Giuca
 
20
# Date: 11/12/2007
 
21
 
 
22
# This is a mod_python handler program. The correct way to call it is to have
 
23
# Apache send all requests to be handled by the module 'dispatch'.
 
24
 
 
25
# Top-level handler. Handles all requests to all pages in IVLE.
 
26
# Handles authentication (not authorization).
 
27
# Then passes the request along to the appropriate ivle app.
28
28
 
29
29
import sys
30
30
import os
37
37
import time
38
38
 
39
39
import mod_python
40
 
import routes
 
40
from mod_python import apache, Cookie
41
41
 
42
42
from ivle import util
43
43
import ivle.conf
44
44
import ivle.conf.apps
45
 
from ivle.dispatch.request import Request
46
 
from ivle.dispatch import login
47
45
import apps
 
46
import login
48
47
import html
 
48
from request import Request
49
49
import plugins.console # XXX: Relies on www/ being in the Python path.
50
50
 
51
 
# XXX List of plugins, which will eventually be read in from conf
52
 
plugins_HACK = [
53
 
    'ivle.webapp.admin.user#Plugin',
54
 
    'ivle.webapp.tutorial#Plugin',
55
 
    'ivle.webapp.admin.subject#Plugin',
56
 
    'ivle.webapp.browser#Plugin',
57
 
    'ivle.webapp.groups#Plugin',
58
 
    'ivle.webapp.console#Plugin',
59
 
]
60
 
 
61
 
def get_routes_mapper():
62
 
    """
63
 
    Build a Mapper object for doing URL matching using 'routes', based on the
64
 
    plugins config.
65
 
    """
66
 
    m = routes.Mapper(explicit=True)
67
 
    for pluginstr in plugins_HACK:
68
 
        plugin_path, classname = pluginstr.split('#')
69
 
        # Load the plugin module from somewhere in the Python path
70
 
        # (Note that plugin_path is a fully-qualified Python module name).
71
 
        plugin = getattr(__import__(plugin_path, fromlist=[classname]),
72
 
            classname)
73
 
        # Establish a URL pattern for each element of plugin.urls
74
 
        for url in plugin.urls:
75
 
            routex = url[0]
76
 
            view_class = url[1]
77
 
            kwargs_dict = url[2] if len(url) >= 3 else {}
78
 
            m.connect(routex, view=view_class, **kwargs_dict)
79
 
    return m
 
51
# List of cookies that IVLE uses (to be removed at logout)
 
52
ivle_cookies = ["ivleforumcookie", "clipboard"]
80
53
 
81
54
def handler(req):
82
55
    """Handles a request which may be to anywhere in the site except media.
93
66
        # yet.
94
67
        handle_unknown_exception(apachereq, *sys.exc_info())
95
68
        # Tell Apache not to generate its own errors as well
96
 
        return mod_python.apache.OK
 
69
        return apache.OK
97
70
 
98
71
    # Run the main handler, and catch all exceptions
99
72
    try:
105
78
    except Exception:
106
79
        handle_unknown_exception(req, *sys.exc_info())
107
80
        # Tell Apache not to generate its own errors as well
108
 
        return mod_python.apache.OK
 
81
        return apache.OK
109
82
 
110
83
def handler_(req, apachereq):
111
84
    """
118
91
    if not req.publicmode:
119
92
        req.user = login.get_user_details(req)
120
93
 
121
 
    ### BEGIN New plugins framework ###
122
 
    # XXX This should be done ONCE per Python process, not per request.
123
 
    # (Wait till WSGI)
124
 
    # XXX No authentication is done here
125
 
    req.mapper = get_routes_mapper()
126
 
    matchdict = req.mapper.match(req.uri)
127
 
    if matchdict is not None:
128
 
        viewcls = matchdict['view']
129
 
        # Get the remaining arguments, less 'view', 'action' and 'controller'
130
 
        # (The latter two seem to be built-in, and we don't want them).
131
 
        kwargs = matchdict.copy()
132
 
        del kwargs['view']
133
 
        # Instantiate the view, which should be a BaseView class
134
 
        view = viewcls(req, **kwargs)
135
 
        # Render the output
136
 
        view.render(req)
137
 
        req.store.commit()
138
 
        return req.OK
139
 
    ### END New plugins framework ###
140
 
 
141
94
    # Check req.app to see if it is valid. 404 if not.
142
95
    if req.app is not None and req.app not in ivle.conf.apps.app_url:
143
 
        req.throw_error(Request.HTTP_NOT_FOUND,
144
 
            "There is no application called %s." % repr(req.app))
 
96
        # Maybe it is a special app!
 
97
        if req.app == 'logout':
 
98
            logout(req)
 
99
        else:
 
100
            req.throw_error(Request.HTTP_NOT_FOUND,
 
101
                "There is no application called %s." % repr(req.app))
145
102
 
146
103
    # Special handling for public mode - only allow the public app, call it
147
104
    # and get out.
213
170
    # Use req.throw_error to do that.
214
171
    return req.OK
215
172
 
 
173
def logout(req):
 
174
    """Log out the current user (if any) by destroying the session state.
 
175
    Then redirect to the top-level IVLE page."""
 
176
    session = req.get_session()
 
177
    session.invalidate()
 
178
    session.delete()
 
179
    # Invalidates all IVLE cookies
 
180
    all_cookies = Cookie.get_cookies(req)
 
181
    for cookie in all_cookies:
 
182
        if cookie in ivle_cookies:
 
183
            req.add_cookie(Cookie.Cookie(cookie,'',expires=1,path='/'))
 
184
    req.throw_redirect(util.make_path('')) 
 
185
 
216
186
def handle_unknown_exception(req, exc_type, exc_value, exc_traceback):
217
187
    """
218
188
    Given an exception that has just been thrown from IVLE, print its details
230
200
    # For some reason, some versions of mod_python have "_server" instead of
231
201
    # "main_server". So we check for both.
232
202
    try:
233
 
        admin_email = mod_python.apache.main_server.server_admin
 
203
        admin_email = apache.main_server.server_admin
234
204
    except AttributeError:
235
205
        try:
236
 
            admin_email = mod_python.apache._server.server_admin
 
206
            admin_email = apache._server.server_admin
237
207
        except AttributeError:
238
208
            admin_email = ""
239
209
    try:
241
211
        req.status = httpcode
242
212
    except AttributeError:
243
213
        httpcode = None
244
 
        req.status = mod_python.apache.HTTP_INTERNAL_SERVER_ERROR
245
 
    try:
246
 
        publicmode = req.publicmode
247
 
    except AttributeError:
248
 
        publicmode = True
 
214
        req.status = apache.HTTP_INTERNAL_SERVER_ERROR
249
215
    try:
250
216
        login = req.user.login
251
217
    except AttributeError:
252
218
        login = None
253
 
    try:
254
 
        role = req.user.role
255
 
    except AttributeError:
256
 
        role = None
257
219
 
258
220
    # Log File
259
221
    try:
349
311
 
350
312
        # Logging
351
313
        logging.error('%s\n%s'%(str(msg), tb))
352
 
        # Error messages are only displayed is the user is NOT a student,
353
 
        # or if there has been a problem logging the error message
354
 
        show_errors = (not publicmode) and ((login and \
355
 
                            str(role) != "student") or logfail)
 
314
 
356
315
        req.write("""<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"                 
357
316
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">                                      
358
317
<html xmlns="http://www.w3.org/1999/xhtml">
359
318
<head><title>IVLE Internal Server Error</title></head>
360
319
<body>
361
320
<h1>IVLE Internal Server Error""")
362
 
        if (show_errors):
363
 
            if (codename is not None
364
 
                        and httpcode != mod_python.apache.HTTP_INTERNAL_SERVER_ERROR):
365
 
                req.write(": %s" % cgi.escape(codename))
366
 
        
 
321
        if (codename is not None
 
322
            and httpcode != apache.HTTP_INTERNAL_SERVER_ERROR):
 
323
            req.write(": %s" % cgi.escape(codename))
367
324
        req.write("""</h1>
368
325
<p>An error has occured which is the fault of the IVLE developers or
369
 
administration. The developers have been notified.</p>
 
326
administration.</p>
370
327
""")
371
 
        if (show_errors):
372
 
            if msg is not None:
373
 
                req.write("<p>%s</p>\n" % cgi.escape(msg))
374
 
            if httpcode is not None:
375
 
                req.write("<p>(HTTP error code %d)</p>\n" % httpcode)
376
 
            req.write("""
377
 
    <p>Please report this to <a href="mailto:%s">%s</a> (the system
378
 
    administrator). Include the following information:</p>
379
 
    """ % (cgi.escape(admin_email), cgi.escape(admin_email)))
 
328
        if msg is not None:
 
329
            req.write("<p>%s</p>\n" % cgi.escape(msg))
 
330
        if httpcode is not None:
 
331
            req.write("<p>(HTTP error code %d)</p>\n" % httpcode)
 
332
        req.write("""
 
333
<p>Please report this to <a href="mailto:%s">%s</a> (the system
 
334
administrator). Include the following information:</p>
 
335
""" % (cgi.escape(admin_email), cgi.escape(admin_email)))
380
336
 
381
 
            req.write("<pre>\n%s\n</pre>\n"%cgi.escape(tb))
382
 
            if logfail:
383
 
                req.write("<p>Warning: Could not open Error Log: '%s'</p>\n"
384
 
                    %cgi.escape(logfile))
 
337
        req.write("<pre>\n%s\n</pre>\n"%cgi.escape(tb))
 
338
        if logfail:
 
339
            req.write("<p>Warning: Could not open Error Log: '%s'</p>\n"
 
340
                %cgi.escape(logfile))
385
341
        req.write("</body></html>")