Version 100 (modified by olemis, 3 years ago) (diff)

XmlRpcPlugin : List issues related to attached Java client lib

Trac XML-RPC Plugin

Remote Procedure Call plugin for Trac 0.10 (not actively maintained) and 0.11/0.12/1.0/++ (trunk).


This plugin allows Trac plugins to export select parts of their interface via XML-RPC and JSON-RPC (if json or simplejson is available). Latest trunk version includes a pluggable API for extending protocols, and see for instance TracRpcProtocolsPlugin for more protocols.

The browsable XML-RPC URI suffix is /rpc, but most XML-RPC clients should use the authenticated URL suffix /login/rpc as this with provide authenticated requests through Trac.

The XML_RPC permission is used to grant users access to using the RPC interface. If you do want to use /rpc and unauthenticated access, you must grant the XML_RPC permission to the 'anonymous' user.

Method status:

  • Ticket API is also complete, with the following types exported: component, version, milestone, type, status, resolution, priority and severity.
  • WikiRPC API is complete, mostly thanks to mgood.

Protocol and method documentation for the latest version of the plugin can be found here.


Outstanding tasks are roadmap, timeline, user management (e.g. get a (filtered) user list to assign a task in mylyn), plugin management (?) probably more.


This plugin requires at least Trac 0.10, but Trac 0.11 or 0.12 is recommended. Install in the same manner as any other Trac plugin:

$ python bdist_egg 
$ cp dist/*.egg /srv/trac/env/plugins 

or if you want it to be installed for all Trac environments (same command can be run later to refresh installation):

$ easy_install -Z -U # 0.11/0.12/1.0/++
$ #or
$ easy_install -Z -U # 0.10
$ # or
$ easy_install -Z -U /path/to/unpacked/download/version 

You will also need to enable the plugin in your environments trac.ini:

tracrpc.* = enabled 

Bugs/Feature Requests

Existing bugs and feature requests for XmlRpcPlugin are here. If you have any issues, create a new ticket.


Problems when AccountManagerPlugin is enabled

If you have the AccountManagerPlugin enabled and you followed their advice/example to disable the standard login module with

trac.web.auth.LoginModule = disabled 

the /login/xmlrpc URL for authorized access will not work as expected. Every access will look like anonymous access. You can use the HttpAuthPlugin to correct this.

The recommended approach to make it work is to add the following configuration in TracIni

environ_auth_overwrite = false

Problems with Digest HTTP authentication

The xmlrpclib.ServerProxy client - as demonstrated in the following examples - will not work with a Digest-based HTTP authentication: you need to set up a Basic HTTP authentication on server side to make the examples work.

If you use the standalone Trac daemon, this means that you cannot use the tracd -a option (htdigest authentication file). Use trac --basic-auth (htpasswd authentication file) instead.

Problems with mod_python, Apache, python 2.4

XmlRpcPlugin might not work with Apache and python 2.4 as explained in TracInstall. Use python 2.5 if you want to run Trac with mod_python.

Download and Source

Download the [download:xmlrpcplugin zipped source], check out the source using Subversion or browse the source with Trac.

Experimental features and work in progress can be found at a patches repository hosted by Bitbucket. Work in progress is developed using Mercurial Queues.

For enhanced compatibility with Apache™ Bloodhound?>=0.6 download BloodhoundRPC fork from this repository and check out bloodhound_rpc branch.


NOTE: The xmlrpclib module has been renamed to xmlrpc.client in Python 3.0.

See for further information.

Python End-User Usage

Obtain and print a list of XML-RPC exported functions available to my user:

import xmlrpclib 
server = xmlrpclib.ServerProxy("http://athomas:password@localhost/trac-dev/login/xmlrpc") 
for method in server.system.listMethods(): 
  print method 
  print '\n'.join(['  ' + x for x in server.system.methodHelp(method).split('\n')]) 

The same example using system.multicall(). This reduces network and server load by compacting all of the system.methodHelp() calls into one HTTP POST.

import xmlrpclib 
server = xmlrpclib.ServerProxy("http://athomas:password@localhost/trac/devel/login/xmlrpc") 
multicall = xmlrpclib.MultiCall(server) 
for method in server.system.listMethods(): 
for help in multicall(): 
    lines = help.splitlines() 
    print lines[0] 
    print '\n'.join(['  ' + x for x in lines[2:]]) 

List all tickets that are owned by athomas, using the XML-RPC multicall system to issue multiple RPC calls with one HTTP request:

import xmlrpclib 
server = xmlrpclib.ServerProxy("http://athomas:password@localhost/trac/devel/login/xmlrpc") 
multicall = xmlrpclib.MultiCall(server) 
for ticket in server.ticket.query("owner=athomas"): 
print map(str, multicall()) 

Access the Wiki with WikiRPC

import xmlrpclib 
server = xmlrpclib.ServerProxy("http://athomas:password@localhost/trac-dev/login/xmlrpc") 
# print the content of WikiStart 
# print WikiStart as HTML 
# write to the SandBox page from a text file 
sandbox_content = file("sandbox.txt").read()"SandBox", sandbox_content, {"comment": "testing the WikiRPC interface"}) 

Add an attachment to WikiStart:

import xmlrpclib 
server = xmlrpclib.ServerProxy("http://athomas:password@localhost:8080/trunk/login/xmlrpc")'WikiStart/', xmlrpclib.Binary(open('').read())) 

Using Digest Authentication in python

One can use digest authentication if you know the realm that you're connecting to. This shows up in the login box "server says '<realm'".

class HTTPSDigestTransport(xmlrpclib.SafeTransport):
    Transport that uses urllib2 so that we can do Digest authentication.
    Based upon code at

    def __init__(self, username, pw, realm, verbose = None, use_datetime=0):
        self.__username = username
        self.__pw = pw
        self.__realm = realm
        self.verbose = verbose
        self._use_datetime = use_datetime

    def request(self, host, handler, request_body, verbose):
        import urllib2

        if verbose or self.verbose:
            print "ProxyTransport URL: [%s]"%url

        request = urllib2.Request(url)
        # Note: 'Host' and 'Content-Length' are added automatically
        request.add_header("User-Agent", self.user_agent)
        request.add_header("Content-Type", "text/xml") # Important

        # setup digest authentication
        authhandler = urllib2.HTTPDigestAuthHandler()
        authhandler.add_password(self.__realm, url, self.__username, self.__pw)
        opener = urllib2.build_opener(authhandler)


digestTransport = HTTPSDigestTransport("username", "password", "realm")
server = xmlrpclib.ServerProxy("https://host/login/xmlrpc", transport=digestTransport)

Using from C#

See XmlRpcPlugin/DotNet.

Using from Java

See this example zip file

Related issues

Examples of using Java
Problem with the api's library(int id, int when=0)

Using from Ruby

See XmlRpcPlugin/Ruby.

API Usage

See the source for details.


Accessing the RPC handler through a browser (at /rpc or /login/rpc) will provide the documentation of protocols and available methods.

Change Log

15032 by osimons on 2015-11-04 10:05:15
XmlRpcPlugin: Never try to update ticket 'time' and 'changetime' fields. Closes #12430.
14872 by osimons on 2015-08-12 14:41:00
XmlRpcPlugin: Removed unused macros.html include. Closes #12481.
14747 by osimons on 2015-06-25 22:21:55
XmlRpcPlugin: Bump version. Ref #12285 request.
14744 by osimons on 2015-06-25 11:46:46
XmlRpcPlugin: Formatting of 'owner' in ticket action controllers has changed.
14743 by osimons on 2015-06-25 11:46:44
XmlRpcPlugin: Support Trac 1.1+ database API. Closes #12285.


Authors and contributors: athomas, mgood, osimons, Olemis Lang
Maintainer: osimons

Attachments (2)

Download all attachments as: .zip