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

« back to all changes in this revision

Viewing changes to ivle/webapp/security/views.py

Replaced Python config files (conf.py) with new config files system, using
    configobj (INI-file style config files).

setup.py config now produces ./etc/ivle.conf, a new-style config file.
ivle/conf/conf.py is now part of the IVLE source code. It reads the new config
file and provides the same legacy interface, so all of IVLE still functions,
including setup.py config.

Added /etc to the source tree (config files will be stored here).
Added configobj as a dependency in doc/setup/install_proc.txt.

setup.py install copies ./etc/ivle.conf into /etc/ivle/ivle.conf.

Removed boilerplate code generation from setup/configure.py (that code is now
part of ivle/conf/conf.py which is now in the source tree).

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
 
18
18
# Author: Will Grant, Nick Chadwick
19
19
 
20
 
import urllib
21
 
import datetime
22
 
try:
23
 
    import mod_python.Cookie
24
 
except ImportError:
25
 
    # This needs to be importable from outside Apache.
26
 
    pass
27
 
 
 
20
from ivle.webapp.base.xhtml import XHTMLView
28
21
import ivle.util
29
 
import ivle.webapp.security
30
 
from ivle.auth import authenticate, AuthError
31
 
from ivle.webapp.base.xhtml import XHTMLView
32
 
from ivle.webapp.base.plugins import CookiePlugin
33
 
 
34
 
class LoginView(XHTMLView):
35
 
    '''A view to allow a user to log in.'''
36
 
    template = 'login.html'
37
 
    allow_overlays = False
38
 
 
39
 
    def authorize(self, req):
40
 
        return True
41
 
 
42
 
    def populate(self, req, ctx):
43
 
        fields = req.get_fieldstorage()
44
 
        nexturl = fields.getfirst('url')
45
 
 
46
 
        if nexturl is None:
47
 
            nexturl = '/'
48
 
 
49
 
        # We are already logged in. Don't bother logging in again.
50
 
        # Note that req.user is None even if we are 'logged in', if the user is
51
 
        # invalid.
52
 
        if req.user is not None:
53
 
            req.throw_redirect(nexturl)
54
 
 
55
 
        ctx['path'] = ivle.util.make_path('+login') + \
56
 
                         '?' + urllib.urlencode([('url', nexturl)])
57
 
 
58
 
        # If this succeeds, the user is invalid.
59
 
        user = ivle.webapp.security.get_user_details(req)
60
 
        if user is not None:
61
 
            if user.state == "no_agreement":
62
 
                # Authenticated, but need to accept the ToS. Send them there.
63
 
                # IMPORTANT NOTE FOR HACKERS: You can't simply disable this
64
 
                # if you are not planning to display a ToS page - the ToS
65
 
                # acceptance process actually calls usrmgt to create the user
66
 
                # jails and related stuff.
67
 
                req.throw_redirect(ivle.util.make_path('+tos') + \
68
 
                        '?' + urllib.urlencode([('url', nexturl)]))
69
 
            elif user.state == "pending":
70
 
                # FIXME: this isn't quite the right answer, but it
71
 
                # should be more robust in the short term.
72
 
                session = req.get_session()
73
 
                session.invalidate()
74
 
                session.delete()
75
 
                user.state = u'no_agreement'
76
 
                req.store.commit()
77
 
                req.throw_redirect(nexturl)
78
 
 
79
 
        if req.method == "POST":
80
 
            # While req.user is normally set to get_user_details, it won't set
81
 
            # it if the account isn't valid. So we get it ourselves.
82
 
            user = ivle.webapp.security.get_user_details(req)
83
 
 
84
 
            badlogin = None
85
 
 
86
 
            username = fields.getfirst('user')
87
 
            password = fields.getfirst('pass')
88
 
            if username is not None:
89
 
                # From this point onwards, we will be showing an error message
90
 
                # if unsuccessful.
91
 
                # Authenticate
92
 
                if password is None:
93
 
                    badlogin = "No password supplied."
94
 
                else:
95
 
                    user = None
96
 
                    try:
97
 
                        user = authenticate.authenticate(req.store,
98
 
                                    username.value, password.value)
99
 
                    except AuthError, msg:
100
 
                        badlogin = msg
101
 
                    if user is None:
102
 
                        # Must have got an error. Do not authenticate.
103
 
                        # The except: above will have set a message.
104
 
                        pass
105
 
                    else:
106
 
                        # Success - Set the session and redirect to the URL.
107
 
                        session = req.get_session()
108
 
                        session['login'] = user.login
109
 
                        session.save()
110
 
                        user.last_login = datetime.datetime.now()
111
 
                        req.store.commit()
112
 
 
113
 
                        # Create cookies for plugins that might request them.
114
 
                        for plugin in req.config.plugin_index[CookiePlugin]:
115
 
                            for cookie in plugin.cookies:
116
 
                                # The function can be None if they just need to be
117
 
                                # deleted at logout.
118
 
                                if plugin.cookies[cookie] is not None:
119
 
                                    req.add_cookie(mod_python.Cookie.Cookie(cookie,
120
 
                                          plugin.cookies[cookie](user), path='/'))
121
 
 
122
 
                        req.throw_redirect(nexturl)
123
 
 
124
 
                # We didn't succeed.
125
 
                # Render the login form with the error message.
126
 
                ctx['error'] = badlogin
127
 
 
128
22
 
129
23
class LogoutView(XHTMLView):
130
24
    '''A view to log the current session out.'''
131
25
    template = 'logout.html'
132
 
    allow_overlays = False
133
 
 
134
 
    def authorize(self, req):
135
 
        # This can be used by any authenticated user, even if they haven't
136
 
        # accepted the ToS yet.
137
 
        return ivle.webapp.security.get_user_details(req) is not None
138
26
 
139
27
    def populate(self, req, ctx):
140
28
        if req.method == "POST":
141
29
            req.logout()
142
30
        else:
143
 
            ctx['path'] =  ivle.util.make_path('+logout')
 
31
            ctx['path'] =  ivle.util.make_path('logout')