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

« back to all changes in this revision

Viewing changes to www/dispatch/__init__.py

  • Committer: mattgiuca
  • Date: 2008-01-23 05:48:04 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:272
consoleservice: Error if not POST.

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
        # If user did not specify an app, HTTP redirect to default app and
 
86
        # exit.
 
87
        if req.app is None:
 
88
            req.throw_redirect(util.make_path(conf.apps.default_app))
 
89
 
 
90
        # Set the default title to the app's tab name, if any. Otherwise URL
 
91
        # name.
 
92
        if app.name is not None:
 
93
            req.title = app.name
 
94
        else:
 
95
            req.title = req.app
 
96
 
 
97
        # Call the specified app with the request object
 
98
        apps.call_app(app.dir, req)
 
99
    # if not logged in, login.login will have written the login box.
 
100
    # Just clean up and exit.
 
101
 
 
102
    # MAKE SURE we write the HTTP (and possibly HTML) header. This
 
103
    # wouldn't happen if nothing else ever got written, so we have to make
 
104
    # sure.
 
105
    req.ensure_headers_written()
 
106
 
 
107
    # When done, write out the HTML footer if the app has requested it
 
108
    if req.write_html_head_foot:
 
109
        html.write_html_foot(req)
 
110
 
 
111
    # Note: Apache will not write custom HTML error messages here.
 
112
    # Use req.throw_error to do that.
 
113
    return req.OK
 
114
 
 
115
def logout(req):
 
116
    """Log out the current user (if any) by destroying the session state.
 
117
    Then redirect to the top-level IVLE page."""
 
118
    session = req.get_session()
 
119
    session.invalidate()
 
120
    session.delete()
 
121
    req.throw_redirect(util.make_path(''))