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

« back to all changes in this revision

Viewing changes to www/dispatch/__init__.py

  • Committer: Matt Giuca
  • Date: 2010-07-22 00:46:45 UTC
  • mto: This revision was merged to the branch mainline in revision 1818.
  • Revision ID: matt.giuca@gmail.com-20100722004645-giso3xsjm8o8rflf
Project page: Removed the space before the '*'.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# IVLE
2
 
# Copyright (C) 2007-2008 The University of Melbourne
3
 
#
4
 
# This program is free software; you can redistribute it and/or modify
5
 
# it under the terms of the GNU General Public License as published by
6
 
# the Free Software Foundation; either version 2 of the License, or
7
 
# (at your option) any later version.
8
 
#
9
 
# This program is distributed in the hope that it will be useful,
10
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
 
# GNU General Public License for more details.
13
 
#
14
 
# You should have received a copy of the GNU General Public License
15
 
# along with this program; if not, write to the Free Software
16
 
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17
 
 
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
 
 
29
 
import mod_python
30
 
from mod_python import apache
31
 
 
32
 
import os
33
 
import os.path
34
 
import conf
35
 
import conf.apps
36
 
import apps
37
 
 
38
 
from request import Request
39
 
import html
40
 
import login
41
 
from common import util
42
 
 
43
 
def handler(req):
44
 
    """Handles a request which may be to anywhere in the site except media.
45
 
    Intended to be called by mod_python, as a handler.
46
 
 
47
 
    req: An Apache request object.
48
 
    """
49
 
    # Make the request object into an IVLE request which can be passed to apps
50
 
    apachereq = req
51
 
    req = Request(req, html.write_html_head)
52
 
 
53
 
    # Check req.app to see if it is valid. 404 if not.
54
 
    if req.app is not None and req.app not in conf.apps.app_url:
55
 
        # Maybe it is a special app!
56
 
        if req.app == 'logout':
57
 
            logout(req)
58
 
        else:
59
 
            # TODO: Nicer 404 message?
60
 
            req.throw_error(Request.HTTP_NOT_FOUND)
61
 
 
62
 
    # Special handling for public mode - just call public app and get out
63
 
    # NOTE: This will not behave correctly if the public app uses
64
 
    # write_html_head_foot, but "serve" does not.
65
 
    if req.publicmode:
66
 
        app = conf.apps.app_url[conf.apps.public_app]
67
 
        apps.call_app(app.dir, req)
68
 
        return req.OK
69
 
 
70
 
    # app is the App object for the chosen app
71
 
    if req.app is None:
72
 
        app = conf.apps.app_url[conf.apps.default_app]
73
 
    else:
74
 
        app = conf.apps.app_url[req.app]
75
 
 
76
 
    # Check if app requires auth. If so, perform authentication and login.
77
 
    if app.requireauth:
78
 
        req.username = login.login(req)
79
 
        logged_in = req.username is not None
80
 
    else:
81
 
        req.username = login.get_username(req)
82
 
        logged_in = True
83
 
 
84
 
    if logged_in:
85
 
        # Keep the user's session alive by writing to the session object.
86
 
        # req.get_session().save()
87
 
        # Well, it's a fine idea, but it creates considerable grief in the
88
 
        # concurrent update department, so instead, we'll just make the
89
 
        # sessions not time out.
90
 
        
91
 
        # If user did not specify an app, HTTP redirect to default app and
92
 
        # exit.
93
 
        if req.app is None:
94
 
            req.throw_redirect(util.make_path(conf.apps.default_app))
95
 
 
96
 
        # Set the default title to the app's tab name, if any. Otherwise URL
97
 
        # name.
98
 
        if app.name is not None:
99
 
            req.title = app.name
100
 
        else:
101
 
            req.title = req.app
102
 
 
103
 
        # Call the specified app with the request object
104
 
        apps.call_app(app.dir, req)
105
 
    # if not logged in, login.login will have written the login box.
106
 
    # Just clean up and exit.
107
 
 
108
 
    # MAKE SURE we write the HTTP (and possibly HTML) header. This
109
 
    # wouldn't happen if nothing else ever got written, so we have to make
110
 
    # sure.
111
 
    req.ensure_headers_written()
112
 
 
113
 
    # When done, write out the HTML footer if the app has requested it
114
 
    if req.write_html_head_foot:
115
 
        html.write_html_foot(req)
116
 
 
117
 
    # Note: Apache will not write custom HTML error messages here.
118
 
    # Use req.throw_error to do that.
119
 
    return req.OK
120
 
 
121
 
def logout(req):
122
 
    """Log out the current user (if any) by destroying the session state.
123
 
    Then redirect to the top-level IVLE page."""
124
 
    session = req.get_session()
125
 
    session.invalidate()
126
 
    session.delete()
127
 
    req.throw_redirect(util.make_path(''))