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

    1: 
    2: from OFS.SimpleItem import SimpleItem
    3: import xmlrpclib
    4: import httplib
    5: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
    6: import os.path
    7: from Globals import package_home
    8: import re
    9: 
   10: class XMLRpcServerProxy(SimpleItem):
   11:     """makes servery proxy available for zope"""
   12:     
   13:     meta_type="XMLRpcServerProxy"
   14:     
   15:     rpc_arg_expr='[^A-z0-9]'
   16:     
   17:     manage_options= (
   18:         {'label':'Main Config','action':'mainConfigHTML'},
   19:         )+ SimpleItem.manage_options
   20: 
   21:     def __init__(self,id,serverUrl,use_xmlrpc=True):
   22:         """init server proxy"""
   23:         self.id=id
   24:         self.serverUrl=serverUrl
   25:         self.use_xmlrpc = use_xmlrpc
   26:         
   27:         
   28:     def ServerProxy(self,serverUrl=None):
   29:         """get the proxy"""
   30:         if not serverUrl:
   31:             serverUrl=self.serverUrl
   32:       
   33:         if self.use_xmlrpc:
   34:             pr = xmlrpclib.ServerProxy(serverUrl)
   35:         else:
   36:             pr = httplib.HTTPConnection(serverUrl)
   37:        
   38:         return pr
   39:     
   40:     
   41:     def eval(self,method,argument):
   42:         """do proxy request"""
   43:         server=self.ServerProxy()
   44:         
   45:         if self.use_xmlrpc:
   46:             # for XML-RPC methods only letters are allowed
   47:             method=re.sub('[^A-z0-9]','',method)
   48:             # clean argument
   49:             argument=re.sub(self.rpc_arg_expr,'',argument)
   50:             
   51:             cmd="""server.%s('%s')"""%(method,argument)
   52:            
   53:             return eval(cmd)
   54:         else:
   55:             # HTTP
   56:             # TODO: check arguments
   57:             uri = method
   58:             if argument:
   59:                 uri += '?' + argument
   60:             
   61:             #print "GET: ", uri
   62:             server.request("GET", uri)
   63:             resp = server.getresponse()
   64:             data = resp.read()
   65:             #print "GOT: ", resp.status, ", ", resp.reason, " = ", data
   66:             
   67:             return data.decode('UTF-8')
   68:         
   69:     
   70:     def mainConfigHTML(self):
   71:         """main config form"""
   72:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','manageXMLRpcServerProxy.zpt')).__of__(self)
   73:         return pt()
   74:     
   75:     def mainConfig(self,serverUrl,use_xmlrpc=True,rpc_arg_expr=None,RESPONSE=None):
   76:         """main config"""
   77:         
   78:         self.serverUrl=serverUrl
   79:         
   80:         if use_xmlrpc and use_xmlrpc != "no":
   81:             use_xmlrpc = True
   82:         else:
   83:             use_xmlrpc = False
   84:         
   85:         self.use_xmlrpc=use_xmlrpc
   86:         
   87:         if rpc_arg_expr is not None:
   88:             self.rpc_arg_expr = rpc_arg_expr
   89:         
   90:         if RESPONSE:
   91:             RESPONSE.redirect("/manage_main")
   92:             
   93: 
   94: def manage_addXMLRpcServerProxyForm(self):
   95:     """add the CXMLRpcServerProxy"""
   96:     pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addXMLRpcServerProxy.zpt')).__of__(self)
   97:     return pt()
   98: 
   99: def manage_addXMLRpcServerProxy(self,id,serverUrl,use_xmlrpc=True,rpc_arg_expr=None,RESPONSE=None):
  100:     """add the basket"""
  101:     if use_xmlrpc and use_xmlrpc != "no":
  102:         use_xmlrpc = True
  103:     else:
  104:         use_xmlrpc = False
  105:         
  106:     if rpc_arg_expr is not None:
  107:         self.rpc_arg_expr = rpc_arg_expr
  108:         
  109:     ob=XMLRpcServerProxy(id,serverUrl,use_xmlrpc)
  110:     
  111:     self._setObject(id, ob)
  112:     
  113:     if RESPONSE is not None:
  114:         RESPONSE.redirect('manage_main')

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