~ubuntu-branches/ubuntu/quantal/gozerbot/quantal

« back to all changes in this revision

Viewing changes to build/lib/gozerbot/users.py

  • Committer: Bazaar Package Importer
  • Author(s): Jeremy Malcolm
  • Date: 2010-09-29 18:20:02 UTC
  • mfrom: (3.1.7 sid)
  • Revision ID: james.westby@ubuntu.com-20100929182002-gi532gnem1vlu6jy
Tags: 0.9.1.3-5
Added python2.5 build dependency. 

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# gozerbot/users.py
 
2
#
 
3
#
 
4
 
 
5
""" bot users """
 
6
 
 
7
__copyright__ = 'this file is in the public domain'
 
8
 
 
9
## IMPORT SECTION
 
10
 
 
11
# gozerbot imports
 
12
from gozerbot.datadir import datadir
 
13
from gozerbot.utils.log import rlog
 
14
from gozerbot.utils.locking import lockdec
 
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.utils.name import stripname
 
19
from gozerbot.persist.persist import Persist
 
20
from gozerbot.config import config
 
21
from gozerbot.jsonusers import JsonUsers
 
22
 
 
23
# basic imports
 
24
import re, types, os, time, thread
 
25
 
 
26
## END IMPORT
 
27
 
 
28
## LOCK SECTION
 
29
 
 
30
deletelock = thread.allocate_lock()
 
31
deletelocked = lockdec(deletelock)
 
32
 
 
33
## END LOCK
 
34
 
 
35
# see if we need to use the database or use the jsonusers
 
36
if not config['nodb']:
 
37
    from gozerbot.database.alchemy import create_session, \
 
38
    UserHost, User, Perms, Statuses, query, getuser, byname, dblocked, trans, eagerload
 
39
else:
 
40
    def trans(func, *args, **kwargs):
 
41
        def transaction(*args, **kwargs):
 
42
            func(*args, **kwargs)
 
43
        return transaction
 
44
 
 
45
 
 
46
class DbUsers(object):
 
47
 
 
48
    """
 
49
         sqlalchemy backed users.
 
50
 
 
51
    """
 
52
 
 
53
    def __init__(self, ddir=None):
 
54
        self.datadir = ddir or datadir
 
55
 
 
56
    ### Misc. Functions
 
57
    def size(self):
 
58
 
 
59
        """
 
60
            return nr of users.
 
61
 
 
62
            .. literalinclude:: ../../gozerbot/users.py
 
63
                :pyobject: DbUsers.size
 
64
        """
 
65
 
 
66
        return query(User).count()
 
67
 
 
68
    def names(self):
 
69
 
 
70
        """
 
71
            get names of all users.
 
72
 
 
73
            :rtype: list .. list of usernames
 
74
 
 
75
            .. literalinclude:: ../../gozerbot/users.py
 
76
                :pyobject: DbUsers.names
 
77
 
 
78
        """
 
79
 
 
80
        return [n.name for n in query(User).all()]
 
81
 
 
82
    @trans
 
83
    def merge(self, session, name, userhost):
 
84
 
 
85
        """
 
86
             add userhosts to user with name.
 
87
 
 
88
             :param session: the session to act upon
 
89
             :type session: sqllachemy.session.Session
 
90
             :param name: name of the user to merge with
 
91
             :type name: string
 
92
             :param userhost: userhosts to merge 
 
93
             :type userhost: list .. list of userhosts
 
94
             :rtype: boolean .. whether the merge succeeded
 
95
 
 
96
             .. literalinclude:: ../../gozerbot/users.py
 
97
                :pyobject: DbUsers.merge
 
98
 
 
99
        """
 
100
 
 
101
        user = byname(name)
 
102
 
 
103
        if user:
 
104
 
 
105
            if name not in user.userhosts:
 
106
                user.userhosts.append(userhost)
 
107
                #session.commit()
 
108
                session.refresh(user)
 
109
                rlog(10, 'users', "%s merged with %s" % (userhost, name))
 
110
                return True
 
111
 
 
112
        return False
 
113
 
 
114
    def usersearch(self, userhost):
 
115
 
 
116
        """
 
117
            search for users with a userhost like the one specified.
 
118
 
 
119
            :param userhost: userhost to search for
 
120
            :type userhost: string
 
121
            :rtype: list .. list of (user.name, user.userhost) tuples
 
122
 
 
123
            .. literalinclude:: ../../gozerbot/users.py
 
124
                :pyobject: DbUsers.usersearch
 
125
 
 
126
        """
 
127
 
 
128
        n = query(UserHost).filter(UserHost.userhost.like('%%%s%%' % userhost)).all()
 
129
        return [(u.name, u.userhost) for u in n]
 
130
 
 
131
    ### Check functions
 
132
    def exist(self, name):
 
133
 
 
134
        """
 
135
            see if user with <name> exists.
 
136
 
 
137
            :param name: name of the user
 
138
            :rtype: gozerbot.database.alchemy.User or None
 
139
 
 
140
            .. literalinclude:: ../../gozerbot/users.py
 
141
                :pyobject: DbUsers.exist
 
142
 
 
143
        """
 
144
 
 
145
        return byname(name)
 
146
 
 
147
    def allowed(self, userhost, perms, log=True):
 
148
 
 
149
        """
 
150
            check if user with userhosts is allowed to execute perm command.
 
151
 
 
152
            :param userhost: userhost to check
 
153
            :type userhost: string
 
154
            :param perms: the permissions to check            
 
155
            :type perms: list
 
156
            :param log: whether the check should be logged
 
157
            :type log: boolean
 
158
            :rtype: list .. list of matching permissions or None
 
159
 
 
160
            .. literalinclude:: ../../gozerbot/users.py
 
161
                :pyobject: DbUsers.allowed
 
162
 
 
163
        """
 
164
 
 
165
        if not type(perms) == types.ListType:
 
166
            perms = [perms, ]
 
167
 
 
168
        if 'ANY' in perms:
 
169
            return ['ANY', ]
 
170
 
 
171
        res = None
 
172
        user = getuser(userhost)
 
173
 
 
174
        if not user:
 
175
 
 
176
            if log:
 
177
                rlog(10, 'users', '%s userhost denied' % userhost)
 
178
            return res
 
179
 
 
180
        else:
 
181
            uperms = set(user.perms)
 
182
            sperms = set(perms)
 
183
            intersection = sperms.intersection(uperms)
 
184
            res = list(intersection) or None
 
185
 
 
186
        if not res and log:
 
187
            rlog(10, 'users', "%s perm %s denied" % (userhost, str(perms)))
 
188
 
 
189
        if res and log:
 
190
            rlog(10, 'users', 'allowed %s %s perm' % (userhost, str(perms)))
 
191
 
 
192
        return res
 
193
 
 
194
    def permitted(self, userhost, who, what):
 
195
 
 
196
        """
 
197
            check if (who,what) is in users permit list.
 
198
 
 
199
            :param userhost: userhost to check permits for
 
200
            :type userhost: string
 
201
            :param who: who to permit
 
202
            :type who: string
 
203
            :param what: what to allow
 
204
            :type what: string
 
205
 
 
206
            .. literalinclude:: ../../gozerbot/users.py
 
207
                :pyobject: DbUsers.permitted
 
208
        """
 
209
 
 
210
        user = getuser(userhost)
 
211
        res = False
 
212
 
 
213
        if user:
 
214
            if '%s %s' % (who, what) in user.permits:
 
215
                res = True
 
216
 
 
217
        return res
 
218
 
 
219
    def status(self, userhost, status):
 
220
 
 
221
        """
 
222
            check if user with <userhost> has <status> set.
 
223
 
 
224
            .. literalinclude:: ../../gozerbot/users.py
 
225
                :pyobject: DbUsers.status
 
226
 
 
227
        """
 
228
 
 
229
        user = getuser(userhost)
 
230
        res = False
 
231
 
 
232
        if user:
 
233
            if status.upper() in user.statuses:
 
234
                res = True
 
235
 
 
236
        return res
 
237
 
 
238
    def gotuserhost(self, name, userhost):
 
239
 
 
240
        """
 
241
            check if user has userhost.
 
242
 
 
243
            .. literalinclude:: ../../gozerbot/users.py
 
244
                :pyobject: DbUsers.gotuserhost
 
245
 
 
246
        """
 
247
 
 
248
        user = byname(name)
 
249
        if user:
 
250
            return userhost in user.userhosts
 
251
 
 
252
    def gotperm(self, name, perm):
 
253
 
 
254
        """
 
255
            check if user has permission.
 
256
 
 
257
 
 
258
            .. literalinclude:: ../../gozerbot/users.py
 
259
                :pyobject: DbUsers.gotperm
 
260
        """
 
261
 
 
262
        user = byname(name)
 
263
 
 
264
        if user:
 
265
            return perm.upper() in user.perms
 
266
 
 
267
    def gotpermit(self, name, permit):
 
268
 
 
269
        """
 
270
            check if user permits something.  permit is a [who, what] list. 
 
271
 
 
272
 
 
273
            .. literalinclude:: ../../gozerbot/users.py
 
274
                :pyobject: DbUsers.gotpermit
 
275
 
 
276
        """
 
277
 
 
278
        user = byname(name)
 
279
 
 
280
        if user:
 
281
            return '%s %s' % permit in user.permits
 
282
        
 
283
    def gotstatus(self, name, status):
 
284
 
 
285
        """
 
286
            check if user has status.
 
287
 
 
288
            .. literalinclude:: ../../gozerbot/users.py
 
289
                :pyobject: DbUsers.gotstatus
 
290
 
 
291
        """
 
292
 
 
293
        user = byname(name)
 
294
        if user:
 
295
            return status.upper() in user.statuses
 
296
 
 
297
    ### Get Functions
 
298
    def getname(self, userhost):
 
299
 
 
300
        """
 
301
            get name of user belonging to <userhost>.
 
302
 
 
303
            .. literalinclude:: ../../gozerbot/users.py
 
304
                :pyobject: DbUsers.getname
 
305
 
 
306
        """
 
307
 
 
308
        user = getuser(userhost)
 
309
 
 
310
        if user:
 
311
            return str(user.name)
 
312
 
 
313
    def gethosts(self, userhost):
 
314
 
 
315
        """ 
 
316
            return the userhosts of the user associated with the 
 
317
            specified userhost.
 
318
 
 
319
            .. literalinclude:: ../../gozerbot/users.py
 
320
                :pyobject: DbUsers.gethosts
 
321
        """
 
322
 
 
323
        user = getuser(userhost)
 
324
 
 
325
        if user:
 
326
            return list(user.userhosts)
 
327
    
 
328
    def getemail(self, userhost):
 
329
 
 
330
        """
 
331
            return the email of the specified userhost.
 
332
 
 
333
            .. literalinclude:: ../../gozerbot/users.py
 
334
                :pyobject: DbUsers.getemail
 
335
        """
 
336
 
 
337
        user = getuser(userhost)
 
338
 
 
339
        if user:
 
340
            if user.email:
 
341
                return str(user.email[0])
 
342
 
 
343
    def getperms(self, userhost):
 
344
 
 
345
        """
 
346
            return permissions of user.
 
347
 
 
348
            .. literalinclude:: ../../gozerbot/users.py
 
349
                :pyobject: DbUsers.getperms
 
350
 
 
351
        """
 
352
 
 
353
        user = getuser(userhost)
 
354
 
 
355
        if user:
 
356
            return list(user.perms)
 
357
 
 
358
    def getpermits(self, userhost):
 
359
 
 
360
        """
 
361
            return permits of the specified userhost.
 
362
 
 
363
            .. literalinclude:: ../../gozerbot/users.py
 
364
                :pyobject: DbUsers.getpermits
 
365
 
 
366
        """
 
367
 
 
368
        user = getuser(userhost)
 
369
 
 
370
        if user:
 
371
            return list(user.permits)
 
372
 
 
373
    def getstatuses(self, userhost):
 
374
 
 
375
        """
 
376
            return the list of statuses for the specified userhost.
 
377
 
 
378
            .. literalinclude:: ../../gozerbot/users.py
 
379
                :pyobject: DbUsers.getstatuses
 
380
 
 
381
        """
 
382
 
 
383
        user = getuser(userhost)
 
384
 
 
385
        if user:
 
386
            return list(user.statuses)
 
387
 
 
388
    def getuserhosts(self, name):
 
389
 
 
390
        """
 
391
            return the userhosts associated with the specified user.
 
392
 
 
393
            .. literalinclude:: ../../gozerbot/users.py
 
394
                :pyobject: DbUsers.getuserhosts
 
395
        """
 
396
 
 
397
        user = byname(name)
 
398
 
 
399
        if user:
 
400
            return list(user.userhosts)
 
401
 
 
402
    def getuseremail(self, name):
 
403
 
 
404
        """
 
405
            get email of user.
 
406
 
 
407
            .. literalinclude:: ../../gozerbot/users.py
 
408
                :pyobject: DbUsers.getuseremail
 
409
 
 
410
        """
 
411
 
 
412
        user = byname(name)
 
413
 
 
414
        if user:
 
415
            if user.email:
 
416
                return str(user.email[0])
 
417
 
 
418
    def getuserperms(self, name):
 
419
 
 
420
        """
 
421
            return permission of user.
 
422
 
 
423
            .. literalinclude:: ../../gozerbot/users.py
 
424
                :pyobject: DbUsers.getuserperms
 
425
        """
 
426
 
 
427
        user = byname(name)
 
428
 
 
429
        if user:
 
430
            return list(user.perms)
 
431
 
 
432
    def getuserpermits(self, name):
 
433
 
 
434
        """
 
435
            return permits of user.
 
436
 
 
437
            .. literalinclude:: ../../gozerbot/users.py
 
438
                :pyobject: DbUsers.getuserpermits
 
439
        """
 
440
 
 
441
        user = byname(name)
 
442
 
 
443
        if user:
 
444
            return list(user.permits)
 
445
 
 
446
    def getuserstatuses(self, name):
 
447
 
 
448
        """
 
449
            return the list of statuses for the specified user.
 
450
 
 
451
            .. literalinclude:: ../../gozerbot/users.py
 
452
                :pyobject: DbUsers.getuserstatuses
 
453
        """
 
454
 
 
455
        user = byname(name)
 
456
 
 
457
        if user:
 
458
            return list(user.statuses)
 
459
 
 
460
    def getpermusers(self, perm):
 
461
 
 
462
        """
 
463
            return all users that have the specified perm.
 
464
 
 
465
            .. literalinclude:: ../../gozerbot/users.py
 
466
                :pyobject: DbUsers.getpermusers
 
467
 
 
468
        """
 
469
        s = create_session()
 
470
        n = query(Perms, s).filter(Perms.perm==perm.upper()).all()
 
471
        return [user.name for user in n]
 
472
 
 
473
    def getstatususers(self, status):
 
474
 
 
475
        """
 
476
            return all users that have the specified status.
 
477
 
 
478
            .. literalinclude:: ../../gozerbot/users.py
 
479
                :pyobject: DbUsers.getstatususers
 
480
 
 
481
        """
 
482
 
 
483
        n = query(Statuses).filter(Statuses.status==status.upper()).all()
 
484
        return [user.name for user in n]
 
485
 
 
486
    ### Set Functions
 
487
    @trans
 
488
    def setemail(self, session, name, email):
 
489
 
 
490
        """
 
491
            set email of user.
 
492
 
 
493
            .. literalinclude:: ../../gozerbot/users.py
 
494
                :pyobject: DbUsers.setemail
 
495
        """
 
496
 
 
497
        user = byname(name, session)
 
498
 
 
499
        if user:
 
500
 
 
501
            try:
 
502
                user.email.remove(email)
 
503
            except:
 
504
                pass
 
505
 
 
506
            user.email.insert(0, email)
 
507
            session.refresh(user)
 
508
            return True
 
509
 
 
510
        return False
 
511
 
 
512
    ### Add functions
 
513
    @trans
 
514
    def add(self, session, name, userhosts, perms):
 
515
 
 
516
        """
 
517
            add an user. session argument is provided by @trans
 
518
 
 
519
            :param name: name of the user
 
520
            :type name: string
 
521
            :param userhosts: userhosts to add
 
522
            :type userhosts: list .. list of userhosts
 
523
            :param perms: the permissions to add
 
524
            :type perms: list .. list of permissions
 
525
 
 
526
            .. literalinclude:: ../../gozerbot/users.py
 
527
                :pyobject: DbUsers.add
 
528
 
 
529
        """
 
530
 
 
531
        if type(userhosts) != types.ListType:
 
532
            rlog(10, 'users', 'i need a list of userhosts')
 
533
            return False
 
534
 
 
535
        name = stripname(name)
 
536
 
 
537
        if not os.path.isdir(self.datadir + os.sep + 'users'):
 
538
            os.mkdir(self.datadir + os.sep + 'users')
 
539
 
 
540
        if not os.path.isdir(self.datadir + os.sep + 'users' +  os.sep + name):
 
541
            os.mkdir(self.datadir + os.sep + 'users' +  os.sep + name)
 
542
 
 
543
        user = byname(name, session)
 
544
 
 
545
        if not user:
 
546
 
 
547
            try:
 
548
                newuser = User(name=name)
 
549
                newuser.userhosts.extend(userhosts)
 
550
                newuser.perms.extend(perms)
 
551
                session.add(newuser)
 
552
                session.commit()
 
553
 
 
554
            except Exception, ex:
 
555
                rlog(10, 'users', str(ex))
 
556
                return
 
557
 
 
558
            rlog(10, 'users', '%s %s %s added to user database' % (name, userhosts, perms))
 
559
 
 
560
        return True
 
561
 
 
562
    @trans
 
563
    def addemail(self, session, userhost, email):
 
564
 
 
565
        """
 
566
            add an email address to the userhost.
 
567
 
 
568
            .. literalinclude:: ../../gozerbot/users.py
 
569
                :pyobject: DbUsers.addemail
 
570
 
 
571
        """
 
572
 
 
573
        user = getuser(userhost, session)
 
574
 
 
575
        if user:
 
576
            user.email.append(email)
 
577
            #session.commit()
 
578
            session.refresh(user)
 
579
            rlog(10, 'users', '%s (%s) added to email' % (email, userhost))
 
580
            return True
 
581
 
 
582
        return False
 
583
 
 
584
    @trans
 
585
    def addperm(self, session, userhost, perm):
 
586
 
 
587
        """
 
588
            add the specified perm to the userhost.
 
589
 
 
590
            .. literalinclude:: ../../gozerbot/users.py
 
591
                :pyobject: DbUsers.addperm
 
592
 
 
593
        """
 
594
 
 
595
        user = getuser(userhost, session)
 
596
 
 
597
        if user:
 
598
            user.perms.append(perm.upper())
 
599
            #session.commit()
 
600
            session.refresh(user)
 
601
            rlog(10, 'users', '%s perm %s added' % (userhost, perm))
 
602
            return True
 
603
 
 
604
        return False
 
605
 
 
606
    @trans
 
607
    def addpermit(self, session, userhost, permit):
 
608
 
 
609
        """
 
610
            add the given [who, what] permit to the given userhost.
 
611
 
 
612
            .. literalinclude:: ../../gozerbot/users.py
 
613
                :pyobject: DbUsers.addpermit
 
614
 
 
615
        """
 
616
 
 
617
        user = getuser(userhost, session)
 
618
 
 
619
        if user:
 
620
            p = '%s %s' % permit
 
621
            user.permits.append(p)
 
622
            #session.commit()
 
623
            session.refesh(user)
 
624
            rlog(10, 'users', '%s permit %s added' % (userhost, p))
 
625
            return True
 
626
 
 
627
        return False
 
628
 
 
629
    @trans
 
630
    def addstatus(self, session, userhost, status):
 
631
 
 
632
        """
 
633
            add status to given userhost.
 
634
 
 
635
            .. literalinclude:: ../../gozerbot/users.py
 
636
                :pyobject: DbUsers.addstatus
 
637
 
 
638
        """
 
639
 
 
640
        user = getuser(userhost, session)
 
641
 
 
642
        if user:
 
643
            user.statuses.append(status.upper())
 
644
            #session.commit()
 
645
            session.refresh(user)
 
646
            rlog(10, 'users', '%s status %s added' % (name, status))
 
647
            return True
 
648
 
 
649
        return False
 
650
 
 
651
    @trans
 
652
    def adduserhost(self, session, name, userhost):
 
653
 
 
654
        """
 
655
            add userhost.
 
656
 
 
657
            .. literalinclude:: ../../gozerbot/users.py
 
658
                :pyobject: DbUsers.adduserhost
 
659
 
 
660
        """
 
661
 
 
662
        user = byname(name, session)
 
663
 
 
664
        if not user:
 
665
            user = User(name=name)
 
666
            session.add(user)
 
667
 
 
668
        user.userhosts.append(userhost)
 
669
        #session.commit()
 
670
        session.refresh(user)
 
671
        rlog(10, 'users', '%s (%s) added to userhosts' % (name, userhost))
 
672
        return True
 
673
 
 
674
    @trans
 
675
    def adduseremail(self, session, name, email):
 
676
 
 
677
        """
 
678
            add email to specified user.
 
679
 
 
680
            .. literalinclude:: ../../gozerbot/users.py
 
681
                :pyobject: DbUsers.adduseremail
 
682
 
 
683
        """
 
684
 
 
685
        user = byname(name, session)
 
686
 
 
687
        if user:
 
688
            user.email.append(email)
 
689
            #session.commit()
 
690
            session.refresh(user)
 
691
            rlog(10, 'users', '%s email %s added' % (name, email))
 
692
            return True
 
693
 
 
694
    @trans
 
695
    def adduserperm(self, session, name, perm):
 
696
 
 
697
        """
 
698
            add permission.
 
699
 
 
700
            .. literalinclude:: ../../gozerbot/users.py
 
701
                :pyobject: DbUsers.adduserperm
 
702
 
 
703
        """
 
704
 
 
705
        user = byname(name, session)
 
706
 
 
707
        if user:
 
708
            perm = perm.upper()
 
709
            user.perms.append(perm)
 
710
            #session.commit()
 
711
            session.refresh(user)
 
712
            rlog(10, 'users', '%s perm %s added' % (name, perm))
 
713
            return True
 
714
 
 
715
        return False
 
716
 
 
717
    @trans
 
718
    def adduserpermit(self, session, name, who, permit):
 
719
 
 
720
        """ 
 
721
            add (who, what) permit tuple to specified user.
 
722
 
 
723
            .. literalinclude:: ../../gozerbot/users.py
 
724
                :pyobject: DbUsers.adduserpermit
 
725
 
 
726
        """
 
727
 
 
728
        user = byname(name, session)
 
729
 
 
730
        if user:
 
731
            p = '%s %s' % (who, permit)
 
732
            user.permits.append(p)
 
733
            #session.commit()
 
734
            session.refresh(user)
 
735
            rlog(10, 'users', '%s permit %s added' % (name, p))
 
736
            return True
 
737
 
 
738
        return False
 
739
 
 
740
    @trans
 
741
    def adduserstatus(self, session, name, status):
 
742
 
 
743
        """
 
744
            add status to given user.
 
745
 
 
746
            .. literalinclude:: ../../gozerbot/users.py
 
747
                :pyobject: DbUsers.adduserstatus
 
748
 
 
749
        """
 
750
 
 
751
        user = byname(name, session)
 
752
 
 
753
        if user:
 
754
            user.statuses.append(status.upper())
 
755
            #session.commit()
 
756
            session.refresh(user)
 
757
            rlog(10, 'users', '%s status %s added' % (name, status))
 
758
            return True
 
759
 
 
760
        return False
 
761
 
 
762
    @trans
 
763
    def addpermall(self, session, perm): 
 
764
 
 
765
        """
 
766
            add permission to all users.
 
767
 
 
768
            .. literalinclude:: ../../gozerbot/users.py
 
769
                :pyobject: DbUsers.addpermall
 
770
        """
 
771
 
 
772
        users = query(User, session).all()
 
773
 
 
774
        if users:
 
775
            for user in users:
 
776
                user.perms.append(perm.upper())
 
777
                session.refresh(user)
 
778
                #session.commit()
 
779
 
 
780
    ### Delete functions
 
781
    @trans
 
782
    def delemail(self, session, userhost, email):
 
783
 
 
784
        """
 
785
            delete email from userhost.
 
786
 
 
787
            .. literalinclude:: ../../gozerbot/users.py
 
788
                :pyobject: DbUsers.delemail
 
789
 
 
790
        """
 
791
 
 
792
        user = getuser(userhost, session)
 
793
 
 
794
        if user:
 
795
            if email in user.emails:
 
796
                user.emails.remove(email)
 
797
                #session.commit()
 
798
                session.refresh(user)
 
799
                return True
 
800
 
 
801
        return False
 
802
 
 
803
    @trans
 
804
    def delperm(self, session, userhost, perm):
 
805
 
 
806
        """
 
807
            delete perm from userhost.
 
808
 
 
809
            .. literalinclude:: ../../gozerbot/users.py
 
810
                :pyobject: DbUsers.delperm
 
811
 
 
812
        """
 
813
 
 
814
        user = getuser(userhost, session)
 
815
 
 
816
        if user:
 
817
            p = perm.upper()
 
818
 
 
819
            if p in user.perms:
 
820
                user.perms.remove(p)
 
821
                #session.commit()
 
822
                session.refresh(user)
 
823
                return True
 
824
 
 
825
        return False
 
826
            
 
827
    @trans
 
828
    def delpermit(self, session, userhost, permit):
 
829
 
 
830
        """
 
831
            delete permit from userhost.
 
832
 
 
833
            .. literalinclude:: ../../gozerbot/users.py
 
834
                :pyobject: DbUsers.delpermit
 
835
        """
 
836
 
 
837
        user = getuser(userhost, session)
 
838
 
 
839
        if user:
 
840
            p = '%s %s' % permit
 
841
 
 
842
            if p in user.permits:
 
843
                user.permits.remove(p)
 
844
                #session.commit()
 
845
                session.refresh(user)
 
846
                return True
 
847
 
 
848
        return False
 
849
 
 
850
    @trans
 
851
    def delstatus(self, session, userhost, status):
 
852
 
 
853
        """
 
854
            delete status from userhost.
 
855
 
 
856
            .. literalinclude:: ../../gozerbot/users.py
 
857
                :pyobject: DbUsers.delstatus
 
858
 
 
859
        """
 
860
 
 
861
        user = getuser(userhost, session)
 
862
 
 
863
        if user:
 
864
            st = status.upper()
 
865
 
 
866
            if st in user.statuses:
 
867
                user.statuses.remove(st)
 
868
                #session.commit()
 
869
                session.refresh(user)
 
870
                return True
 
871
 
 
872
        return False
 
873
 
 
874
    @trans
 
875
    def delete(self, session, name):
 
876
 
 
877
        """ 
 
878
            delete user with name. 
 
879
 
 
880
            .. literalinclude:: ../../gozerbot/users.py
 
881
                :pyobject: DbUsers.delete
 
882
 
 
883
        """
 
884
        name = stripname(name)
 
885
        user = byname(name, session)
 
886
 
 
887
        if user:
 
888
            session.delete(user)
 
889
            session.commit()
 
890
            return True
 
891
 
 
892
        return False
 
893
 
 
894
    @trans
 
895
    def deluserhost(self, session, name, userhost):
 
896
 
 
897
        """
 
898
            delete the userhost entry.
 
899
 
 
900
 
 
901
            .. literalinclude:: ../../gozerbot/users.py
 
902
                :pyobject: DbUsers.deluserhost
 
903
        """
 
904
 
 
905
        user = byname(name, session)
 
906
 
 
907
        if user:
 
908
            if userhost in user.userhosts:
 
909
                user.userhosts.remove(userhost)
 
910
                #session.commit()
 
911
                session.refresh(user)
 
912
                rlog(10, 'users', '%s userhost %s deleted' % (name, userhost))
 
913
                return True
 
914
 
 
915
        return False
 
916
 
 
917
    @trans
 
918
    def deluseremail(self, session, name, email):
 
919
 
 
920
        """
 
921
            delete email.
 
922
 
 
923
            .. literalinclude:: ../../gozerbot/users.py
 
924
                :pyobject: DbUsers.deluseremail
 
925
 
 
926
        """
 
927
 
 
928
        user = byname(name, session)
 
929
 
 
930
        if user:
 
931
            if email in user.email:
 
932
                user.email.remove(email)
 
933
                #session.commit()
 
934
                session.refresh(user)
 
935
                rlog(10, 'users', '%s email %s deleted' % (name, email))
 
936
                return True
 
937
 
 
938
        return False
 
939
 
 
940
    @trans
 
941
    def deluserperm(self, session, name, perm):
 
942
 
 
943
        """
 
944
             delete permission.
 
945
 
 
946
            .. literalinclude:: ../../gozerbot/users.py
 
947
                :pyobject: DbUsers.deluserperm
 
948
 
 
949
        """
 
950
 
 
951
        user = byname(name, session)
 
952
 
 
953
        if user:
 
954
            p = perm.upper()
 
955
 
 
956
            if p in user.perms:
 
957
                user.perms.remove(p)
 
958
                #session.commit()
 
959
                session.refresh(user)
 
960
                rlog(10, 'users', '%s perm %s deleted' % (name, p))
 
961
                return True
 
962
 
 
963
        return False
 
964
 
 
965
    @trans
 
966
    def deluserpermit(self, session, name, permit):
 
967
 
 
968
        """
 
969
            delete permit.
 
970
 
 
971
            .. literalinclude:: ../../gozerbot/users.py
 
972
                :pyobject: DbUsers.deluserpermit
 
973
 
 
974
        """
 
975
 
 
976
        user = byname(name, session)
 
977
 
 
978
        if user:
 
979
            p = '%s %s' % permit
 
980
 
 
981
            if p in user.permits:
 
982
                user.permits.remove(p)
 
983
                #session.commit()
 
984
                session.refresh(user)
 
985
                rlog(10, 'users', '%s permit %s deleted' % (name, p))
 
986
                return True
 
987
 
 
988
        return False
 
989
 
 
990
    @trans
 
991
    def deluserstatus(self, session, name, status):
 
992
 
 
993
        """
 
994
            delete the status from the given user.
 
995
 
 
996
            .. literalinclude:: ../../gozerbot/users.py
 
997
                :pyobject: DbUsers.deluserstatus
 
998
 
 
999
        """
 
1000
 
 
1001
        user = byname(name, session)
 
1002
 
 
1003
        if user:
 
1004
            st = status.upper()
 
1005
 
 
1006
            if st in user.statuses:
 
1007
                user.statuses.remove(status)
 
1008
                #session.commit()
 
1009
                session.refresh(user)
 
1010
                rlog(10, 'users', '%s status %s deleted' % (name, st))
 
1011
                return True
 
1012
 
 
1013
        return False
 
1014
 
 
1015
    @trans
 
1016
    def delallemail(self, session, name):
 
1017
 
 
1018
        """
 
1019
            Delete all emails of the specified user.
 
1020
 
 
1021
 
 
1022
            .. literalinclude:: ../../gozerbot/users.py
 
1023
                :pyobject: DbUsers.delallemail
 
1024
 
 
1025
        """
 
1026
 
 
1027
        user = byname(name, session)
 
1028
 
 
1029
        if user:
 
1030
            user.email = []
 
1031
            #session.commit()
 
1032
            session.refresh(user)
 
1033
            rlog(10, 'users', '%s emails deleted' % (name, ))
 
1034
            return True
 
1035
 
 
1036
        return False
 
1037
 
 
1038
    #@deletelocked
 
1039
    @trans
 
1040
    def delpermall(self, session, perm):
 
1041
 
 
1042
        """
 
1043
            delete permission from all users.
 
1044
 
 
1045
            .. literalinclude:: ../../gozerbot/users.py
 
1046
                :pyobject: DbUsers.delpermall
 
1047
 
 
1048
        """
 
1049
 
 
1050
        users = query(User, session).options(eagerload('perms')).all()
 
1051
 
 
1052
        for user in users:
 
1053
 
 
1054
            if user.name != 'owner':
 
1055
 
 
1056
                try:
 
1057
                    user.perms.remove(perm)
 
1058
                    #session.commit()
 
1059
                    session.refresh(user)
 
1060
 
 
1061
                except ValueError:
 
1062
                    pass
 
1063
 
 
1064
        return True
 
1065
 
 
1066
    def make_owner(self, userhosts):
 
1067
 
 
1068
        """
 
1069
            see if owner already has a user account if not merge otherwise 
 
1070
            add.
 
1071
 
 
1072
            :param userhosts: userhosts to inititalize owner with
 
1073
            :type userhosts: list or string
 
1074
 
 
1075
            .. literalinclude:: ../../gozerbot/users.py
 
1076
                :pyobject: DbUsers.make_owner
 
1077
 
 
1078
        """
 
1079
 
 
1080
        owner = []
 
1081
 
 
1082
        if type(userhosts) != types.ListType:
 
1083
            owner.append(userhosts)
 
1084
        else:
 
1085
            owner = userhosts
 
1086
 
 
1087
        for userhost in owner:
 
1088
            username = self.getname(unicode(userhost))
 
1089
 
 
1090
            if not username:
 
1091
                if not self.merge('owner', unicode(userhost)):
 
1092
                    self.add('owner', [unicode(userhost), ], ['USER', 'OPER'])
 
1093
 
 
1094
## INIT SECTION
 
1095
 
 
1096
# default to database
 
1097
if not config['nodb']:
 
1098
    users = DbUsers()
 
1099
else:
 
1100
    # otheriwse use json users
 
1101
    users = JsonUsers(datadir + os.sep + (config['jsonuser'] or 'users.json'))
 
1102
 
 
1103
## END INIT