7
__copyright__ = 'this file is in the public domain'
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
24
import re, types, os, time, thread
30
deletelock = thread.allocate_lock()
31
deletelocked = lockdec(deletelock)
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
40
def trans(func, *args, **kwargs):
41
def transaction(*args, **kwargs):
46
class DbUsers(object):
49
sqlalchemy backed users.
53
def __init__(self, ddir=None):
54
self.datadir = ddir or datadir
62
.. literalinclude:: ../../gozerbot/users.py
63
:pyobject: DbUsers.size
66
return query(User).count()
71
get names of all users.
73
:rtype: list .. list of usernames
75
.. literalinclude:: ../../gozerbot/users.py
76
:pyobject: DbUsers.names
80
return [n.name for n in query(User).all()]
83
def merge(self, session, name, userhost):
86
add userhosts to user with name.
88
:param session: the session to act upon
89
:type session: sqllachemy.session.Session
90
:param name: name of the user to merge with
92
:param userhost: userhosts to merge
93
:type userhost: list .. list of userhosts
94
:rtype: boolean .. whether the merge succeeded
96
.. literalinclude:: ../../gozerbot/users.py
97
:pyobject: DbUsers.merge
105
if name not in user.userhosts:
106
user.userhosts.append(userhost)
108
session.refresh(user)
109
rlog(10, 'users', "%s merged with %s" % (userhost, name))
114
def usersearch(self, userhost):
117
search for users with a userhost like the one specified.
119
:param userhost: userhost to search for
120
:type userhost: string
121
:rtype: list .. list of (user.name, user.userhost) tuples
123
.. literalinclude:: ../../gozerbot/users.py
124
:pyobject: DbUsers.usersearch
128
n = query(UserHost).filter(UserHost.userhost.like('%%%s%%' % userhost)).all()
129
return [(u.name, u.userhost) for u in n]
132
def exist(self, name):
135
see if user with <name> exists.
137
:param name: name of the user
138
:rtype: gozerbot.database.alchemy.User or None
140
.. literalinclude:: ../../gozerbot/users.py
141
:pyobject: DbUsers.exist
147
def allowed(self, userhost, perms, log=True):
150
check if user with userhosts is allowed to execute perm command.
152
:param userhost: userhost to check
153
:type userhost: string
154
:param perms: the permissions to check
156
:param log: whether the check should be logged
158
:rtype: list .. list of matching permissions or None
160
.. literalinclude:: ../../gozerbot/users.py
161
:pyobject: DbUsers.allowed
165
if not type(perms) == types.ListType:
172
user = getuser(userhost)
177
rlog(10, 'users', '%s userhost denied' % userhost)
181
uperms = set(user.perms)
183
intersection = sperms.intersection(uperms)
184
res = list(intersection) or None
187
rlog(10, 'users', "%s perm %s denied" % (userhost, str(perms)))
190
rlog(10, 'users', 'allowed %s %s perm' % (userhost, str(perms)))
194
def permitted(self, userhost, who, what):
197
check if (who,what) is in users permit list.
199
:param userhost: userhost to check permits for
200
:type userhost: string
201
:param who: who to permit
203
:param what: what to allow
206
.. literalinclude:: ../../gozerbot/users.py
207
:pyobject: DbUsers.permitted
210
user = getuser(userhost)
214
if '%s %s' % (who, what) in user.permits:
219
def status(self, userhost, status):
222
check if user with <userhost> has <status> set.
224
.. literalinclude:: ../../gozerbot/users.py
225
:pyobject: DbUsers.status
229
user = getuser(userhost)
233
if status.upper() in user.statuses:
238
def gotuserhost(self, name, userhost):
241
check if user has userhost.
243
.. literalinclude:: ../../gozerbot/users.py
244
:pyobject: DbUsers.gotuserhost
250
return userhost in user.userhosts
252
def gotperm(self, name, perm):
255
check if user has permission.
258
.. literalinclude:: ../../gozerbot/users.py
259
:pyobject: DbUsers.gotperm
265
return perm.upper() in user.perms
267
def gotpermit(self, name, permit):
270
check if user permits something. permit is a [who, what] list.
273
.. literalinclude:: ../../gozerbot/users.py
274
:pyobject: DbUsers.gotpermit
281
return '%s %s' % permit in user.permits
283
def gotstatus(self, name, status):
286
check if user has status.
288
.. literalinclude:: ../../gozerbot/users.py
289
:pyobject: DbUsers.gotstatus
295
return status.upper() in user.statuses
298
def getname(self, userhost):
301
get name of user belonging to <userhost>.
303
.. literalinclude:: ../../gozerbot/users.py
304
:pyobject: DbUsers.getname
308
user = getuser(userhost)
311
return str(user.name)
313
def gethosts(self, userhost):
316
return the userhosts of the user associated with the
319
.. literalinclude:: ../../gozerbot/users.py
320
:pyobject: DbUsers.gethosts
323
user = getuser(userhost)
326
return list(user.userhosts)
328
def getemail(self, userhost):
331
return the email of the specified userhost.
333
.. literalinclude:: ../../gozerbot/users.py
334
:pyobject: DbUsers.getemail
337
user = getuser(userhost)
341
return str(user.email[0])
343
def getperms(self, userhost):
346
return permissions of user.
348
.. literalinclude:: ../../gozerbot/users.py
349
:pyobject: DbUsers.getperms
353
user = getuser(userhost)
356
return list(user.perms)
358
def getpermits(self, userhost):
361
return permits of the specified userhost.
363
.. literalinclude:: ../../gozerbot/users.py
364
:pyobject: DbUsers.getpermits
368
user = getuser(userhost)
371
return list(user.permits)
373
def getstatuses(self, userhost):
376
return the list of statuses for the specified userhost.
378
.. literalinclude:: ../../gozerbot/users.py
379
:pyobject: DbUsers.getstatuses
383
user = getuser(userhost)
386
return list(user.statuses)
388
def getuserhosts(self, name):
391
return the userhosts associated with the specified user.
393
.. literalinclude:: ../../gozerbot/users.py
394
:pyobject: DbUsers.getuserhosts
400
return list(user.userhosts)
402
def getuseremail(self, name):
407
.. literalinclude:: ../../gozerbot/users.py
408
:pyobject: DbUsers.getuseremail
416
return str(user.email[0])
418
def getuserperms(self, name):
421
return permission of user.
423
.. literalinclude:: ../../gozerbot/users.py
424
:pyobject: DbUsers.getuserperms
430
return list(user.perms)
432
def getuserpermits(self, name):
435
return permits of user.
437
.. literalinclude:: ../../gozerbot/users.py
438
:pyobject: DbUsers.getuserpermits
444
return list(user.permits)
446
def getuserstatuses(self, name):
449
return the list of statuses for the specified user.
451
.. literalinclude:: ../../gozerbot/users.py
452
:pyobject: DbUsers.getuserstatuses
458
return list(user.statuses)
460
def getpermusers(self, perm):
463
return all users that have the specified perm.
465
.. literalinclude:: ../../gozerbot/users.py
466
:pyobject: DbUsers.getpermusers
470
n = query(Perms, s).filter(Perms.perm==perm.upper()).all()
471
return [user.name for user in n]
473
def getstatususers(self, status):
476
return all users that have the specified status.
478
.. literalinclude:: ../../gozerbot/users.py
479
:pyobject: DbUsers.getstatususers
483
n = query(Statuses).filter(Statuses.status==status.upper()).all()
484
return [user.name for user in n]
488
def setemail(self, session, name, email):
493
.. literalinclude:: ../../gozerbot/users.py
494
:pyobject: DbUsers.setemail
497
user = byname(name, session)
502
user.email.remove(email)
506
user.email.insert(0, email)
507
session.refresh(user)
514
def add(self, session, name, userhosts, perms):
517
add an user. session argument is provided by @trans
519
:param name: name of the user
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
526
.. literalinclude:: ../../gozerbot/users.py
527
:pyobject: DbUsers.add
531
if type(userhosts) != types.ListType:
532
rlog(10, 'users', 'i need a list of userhosts')
535
name = stripname(name)
537
if not os.path.isdir(self.datadir + os.sep + 'users'):
538
os.mkdir(self.datadir + os.sep + 'users')
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)
543
user = byname(name, session)
548
newuser = User(name=name)
549
newuser.userhosts.extend(userhosts)
550
newuser.perms.extend(perms)
554
except Exception, ex:
555
rlog(10, 'users', str(ex))
558
rlog(10, 'users', '%s %s %s added to user database' % (name, userhosts, perms))
563
def addemail(self, session, userhost, email):
566
add an email address to the userhost.
568
.. literalinclude:: ../../gozerbot/users.py
569
:pyobject: DbUsers.addemail
573
user = getuser(userhost, session)
576
user.email.append(email)
578
session.refresh(user)
579
rlog(10, 'users', '%s (%s) added to email' % (email, userhost))
585
def addperm(self, session, userhost, perm):
588
add the specified perm to the userhost.
590
.. literalinclude:: ../../gozerbot/users.py
591
:pyobject: DbUsers.addperm
595
user = getuser(userhost, session)
598
user.perms.append(perm.upper())
600
session.refresh(user)
601
rlog(10, 'users', '%s perm %s added' % (userhost, perm))
607
def addpermit(self, session, userhost, permit):
610
add the given [who, what] permit to the given userhost.
612
.. literalinclude:: ../../gozerbot/users.py
613
:pyobject: DbUsers.addpermit
617
user = getuser(userhost, session)
621
user.permits.append(p)
624
rlog(10, 'users', '%s permit %s added' % (userhost, p))
630
def addstatus(self, session, userhost, status):
633
add status to given userhost.
635
.. literalinclude:: ../../gozerbot/users.py
636
:pyobject: DbUsers.addstatus
640
user = getuser(userhost, session)
643
user.statuses.append(status.upper())
645
session.refresh(user)
646
rlog(10, 'users', '%s status %s added' % (name, status))
652
def adduserhost(self, session, name, userhost):
657
.. literalinclude:: ../../gozerbot/users.py
658
:pyobject: DbUsers.adduserhost
662
user = byname(name, session)
665
user = User(name=name)
668
user.userhosts.append(userhost)
670
session.refresh(user)
671
rlog(10, 'users', '%s (%s) added to userhosts' % (name, userhost))
675
def adduseremail(self, session, name, email):
678
add email to specified user.
680
.. literalinclude:: ../../gozerbot/users.py
681
:pyobject: DbUsers.adduseremail
685
user = byname(name, session)
688
user.email.append(email)
690
session.refresh(user)
691
rlog(10, 'users', '%s email %s added' % (name, email))
695
def adduserperm(self, session, name, perm):
700
.. literalinclude:: ../../gozerbot/users.py
701
:pyobject: DbUsers.adduserperm
705
user = byname(name, session)
709
user.perms.append(perm)
711
session.refresh(user)
712
rlog(10, 'users', '%s perm %s added' % (name, perm))
718
def adduserpermit(self, session, name, who, permit):
721
add (who, what) permit tuple to specified user.
723
.. literalinclude:: ../../gozerbot/users.py
724
:pyobject: DbUsers.adduserpermit
728
user = byname(name, session)
731
p = '%s %s' % (who, permit)
732
user.permits.append(p)
734
session.refresh(user)
735
rlog(10, 'users', '%s permit %s added' % (name, p))
741
def adduserstatus(self, session, name, status):
744
add status to given user.
746
.. literalinclude:: ../../gozerbot/users.py
747
:pyobject: DbUsers.adduserstatus
751
user = byname(name, session)
754
user.statuses.append(status.upper())
756
session.refresh(user)
757
rlog(10, 'users', '%s status %s added' % (name, status))
763
def addpermall(self, session, perm):
766
add permission to all users.
768
.. literalinclude:: ../../gozerbot/users.py
769
:pyobject: DbUsers.addpermall
772
users = query(User, session).all()
776
user.perms.append(perm.upper())
777
session.refresh(user)
782
def delemail(self, session, userhost, email):
785
delete email from userhost.
787
.. literalinclude:: ../../gozerbot/users.py
788
:pyobject: DbUsers.delemail
792
user = getuser(userhost, session)
795
if email in user.emails:
796
user.emails.remove(email)
798
session.refresh(user)
804
def delperm(self, session, userhost, perm):
807
delete perm from userhost.
809
.. literalinclude:: ../../gozerbot/users.py
810
:pyobject: DbUsers.delperm
814
user = getuser(userhost, session)
822
session.refresh(user)
828
def delpermit(self, session, userhost, permit):
831
delete permit from userhost.
833
.. literalinclude:: ../../gozerbot/users.py
834
:pyobject: DbUsers.delpermit
837
user = getuser(userhost, session)
842
if p in user.permits:
843
user.permits.remove(p)
845
session.refresh(user)
851
def delstatus(self, session, userhost, status):
854
delete status from userhost.
856
.. literalinclude:: ../../gozerbot/users.py
857
:pyobject: DbUsers.delstatus
861
user = getuser(userhost, session)
866
if st in user.statuses:
867
user.statuses.remove(st)
869
session.refresh(user)
875
def delete(self, session, name):
878
delete user with name.
880
.. literalinclude:: ../../gozerbot/users.py
881
:pyobject: DbUsers.delete
884
name = stripname(name)
885
user = byname(name, session)
895
def deluserhost(self, session, name, userhost):
898
delete the userhost entry.
901
.. literalinclude:: ../../gozerbot/users.py
902
:pyobject: DbUsers.deluserhost
905
user = byname(name, session)
908
if userhost in user.userhosts:
909
user.userhosts.remove(userhost)
911
session.refresh(user)
912
rlog(10, 'users', '%s userhost %s deleted' % (name, userhost))
918
def deluseremail(self, session, name, email):
923
.. literalinclude:: ../../gozerbot/users.py
924
:pyobject: DbUsers.deluseremail
928
user = byname(name, session)
931
if email in user.email:
932
user.email.remove(email)
934
session.refresh(user)
935
rlog(10, 'users', '%s email %s deleted' % (name, email))
941
def deluserperm(self, session, name, perm):
946
.. literalinclude:: ../../gozerbot/users.py
947
:pyobject: DbUsers.deluserperm
951
user = byname(name, session)
959
session.refresh(user)
960
rlog(10, 'users', '%s perm %s deleted' % (name, p))
966
def deluserpermit(self, session, name, permit):
971
.. literalinclude:: ../../gozerbot/users.py
972
:pyobject: DbUsers.deluserpermit
976
user = byname(name, session)
981
if p in user.permits:
982
user.permits.remove(p)
984
session.refresh(user)
985
rlog(10, 'users', '%s permit %s deleted' % (name, p))
991
def deluserstatus(self, session, name, status):
994
delete the status from the given user.
996
.. literalinclude:: ../../gozerbot/users.py
997
:pyobject: DbUsers.deluserstatus
1001
user = byname(name, session)
1006
if st in user.statuses:
1007
user.statuses.remove(status)
1009
session.refresh(user)
1010
rlog(10, 'users', '%s status %s deleted' % (name, st))
1016
def delallemail(self, session, name):
1019
Delete all emails of the specified user.
1022
.. literalinclude:: ../../gozerbot/users.py
1023
:pyobject: DbUsers.delallemail
1027
user = byname(name, session)
1032
session.refresh(user)
1033
rlog(10, 'users', '%s emails deleted' % (name, ))
1040
def delpermall(self, session, perm):
1043
delete permission from all users.
1045
.. literalinclude:: ../../gozerbot/users.py
1046
:pyobject: DbUsers.delpermall
1050
users = query(User, session).options(eagerload('perms')).all()
1054
if user.name != 'owner':
1057
user.perms.remove(perm)
1059
session.refresh(user)
1066
def make_owner(self, userhosts):
1069
see if owner already has a user account if not merge otherwise
1072
:param userhosts: userhosts to inititalize owner with
1073
:type userhosts: list or string
1075
.. literalinclude:: ../../gozerbot/users.py
1076
:pyobject: DbUsers.make_owner
1082
if type(userhosts) != types.ListType:
1083
owner.append(userhosts)
1087
for userhost in owner:
1088
username = self.getname(unicode(userhost))
1091
if not self.merge('owner', unicode(userhost)):
1092
self.add('owner', [unicode(userhost), ], ['USER', 'OPER'])
1096
# default to database
1097
if not config['nodb']:
1100
# otheriwse use json users
1101
users = JsonUsers(datadir + os.sep + (config['jsonuser'] or 'users.json'))