~ubuntu-branches/ubuntu/utopic/gozerbot/utopic

« back to all changes in this revision

Viewing changes to gozerbot/jsonusers.py

  • Committer: Bazaar Package Importer
  • Author(s): Jeremy Malcolm
  • Date: 2009-09-14 09:00:29 UTC
  • mfrom: (1.1.4 upstream) (3.1.5 sid)
  • Revision ID: james.westby@ubuntu.com-20090914090029-uval0ekt72kmklxw
Tags: 0.9.1.3-3
Changed dependency on python-setuptools to python-pkg-resources
(Closes: #546435) 

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# gozerbot/jsonusers.py
 
2
#
 
3
#
 
4
 
 
5
""" bot's users in JSON file.  NOT USED AT THE MOMENT. """
 
6
 
 
7
__copyright__ = 'this file is in the public domain'
 
8
 
 
9
# ==============
 
10
# IMPORT SECTION
 
11
 
 
12
# gozerbot imports
 
13
from gozerbot.datadir import datadir
 
14
from gozerbot.utils.log import rlog
 
15
from gozerbot.utils.generic import stripident, stripidents
 
16
from gozerbot.utils.exception import handle_exception, exceptionmsg
 
17
from gozerbot.utils.generic import die, stripped
 
18
from gozerbot.persist.persist import Persist
 
19
from gozerbot.utils.lazydict import LazyDict
 
20
from gozerbot.config import config
 
21
 
 
22
# basic imports
 
23
import re, types, os, time
 
24
 
 
25
# END IMPORT
 
26
# ==========
 
27
 
 
28
# ============
 
29
# LOCK SECTION
 
30
 
 
31
# no locks
 
32
 
 
33
# END LOCK
 
34
# ========
 
35
 
 
36
 
 
37
class JsonUser(LazyDict):
 
38
 
 
39
    """ LazyDict representing a user. """
 
40
 
 
41
    def __init__(self, name="", userhosts=[], perms=[], permits=[], status=[], email=[], d=None):
 
42
        if not d:
 
43
            LazyDict.__init__(self)
 
44
            self.name = name
 
45
            self.userhosts = userhosts
 
46
            self.perms = perms
 
47
            self.permits = permits
 
48
            self.status = status
 
49
            self.email = email
 
50
        else:
 
51
            LazyDict.__init__(self, d)
 
52
 
 
53
class JsonUsers(Persist):
 
54
 
 
55
    """ class representing all users. """
 
56
 
 
57
    def __init__(self, filename, ddir=None):
 
58
        self.datadir = ddir or datadir
 
59
        Persist.__init__(self, filename)
 
60
        if not self.data:
 
61
            self.data = {}
 
62
        self.users = self.data
 
63
 
 
64
    def all(self):
 
65
 
 
66
        """ get all users. """
 
67
 
 
68
        result = []
 
69
        for userdata in self.data.values():
 
70
            result.append(JsonUser(d=userdata))
 
71
        return result
 
72
 
 
73
    ### Misc. Functions
 
74
    def size(self):
 
75
 
 
76
        """ return nr of users. """
 
77
 
 
78
        return len(self.users)
 
79
 
 
80
    def names(self):
 
81
 
 
82
        """ get names of all users. """
 
83
 
 
84
        result = []
 
85
        for user in self.all():
 
86
            result.append(user.name)
 
87
        return result
 
88
 
 
89
    def byname(self, name):
 
90
        """ return user by name. """ 
 
91
        try:
 
92
            return JsonUser(d=self.users[name])
 
93
        except KeyError:
 
94
            return
 
95
 
 
96
    def merge(self, name, userhost):
 
97
        """ add userhosts to user with name """
 
98
        user = self.byname(name)
 
99
        if user:
 
100
            user.userhosts.append(userhost)
 
101
            self.save()
 
102
            rlog(10, 'users', "%s merged with %s" % (userhost, name))
 
103
            return 1
 
104
 
 
105
    def usersearch(self, userhost):
 
106
        """ search for users with a userhost like the one specified """
 
107
        result = []
 
108
        for udata in self.users.values():
 
109
            user = JsonUser(d=udata)
 
110
            if userhost in user.userhosts:
 
111
                 result.append((user.name, user.userhost))
 
112
        return result
 
113
 
 
114
    def getuser(self, userhost):
 
115
        for userdata in self.users.values():
 
116
            user = JsonUser(d=userdata)
 
117
            if userhost in user.userhosts:
 
118
                return user
 
119
 
 
120
    ### Check functions
 
121
    def exist(self, name):
 
122
        """ see if user with <name> exists """
 
123
        return self.byname(name)
 
124
 
 
125
    def allowed(self, userhost, perms, log=True):
 
126
        """ check if user with userhosts is allowed to execute perm command """
 
127
        if not type(perms) == types.ListType:
 
128
            perms = [perms, ]
 
129
        if 'ANY' in perms:
 
130
            return 1
 
131
        res = None
 
132
        user = self.getuser(userhost)
 
133
        if not user and log:
 
134
            rlog(10, 'users', '%s userhost denied' % userhost)
 
135
            return res
 
136
        else:
 
137
            uperms = set(user.perms)
 
138
            sperms = set(perms)
 
139
            intersection = sperms.intersection(uperms)
 
140
            res = list(intersection) or None
 
141
        if not res and log:
 
142
            rlog(10, 'users', "%s perm %s denied" % (userhost, str(perms)))
 
143
        return res
 
144
 
 
145
    def permitted(self, userhost, who, what):
 
146
        """ check if (who,what) is in users permit list """
 
147
        user = self.getuser(userhost)
 
148
        res = None
 
149
        if user:
 
150
            if '%s %s' % (who, what) in user.permits:
 
151
                res = 1
 
152
        return res
 
153
 
 
154
    def status(self, userhost, status):
 
155
        """ check if user with <userhost> has <status> set """
 
156
        user = self.getuser(userhost)
 
157
        res = None
 
158
        if user:
 
159
            if status.upper() in user.statuses:
 
160
                res = 1
 
161
        return res
 
162
 
 
163
    def gotuserhost(self, name, userhost):
 
164
        """ check if user has userhost """
 
165
        user = self.byname(name)
 
166
        return userhost in user.userhosts
 
167
 
 
168
    def gotperm(self, name, perm):
 
169
        """ check if user had permission """
 
170
        user = self.byname(name)
 
171
        if user:
 
172
            return perm.upper() in user.perms
 
173
 
 
174
    def gotpermit(self, name, permit):
 
175
        """ check if user permits something.  permit is a (who, what) tuple """
 
176
        user = self.byname(name)
 
177
        if user:
 
178
            return '%s %s' % permit in user.permits
 
179
        
 
180
    def gotstatus(self, name, status):
 
181
        """ check if user has status """
 
182
        user = self.byname(name)
 
183
        return status.upper() in user.statuses
 
184
 
 
185
    ### Get Functions
 
186
    def getname(self, userhost):
 
187
        """ get name of user belonging to <userhost> """
 
188
        user = self.getuser(userhost)
 
189
        if user:
 
190
            return user.name
 
191
 
 
192
    def gethosts(self, userhost):
 
193
        """ return the userhosts of the user associated with the specified userhost """
 
194
        user = self.getuser(userhost)
 
195
        if user:
 
196
            return user.userhosts
 
197
    
 
198
    def getemail(self, userhost):
 
199
        """ return the email of the specified userhost """
 
200
        user = self.getuser(userhost)
 
201
        if user:
 
202
            if user.email:
 
203
                return user.email[0]
 
204
 
 
205
    def getperms(self, userhost):
 
206
        """ return permission of user"""
 
207
        user = self.getuser(userhost)
 
208
        if user:
 
209
            return user.perms
 
210
 
 
211
    def getpermits(self, userhost):
 
212
        """ return permits of the specified userhost"""
 
213
        user = self.getuser(userhost)
 
214
        if user:
 
215
            return user.permits
 
216
 
 
217
    def getstatuses(self, userhost):
 
218
 
 
219
        """
 
220
            return the list of statuses for the specified userhost.
 
221
 
 
222
        """
 
223
 
 
224
        user = self.getuser(userhost)
 
225
        if user:
 
226
            return user.status
 
227
 
 
228
    def getuserhosts(self, name):
 
229
 
 
230
        """
 
231
            return the userhosts associated with the specified user.
 
232
 
 
233
        """
 
234
 
 
235
        user = self.byname(name)
 
236
 
 
237
        if user:
 
238
            return user.userhosts
 
239
 
 
240
    def getuseremail(self, name):
 
241
 
 
242
        """
 
243
            get email of user.
 
244
 
 
245
        """
 
246
 
 
247
        user = self.byname(name)
 
248
 
 
249
        if user:
 
250
            if user.email:
 
251
                return user.email[0]
 
252
 
 
253
    def getuserperms(self, name):
 
254
 
 
255
        """
 
256
            return permission of user.
 
257
 
 
258
        """
 
259
 
 
260
        user = self.byname(name)
 
261
        if user:
 
262
            return user.perms
 
263
 
 
264
    def getuserpermits(self, name):
 
265
 
 
266
        """
 
267
            return permits of user.
 
268
 
 
269
        """
 
270
 
 
271
        user = self.byname(name)
 
272
 
 
273
        if user:
 
274
            return user.permits
 
275
 
 
276
    def getuserstatuses(self, name):
 
277
 
 
278
        """
 
279
            return the list of statuses for the specified user.
 
280
 
 
281
        """
 
282
 
 
283
        user = self.byname(name)
 
284
 
 
285
        if user:
 
286
            return user.status
 
287
 
 
288
    def getpermusers(self, perm):
 
289
 
 
290
        """
 
291
            return all users that have the specified perm.
 
292
 
 
293
        """
 
294
 
 
295
        result = []
 
296
 
 
297
        for userdata in self.users.values():
 
298
            user = JsonUser(d=userdata)
 
299
 
 
300
            if perm.upper() in user.perms:
 
301
                result.append(user.name)
 
302
 
 
303
        return result
 
304
 
 
305
    def getstatususers(self, status):
 
306
 
 
307
        """
 
308
            return all users that have the specified status.
 
309
 
 
310
        """
 
311
 
 
312
        result = []
 
313
 
 
314
        for userdata in self.users.values():
 
315
            user = JsonUser(d=userdata)
 
316
 
 
317
            if status in user.status:
 
318
                result.append(user.name)
 
319
 
 
320
        return result
 
321
 
 
322
    ### Set Functions
 
323
    def setemail(self, name, email):
 
324
 
 
325
        """ 
 
326
            set email of user.
 
327
 
 
328
        """
 
329
 
 
330
        user = self.byname(name)
 
331
        if user:
 
332
            try:
 
333
                user.email.remove(email)
 
334
            except:
 
335
                pass
 
336
            user.email.insert(0, email)
 
337
            self.save()
 
338
            return True
 
339
        return False
 
340
 
 
341
    ### Add functions
 
342
    def add(self, name, userhosts, perms):
 
343
 
 
344
        """
 
345
            add an user.
 
346
 
 
347
        """
 
348
 
 
349
        if type(userhosts) != types.ListType:
 
350
            rlog(10, 'jsonusers', 'i need a list of userhosts')
 
351
            return 0
 
352
 
 
353
        if not os.path.isdir(self.datadir + os.sep + 'users'):
 
354
            os.mkdir(self.datadir + os.sep + 'users')
 
355
 
 
356
        if not os.path.isdir(self.datadir + os.sep + 'users' +  os.sep + name):
 
357
            os.mkdir(self.datadir + os.sep + 'users' +  os.sep + name)
 
358
 
 
359
        user = self.byname(name)
 
360
 
 
361
        if not user:
 
362
 
 
363
            try:
 
364
                newuser = JsonUser(name=name)
 
365
                newuser.userhosts.extend(userhosts)
 
366
                newuser.perms.extend(perms)
 
367
                self.users[name] = newuser
 
368
                self.save()
 
369
            except Exception, ex:
 
370
                rlog(10, 'jsonusers', str(ex))
 
371
                return False
 
372
 
 
373
            rlog(10, 'users', '%s %s %s added to user database' % (name, \
 
374
userhosts, perms))
 
375
 
 
376
        return True
 
377
 
 
378
    def addemail(self, userhost, email):
 
379
 
 
380
        """
 
381
            add an email address to the userhost.
 
382
 
 
383
        """
 
384
 
 
385
        user = self.getuser(userhost)
 
386
 
 
387
        if user:
 
388
            user.email.append(email)
 
389
            self.save()
 
390
            rlog(10, 'users', '%s (%s) added to email' % (email, userhost))
 
391
            return 1
 
392
 
 
393
    def addperm(self, userhost, perm):
 
394
 
 
395
        """
 
396
            add the specified perm to the userhost.
 
397
 
 
398
        """
 
399
 
 
400
        user = self.getuser(userhost)
 
401
 
 
402
        if user:
 
403
            user.perms.append(perm.upper())
 
404
            self.save()
 
405
            rlog(10, 'users', '%s perm %s added' % (userhost, perm))
 
406
            return 1
 
407
 
 
408
    def addpermit(self, userhost, permit):
 
409
 
 
410
        """
 
411
            add the given (who, what) permit to the given userhost.
 
412
 
 
413
        """
 
414
 
 
415
        user = self.getuser(userhost)
 
416
 
 
417
        if user:
 
418
            #p = '%s %s' % permit
 
419
            user.permits.append(permit)
 
420
            self.save()
 
421
            rlog(10, 'users', '%s permit %s added' % (userhost, p))
 
422
            return 1
 
423
 
 
424
    def addstatus(self, userhost, status):
 
425
 
 
426
        """
 
427
            add status to given userhost.
 
428
 
 
429
        """
 
430
 
 
431
        user = self.getuser(userhost)
 
432
 
 
433
        if user:
 
434
            user.status.append(status.upper())
 
435
            self.save()
 
436
            rlog(10, 'users', '%s status %s added' % (name, status))
 
437
            return 1
 
438
 
 
439
    def adduserhost(self, name, userhost):
 
440
 
 
441
        """
 
442
           add userhost.
 
443
 
 
444
        """
 
445
 
 
446
        user = self.byname(name)
 
447
 
 
448
        if not user:
 
449
            user = self.users[name] = User(name=name)
 
450
 
 
451
        user.userhosts.append(userhost)
 
452
        self.save(user)
 
453
        rlog(10, 'users', '%s (%s) added to userhosts' % (name, userhost))
 
454
        return 1
 
455
 
 
456
    def adduseremail(self, name, email):
 
457
 
 
458
        """
 
459
            add email to specified user.
 
460
 
 
461
        """
 
462
 
 
463
        user = self.byname(name)
 
464
 
 
465
        if user:
 
466
            user.email.append(email)
 
467
            self.save()
 
468
            rlog(10, 'users', '%s email %s added' % (name, email))
 
469
            return 1
 
470
 
 
471
    def adduserperm(self, name, perm):
 
472
 
 
473
        """ 
 
474
           add permission.
 
475
 
 
476
        """
 
477
 
 
478
        user = self.byname(name)
 
479
 
 
480
        if user:
 
481
            perm = perm.upper()
 
482
            user.perms.append(perm)
 
483
            self.save()
 
484
            rlog(10, 'users', '%s perm %s added' % (name, perm))
 
485
            return 1
 
486
 
 
487
    def adduserpermit(self, name, permit):
 
488
 
 
489
        """ 
 
490
            add (who, what) permit tuple to sepcified user.
 
491
 
 
492
        """
 
493
 
 
494
        user = self.byname(name)
 
495
 
 
496
        if user:
 
497
            p = '%s %s' % permit
 
498
            user.permits.append(p)
 
499
            self.save()
 
500
            rlog(10, 'users', '%s permit %s added' % (name, p))
 
501
            return 1
 
502
 
 
503
    def adduserstatus(self, name, status):
 
504
 
 
505
        """
 
506
            add status to given user.
 
507
 
 
508
        """
 
509
 
 
510
        user = byname(name)
 
511
 
 
512
        if user:
 
513
            user.status.append(status.upper())
 
514
            self.save()
 
515
            rlog(10, 'users', '%s status %s added' % (name, status))
 
516
            return 1
 
517
 
 
518
    def addpermall(self, perm): 
 
519
 
 
520
        """
 
521
            add permission to all users.
 
522
 
 
523
        """
 
524
 
 
525
        for user in self.users.values():
 
526
            user.perms.append(perm.upper())
 
527
 
 
528
        self.save()
 
529
 
 
530
    ### Delete functions
 
531
 
 
532
    def delemail(self, userhost, email):
 
533
 
 
534
        """
 
535
            delete email from userhost.
 
536
 
 
537
        """
 
538
 
 
539
        user = self.getuser(userhost)
 
540
 
 
541
        if user:
 
542
 
 
543
            if email in user.emails:
 
544
                user.emails.remove(email)
 
545
                self.save()
 
546
                return 1
 
547
 
 
548
    def delperm(self, userhost, perm):
 
549
 
 
550
        """
 
551
            delete perm from userhost.
 
552
 
 
553
        """
 
554
 
 
555
        user = self.getuser(userhost)
 
556
        if user:
 
557
            p = perm.upper()
 
558
            if p in user.perms:
 
559
                user.perms.remove(p)
 
560
                self.save()
 
561
                return 1
 
562
 
 
563
    def delpermit(self, userhost, permit):
 
564
 
 
565
        """
 
566
            delete permit from userhost.
 
567
 
 
568
        """
 
569
 
 
570
        user = self.getuser(userhost)
 
571
 
 
572
        if user:
 
573
            p = '%s %s' % permit
 
574
 
 
575
            if p in user.permits:
 
576
                user.permits.remove(p)
 
577
                self.save()
 
578
                return 1
 
579
 
 
580
    def delstatus(self, userhost, status):
 
581
 
 
582
        """
 
583
            delete status from userhost.
 
584
 
 
585
        """
 
586
 
 
587
        user = self.getuser(userhost)
 
588
 
 
589
        if user:
 
590
            st = status.upper()
 
591
 
 
592
            if st in user.status:
 
593
                user.status.remove(st)
 
594
                self.save()
 
595
                return 1
 
596
 
 
597
    def delete(self, name):
 
598
 
 
599
        """
 
600
            delete user with name.
 
601
 
 
602
        """
 
603
 
 
604
        del self.users[name]
 
605
        self.save()
 
606
        return 1
 
607
 
 
608
    def deluserhost(self, name, userhost):
 
609
 
 
610
        """
 
611
            delete the userhost entry.
 
612
 
 
613
        """
 
614
 
 
615
        user = self.byname(name)
 
616
 
 
617
        if user:
 
618
 
 
619
            if userhost in user.userhosts:
 
620
                user.userhosts.remove(userhost)
 
621
                self.save()
 
622
                rlog(10, 'users', '%s userhost %s deleted' % (name, userhost))
 
623
                return 1
 
624
 
 
625
    def deluseremail(self, name, email):
 
626
 
 
627
        """
 
628
            delete email.
 
629
 
 
630
        """
 
631
 
 
632
        user = self.byname(name)
 
633
 
 
634
        if user:
 
635
 
 
636
            if email in user.email:
 
637
                user.email.remove(email)
 
638
                self.save()
 
639
                rlog(10, 'users', '%s email %s deleted' % (name, email))
 
640
                return 1
 
641
 
 
642
    def deluserperm(self, name, perm):
 
643
 
 
644
        """
 
645
            delete permission.
 
646
 
 
647
        """
 
648
 
 
649
        user = self.byname(name)
 
650
 
 
651
        if user:
 
652
            p = perm.upper()
 
653
 
 
654
            if p in user.perms:
 
655
                user.perms.remove(p)
 
656
                self.save()
 
657
                rlog(10, 'users', '%s perm %s deleted' % (name, p))
 
658
                return 1
 
659
 
 
660
    def deluserpermit(self, name, permit):
 
661
 
 
662
        """
 
663
            delete permit.
 
664
 
 
665
         """
 
666
 
 
667
        user = self.byname(name)
 
668
 
 
669
        if user:
 
670
            p = '%s %s' % permit
 
671
 
 
672
            if p in user.permits:
 
673
                user.permits.remove(p)
 
674
                self.save()
 
675
                rlog(10, 'users', '%s permit %s deleted' % (name, p))
 
676
                return 1
 
677
 
 
678
    def deluserstatus(self, name, status):
 
679
 
 
680
        """
 
681
            delete the status from the given user.
 
682
 
 
683
        """
 
684
 
 
685
        user = self.byname(name)
 
686
 
 
687
        if user:
 
688
            st = status.upper()
 
689
 
 
690
            if st in user.status:
 
691
                user.status.remove(status)
 
692
                self.save()
 
693
                rlog(10, 'users', '%s status %s deleted' % (name, st))
 
694
                return 1
 
695
 
 
696
    def delallemail(self, name):
 
697
 
 
698
        """
 
699
            Delete all emails for the specified user.
 
700
 
 
701
        """
 
702
 
 
703
        user = self.byname(name)
 
704
 
 
705
        if user:
 
706
            user.email = []
 
707
            self.save()
 
708
            rlog(10, 'users', '%s emails deleted' % (name, ))
 
709
            return 1
 
710
 
 
711
    def delpermall(self, perm):
 
712
 
 
713
        """
 
714
            delete permission from all users.
 
715
 
 
716
        """
 
717
 
 
718
        for user in self.users.values():
 
719
            if user.name != 'owner':
 
720
                del user.perms
 
721
 
 
722
        self.save()
 
723
        return 1
 
724
 
 
725
    def make_owner(self, userhosts):
 
726
 
 
727
        """
 
728
            see if owner already has a user account if not merge otherwise add. 
 
729
 
 
730
        """
 
731
 
 
732
        assert(userhosts)
 
733
        owner = []
 
734
 
 
735
        if type(userhosts) != types.ListType:
 
736
            owner.append(userhosts)
 
737
        else:
 
738
            owner = userhosts
 
739
 
 
740
        for userhost in owner:
 
741
            username = self.getname(unicode(userhost))
 
742
 
 
743
            if not username:
 
744
 
 
745
                if not self.merge('owner', unicode(userhost)):
 
746
                    self.add('owner', [unicode(userhost), ], ['USER', 'OPER'])
 
747
 
 
748
# ============
 
749
# INIT SECTION
 
750
 
 
751
# no vars
 
752
 
 
753
# END INIT
 
754
# ========
 
 
b'\\ No newline at end of file'