.. meta::
:description:
Critical documentation for upgrading the Roundup Issue
Tracker. Actions that must be taken when upgrading from
one version to another are documented here.
.. index:: Upgrading
======================================
Upgrading to newer versions of Roundup
======================================
Please read each section carefully and edit the files in your tracker home
accordingly. Note that there is information about upgrade procedures in the
`administration guide`_ in the `Software Upgrade`_ section.
If a specific version transition isn't mentioned here (e.g. 0.6.7 to
0.6.8) then you don't need to do anything. If you're upgrading from
0.5.6 to 0.6.8 though, you'll need to apply the "0.5 to 0.6" and
"0.6.x to 0.6.3" steps.
General steps:
1. Make note of your current Roundup version.
2. Take your Roundup installation offline (web, email,
cron scripts, roundup-admin etc.)
3. Backup your Roundup instance
4. Install the new version of Roundup (preferably in a new virtual
environment)
5. Make version specific changes as described below for
each version transition. If you are starting at 1.5.0
and installing to 2.3.0, you need to make the changes for **all**
versions starting at 1.5 and ending at 2.3. E.G.
1.5.0 -> 1.5.1, 1.5.1 -> 1.6.0, ..., 2.1.0 -> 2.2.0,
2.2.0 -> 2.3.0.
6. Run ``roundup-admin -i migrate`` using
the newer version of Roundup for the instance you are
upgrading. This will update the database if it is
required.
7. Bring your Roundup instance back online
8. Test
Repeat for each tracker instance.
.. note::
The v1.5.x releases of Roundup were the last to support
Python v2.5 and v2.6. Starting with the v1.6 releases of Roundup
Python version 2.7 that is newer than 2.7.2 is required to run
Roundup. Starting with Roundup version 2.0.0 we also support Python 3
versions newer than 3.6. Roundup version 2.5 supports Python
3.7 and newer.
Recent release notes have the following labels:
* **required** - Roundup will not work properly if these steps are not done
* **recommended** - Roundup will still work, but these steps can cause
security or stability issues if not done.
* **optional** - new features or changes to existing features you might
want to use
* **info** - important possibly visible changes in how things operate
If you use virtual environments for your installation, you
can run trackers with different versions of Roundup. So you
can have one tracker using version 2.2.0 and another tracker
using version 1.6.1. This allows you to upgrade trackers one
at a time rather than having to upgrade all your trackers at
once. Note that downgrading may require restoring your
database to an earlier version, so make sure you backed up
your database.
.. note::
This file only includes versions released in the last 10
years. If you are upgrading from an older version, start with the
changes in the `historical migration `_
document.
.. admonition:: Python 2 Support
If you are running Roundup under Python 2, you should make plans to
switch to Python 3. Release 2.4.0 (Jul 2024) is the last release to
officially support Python 2. The next non-patch release scheduled
for 2025 will mark 5 years since Roundup supported Python 3.
.. admonition:: XHTML Support Deprecation Notice
If you are running a tracker where the ``html_version`` setting in
``config.ini`` is ``xhtml``, you should plan to change your
templates to use html (HTML5). If you are affected by this, please
send email to the roundup-users mailing list (roundup-users at
lists.sourceforge.net). Version 2.3.0 is the last version to support
XHTML.
.. raw:: html
Contents:
.. contents::
:local:
.. raw:: html
.. index:: Upgrading; 2.4.0 to 2.5.0
Migrating from 2.4.0 to 2.5.0
=============================
.. _CVE-2025-53865:
XSS security issue with devel and responsive templates (recommended)
--------------------------------------------------------------------
There are actually two different issues under this heading.
1. incorrect use of the ``structure`` keyword with
``tal:content``
2. use of ``tal:replace`` on unsafe input
See the `security page for a link to CVE-2025-53865
`_.
In the discussion below, the :term:`html directory` means one or
more directories listed in the ``templates`` key of your
tracker's ``config.ini`` file.
These directions can be used to solve the XSS security issue with
any version of Roundup. Even if you used a classic or minimal
template, you should check your trackers for these issues. The
classic template fixed most of these many years ago, but the
updates were not made to the devel and responsive templates. No
report of similar issues with the jinja template has been seen.
Incorrect use of structure in templates
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The devel and responsive templates prior to Roundup 2.5 used this
construct::
tal:content="structure context/MUMBLE/plain"
Where ``MUMBLE`` is a property of your issues (e.g. title).
This construct allows a URL with a carefully crafted query
parameter to execute arbitrary JavaScript.
You should check all your trackers. The classic template has not
used this construct since at least 2009, but your tracker's
templates may use the offending construct anyway.
This fix will apply if your tracker is based on the responsive or
devel template. Check the TEMPLATE-INFO.txt file in your tracker
home. The template name is the first component of the ``Name``
field. For example a Name like::
Name: responsive-bugtracker
Name: devel-bugtracker
shows that tracker is based on the responsive or devel templates.
.. _cve-2025-53865-fixed:
To fix this, remove the ``structure`` declaration when it is used
with a plain representation. So fixing the code by replacing the
example above with::
tal:content="context/MUMBLE/plain"
prevents the attack.
To check for this issue, search for ``structure`` followed by
``/plain`` in all your html templates. If you are on a Linux/Unix
system you can search the html subdirectory of your tracker with
the following::
grep 'structure.*/plain' *.html
which should return any lines with issues.
.. warning::
Backup the files in the ``html`` subdirectory of your tracker
in case an edit goes wrong.
As an example, you could fix this issue using the GNU sed
command::
sed -i.bak -e '/structure.*\/plain/s/structure.//' *.html
to edit the files in place and remove the structure keyword. It
will create a ``.bak`` file with the original contents of the
file. If your templates were changed, this might still miss some
entries. If you are on windows, some text editors support search
and replace using a regular expression.
If the construct is split across lines::
tal:content="structure
context/MUMBLE/plain"
the commands above will miss the construct. So you should also
search the html files using ``grep /plain *.html`` and verify
that all of the ``context/MUMBLE/plain`` include ``tal:content``
as in the `fixed example above <#cve-2025-53865-fixed>`_. Any
lines that have ``context/MUMBLE/plain`` without ``tal:content=``
before it need to be manually verified/fixed.
The distributed devel and responsive templates do not split the
construct across lines, but if you changed the files it may be
split.
tal:replace used with unsafe input
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The problem was caused by the following markup::
in the head of the ``bug.item.html``, ``task.item.html`` and
other files in the devel and responsive templates.
This was fixed many years ago in the classic template's
``index.item.html``. The classic template replaces the above
construct with::
``tal:content`` explicitly escapes the result unless the
``structure`` directive is used. ``tal:replace`` expects the
result to be safe and usable in an HTML context.
TAL drops any tags that it doesn't know about from the output.
```` results in the value of the
content expression without a surrounding html tag. (Effectively
replacing the construct.)
The following diff for ``bug.item.html`` in the devel template
shows the change to make things safe (remove lines starting with
``-`` and add lines staring with ``+``)::
Bug : - Bug : -
New Bug report - username
to::
username
The code audit found the ``tal:replace`` construct is used with
``context/id`` and ``context/designator`` paths. The references
to these paths have been changed to use ``tal:x`` in the classic
template's ``msg.item.html`` file and the classic and minimal
template's ``_generic.collision.html`` file.
These paths are critical to navigation in Roundup and are set
from the path part of the URL. Roundup's URL path validation
makes it unlikely that an attacker could exploit them. If you
wish you can change your templates or copy the corresponding
files from the template if you haven't made local changes.
Also you may have used copies of these insecure templates
elsewhere in your tracker (e.g. to create a feature class). To
find other possible issues you can use the command::
grep -r "tal:replace=" *.html
in your tracker's :term:`html directory`. Check each occurrence
and if needed, change it to the safer form. You should consider
any reference to ``context`` to be under the user's (attacker's)
control. Also ``db`` (excluding ``db/config``) and ``request``
references that use user supplied content
(e.g. ``request/user/username`` above) should be changed to
``tal:x`` form
.. comment:
As part of the analysis, the following command was used to find
potentially vulnerable stuff in the templates. Each grep -v was
removed to display items in that category and they were checked::
grep -r 'tal:replace' . | grep -v 'replace="batch' | \
grep -v 'replace="config' | grep -v 'replace="db/config' | \
grep -v 'replace="structure' | grep -v 'replace="python:' | \
grep -v 'replace="request/'
context/id, context/designator:
assume safe if used in an class.item.html page as the page
wouldn't be shown if they weren't valid numbers/designators.
Might not be ok referenced in a _generic fallback page though.
config, db/config, batch, nothing:
should be safe as they are not under user control
request/classname (python:request._classname), request/template:
should be safe as they are needed to navigate to a display page,
so if they are invalid nothing will be displayed.
utils, python:
assume it's written correctly and is safe (could use some new
tests for the shipped utility functions). The intent of these
can be to deliver blocks of
or get the file in a separate download using a regular script
tag::
You can place these at the end of ``page.html`` just before the
close body ``