Package gozerbot :: Module users
[hide private]
[frames] | no frames]

Source Code for Module gozerbot.users

  1  # gozerbot/users.py 
  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   
18 -class User(object):
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
35 - def __str__(self):
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
41 -class Users(Persist):
42 43 """ holds multiple users """ 44
45 - def __init__(self, filename):
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
56 - def adduserhost(self, userhost, user):
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
68 - def deluserhost(self, userhost):
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
81 - def exist(self, name):
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
88 - def getperms(self, userhost):
89 """ get permissions """ 90 user = self.getuser(userhost) 91 if user: 92 return user.perms 93 else: 94 return ['ANON', ]
95
96 - def getuser(self, userhost):
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
111 - def gotperm(self, name, perm):
112 user = self.byname(name) 113 if not user: 114 return 0 115 if perm in user.perms: 116 return 1
117
118 - def size(self):
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 # add user 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
144 - def permitted(self, userhost, who, what):
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
152 - def names(self):
153 """ get names of all users """ 154 result = [] 155 for item in self.data: 156 result.append(item.name) 157 return result
158
159 - def getname(self, userhost):
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
167 - def byname(self, name):
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
189 - def delete(self, name):
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
233 - def getemail(self, name):
234 """ return email of user """ 235 user = self.byname(name) 236 return user.email
237
238 - def setemail(self, name, email):
239 """ set email of user """ 240 user = self.byname(name) 241 user.email = email 242 self.save() 243 return 1
244 245 # if database is enabled create db object and set users object to 246 # database users 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 # no database .. create normal users object 260 users = Users(datadir + os.sep + 'users') 261