Version 84 (modified by sobersabre, 4 years ago) (diff)

updated the level of header to fit into the toc

Trac XML-RPC Plugin






Method status:

  • WikiRPC API is complete, mostly thanks to mgood.






# python bdist_egg 


$ easy_install -Z -U # 0.11+0.12
$ #or
$ easy_install -Z -U # 0.10
$ # or


tracrpc.* = enabled 

Bugs/Feature Requests



Problems when AccountManagerPlugin is enabled


trac.web.auth.LoginModule = disabled 


Problems with Digest HTTP authentication



Problems with mod_python, Apache, python 2.4


Download and Source




Python End-User Usage


import xmlrpclib 
for method in server.system.listMethods(): 
  print method 


import xmlrpclib 
multicall = xmlrpclib.MultiCall(server) 
for method in server.system.listMethods(): 
for help in multicall(): 
    lines = help.splitlines() 
    print lines[0] 


import xmlrpclib 
multicall = xmlrpclib.MultiCall(server) 
for ticket in server.ticket.query("owner=athomas"): 
print map(str, multicall()) 

Access the Wiki with WikiRPC

import xmlrpclib 
# print the content of WikiStart 
# print WikiStart as HTML 
# write to the SandBox page from a text file 

Add an attachment to WikiStart:

import xmlrpclib 

Using Digest Authentication in python


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

        self.__username = username
        self.__pw = pw
        self.__realm = realm
        self.verbose = verbose
        self._use_datetime = use_datetime

        import urllib2

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

        request = urllib2.Request(url)
        request.add_header("User-Agent", self.user_agent)

        # setup digest authentication
        authhandler = urllib2.HTTPDigestAuthHandler()
        opener = urllib2.build_opener(authhandler)



Using from C#

See DotNet.

Using from Java

See this example zip file

Using from Ruby

You can either use the XMLRPC functionality included in the Ruby Standard Library or download the trac4r library which does all the trivial stuff for you.

please refer to the SSL Support section if you need one.

trac4r Example

This example uses trac4r:

require 'trac4r/trac'
# initialize the connection (username and password can be ommitted if not needed, but most of the time you will need them if anonymous doesn't have XMLRPC permissions)
trac = "", "myusername", "mypassword"
# get a list of all tickets (as an array of numbers) :include_closed => true # this is the default anyway
# get all the tickets
# NOTE: the results here are cached, so you can call it as often as you want without producing traffic more than once.
# use ":cached_results => false" to get the latest version :include_closed => true
# get a single ticket
ticket = 5
# print the data
puts "Title: #{ticket.summary}"
puts "Description: #{ticket.description}"
puts "Milestone: #{ticket.milestone}"
puts "Status: #{ticket.status}"
puts "Type: #{ticket.type}"
puts "Priority: #{ticket.priority}"
# get a list of all wiki pages
# download one page "SomeRandomPageName" # HTML version "AnotherRandomPageName" # trac syntax version (e.g. for editing)
# for previews use "content of a page in [wiki:WikiFormatting Trac syntax] as a ''String''"
# to post a page use "NameOfThePage", "content in Trac syntax"
# list the attachments of a wiki page "NameOfThePage"
# save an attachment"my_cool_document","w") do |f|
  f.write "NameOfThePage", "my_cool_document.pdf"

# upload an attachment to the page above
page = "NameOfThePage"
fn = "my_nice_doc.pdf"
fh =, "rb")
sdata =
data =
result =, name, "uploaded via ruby script", data)
# the correct result should be the name of the file:
puts "ERROR: uploading #{name} didn't work properly!" if result != name

Also see the included Documentation in trac4r/doc

If you need to do a custom query do


The first argument is the method name, all other arguments are directly passed to XMLRPC. For this example of cause you could do trac.api_version instead ;)

If you have any problems with trac4r you can email me: niklas.cathor (eat) gmail dot com

xmlrpc Example

An example using XML-RPC directly with Ruby to append to a wiki page:

require 'xmlrpc/client'
user = "username"
password = "password"
page_name = "SandBoxRPC"
new_content = "\n\nMy new content"
new_comment = "Adding new content from ruby"

server = XMLRPC::Client.new2("https://#{user}:#{password}")
content ="wiki.getPage", page_name) + new_content"wiki.putPage", page_name, content, {"comment" => new_comment})

SSL Support + X509

The standard ruby xmlrpc client for some reason does not support SSL at all. In order to be able to use the XMLRPC over SSL with both

  • Client Certificate authentication
  • Basic Authentication

One must do as follows.

in order to proceed, you should have:

  • ca certificate in .pem format
  • personal certificate + RSA key in .p12 format (and its password, of course)
  • patched version of xmlrpc/client.rb
  • patched version of trac4r
  • username/password (for basic authentication)

Assuming you have the above, and your ca and user certificates are respectively:

The Instructions
  1. apply the patches:
    1. to the xmlrpc client
      sudo su -
      cd /usr/lib/ruby/1.8/
      patch -p0  < /path/to/xmlrpc-client.SSL.patch
    2. to the trac4r gem
      sudo su -
      cd /var/lib/gems/1.8/gems/
      patch -p0  < /path/to/trac4r-1.2.3.SSL.patch
  2. create a .yml file called ~/.trac/creds.yml of the following structure:
    tracurl: https://yourserver.yourdomain/yourproject
    tracuser: yourwebuser
    tracpass: yourwebpassword
    certkey: /home/youruser/.ssl/certkey.p12
    cacert: /home/youruser/.ssl/cacert.pem
    keypass: yourkeypassword
    • do not forget to chmod the personal files to 600 or 400
  3. use the data in the code
    require 'yaml'
    require 'openssl'
    require 'xmlrpc/client'
    require 'trac4r'
    ## read the data from yaml:
    $ymlname= "#{ENV['HOME']}/.trac/creds.yml"
    if !File.exists?($ymlname) 
        raise "Cannot open credentials file!"
        $vars = YAML::load_file($ymlname)
    rescue Exception => e
        raise "Cannot load credentials file #{$ymlname}: #{e.message}\nTrace: #{e.stacktrace}"
    ## extract the certificate, and the key from the fles.
    pkcs =$vars['certkey']),$vars['keypass'])
    cert = pkcs.cert
    key = pkcs.key
    ## connect to the server
    trac =$vars['tracurl'], $vars['tracuser'], $vars['tracpass'], $vars['cacert'], cert, key)
    ## from now you can refer to the connection as open (or query it)
    ## use the API as explained above.

NOTE: The working environment of the code (trac4r + ssl) is:

  • Debian/GNU system: Linux hostname 2.6.26-2-686 #1 SMP Mon Jun 21 05:58:44 UTC 2010 i686 GNU/Linux
  • OpenSSL: OpenSSL 0.9.8g 19 Oct 2007
  • Ruby: ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]
  • The certificates have been issued by the above OpenSSL setup.

API Usage

See the source for details.


If the HTTP request to this URI is not XML, the XmlRpcPlugin will list all exported functions that the current user has permission to use.

Change Log

[13776] by osimons on 2014-03-19 00:06:29
XmlRpcPlugin: Tweak [13728] fix again to let carriage return pass through. Closes #11050 again. Also closes #11635.

Thanks Jun.


Thanks olemis.

XmlRpcPlugin: Added a test for ticket.type.getAll.



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

Attachments (2)

Download all attachments as: .zip