Ejemplo n.º 1
0
    def _rpc_process(self, req, protocol, content_type):
        """Process incoming RPC request and finalize response."""
        proto_id = protocol.rpc_info()[0]
        rpcreq = req.rpc = {'mimetype': content_type}
        try:
            self.log.debug("RPC(%s) call by '%s'", proto_id, req.authname)
            rpcreq = req.rpc = protocol.parse_rpc_request(req, content_type)
            rpcreq['mimetype'] = content_type

            # Important ! Check after parsing RPC request to add
            #             protocol-specific fields in response
            #             (e.g. JSON-RPC response `id`)
            req.perm.require('XML_RPC')  # Need at least XML_RPC

            method_name = rpcreq.get('method')
            if method_name is None:
                raise ProtocolException('Missing method name')
            args = rpcreq.get('params') or []
            self.log.debug("RPC(%s) call by '%s' %s", proto_id, \
                                              req.authname, method_name)
            try:
                result = (XMLRPCSystem(self.env).get_method(method_name)(
                    req, args))[0]
                if isinstance(result, GeneratorType):
                    result = list(result)
            except (RPCError, PermissionError, ResourceNotFound), e:
                raise
            except Exception:
                e, tb = sys.exc_info()[-2:]
                raise ServiceException(e), None, tb
            else:
                protocol.send_rpc_result(req, result)
Ejemplo n.º 2
0
    def _dump_docs(self, req):
        self.log.debug("Rendering docs")

        # Dump RPC documentation
        req.perm.require('XML_RPC')  # Need at least XML_RPC
        namespaces = {}
        for method in XMLRPCSystem(self.env).all_methods(req):
            namespace = method.namespace.replace('.', '_')
            if namespace not in namespaces:
                namespaces[namespace] = {
                    'description':
                    wiki_to_oneliner(method.namespace_description,
                                     self.env,
                                     req=req),
                    'methods': [],
                    'namespace':
                    method.namespace,
                }
            try:
                namespaces[namespace]['methods'].append(
                    (method.signature,
                     wiki_to_oneliner(method.description, self.env,
                                      req=req), method.permission))
            except Exception, e:
                from tracrpc.util import StringIO
                import traceback
                out = StringIO()
                traceback.print_exc(file=out)
                raise Exception('%s: %s\n%s' %
                                (method.name, str(e), out.getvalue()))
Ejemplo n.º 3
0
    def process_request(self, req):
        # Need at least XML_RPC
        req.perm.assert_permission('XML_RPC')

        # Dump RPC functions
        content_type = req.get_header('Content-Type')
        if content_type is None or 'text/xml' not in content_type:
            namespaces = {}
            for method in XMLRPCSystem(self.env).all_methods(req):
                namespace = method.namespace.replace('.', '_')
                if namespace not in namespaces:
                    namespaces[namespace] = {
                        'description':
                        wiki_to_oneliner(method.namespace_description,
                                         self.env),
                        'methods': [],
                        'namespace':
                        method.namespace,
                    }
                try:
                    namespaces[namespace]['methods'].append(
                        (method.signature,
                         wiki_to_oneliner(method.description,
                                          self.env), method.permission))
                except Exception, e:
                    from StringIO import StringIO
                    import traceback
                    out = StringIO()
                    traceback.print_exc(file=out)
                    raise Exception('%s: %s\n%s' %
                                    (method.name, str(e), out.getvalue()))
            add_stylesheet(req, 'common/css/wiki.css')
            req.hdf['xmlrpc.functions'] = namespaces
            return 'xmlrpclist.cs', None
Ejemplo n.º 4
0
    def setUp(self):
        self.env = EnvironmentStub(default_data=True)
        from trac.log import logger_factory
        self.env.log = logger_factory(logtype='syslog',
                                      logfile=None,
                                      level='DEBUG',
                                      logid='Trac',
                                      format=None)

        self.env.path = '/'
        self.wiki_tag_rpc_engine = WikiTagRPCSystem(self.env)
        self.ticket_tag_rpc_engine = TicketTagRPCSystem(self.env)
        self.tag_engine = TagEngine(self.env)
        self.tag_engine.upgrade_environment(self.env.get_db_cnx())
        self.xml_rpc_system = XMLRPCSystem(self.env)

        # Insert some test tickets
        from trac.ticket.model import Ticket
        for id in (1, 2, 3):
            ticket = Ticket(self.env)
            ticket['summary'] = 'Test ticket %i' % id
            ticket['description'] = 'Test ticket %i description' % id
            ticket.insert()
Ejemplo n.º 5
0
 def setUp(self):
     self.env = EnvironmentStub(default_data=True)
     from trac.log import logger_factory
     self.env.log =logger_factory(logtype='syslog', logfile=None, level='DEBUG', logid='Trac', format=None)
     
     self.env.path = '/'
     self.wiki_tag_rpc_engine = WikiTagRPCSystem(self.env)
     self.ticket_tag_rpc_engine = TicketTagRPCSystem(self.env)
     self.tag_engine = TagEngine(self.env)
     self.tag_engine.upgrade_environment(self.env.get_db_cnx())
     self.xml_rpc_system = XMLRPCSystem(self.env)
                      
     
     # Insert some test tickets
     from trac.ticket.model import Ticket
     for id in (1, 2, 3):
         ticket = Ticket(self.env)
         ticket['summary'] = 'Test ticket %i' % id
         ticket['description'] = 'Test ticket %i description' % id
         ticket.insert()
Ejemplo n.º 6
0
    def _rpc_process(self, req, protocol, content_type):
        """Process incoming RPC request and finalize response."""
        proto_id = protocol.rpc_info()[0]
        rpcreq = req.rpc = {'mimetype': content_type}
        self.log.debug("RPC(%s) call by '%s'", proto_id, req.authname)
        try:
            if req.path_info.startswith('/login/') and \
                    req.authname == 'anonymous':
                raise TracError("Authentication information not available")
            rpcreq = req.rpc = protocol.parse_rpc_request(req, content_type)
            rpcreq['mimetype'] = content_type

            # Important ! Check after parsing RPC request to add
            #             protocol-specific fields in response
            #             (e.g. JSON-RPC response `id`)
            req.perm.require('XML_RPC')  # Need at least XML_RPC

            method_name = rpcreq.get('method')
            if method_name is None:
                raise ProtocolException('Missing method name')
            args = rpcreq.get('params') or []
            self.log.debug("RPC(%s) call by '%s' %s", proto_id, req.authname,
                           method_name)
            try:
                result = (XMLRPCSystem(self.env).get_method(method_name)(
                    req, args))[0]
                if isinstance(result, GeneratorType):
                    result = list(result)
            except (TracError, PermissionError, ResourceNotFound), e:
                raise
            except Exception:
                e, tb = sys.exc_info()[-2:]
                self.log.error(
                    "RPC(%s) [%s] Exception caught while calling "
                    "%s(*%r) by %s%s", proto_id, req.remote_addr,
                    method_name, args, req.authname,
                    exception_to_unicode(e, traceback=True))
                raise ServiceException(e), None, tb
            else:
                protocol.send_rpc_result(req, result)
Ejemplo n.º 7
0
class TagsXmlRpcTestCase(unittest.TestCase):
    test_data = (('wiki', 'WikiStart', ('foo', 'bar')), ('wiki', 'SandBox',
                                                         ('bar', 'war')),
                 ('ticket', 1, ('war', 'death')), ('ticket', 2,
                                                   ('death', 'destruction')),
                 ('ticket', 3, ('foo', 'bar', 'destruction')))

    perm = Mock(assert_permission=lambda x: True,
                has_permission=lambda x: True)

    req = Mock(perm=perm, authname='anonymous')

    def _populate_tags(self, ts):
        for tagspace, target, tags in self.test_data:
            tagspace = ts.tagspace(tagspace)
            tagspace.add_tags(self.req, target, tags)
            yield tagspace, target, tags

    def setUp(self):
        self.env = EnvironmentStub(default_data=True)
        from trac.log import logger_factory
        self.env.log = logger_factory(logtype='syslog',
                                      logfile=None,
                                      level='DEBUG',
                                      logid='Trac',
                                      format=None)

        self.env.path = '/'
        self.wiki_tag_rpc_engine = WikiTagRPCSystem(self.env)
        self.ticket_tag_rpc_engine = TicketTagRPCSystem(self.env)
        self.tag_engine = TagEngine(self.env)
        self.tag_engine.upgrade_environment(self.env.get_db_cnx())
        self.xml_rpc_system = XMLRPCSystem(self.env)

        # Insert some test tickets
        from trac.ticket.model import Ticket
        for id in (1, 2, 3):
            ticket = Ticket(self.env)
            ticket['summary'] = 'Test ticket %i' % id
            ticket['description'] = 'Test ticket %i description' % id
            ticket.insert()

    def test_insert(self):
        ts = self.tag_engine.tagspace
        for tagspace, target, tags in self._populate_tags(ts):
            found_tags = tagspace.get_tags([target])
            self.assertEqual(found_tags, set(tags))

    def test_wiki_tagspace(self):

        self.assertEqual(self.wiki_tag_rpc_engine.namespace, 'wiki')

    def test_ticket_tagspace(self):

        self.assertEqual(self.ticket_tag_rpc_engine.namespace, 'ticket')

    def test_wiki_xmlrpc_methods(self):
        self.failUnless(
            set(self.wiki_tag_rpc_engine.xmlrpc_methods()) != None,
            "No xmlrpc methods for wiki namespace")

    def test_ticket_xmlrpc_methods(self):
        self.failUnless(
            set(self.ticket_tag_rpc_engine.xmlrpc_methods()) != None,
            "No xmlrpc methods for ticket namespace")

    def test_wiki_xmlrpc_namespace(self):
        self.assertEqual(self.wiki_tag_rpc_engine.xmlrpc_namespace(),
                         "tags.wiki")

    def test_ticket_xmlrpc_namespace(self):
        self.assertEqual(self.ticket_tag_rpc_engine.xmlrpc_namespace(),
                         "tags.ticket")

    def test_wiki_get_name_tags(self):
        wiki_start_tags = self.wiki_tag_rpc_engine.getTags(
            self.req, "WikiStart")
        self.failUnless(wiki_start_tags != None,
                        "Can not find any tags for mock page WikiStart")

    def test_xmlrpc_listMethods(self):
        for method in self.xml_rpc_system.all_methods(self.req):
            namespace = method.namespace.replace('.', '_')
            namespaces = {}
            if namespace not in namespaces:
                namespaces[namespace] = {
                    'description':
                    wiki_to_oneliner(method.namespace_description, self.env),
                    'methods': [],
                    'namespace':
                    method.namespace,
                }
            try:
                namespaces[namespace]['methods'].append(
                    (method.signature,
                     wiki_to_oneliner(method.description,
                                      self.env), method.permission))
            except Exception, e:
                self.fail('%s: %s\n' % (method.name, str(e)))
Ejemplo n.º 8
0
class XMLRPCWeb(Component):
    """ Handle XML-RPC calls from HTTP clients, as well as presenting a list of
        methods available to the currently logged in user. Browsing to
        <trac>/xmlrpc will display this list. """

    implements(IRequestHandler, ITemplateProvider)

    # IRequestHandler methods
    def match_request(self, req):
        return req.path_info in ('/login/xmlrpc', '/xmlrpc')

    def _send_response(self, req, response):
        req.send_response(200)
        req.send_header('Content-Type', 'text/xml')
        req.send_header('Content-Length', len(response))
        req.end_headers()
        req.write(response)

    def process_request(self, req):
        # Need at least XML_RPC
        req.perm.assert_permission('XML_RPC')

        # Dump RPC functions
        content_type = req.get_header('Content-Type')
        if content_type is None or 'text/xml' not in content_type:
            namespaces = {}
            for method in XMLRPCSystem(self.env).all_methods(req):
                namespace = method.namespace.replace('.', '_')
                if namespace not in namespaces:
                    namespaces[namespace] = {
                        'description':
                        wiki_to_oneliner(method.namespace_description,
                                         self.env),
                        'methods': [],
                        'namespace':
                        method.namespace,
                    }
                try:
                    namespaces[namespace]['methods'].append(
                        (method.signature,
                         wiki_to_oneliner(method.description,
                                          self.env), method.permission))
                except Exception, e:
                    from StringIO import StringIO
                    import traceback
                    out = StringIO()
                    traceback.print_exc(file=out)
                    raise Exception('%s: %s\n%s' %
                                    (method.name, str(e), out.getvalue()))
            add_stylesheet(req, 'common/css/wiki.css')
            req.hdf['xmlrpc.functions'] = namespaces
            return 'xmlrpclist.cs', None

        # Handle XML-RPC call
        args, method = xmlrpclib.loads(
            req.read(int(req.get_header('Content-Length'))))
        try:
            result = XMLRPCSystem(self.env).get_method(method)(req, args)
            self._send_response(req,
                                xmlrpclib.dumps(result, methodresponse=True))
        except xmlrpclib.Fault, e:
            self.log.error(e)
            self._send_response(req, xmlrpclib.dumps(e))
Ejemplo n.º 9
0
class TagsXmlRpcTestCase(unittest.TestCase):
    test_data = (('wiki', 'WikiStart', ('foo', 'bar')),
                 ('wiki', 'SandBox', ('bar', 'war')),
                 ('ticket', 1, ('war', 'death')),
                 ('ticket', 2, ('death', 'destruction')),
                 ('ticket', 3, ('foo', 'bar', 'destruction'))
                 )

    
    
    perm=Mock(assert_permission=lambda x: True,has_permission=lambda x: True)
    
    req = Mock(perm=perm, authname='anonymous')
    def _populate_tags(self,ts):
            for tagspace, target, tags in self.test_data:
                tagspace = ts.tagspace(tagspace)
                tagspace.add_tags(self.req, target, tags)
                yield tagspace, target, tags
            
    def setUp(self):
        self.env = EnvironmentStub(default_data=True)
        from trac.log import logger_factory
        self.env.log =logger_factory(logtype='syslog', logfile=None, level='DEBUG', logid='Trac', format=None)
        
        self.env.path = '/'
        self.wiki_tag_rpc_engine = WikiTagRPCSystem(self.env)
        self.ticket_tag_rpc_engine = TicketTagRPCSystem(self.env)
        self.tag_engine = TagEngine(self.env)
        self.tag_engine.upgrade_environment(self.env.get_db_cnx())
        self.xml_rpc_system = XMLRPCSystem(self.env)
                         
        
        # Insert some test tickets
        from trac.ticket.model import Ticket
        for id in (1, 2, 3):
            ticket = Ticket(self.env)
            ticket['summary'] = 'Test ticket %i' % id
            ticket['description'] = 'Test ticket %i description' % id
            ticket.insert()
    def test_insert(self):
        ts = self.tag_engine.tagspace
        for tagspace, target, tags in self._populate_tags(ts):
            found_tags = tagspace.get_tags([target])
            self.assertEqual(found_tags, set(tags))  
              
    def test_wiki_tagspace(self):
        
        self.assertEqual(self.wiki_tag_rpc_engine.namespace, 'wiki')
        
    def test_ticket_tagspace(self):
        
        self.assertEqual(self.ticket_tag_rpc_engine.namespace, 'ticket')
        
    def test_wiki_xmlrpc_methods(self):
        self.failUnless(set(self.wiki_tag_rpc_engine.xmlrpc_methods()) != None, "No xmlrpc methods for wiki namespace")
 
    def test_ticket_xmlrpc_methods(self):
        self.failUnless(set(self.ticket_tag_rpc_engine.xmlrpc_methods()) != None, "No xmlrpc methods for ticket namespace")
        
    def test_wiki_xmlrpc_namespace(self):
        self.assertEqual(self.wiki_tag_rpc_engine.xmlrpc_namespace(), "tags.wiki")
        
    def test_ticket_xmlrpc_namespace(self):
        self.assertEqual(self.ticket_tag_rpc_engine.xmlrpc_namespace(), "tags.ticket")  
        
    def test_wiki_get_name_tags (self):
        wiki_start_tags = self.wiki_tag_rpc_engine.getTags(self.req,"WikiStart")
        self.failUnless( wiki_start_tags!= None, "Can not find any tags for mock page WikiStart")
        
        
    def test_xmlrpc_listMethods(self):
        for method in self.xml_rpc_system.all_methods(self.req):
                namespace = method.namespace.replace('.', '_')
                namespaces = {}
                if namespace not in namespaces:
                    namespaces[namespace] = {
                        'description' : wiki_to_oneliner(method.namespace_description, self.env),
                        'methods' : [],
                        'namespace' : method.namespace,
                        }
                try:
                    namespaces[namespace]['methods'].append((method.signature, wiki_to_oneliner(method.description, self.env), method.permission))
                except Exception, e:
                    self.fail('%s: %s\n' % (method.name, str(e)))