1
# IVLE - Informatics Virtual Learning Environment
2
# Copyright (C) 2007-2008 The University of Melbourne
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.
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.
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
22
# Provides a User class which stores the login details of a particular IVLE
23
# user. Objects of this class are expected to be stored in the request
30
# Similar to db.login_fields_list but contains a different set of fields.
31
# The User object does not contain all the fields.
32
user_fields_required = frozenset((
33
"login", "fullname", "role", "state", "unixid"
36
"login", "state", "unixid", "email", "nick", "fullname",
37
"role", "studentid", "acct_exp", "pass_exp", "last_login",
38
"svn_pass", "local_password",
40
timestamp_fields = frozenset((
41
"acct_exp", "pass_exp", "last_login",
43
# Fields not included: passhash, last_login
45
class UserException(Exception):
50
Stores the login details of a particular IVLE user.
51
Its fields correspond to (most of) the fields of the "login" table of the
53
All fields are always present, but some may be None.
55
__slots__ = user_fields_list
56
def __init__(self, **kwargs):
57
# XXX Will ignore unknown fields instead of erroring
58
if "rolenm" in kwargs and "role" not in kwargs:
59
kwargs['role'] = common.caps.Role(kwargs['rolenm'])
60
if "passhash" in kwargs and "local_password" not in kwargs:
61
kwargs['local_password'] = kwargs['passhash'] is not None
62
for r in user_fields_list:
64
self.__setattr__(r, kwargs[r])
65
elif r in user_fields_required:
66
# Required argument, not specified
67
raise TypeError("User: Required field %s missing" % repr(r))
72
self.nick = kwargs['fullname']
74
raise TypeError("User: Required field "
77
self.__setattr__(r, None)
78
for field in timestamp_fields:
79
# Convert all timestamp fields from strings to Timestamp objects
80
if hasattr(self, field):
81
val = self.__getattribute__(field)
83
val = time.strptime(val, db.TIMESTAMP_FORMAT)
84
self.__setattr__(field, val)
87
items = ["%s=%s" % (r, repr(self.__getattribute__(r)))
88
for r in user_fields_list]
89
return "User(" + ', '.join(items) + ")"
91
"""Iteration yielding field:value pairs.
92
(Allows the "dict" function to work on Users)
94
for r in user_fields_list:
95
yield (r, self.__getattribute__(r))
97
def hasCap(self, capability):
98
"""Given a capability (which is a Role object), returns True if this
99
User has that capability, False otherwise.
101
return self.role.hasCap(capability)
103
def pass_expired(self):
104
"""Determines whether the pass_exp field indicates that
105
login should be denied.
107
fieldval = self.pass_exp
108
return fieldval is not None and time.localtime() > fieldval
109
def acct_expired(self):
110
"""Determines whether the acct_exp field indicates that
111
login should be denied.
113
fieldval = self.acct_exp
114
return fieldval is not None and time.localtime() > fieldval