1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
|
# -*- test-case-name: twisted.python.test.test_fakepwd -*-
# Copyright (c) Twisted Matrix Laboratories.
# See LICENSE for details.
"""
L{twisted.python.fakepwd} provides a fake implementation of the L{pwd} API.
"""
__all__ = ['UserDatabase', 'ShadowDatabase']
class _UserRecord(object):
"""
L{_UserRecord} holds the user data for a single user in L{UserDatabase}.
It corresponds to L{pwd.struct_passwd}. See that class for attribute
documentation.
"""
def __init__(self, name, password, uid, gid, gecos, home, shell):
self.pw_name = name
self.pw_passwd = password
self.pw_uid = uid
self.pw_gid = gid
self.pw_gecos = gecos
self.pw_dir = home
self.pw_shell = shell
def __len__(self):
return 7
def __getitem__(self, index):
return (
self.pw_name, self.pw_passwd, self.pw_uid,
self.pw_gid, self.pw_gecos, self.pw_dir, self.pw_shell)[index]
class UserDatabase(object):
"""
L{UserDatabase} holds a traditional POSIX user data in memory and makes it
available via the same API as L{pwd}.
@ivar _users: A C{list} of L{_UserRecord} instances holding all user data
added to this database.
"""
def __init__(self):
self._users = []
def addUser(self, username, password, uid, gid, gecos, home, shell):
"""
Add a new user record to this database.
@param username: The value for the C{pw_name} field of the user
record to add.
@type username: C{str}
@param password: The value for the C{pw_passwd} field of the user
record to add.
@type password: C{str}
@param uid: The value for the C{pw_uid} field of the user record to
add.
@type uid: C{int}
@param gid: The value for the C{pw_gid} field of the user record to
add.
@type gid: C{int}
@param gecos: The value for the C{pw_gecos} field of the user record
to add.
@type gecos: C{str}
@param home: The value for the C{pw_dir} field of the user record to
add.
@type home: C{str}
@param shell: The value for the C{pw_shell} field of the user record to
add.
@type shell: C{str}
"""
self._users.append(_UserRecord(
username, password, uid, gid, gecos, home, shell))
def getpwuid(self, uid):
"""
Return the user record corresponding to the given uid.
"""
for entry in self._users:
if entry.pw_uid == uid:
return entry
raise KeyError()
def getpwnam(self, name):
"""
Return the user record corresponding to the given username.
"""
for entry in self._users:
if entry.pw_name == name:
return entry
raise KeyError()
def getpwall(self):
"""
Return a list of all user records.
"""
return self._users
class _ShadowRecord(object):
"""
L{_ShadowRecord} holds the shadow user data for a single user in
L{ShadowDatabase}. It corresponds to C{spwd.struct_spwd}. See that class
for attribute documentation.
"""
def __init__(self, username, password, lastChange, min, max, warn, inact,
expire, flag):
self.sp_nam = username
self.sp_pwd = password
self.sp_lstchg = lastChange
self.sp_min = min
self.sp_max = max
self.sp_warn = warn
self.sp_inact = inact
self.sp_expire = expire
self.sp_flag = flag
def __len__(self):
return 9
def __getitem__(self, index):
return (
self.sp_nam, self.sp_pwd, self.sp_lstchg, self.sp_min,
self.sp_max, self.sp_warn, self.sp_inact, self.sp_expire,
self.sp_flag)[index]
class ShadowDatabase(object):
"""
L{ShadowDatabase} holds a shadow user database in memory and makes it
available via the same API as C{spwd}.
@ivar _users: A C{list} of L{_ShadowRecord} instances holding all user data
added to this database.
@since: 12.0
"""
def __init__(self):
self._users = []
def addUser(self, username, password, lastChange, min, max, warn, inact,
expire, flag):
"""
Add a new user record to this database.
@param username: The value for the C{sp_nam} field of the user record to
add.
@type username: C{str}
@param password: The value for the C{sp_pwd} field of the user record to
add.
@type password: C{str}
@param lastChange: The value for the C{sp_lstchg} field of the user
record to add.
@type lastChange: C{int}
@param min: The value for the C{sp_min} field of the user record to add.
@type min: C{int}
@param max: The value for the C{sp_max} field of the user record to add.
@type max: C{int}
@param warn: The value for the C{sp_warn} field of the user record to
add.
@type warn: C{int}
@param inact: The value for the C{sp_inact} field of the user record to
add.
@type inact: C{int}
@param expire: The value for the C{sp_expire} field of the user record
to add.
@type expire: C{int}
@param flag: The value for the C{sp_flag} field of the user record to
add.
@type flag: C{int}
"""
self._users.append(_ShadowRecord(
username, password, lastChange,
min, max, warn, inact, expire, flag))
def getspnam(self, username):
"""
Return the shadow user record corresponding to the given username.
"""
for entry in self._users:
if entry.sp_nam == username:
return entry
raise KeyError
def getspall(self):
"""
Return a list of all shadow user records.
"""
return self._users
|