[pybot-commits] CVS: pybot/pybot/modules xmlrpc.py,NONE,1.1 soap.py,1.2,1.3
Brought to you by:
niemeyer
From: Gustavo N. <nie...@us...> - 2003-05-05 20:47:27
|
Update of /cvsroot/pybot/pybot/pybot/modules In directory sc8-pr-cvs1:/tmp/cvs-serv17260/pybot/modules Modified Files: soap.py Added Files: xmlrpc.py Log Message: Created xmlrpc module, including xmlrpc support for pybot. --- NEW FILE: xmlrpc.py --- # Copyright (c) 2000-2001 Gustavo Niemeyer <nie...@co...> # # This file is part of pybot. # # pybot is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # pybot is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with pybot; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA from pybot import hooks, mm, rm, options, servers from SimpleXMLRPCServer import SimpleXMLRPCServer from types import StringType import xmlrpclib import traceback import re HELP = [ ("""\ The xmlrpc service is based on method names and permissions. If you \ want to allow a given user to run a method, first you must create \ a xmlrpc user for him, with "(add|create) xmlrpc user <username> \ with pass[word] <password>".\ """,), ("""\ Then, you can give or remove permissions for that user with \ "[don't|do not] allow xmlrpc (func[tion]|method) <func> [(to|for) user \ <xmlrpcuser>] [(to|for|on|at) [user|channel] <target>] [[and] [on|at] \ server <server>]".\ """,), ("""\ To remove a given xmlrpc user, just use "(del[ete]|remove) xmlrpc \ user <user>".\ """,)] class XmlRpcObject: def __init__(self, funcs, hasperm): self.__funcs = funcs self.__hasperm = hasperm def _dispatch(self, name, args): func = self.__funcs.get(name) if not func: return xmlrpclib.Fault(2, "no such method") auth = args[0] if type(auth) is not dict: return xmlrpclib.Fault(1, "invalid authorization") try: if self.__hasperm(name, auth): ret = func(*args) if ret is None: ret = 0 return ret else: return xmlrpclib.Fault(3, "method not allowed") except: traceback.print_exc() return xmlrpclib.Fault(4, "pybot error") class XmlRpc: def __init__(self, bot): self.user = options.gethard("XmlRpc.users", {}) self.perm = options.gethard("XmlRpc.permissions", {}) self.server = SimpleXMLRPCServer(("0.0.0.0", 8460)) self.server.socket.setblocking(0) rm.register("sendmsg", self.rm_sendmsg) xro = XmlRpcObject(rm.get_methods(), self.hasperm) self.server.register_instance(xro) hooks.register("Message", self.message) hooks.register("Loop", self.loop) # (add|create) xmlrpc user <user> with [pass|password] <passwd> [!.] self.re1 = re.compile(r"(?:add|create)\s+xmlrpc\s+user\s+(?P<user>\S+)\s+with\s+(?:password|pass)\s+(?P<passwd>\S+)\s*[.!]*$") # (del|delete|remove) xmlrpc user <user> self.re2 = re.compile(r"(?:del|delete|remove)\s+xmlrpc\s+user\s+(?P<user>\S+)\s*[.!]*$") # [don[']t|do not] allow xmlrpc (func[tion]|method) <func> [(to|for) user <user>] [(to|for|on|at) [user|channel] <target>] [[and] [on|at] server <server>] self.re3 = re.compile(r"(?P<dont>don'?t\s+|do not\s+)?allow\s+xmlrpc\s+(?:func(?:tion)?|method)\s+(?P<func>\S+)(?:\s+(?:to\s+|for\s+)user\s+(?P<user>\S+))?(?:\s+(?:to|for|on|at)\s+(?:user\s+|channel\s+)?(?P<target>\S+))?(?:\s+(?:and\s+)?(?:on\s+|at\s+)?server\s+(?P<server>\S+))?\s*[.!]*$") # xmlrpc mm.register_help(0, "xmlrpc", HELP) def unload(self): hooks.unregister("Message", self.message) hooks.unregister("Loop", self.loop) self.server.server_close() rm.unregister("sendmsg") mm.unregister_help(0, HELP) def loop(self): self.server.handle_request() def message(self, msg): if msg.forme: m = self.re1.match(msg.line) if m: if mm.hasperm(0, msg.server.servername, msg.target, msg.user, "xmlrpc"): user = m.group("user") if self.user.has_key(user): msg.answer("%:", ["I can't do this!", "Sorry!"], ["This user already exists", "This user is already registered"], [".", "!"]) else: self.user[user] = m.group("passwd") msg.answer("%:", ["User added", "Ok", "User created", "Done"], [".", "!"]) else: msg.answer("%:", ["Sorry, you", "You"], ["can't add xmlrpc users.", "don't have this power."]) return 0 m = self.re2.match(msg.line) if m: if mm.hasperm(0, msg.server.servername, msg.target, msg.user, "xmlrpc"): try: del self.user[m.group("user")] except KeyError: msg.answer("%:", ["Oops!", "Sorry!"], ["There's no such user", "I haven't found this user"], [".", "!"]) else: msg.answer("%:", ["User removed", "No problems", "User deleted", "Done"], [".", "!"]) else: msg.answer("%:", ["Sorry, you", "You"], ["can't add xmlrpc users.", "don't have this power."]) return 0 m = self.re3.match(msg.line) if m: if mm.hasperm(0, msg.server.servername, msg.target, msg.user, "xmlrpc"): func = m.group("func") tuple = (m.group("user"), m.group("server"), m.group("target")) if m.group("dont"): try: funcperm = self.perm[func] funcperm.index(tuple) except (KeyError, ValueError): msg.answer("%:", ["Sorry!", "Oops!", "Can't do this!"], ["Nobody has this permission", "This permission doesn't exist"], [".", "!"]) else: funcperm.remove(tuple) if not funcperm: del self.perm[func] msg.answer("%:", ["Ok", "No problems", "Right now", "Permission removed"], [".", "!"]) else: funcperm = self.perm.setdefault(func, []) try: funcperm.index(tuple) except ValueError: funcperm.append(tuple) msg.answer("%:", ["Ok", "No problems", "Right now"], [".", "!"]) else: msg.answer("%:", ["Oops!", "It's not necessary!", "I don't have to!"], "This permission already exists", [".", "!"]) else: msg.answer("%:", ["Sorry, you", "You"], ["can't work with xmlrpc permissions.", "don't have this power."]) return 0 def hasperm(self, funcname, auth): user = auth.get("username") passwd = auth.get("password") server = auth.get("server") target = auth.get("target") if passwd == self.user.get(user): funcperm = self.perm.get(funcname, []) for _user, _server, _target in funcperm: if (not _user or user == _user) and \ (not _server or not server or _server == server) and \ (not _target or not target or _target == target): return 1 def rm_sendmsg(self, auth, msg, notice=0, ctcp=None): server = servers.get(auth["server"]) if server: if type(msg) == StringType: server.sendmsg(auth["target"], None, msg, notice=notice, ctcp=ctcp) else: server.sendmsg(auth["target"], None, notice=notice, ctcp=ctcp, *msg) def __loadmodule__(bot): global mod mod = XmlRpc(bot) def __unloadmodule__(bot): global mod mod.unload() del mod # vim:ts=4:sw=4:et Index: soap.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/soap.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** soap.py 4 Dec 2001 00:57:38 -0000 1.2 --- soap.py 5 May 2003 20:47:23 -0000 1.3 *************** *** 17,21 **** # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ! from pybot import hooks, mm, sm, options, servers from inspect import ismethod, getargspec import pybot.util.SOAP as SOAP --- 17,21 ---- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ! from pybot import hooks, mm, rm, options, servers from inspect import ismethod, getargspec import pybot.util.SOAP as SOAP *************** *** 74,80 **** self.server = SOAP.SOAPServer(("0.0.0.0", 8450)) ! sm.register("sendmsg", self.sm_sendmsg) ! so = SoapObject(sm.get_methods(), self.hasperm) self.server.registerObject(so) --- 74,80 ---- self.server = SOAP.SOAPServer(("0.0.0.0", 8450)) ! rm.register("sendmsg", self.sm_sendmsg) ! so = SoapObject(rm.get_methods(), self.hasperm) self.server.registerObject(so) *************** *** 95,99 **** hooks.unregister("Loop", self.loop) self.server.server_close() ! sm.unregister("sendmsg") def loop(self): --- 95,99 ---- hooks.unregister("Loop", self.loop) self.server.server_close() ! rm.unregister("sendmsg") def loop(self): |