1
2
3
4
5 """ bot's users """
6
7 __copyright__ = 'this file is in the public domain'
8
9 from gozerbot.datadir import datadir
10 from gozerbot.generic import rlog, stripident, stripidents, \
11 handle_exception, exceptionmsg, die, stripped
12 from gozerbot.persist import Persist
13 from gozerbot.config import config
14 import re, types, os, time
15
16 config.load()
17
19
20 """ repesents a user """
21
22 - def __init__(self, name, userhosts, perms):
23 self.name = str(name)
24 self.userhosts = list(userhosts)
25 self.perms = list(perms)
26 self.email = ""
27 self.permit = []
28 self.status = []
29 self.passwd = ""
30 self.allowed = []
31 self.notallowed = []
32 self.tempuserhosts = []
33 self.userdata = {}
34
36 return "name: %s userhosts: %s perms: %s email: %s status: %s \
37 allowed: %s notallowed: %s tempusershosts: %s permit: %s" % (self.name, \
38 self.userhosts, self.perms, self.email, self.status, self.allowed, \
39 self.notallowed, self.tempuserhosts, self.permit)
40
42
43 """ holds multiple users """
44
46 self.userhosts = {}
47 self.masks = {}
48 self.compiled = {}
49 Persist.__init__(self, filename)
50 if not self.data:
51 self.data = []
52 for i in self.data:
53 for j in i.userhosts:
54 self.adduserhost(j, i)
55
57 """ add userhost/mask """
58 if '?' in userhost or '*' in userhost:
59 tmp = re.escape(userhost)
60 tmp = tmp.replace('\?','.')
61 tmp = tmp.replace('\*','.*?')
62 regex = re.compile(tmp)
63 self.compiled[regex] = user
64 self.masks[userhost] = regex
65 else:
66 self.userhosts[userhost] = user
67
69 """ del userhost/mask """
70 try:
71 if '?' in userhost or '*' in userhost:
72 regex = self.masks[userhost]
73 del self.compiled[regex]
74 del self.masks[userhost]
75 else:
76 del self.userhosts[userhost]
77 return 1
78 except KeyError:
79 return 0
80
82 """ see if user with username exists """
83 name = name.lower()
84 for i in self.data:
85 if i.name == name:
86 return 1
87
89 """ get permissions """
90 user = self.getuser(userhost)
91 if user:
92 return user.perms
93 else:
94 return ['ANON', ]
95
97 """ get user for which userhost matches """
98 userhost = stripident(userhost)
99 if userhost in self.userhosts:
100 return self.userhosts[userhost]
101 else:
102 for i in self.compiled:
103 if re.search(i, userhost):
104 return self.compiled[i]
105 for user in self.data:
106 for i in user.userhosts:
107 if i == userhost or i == stripped(userhost):
108 return user
109 return None
110
112 user = self.byname(name)
113 if not user:
114 return 0
115 if perm in user.perms:
116 return 1
117
119 """ return nr of users """
120 return len(self.data)
121
122 - def add(self, name, userhosts, perms):
123 """ add user """
124 self.addnosave(name, userhosts, perms)
125 self.save()
126 return 1
127
128 - def addnosave(self, name, userhosts, perms):
129 """ add user without saving """
130 name = name.lower()
131 for item in self.data:
132 if item.name == name:
133 return 0
134 userhosts = stripidents(userhosts)
135
136 user = User(name, userhosts, perms)
137 self.data.append(user)
138 rlog(10, 'users', 'added user %s %s with perms %s' % (name, \
139 userhosts, perms))
140 for i in userhosts:
141 self.adduserhost(i, user)
142 return 1
143
145 """ check if (who,what) is in users permit list """
146 user = self.getuser(userhost)
147 if not user:
148 return 0
149 if (who, what) in user.permit:
150 return 1
151
153 """ get names of all users """
154 result = []
155 for item in self.data:
156 result.append(item.name)
157 return result
158
160 """ get name of user with userhost """
161 item = self.getuser(userhost)
162 if item:
163 return item.name
164 else:
165 return None
166
168 """ return user with name """
169 name = name.lower()
170 for item in self.data:
171 if item.name.lower() == name:
172 return item
173 return None
174
175 - def merge(self, name, userhost):
176 """ add userhosts to user with name """
177 name = name.lower()
178 for item in self.data:
179 if item.name == name:
180 userhost = stripident(userhost)
181 item.userhosts.append(userhost)
182 self.adduserhost(userhost, item)
183 self.save()
184 rlog(10, 'users', 'merged %s (%s) with %s' % (name, \
185 userhost, item.name))
186 return 1
187 return None
188
190 """ delete user with name """
191 data = self.data
192 name = name.lower()
193 got = 0
194 for itemnr in range(len(data)-1, -1, -1):
195 if data[itemnr].name == name:
196 for i in data[itemnr].userhosts:
197 self.deluserhost(i)
198 del data[itemnr]
199 got = 1
200 if got:
201 self.save()
202 return 1
203 return None
204
205 - def allowed(self, userhost, perms, log=True):
206 """ check if user with userhosts is allowed to execute perm command """
207 if type(perms) != types.ListType:
208 perms = [perms, ]
209 if 'ANY' in perms:
210 return 1
211 item = self.getuser(userhost)
212 if not item:
213 if log:
214 rlog(10, 'users', '%s userhost denied' % userhost)
215 return 0
216 for i in perms:
217 if i in item.perms:
218 return 1
219 if log:
220 rlog(10, 'users', '%s perm %s denied' % (userhost, perms))
221 return 0
222
223 - def status(self, userhost, status):
224 """ check if user has status set """
225 status = status.upper()
226 item = self.getuser(userhost)
227 if not item:
228 return 0
229 if status in item.status:
230 return 1
231 return 0
232
234 """ return email of user """
235 user = self.byname(name)
236 return user.email
237
239 """ set email of user """
240 user = self.byname(name)
241 user.email = email
242 self.save()
243 return 1
244
245
246
247 if config['dbenable']:
248 try:
249 import gozerbot.db
250 import gozerbot.dbusers
251 except Exception, ex:
252 print exceptionmsg()
253 rlog(100, 'users', 'an error has occured while trying to enable \
254 the mysql database')
255 time.sleep(5)
256 die()
257 users = gozerbot.dbusers.Dbusers()
258 else:
259
260 users = Users(datadir + os.sep + 'users')
261