Thread: [pybot-commits] CVS: pybot/pybot/modules permission.py,1.3,1.4
Brought to you by:
niemeyer
From: Gustavo N. <nie...@us...> - 2002-06-20 01:17:54
|
Update of /cvsroot/pybot/pybot/pybot/modules In directory usw-pr-cvs1:/tmp/cvs-serv15052/pybot/modules Modified Files: permission.py Log Message: - Improved permission module a lot; - Included help system; - Changed admin permission handling (WARNING!!! Don't merge this patch if you don't know what it means!) Index: permission.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/permission.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** permission.py 4 Dec 2001 00:57:38 -0000 1.3 --- permission.py 20 Jun 2002 01:17:48 -0000 1.4 *************** *** 19,22 **** --- 19,39 ---- from pybot import mm, hooks, options from pybot.user import User + import re + + HELP = [ + ("""\ + I'm able to control what features are available to what users \ + trough a permission system. Only administrators can give or take \ + permissions. If you're one of them, you can do it with "(give|take) \ + perm[ission] <perm> [to|from] [user <user>] [on|at] [this \ + channel|channel <channel>] [on|at|to] [this server|server <server>].\ + """,), + ("""\ + If you're an administrator, you may also view which permissions are \ + enabled, and to which users, with "(show|list) perm[ission][s] [<perm>]".\ + If you don't provide <perm>, you'll get a list of permissions, otherwise \ + you'll receive a list of users with this permission enabled.\ + """,)] + class Permission: *************** *** 29,32 **** --- 46,58 ---- hooks.register("Message", self.message) + # Matches '(give|take) perm[ission] <perm> [to|from] [user <user>] [on|at] [this channel|channel <channel>] [on|at|to] [this server|server <server>]' + self.re1 = re.compile("(?P<command>give|take)\s+(?:(?P<perm1>\w+)\s+perm(?:ission)?|perm(?:ission)?\s+(?P<perm2>\w+))(?:\s+to|\s+from)?(?:\s+user\s+(?P<user>\S+))?(?:\s+on|\s+at)?(?:\s+(?P<thischannel>this\s+channel)|\s+channel\s+(?P<channel>\S+))?(?:\s+on|\s+at|\s+to)?(?:\s+(?P<thisserver>this\s+server)|\s+server\s+(?P<server>\S+))?\s*[!.]*$", re.I) + + # Matches '(show|list) perm[ission][s] [<perm>]' + self.re2 = re.compile("(?:show|list)\s+perm(?:ission)?s?(?:\s+(?P<perm>\w+))?\s*[!.]*$", re.I) + + # Match 'perm[ission][s] [system]' + mm.register_help(0, "perm(?:ission)?s?(?:\s+system)?", HELP) + def unload(self): mm.unregister("hasperm") *************** *** 34,129 **** mm.unregister("unsetperm") hooks.unregister("Message", self.message) def message(self, msg): ! var = [] ! if msg.match(var, 6, "%", "give", 0, "~", ["permission", "perm"], "to", [("user", 1, "~"), None], [(["on", "at", None], [(2, "~this", "channel"), ("channel", 3, "^[#&+!][^,^G]+$")]), None], [(["on", "at", "to", None], [(4, "~this", "server"), ("server", 5, "~")]), None], ["!", ".", None]): ! if self.mm_hasperm(0, msg.server.servername, msg.target, msg.user, None): ! if var[1] or var[2] or var[3] or var[4]: ! if var[2]: channel = msg.target server = msg.server.servername else: ! if var[3]: ! channel = var[3] else: channel = None ! if var[4]: server = msg.server.servername ! elif var[5]: ! server = var[5] else: server = None ! if var[1]: user = User() ! user.setstring(var[1]) else: user = None ! self.mm_setperm(0, server,channel,user,var[0]) ! msg.answer("%:", ["Done, sir!", "Given, sir!", "No problems!", "Ok!"]) ! else: ! msg.answer("%:", ["Sorry, you", "Sir, you", "You"], ["can't work with permissions.", "don't have this power.", "can't give permissions."]) ! return 0 ! elif msg.match(var, 6, "%", "take", 0, "~", ["permission", "perm"], "from", [("user", 1, "~"), None], [(["on", "at", None], [(2, "~this", "channel"), ("channel", 3, "^[#&+!][^,^G]+$")]), None], [(["on", "at", None], [(4, "~this", "server"), ("server", 5, "~")]), None], ["!", ".", None]): ! if self.mm_hasperm(0, msg.server.servername, msg.target, msg.user, None): ! if var[1] or var[2] or var[3] or var[4]: ! if var[2]: ! channel = msg.target ! server = msg.server.servername else: ! if var[3]: ! channel = var[3] ! else: ! channel = None ! if var[4]: ! server = msg.server.servername ! elif var[5]: ! server = var[5] else: ! server = None ! if var[1]: ! user = User() ! user.setstring(var[1]) else: ! user = None ! self.mm_unsetperm(0, server,channel,user,var[0]) ! msg.answer("%:", ["Done, sir!", "No problems!", "Ok!", "Right now!", "Right now, sir!"]) ! else: ! msg.answer("%:", ["Sorry, you", "Sir, you", "You"], ["can't work with permissions.", "don't have this power.", "can't take permissions."]) ! return 0 ! def mm_hasperm(self, defret, server, channel, user, perm): - for _user in self.gosh: - if user.match(_user.nick, _user.username, _user.host): - return 1 if self.perm.has_key(perm): for tup in self.perm[perm]: ! if (tup[0] == None or tup[0] == server) and \ ! (tup[1] == None or tup[1] == channel) and \ ! (tup[2] == None or user.match(tup[2].nick, tup[2].username, tup[2].host)): return 1 def mm_setperm(self, defret, server, channel, user, perm): ! if perm == "gosh": ! self.gosh.append(user) else: ! if not self.perm.has_key(perm): ! self.perm[perm] = [(server,channel,user)] ! else: ! self.perm[perm].append((server,channel,user)) def mm_unsetperm(self, defret, server, channel, user, perm): ! if perm == "gosh": ! for _user in self.gosh: ! if _user.match(user.nick, user.username, user.host): ! self.gosh.remove(_user) ! elif self.perm.has_key(perm): _perm = self.perm[perm] for tup in _perm: ! if (tup[0] == None or tup[0] == server) and \ ! (tup[1] == None or tup[1] == channel) and \ ! (tup[2] == None or user.match(tup[2].nick, tup[2].username, tup[2].host)): _perm.remove(tup) if len(_perm) == 0: del self.perm[perm] --- 60,182 ---- mm.unregister("unsetperm") hooks.unregister("Message", self.message) + mm.unregister_help(0, HELP) def message(self, msg): ! if msg.forme: ! m = self.re1.match(msg.line) ! if m: ! if self.mm_hasperm(0, msg.server.servername, msg.target, msg.user, None): ! if m.group("thischannel"): ! found = 1 channel = msg.target server = msg.server.servername else: ! if m.group("channel"): ! found = 1 ! channel = m.group("channel") else: channel = None ! if m.group("thisserver"): ! found = 1 server = msg.server.servername ! elif m.group("server"): ! server = m.group("server") else: server = None ! if m.group("user"): ! userstr = m.group("user") ! if not re.compile(".+!.+@.+").match(userstr): ! msg.answer("%:", "Please, provide a user in the format \"<nick>!<username>@<servername>\".") ! return 0 user = User() ! user.setstring(userstr) else: user = None ! perm = m.group("perm1") or m.group("perm2") ! if m.group("command").lower() == "give": ! self.mm_setperm(0, server, channel, user, perm) else: ! if not self.mm_unsetperm(0, server, channel, ! user, perm): ! msg.answer("%:", "No entries like this were found", [".", "!"]) ! return 0 ! msg.answer("%:", ["Done, sir!", "No problems!", "Ok!"]) ! else: ! msg.answer("%:", ["Sorry, you", "Sir, you", "You"], ["can't work with permissions.", "don't have this power."]) ! return 0 ! ! m = self.re2.match(msg.line) ! if m: ! if self.mm_hasperm(0, msg.server.servername, msg.target, msg.user, None): ! perm = m.group("perm") ! if perm: ! if not (self.perm.has_key(perm) and self.perm[perm]): ! msg.answer("%:", "Nobody has this permission", [".", "!"]) else: ! perms = self.perm[perm] ! permlen = len(self.perm[perm]) ! s = "" ! for i in range(permlen): ! tup = perms[i] ! if tup[2] is not None: ! s += tup[2].string ! if tup[1] is not None: ! join = "" ! if s: ! join = " at " ! s = "%s%schannel %s" % (s, join, tup[1]) ! if tup[0] is not None: ! join = "" ! if s: ! join = " on " ! s = "%s%sserver %s" % (s, join, tup[0]) ! if i == permlen-1: ! s += "." ! elif i == permlen-2: ! s += ", and " ! else: ! s += ", " ! msg.answer("%:", "This permission is available for the following people:", s) else: ! if not self.perm: ! msg.answer("%:", "No given permissions", [".", "!"]) ! else: ! msg.answer("%:", "The following permissions are available for some users:", ", ".join(self.perm.keys())) ! else: ! msg.answer("%:", ["Sorry, you", "Sir, you", "You"], ["can't work with permissions.", "don't have this power."]) ! return 0 ! def mm_hasperm(self, defret, server, channel, user, perm): if self.perm.has_key(perm): for tup in self.perm[perm]: ! if (tup[0] is None or tup[0] == server) and \ ! (tup[1] is None or tup[1] == channel) and \ ! (tup[2] is None or user.match(tup[2].nick, tup[2].username, tup[2].host)): return 1 + if perm != "admin": + if not (self.perm.has_key("admin") and self.perm["admin"]): + return 1 + return self.mm_hasperm(defret, server, channel, user, "admin") + return 0 def mm_setperm(self, defret, server, channel, user, perm): ! if not self.perm.has_key(perm): ! self.perm[perm] = [(server,channel,user)] else: ! self.perm[perm].append((server,channel,user)) def mm_unsetperm(self, defret, server, channel, user, perm): ! found = 0 ! if self.perm.has_key(perm): _perm = self.perm[perm] for tup in _perm: ! if (tup[0] is None or tup[0] == server) and \ ! (tup[1] is None or tup[1] == channel) and \ ! (tup[2] is None or user.match(tup[2].nick, tup[2].username, tup[2].host)): _perm.remove(tup) if len(_perm) == 0: del self.perm[perm] + found = 1 + return found |