25
25
# This needs to be importable from outside Apache.
28
import ivle.pulldown_subj
29
29
import ivle.webapp.security
30
30
from ivle.auth import authenticate, AuthError
31
31
from ivle.webapp.base.xhtml import XHTMLView
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)
46
58
if nexturl is None:
49
# We are already logged in. Don't bother logging in again.
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.
50
65
# Note that req.user is None even if we are 'logged in', if the user is
52
if req.user is not None:
66
# invalid (state != enabled, or expired).
67
if req.method != "POST" and req.user is not None:
53
68
req.throw_redirect(nexturl)
55
ctx['path'] = ivle.util.make_path('+login') + \
56
'?' + urllib.urlencode([('url', 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
58
78
# If this succeeds, the user is invalid.
59
79
user = ivle.webapp.security.get_user_details(req)
64
84
# if you are not planning to display a ToS page - the ToS
65
85
# acceptance process actually calls usrmgt to create the user
66
86
# jails and related stuff.
67
req.throw_redirect(ivle.util.make_path('+tos') + \
68
'?' + urllib.urlencode([('url', nexturl)]))
87
req.throw_redirect(req.make_path('+tos') + query_string)
69
88
elif user.state == "pending":
70
89
# FIXME: this isn't quite the right answer, but it
71
90
# should be more robust in the short term.
97
user = authenticate.authenticate(req.store,
98
username.value, password.value)
116
# Username is case insensitive
117
user = authenticate.authenticate(req.config, req.store,
118
username.value.lower(), password.value)
99
119
except AuthError, msg:
107
127
session = req.get_session()
108
128
session['login'] = user.login
110
131
user.last_login = datetime.datetime.now()
113
133
# Create cookies for plugins that might request them.
114
134
for plugin in req.config.plugin_index[CookiePlugin]:
119
139
req.add_cookie(mod_python.Cookie.Cookie(cookie,
120
140
plugin.cookies[cookie](user), path='/'))
142
# Add any new enrolments.
143
ivle.pulldown_subj.enrol_user(req.config, req.store, user)
122
146
req.throw_redirect(nexturl)
124
148
# We didn't succeed.