25
25
# This needs to be importable from outside Apache.
28
import ivle.pulldown_subj
29
import ivle.webapp.security
29
import ivle.dispatch.login
30
30
from ivle.auth import authenticate, AuthError
31
31
from ivle.webapp.base.xhtml import XHTMLView
32
32
from ivle.webapp.base.plugins import CookiePlugin
33
from ivle.dispatch.login import get_user_details
34
35
class LoginView(XHTMLView):
35
36
'''A view to allow a user to log in.'''
36
37
template = 'login.html'
37
allow_overlays = False
39
39
def authorize(self, req):
43
43
fields = req.get_fieldstorage()
44
44
nexturl = fields.getfirst('url')
46
# XXX Warning that Internet Explorer is unsupported
47
# Test if the user is in Internet Explorer
49
useragent = req.headers_in['User-Agent']
50
# A bit of very basic UA string detection
51
ctx['msie'] = ('MSIE' in useragent
52
and 'AppleWebKit' not in useragent
53
and 'Gecko' not in useragent
54
and 'Opera' not in useragent)
58
46
if nexturl is None:
61
# We are already logged in. If it is a POST, they might be trying to
62
# clobber their session with some new credentials. That's their own
63
# business, so we let them do it. Otherwise, we don't bother prompting
64
# and just redirect to the destination.
49
# We are already logged in. Don't bother logging in again.
65
50
# Note that req.user is None even if we are 'logged in', if the user is
66
# invalid (state != enabled, or expired).
67
if req.method != "POST" and req.user is not None:
52
if req.user is not None:
68
53
req.throw_redirect(nexturl)
70
# Don't give any URL if we want /.
74
query_string = '?url=' + urllib.quote(nexturl, safe="/~")
76
ctx['path'] = req.make_path('+login') + query_string
55
ctx['path'] = ivle.util.make_path('+login') + \
56
'?' + urllib.urlencode([('url', nexturl)])
78
58
# If this succeeds, the user is invalid.
79
user = ivle.webapp.security.get_user_details(req)
59
user = get_user_details(req)
80
60
if user is not None:
81
61
if user.state == "no_agreement":
82
62
# Authenticated, but need to accept the ToS. Send them there.
84
64
# if you are not planning to display a ToS page - the ToS
85
65
# acceptance process actually calls usrmgt to create the user
86
66
# jails and related stuff.
87
req.throw_redirect(req.make_path('+tos') + query_string)
67
req.throw_redirect(ivle.util.make_path('+tos') + \
68
'?' + urllib.urlencode([('url', nexturl)]))
88
69
elif user.state == "pending":
89
70
# FIXME: this isn't quite the right answer, but it
90
71
# should be more robust in the short term.
98
79
if req.method == "POST":
99
80
# While req.user is normally set to get_user_details, it won't set
100
81
# it if the account isn't valid. So we get it ourselves.
101
user = ivle.webapp.security.get_user_details(req)
82
user = get_user_details(req)
116
# Username is case insensitive
117
user = authenticate.authenticate(req.config, req.store,
118
username.value.lower(), password.value)
97
user = authenticate.authenticate(req.store,
98
username.value, password.value)
119
99
except AuthError, msg:
127
107
session = req.get_session()
128
108
session['login'] = user.login
131
110
user.last_login = datetime.datetime.now()
133
113
# Create cookies for plugins that might request them.
134
for plugin in req.config.plugin_index[CookiePlugin]:
114
for plugin in req.plugin_index[CookiePlugin]:
135
115
for cookie in plugin.cookies:
136
116
# The function can be None if they just need to be
137
117
# deleted at logout.
139
119
req.add_cookie(mod_python.Cookie.Cookie(cookie,
140
120
plugin.cookies[cookie](user), path='/'))
142
# Add any new enrolments.
143
ivle.pulldown_subj.enrol_user(req.config, req.store, user)
146
122
req.throw_redirect(nexturl)
148
124
# We didn't succeed.
153
129
class LogoutView(XHTMLView):
154
130
'''A view to log the current session out.'''
155
131
template = 'logout.html'
156
allow_overlays = False
158
133
def authorize(self, req):
159
134
# This can be used by any authenticated user, even if they haven't
160
135
# accepted the ToS yet.
161
return ivle.webapp.security.get_user_details(req) is not None
136
return ivle.dispatch.login.get_user_details(req) is not None
163
138
def populate(self, req, ctx):
164
139
if req.method == "POST":
167
ctx['path'] = req.make_path('+logout')
142
ctx['path'] = ivle.util.make_path('+logout')