1
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={}
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
168
169
170
171 -class AUTH(PlugIn):
172 NS=''
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
186 NS=''
187
188
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
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
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
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
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
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
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
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
324 return len(db[server].keys())
325
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
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
345 try:
346 global db
347
348
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
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
388
389 @property
392
395