Package spade :: Package xmppd :: Package modules :: Module db_fake
[hide private]
[frames] | no frames]

Source Code for Module spade.xmppd.modules.db_fake

  1  # -*- coding: utf-8 -*- 
  2  from xmpp import * 
  3   
  4   
  5  """try: 
  6          from xml.marshal.generic import * 
  7          marshal = Marshaller() 
  8          unmarshal = Unmarshaller() 
  9  except: 
 10          import marshal 
 11          import marshal as unmarshal 
 12   
 13  """ 
 14  import marshal 
 15  import marshal as unmarshal 
 16  import copy 
 17   
 18  db={} 
19 20 -def build_database(server_instance):
21 global db 22 for a_registered_server in server_instance.servernames: 23 server_instance.DEBUG('server','DB: Building database tree for %s'%a_registered_server,'info') 24 if not db.has_key(a_registered_server): 25 db[a_registered_server]={} 26 27 28 db[a_registered_server]['__ir__'] = {} 29 db[a_registered_server]['__ir__']['storage'] = {'karma':{'down':307200,'up':307200307200307200,'last_time':0.0,'tot_down':0,'tot_up':0}} 30 db[a_registered_server]['__ir__']['password'] = 'test' 31 db[a_registered_server]['__ir__']['anon_allow'] = 'yes' 32 db[a_registered_server]['__ir__']['roster'] = {} 33 db[a_registered_server]['__ir__']['groups'] = {} 34 35 """ 36 db[a_registered_server]['t'] = {} 37 db[a_registered_server]['t']['password'] = 'thx1138.dsic.upv.es' 38 db[a_registered_server]['t']['anon_allow'] = 'yes' 39 db[a_registered_server]['t']['roster'] = {} 40 #db[a_registered_server]['t']['roster']['t2@thx1138.dsic.upv.es'] = {'subscription':'both'} 41 db[a_registered_server]['t']['groups'] = {} 42 db[a_registered_server]['t2'] = {} 43 db[a_registered_server]['t2']['password'] = 'thx1138.dsic.upv.es' 44 db[a_registered_server]['t2']['anon_allow'] = 'yes' 45 db[a_registered_server]['t2']['roster'] = {} 46 #db[a_registered_server]['t2']['roster']['t@thx1138.dsic.upv.es'] = {'subscription':'both'} 47 db[a_registered_server]['t2']['groups'] = {} 48 49 db[a_registered_server]['t3'] = {} 50 db[a_registered_server]['t3']['password'] = 't3' 51 db[a_registered_server]['t3']['anon_allow'] = 'yes' 52 db[a_registered_server]['t3']['roster'] = {} 53 db[a_registered_server]['t3']['groups'] = {} 54 db[a_registered_server]['t3']['name'] = "T3" 55 56 db[a_registered_server]['t4'] = {} 57 db[a_registered_server]['t4']['password'] = 't4' 58 db[a_registered_server]['t4']['anon_allow'] = 'yes' 59 db[a_registered_server]['t4']['roster'] = {} 60 db[a_registered_server]['t4']['groups'] = {} 61 db[a_registered_server]['t4']['name'] = "T4" 62 63 64 db[a_registered_server]['test'] = {} 65 db[a_registered_server]['test']['storage'] = {'karma':{'down':307200,'up':307200307200307200,'last_time':0.0,'tot_down':0,'tot_up':0}} 66 db[a_registered_server]['test']['password'] = 'test' 67 #Anon_allow tells the privacy subsystem if it's okay for someone to contact you 68 #without any subscription at all. 69 db[a_registered_server]['test']['anon_allow'] = 'no' 70 db[a_registered_server]['test']['roster'] = {} 71 # {'jid':'test2@172.16.1.34','name':'Test Account 2','subscription':'both'}, 72 # {'jid':'test3@172.16.1.34','subscription':'both'}] 73 db[a_registered_server]['test']['groups'] = {} 74 db[a_registered_server]['test']['groups']['Friends'] = ['test2@172.16.1.34','test3@172.16.1.34'] 75 76 db[a_registered_server]['test2'] = {} 77 db[a_registered_server]['test2']['storage'] = {'karma':{'down':307200,'up':307200,'last_time':0.0,'tot_down':0,'tot_up':0}} 78 db[a_registered_server]['test2']['password'] = 'test' 79 db[a_registered_server]['test2']['anon_allow'] = 'yes' 80 81 db[a_registered_server]['test2']['roster'] = {} 82 db[a_registered_server]['test2']['roster']['test3@'+a_registered_server] = {'subscription':'both'} 83 84 db[a_registered_server]['test2']['groups'] = {} 85 db[a_registered_server]['test2']['groups']['Friends'] = ['test3@172.16.1.34','test3@172.16.0.2','test3@'+a_registered_server] 86 87 db[a_registered_server]['test3'] = {} 88 db[a_registered_server]['test3']['storage'] = {'karma':{'down':307200,'up':307200,'last_time':0.0,'tot_down':0,'tot_up':0}} 89 db[a_registered_server]['test3']['password'] = 'test' 90 db[a_registered_server]['test3']['anon_allow'] = 'yes' 91 db[a_registered_server]['test3']['name'] = 'テスト・アカウント#3' 92 #Roster Info 93 ##Roster Items 94 db[a_registered_server]['test3']['roster'] = {} 95 db[a_registered_server]['test3']['roster']['test2@'+a_registered_server] = {'subscription':'both'} 96 db[a_registered_server]['test3']['roster']['pixelcort@'+a_registered_server] = {'subscription':'both'} 97 db[a_registered_server]['test3']['roster']['kris_tate@'+a_registered_server] = {'subscription':'both'} 98 99 ##Item Groups 100 db[a_registered_server]['test3']['groups'] = {} 101 db[a_registered_server]['test3']['groups']['かっこういいな人'] = ['test2@172.16.1.34','test2@172.16.0.2','test2@'+a_registered_server,'pixelcort@'+a_registered_server,'kris_tate@'+a_registered_server] 102 103 db[a_registered_server]['pixelcort'] = {} 104 db[a_registered_server]['pixelcort']['storage'] = {'karma':{'down':307200,'up':307200,'last_time':0.0,'tot_down':0,'tot_up':0}} 105 db[a_registered_server]['pixelcort']['password'] = 'test' 106 db[a_registered_server]['pixelcort']['anon_allow'] = 'yes' 107 db[a_registered_server]['pixelcort']['name'] = 'Cortland Klein' 108 #Roster Info 109 ##Roster Items 110 db[a_registered_server]['pixelcort']['roster'] = {} 111 db[a_registered_server]['pixelcort']['roster']['tekcor@'+a_registered_server] = {'subscription':'both'} 112 db[a_registered_server]['pixelcort']['roster']['kris_tate@'+a_registered_server] = {'subscription':'both'} 113 db[a_registered_server]['pixelcort']['roster']['mvanveen@'+a_registered_server] = {'subscription':'both'} 114 115 ##Item Groups 116 db[a_registered_server]['pixelcort']['groups'] = {} 117 db[a_registered_server]['pixelcort']['groups']['Friends'] = ['tekcor@'+a_registered_server,'mvanveen@'+a_registered_server] 118 db[a_registered_server]['pixelcort']['groups']['Kris'] = ['kris_tate@'+a_registered_server] 119 120 db[a_registered_server]['kris_tate'] = {} 121 db[a_registered_server]['kris_tate']['storage'] = {'karma':{'down':307200,'up':1000,'last_time':0.0,'tot_down':0,'tot_up':0}} 122 db[a_registered_server]['kris_tate']['password'] = 'test' 123 db[a_registered_server]['kris_tate']['anon_allow'] = 'yes' 124 db[a_registered_server]['kris_tate']['name'] = 'Kristopher Tate' 125 #Roster Info 126 ##Roster Items 127 db[a_registered_server]['kris_tate']['roster'] = {} 128 db[a_registered_server]['kris_tate']['roster']['tekcor@'+a_registered_server] = {'subscription':'both'} 129 db[a_registered_server]['kris_tate']['roster']['pixelcort@'+a_registered_server] = {'subscription':'both'} 130 db[a_registered_server]['kris_tate']['roster']['mvanveen@'+a_registered_server] = {'subscription':'both'} 131 132 ##Item Groups 133 db[a_registered_server]['kris_tate']['groups'] = {} 134 db[a_registered_server]['kris_tate']['groups']['かっこういいな人'] = ['tekcor@'+a_registered_server,'pixelcort@'+a_registered_server,'mvanveen@'+a_registered_server] 135 136 db[a_registered_server]['tekcor'] = {} 137 db[a_registered_server]['tekcor']['storage'] = {'karma':{'down':307200,'up':307200,'last_time':0.0,'tot_down':0,'tot_up':0}} 138 db[a_registered_server]['tekcor']['password'] = 'test' 139 db[a_registered_server]['tekcor']['anon_allow'] = 'yes' 140 db[a_registered_server]['tekcor']['name'] = 'Thom McGrath' 141 #Roster Info 142 ##Roster Items 143 db[a_registered_server]['tekcor']['roster'] = {} 144 db[a_registered_server]['tekcor']['roster']['pixelcort@'+a_registered_server] = {'subscription':'both'} 145 db[a_registered_server]['tekcor']['roster']['kris_tate@'+a_registered_server] = {'subscription':'both'} 146 147 ##Item Groups 148 db[a_registered_server]['tekcor']['groups'] = {} 149 db[a_registered_server]['tekcor']['groups']['Friends'] = ['kris_tate@'+a_registered_server,'pixelcort@'+a_registered_server] 150 151 152 db[a_registered_server]['mvanveen'] = {} 153 db[a_registered_server]['mvanveen']['storage'] = {'karma':{'down':307200,'up':307200,'last_time':0.0,'tot_down':0,'tot_up':0}} 154 db[a_registered_server]['mvanveen']['password'] = 'test' 155 db[a_registered_server]['mvanveen']['anon_allow'] = 'yes' 156 db[a_registered_server]['mvanveen']['name'] = 'Mike Van Veen' 157 #Roster Info 158 ##Roster Items 159 db[a_registered_server]['mvanveen']['roster'] = {} 160 db[a_registered_server]['mvanveen']['roster']['pixelcort@'+a_registered_server] = {'subscription':'both'} 161 db[a_registered_server]['mvanveen']['roster']['kris_tate@'+a_registered_server] = {'subscription':'both'} 162 163 ##Item Groups 164 db[a_registered_server]['mvanveen']['groups'] = {} 165 db[a_registered_server]['mvanveen']['groups']['Friends'] = ['kris_tate@'+a_registered_server,'pixelcort@'+a_registered_server] 166 """
167 #for guy in db[a_registered_server].keys():
168 # db[a_registered_server][guy]['roster'][a_registered_server] = {'subscription':'to','name':"Help Desk"} 169 170 171 -class AUTH(PlugIn):
172 NS=''
173 - def getpassword(self, node, domain):
174 try: return db[domain][node]['password'] 175 except KeyError: pass
176
177 - def isuser(self, node, domain):
178 try: 179 if db[str(domain)].has_key(node): return True 180 except: pass 181 182 if str(domain) in self._owner.components.keys(): return True 183 return False
184
185 -class DB(PlugIn):
186 NS='' 187 188
189 - def plugin(self,server):
190 self.DEBUG('Building Database tree!','info') 191 self.load_database() 192 build_database(server) #Building database!
193
194 - def store(self,domain,node,stanza,id='next_unique_id'):
195 if not node: node, domain = domain.split(".",1) 196 try: 197 self.DEBUG("Storing to database:\n%s:%s::%s:%s"%(domain,node,id,stanza),'info') 198 db[domain][node]['storage'][id] = stanza 199 self.save_database() 200 return True 201 except KeyError: 202 self.DEBUG("Could not store in database:\n%s:%s::%s:%s"%(domain,node,id,stanza),'error') 203 return False
204
205 - def get_store(self,domain,node,id):
206 if not node: node, domain = domain.split(".",1) 207 try: 208 return db[domain][node]['storage'][id] 209 except KeyError: 210 return False
211
212 - def get_storage(self,domain,node):
213 if not node: node, domain = domain.split(".",1) 214 try: 215 l = copy.copy(db[domain][node]['storage'].values()) 216 db[domain][node]['storage'].clear() 217 return l 218 except KeyError: 219 return [] 220 except: 221 return []
222 223
224 - def save(self,domain,node,stanza,id='next_unique_id'):
225 if not node: node, domain = domain.split(".",1) 226 try: 227 self.DEBUG("Saving to database:\n%s:%s::%s:%s"%(domain,node,id,stanza),'info') 228 db[domain][node][id] = stanza 229 self.save_database() 230 return True 231 except KeyError: 232 self.DEBUG("DB ERR: Could not save to database:\n%s:%s::%s:%s"%(domain,node,id,stanza),'warn') 233 return False
234
235 - def save_to_roster(self,domain,node,jid,info,add_only_if_already=False):
236 if not node: node, domain = domain.split(".",1) 237 self.DEBUG("Saving roster info to database %s-->(%s) [%s]:\n"%(jid,node+'@'+domain,str(info)),'info') 238 if db[domain][node]['roster'].has_key(jid) and add_only_if_already==False: 239 db[domain][node]['roster'][jid].update(info) 240 else: 241 db[domain][node]['roster'][jid] = info 242 self.save_database()
243 244
245 - def pull_roster(self,domain,node,jid):
246 if not node: node, domain = domain.split(".",1) 247 try: 248 data = db[domain][node]['roster'][jid] 249 if data.has_key('subscription') == False: 250 data.update({'subscription':'none'}) 251 return data 252 except KeyError: 253 self.DEBUG('DB ERR: Could not retrieve %s@%s roster for %s'%(node,domain,jid),'warn') 254 return None
255
256 - def del_from_roster(self,domain,node,jid):
257 if not node: node, domain = domain.split(".",1) 258 self.DEBUG("Deleting roster info from database %s--X(%s):\n"%(jid,node+'@'+domain),'info') 259 try: 260 del(db[domain][node]['roster'][jid]) 261 self.save_database() 262 return True 263 except KeyError, err: 264 self.DEBUG('DB ERR: A Client tried to remove a contact that wasn\'t even added! (%s::%s::%s)'%(domain,node,jid),'warn') 265 return False
266
267 - def del_from_roster_jid(self,domain,node,jid,what):
268 if not node: node, domain = domain.split(".",1) 269 self.DEBUG("Deleting roster info from database %s--X(%s):\n"%(jid,node+'@'+domain),'info') 270 try: 271 del(db[domain][node]['roster'][jid][what]) 272 self.save_database() 273 return True 274 except KeyError, err: 275 self.DEBUG('DB ERR: A Client tried to remove a contact attr that wasn\'t even added! (%s::%s::%s)'%(domain,node,jid),'warn') 276 return False
277
278 - def save_groupie(self,domain,node,jid,groups):
279 if not node: node, domain = domain.split(".",1) 280 temp = [] 281 for x in groups: 282 if type(x)==type(u''): x = x.encode('utf-8') 283 elif type(x)==type(u''): x = unicode(x).encode('utf-8') 284 temp += [x] 285 group_list = x 286 self.DEBUG("Saving groupie jid to database %s-->(%s) [%s]:\n"%(jid,node+'@'+domain,unicode(groups).encode('utf-8')),'info') 287 for gn,gm in db[domain][node]['groups'].iteritems(): 288 if gn not in group_list and jid in db[domain][node]['groups'][gn]: 289 db[domain][node]['groups'][gn].remove(jid) 290 elif gn in group_list and jid not in db[domain][node]['groups'][gn]: 291 db[domain][node]['groups'][gn] += [jid] 292 self.save_database()
293
294 - def del_groupie(self,domain,node,jid):
295 if not node: node, domain = domain.split(".",1) 296 try: 297 self.DEBUG("Deleting groupie from database %s--X(%s):\n"%(jid,node+'@'+domain),'info') 298 for gn,gm in db[domain][node]['groups'].iteritems(): 299 if jid in db[domain][node]['groups'][gn]: 300 db[domain][node]['groups'][gn].remove(jid) 301 except Exception, err: 302 self.DEBUG('DB ERR: A groupie went mad! %s::%s::%s'%(domain,node,jid),'warn') 303 self.save_database()
304
305 - def get(self,domain,node,what):
306 if not node: node, domain = domain.split(".",1) 307 try: 308 return db[domain][node][what] 309 except KeyError: 310 self.DEBUG('DB ERR: Could not retrieve %s::%s::%s'%(domain,node,what),'warn') 311 return None
312
313 - def delete(self,domain,node,what):
314 if not node: node, domain = domain.split(".",1) 315 try: 316 del(db[domain][node][what]) 317 self.save_database() 318 return True 319 except KeyError: 320 self.DEBUG('DB ERR: Could not delete %s::%s::%s'%(domain,node,what),'warn') 321 return None
322
323 - def getNumRegistered(self,server):
324 return len(db[server].keys())
325
326 - def register_user(self,domain,node,password,name):
327 try: 328 db[domain][node] = {} 329 db[domain][node]['password'] = password 330 db[domain][node]['roster'] = {} 331 db[domain][node]['storage'] = {} 332 db[domain][node]['groups'] = {} 333 db[domain][node]['name'] = name 334 db[domain][node]['anon_allow'] = 'yes' 335 db[domain][node]['roster'] = {} 336 #db[domain][node]['roster'][domain] = {'subscription':'to','name':"Help Desk"} 337 self.DEBUG("Registered user %s in domain %s"%(node,domain),'info') 338 self.save_database() 339 return True 340 except: 341 self.DEBUG('Error registering username %s in domain %s'%(node,domain),'error') 342 return False
343
344 - def save_database(self, filename="user_db.xml"):
345 try: 346 global db 347 #print "#### userdbfile = " + str(self.userdbfile) 348 #print "#### spoolpath = " + str(self.spoolpath) 349 """ 350 if not os.path.exists(self.spoolpath): 351 self.DEBUG("spoolpath does no exist.", 'warn') 352 p = self.spoolpath.split(os.sep) 353 tmpitem='' 354 for item in p: 355 tmpitem+=os.sep+str(item) 356 if not os.path.exists(tmpitem): 357 self.DEBUG("mkdir " + str(tmpitem), 'info') 358 os.mkdir(tmpitem) 359 """ 360 fh = open(filename, 'w') 361 marshal.dump(db, fh) 362 fh.close() 363 self.DEBUG('save_database: User database saved!', 'info') 364 return True 365 except: 366 self.DEBUG('save_database: Could not save user database', 'error') 367 return False
368 369 370
371 - def load_database(self, filename="user_db.xml"):
372 """ 373 Loads an entire database from disk 374 """ 375 try: 376 global db 377 fh = open(filename, 'r') 378 db = unmarshal.load(fh) 379 fh.close() 380 self.DEBUG('load_database: User database loaded', 'info') 381 return True 382 except: 383 self.DEBUG('load_database: Could not load user database', 'error') 384 return False
385
386 - def __str__(self):
387 return str(db)
388 389 @property
390 - def db(self):
391 return db
392
393 - def print_database(self):
394 print str(self)
395