File:  [Repository] / XMLRpcTools / XMLRpcTools.py
Revision 1.7: download - view: text, annotated - select for diffs - revision graph
Mon Oct 22 18:34:35 2007 UTC (18 years, 7 months ago) by casties
Branches: MAIN
CVS tags: HEAD
made regex to filter rpc arguments configurable


from OFS.SimpleItem import SimpleItem
import xmlrpclib
import httplib
from Products.PageTemplates.PageTemplateFile import PageTemplateFile
import os.path
from Globals import package_home
import re

class XMLRpcServerProxy(SimpleItem):
    """makes servery proxy available for zope"""
    
    meta_type="XMLRpcServerProxy"
    
    rpc_arg_expr='[^A-z0-9]'
    
    manage_options= (
        {'label':'Main Config','action':'mainConfigHTML'},
        )+ SimpleItem.manage_options

    def __init__(self,id,serverUrl,use_xmlrpc=True):
        """init server proxy"""
        self.id=id
        self.serverUrl=serverUrl
        self.use_xmlrpc = use_xmlrpc
        
        
    def ServerProxy(self,serverUrl=None):
        """get the proxy"""
        if not serverUrl:
            serverUrl=self.serverUrl
      
        if self.use_xmlrpc:
            pr = xmlrpclib.ServerProxy(serverUrl)
        else:
            pr = httplib.HTTPConnection(serverUrl)
       
        return pr
    
    
    def eval(self,method,argument):
        """do proxy request"""
        server=self.ServerProxy()
        
        if self.use_xmlrpc:
            # for XML-RPC methods only letters are allowed
            method=re.sub('[^A-z0-9_]','',method)
            # clean argument
            argument=re.sub(self.rpc_arg_expr,'',argument)
            
            cmd="""server.%s('%s')"""%(method,argument)
           
            return eval(cmd)
        else:
            # HTTP
            # TODO: check arguments
            uri = method
            if argument:
                uri += '?' + argument
            
            #print "GET: ", uri
            server.request("GET", uri)
            resp = server.getresponse()
            data = resp.read()
            #print "GOT: ", resp.status, ", ", resp.reason, " = ", data
            
            return data.decode('UTF-8')
        
    
    def mainConfigHTML(self):
        """main config form"""
        pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','manageXMLRpcServerProxy.zpt')).__of__(self)
        return pt()
    
    def mainConfig(self,serverUrl,use_xmlrpc=True,rpc_arg_expr=None,RESPONSE=None):
        """main config"""
        
        self.serverUrl=serverUrl
        
        if use_xmlrpc and use_xmlrpc != "no":
            use_xmlrpc = True
        else:
            use_xmlrpc = False
        
        self.use_xmlrpc=use_xmlrpc
        
        if rpc_arg_expr is not None:
            self.rpc_arg_expr = rpc_arg_expr
        
        if RESPONSE:
            RESPONSE.redirect("/manage_main")
            

def manage_addXMLRpcServerProxyForm(self):
    """add the CXMLRpcServerProxy"""
    pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addXMLRpcServerProxy.zpt')).__of__(self)
    return pt()

def manage_addXMLRpcServerProxy(self,id,serverUrl,use_xmlrpc=True,rpc_arg_expr=None,RESPONSE=None):
    """add the basket"""
    if use_xmlrpc and use_xmlrpc != "no":
        use_xmlrpc = True
    else:
        use_xmlrpc = False
        
    if rpc_arg_expr is not None:
        self.rpc_arg_expr = rpc_arg_expr
        
    ob=XMLRpcServerProxy(id,serverUrl,use_xmlrpc)
    
    self._setObject(id, ob)
    
    if RESPONSE is not None:
        RESPONSE.redirect('manage_main')

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>