diff doc/announcement.txt @ 8328:3bf6ad421347 2.5.0b1

chore: update files for release 2.5.0b1.
author John Rouillard <rouilj@ieee.org>
date Wed, 11 Jun 2025 17:04:51 -0400
parents 3614cd64f4c4
children 2ed6fb7081c6
line wrap: on
line diff
--- a/doc/announcement.txt	Wed Jun 11 16:19:00 2025 -0400
+++ b/doc/announcement.txt	Wed Jun 11 17:04:51 2025 -0400
@@ -1,15 +1,13 @@
-I'm proud to release version 2.4.0 of the Roundup issue
+I'm proud to release version 2.5.0b1 of the Roundup issue
 tracker.  This release is a bugfix and feature release, so
 make sure to read `docs/upgrading.txt
 <https://www.roundup-tracker.org/docs/upgrading.html>`_ to
 bring your tracker up to date.
 
-The 79 changes, as usual, include some new features and many
+The 41 changes, as usual, include some new features and many
 bug fixes.
 
-Version 2.4.0 will be the last release to support Python
-2. The next minor release, planned for mid 2025, will occur
-5 years after Roundup started supporting Python 3.
+Version 2.5.0b1 does not support Python 2.
 
 Note that you should run ``roundup-admin ... migrate`` to
 update the database schema version. Do this before you use
@@ -26,73 +24,54 @@
 
 then unpack and test/install from the tarball.
 
-Among the notable improvements in 2.4.0 from the 2.3.0
+Among the notable improvements in 2.5.0 from the 2.4.0
 release are:
 
-* three CVE's have been fixed. One requires changes to your
-  tracker's home directory. The other two are fixed by
-  installing 2.4.0.  See
-  https://www.roundup-tracker.org/docs/security.html for
-  details and instructions on how to fix these in 2.4.0 and
-  earlier releases.
+* detect more errors in RPN search expressions. Return more
+  useful error messages. Documented (advanced) RPN search expressions
+  in the user guide.
 
-* new classhelper component thanks to a team of students
-  from CS682 at U-Mass Boston. This fixes many issues with
-  the old classhelper. It is implemented as a web-component
-  and needs REST interface access. It will fall back to the
-  classic classhelper if REST is not available or if the
-  browser does not support web-components.
+* change default password hash method to PBKDF2 with SHA512. You
+  may need to reset password_pbkdf2_default_rounds to a lower
+  value. See upgrading doc.
 
-* fix Windows Python installation using pip. It used to go
-  into an infinite loop during install or download. Also fix
-  installation of shared files (templates) so roundup-admin
-  can find them.
+* add filter function to Permission objects. This pushes some
+  permission checks down to the SQL database and speeds up display of
+  index pages.
+
+* fix crash bug on windows with Python 3.13
 
-* using ``@current_user`` as a value in a search URL for a
-  user property will use the current logged in user. Now you
-  can share searches like: "My issues" as "my" will become
-  the current logged in user.
+* update doc on required REST headers. Also other docs updates.
 
-* login failures to the REST/XML-RPC interfaces are now rate
-  limited to limit password guessing attacks.
+* detect error condition early when we can't respond with requested
+  REST format response (e.g. xml is requested).
 
-* utf8mb4 is the default charset for MySQL. This requires
-  migrating your database using the mysql client. You can
-  choose to keep the older character set in config.ini.
+* do not generate an error if a PUT REST request sets the user's
+  address to the current value.
 
-* PostgreSQL services defined in pg_service.conf can be
-  used.  PostgreSQL schemas are supported to eliminate the
-  need for the roundup user to have database
-  creation/deletion privileges.
-
-* fix out of memory issue when importing larger trackers
-  into PostgreSQL.
+* make ``roundup-gettext`` extract translatable strings from detectors
+  and extensions.
 
-* multiple roundup-admin improvements: display protected
-  properties (like creation date), better formatting of
-  output, command history. Also on windows, pyreadline3 is
-  supported to provide an editable interactive command line.
+* improve security of session cookies by marking them with the magic
+  ``__Secure__`` prefix.
 
-* an experimental wsgi performance improvement in 2.3.0 is
-  now now the default and is opt-out.
+* make the rest endpoint return raw message or file content data. Use
+  the ``binary_content`` endpoint and a suitable ``Accept``` header in
+  the request.
 
-* new template functions: utils.readfile and
-  utils.expandfile. Javascript that is included in the
-  Python core will be moved to external files and be able to
-  have values from Roundup substituted in the Javascript.
+* add support for the ``defusedxml`` Python module to improve security when
+  using XML.
 
-* allow content-type of a template to be set from inside the
-  template.  This allows returning json or xml from a
-  template without a .json or .xml extention.
+* add templating function: ``utils.set_http_response(integer)`` to set
+  HTTP return code from your template.
 
-* fix import/export on windows to use Unix style line
-  endings fixing export/import on Windows and making exports
-  portable across platforms.
+* add generation of native HTML date and number/integer inputs. See
+  Upgrading for caveats this is disabled by default.
 
-* various other Windows platform fixes including test suite
-  fixes.
+* re-enable support for GPG/PGP signed emails. Requires installing
+  from the test PyPi repository.
 
-* sqlite version 1 and StructuredText support removed.
+* remove XHTML support simplifying the code base
 
 The file CHANGES.txt has a detailed list of feature
 additions and bug fixes for each release. The most recent
@@ -182,270 +161,146 @@
 Recent Changes
 ==============
 
-From 2.3.0 to 2.4.0
+From 2.4.0 to 2.5.0
 
 Fixed:
 
-- CVE-2024-39124 - The classhelpers (_generic.help.html) are
-  vulnerable to an XSS attack. A specially crafted URL that used
-  that endpoint would result in running a script embedded in the
-  URL. (Found/reported by Alec Romano (4rdr), fix/tests John
-  Rouillard)
-- CVE-2024-39125 - If the Referer header is set to a script tag,
-  it will be executed when the error in the Referer header is
-  reported. (Found/reported by Alec Romano (4rdr), fix/tests John
-  Rouillard)
-- CVE-2024-39126 - PDF, XML and SVG files attached to an issue can contain
-  embedded JavaScript. This JavaScript was executed when the file was
-  accessed. PDF files are now downloaded and not displayed in the
-  browser. A content security policy is added for all download files
-  which prevents code execution in SVG files.  (Found/reported by Alec
-  Romano (4rdr), fix/tests John Rouillard)
-- issue2551282 - MySQL utf8mb4 issues and
-  issue2551115 - Use utf8mb4 as a default for MySQL instead of utf8
-  The default database type and collations have been set to:
-  utf8mb4, utf8mb4_unicode_ci and utf8mb4_0900_bin. They are (sadly)
-  configurable from config.ini. Require directions on upgrading the
-  MySQL db have been documented in upgrading.txt.
-- issue2551063 - Rest/Xmlrpc interfaces needs failed login protection.
-  Failed API login rate limiting with expiring lockout added. (John
-  Rouillard)
-- issue2551184 - improve i18n handling. Patch to test to make sure it
-  uses the test tracker's locale files and not other locale
-  files. (Marcus Priesch)
-- issue2551283 - fail if version 2.4.9 of markdown2 is used, it broke
-  [issue1](issue1) style links. Support markdown2 2.4.8 and earlier
-  and 2.4.10 with its new schema filtering method. (John Rouillard)
-- multiple flake8 fixes (John Rouillard)
-- rename loop variable in 'for sendto in sendto:' (John Rouillard)
-- issue2551193 - Fix roundup for removal of cgi and cgitb standard
-  python modules (and FieldStorage/MiniFieldStorage). Replaced imports
-  from cgi to use roundup.anypy.cgi\_ which will load the system cgi
-  unless it is missing. Then it will load roundup.anypy.vendored.cgi
-  and make \*FieldStorage symbols available. Roundup uses its own
-  cgitb.py and not the system cgitb.py. It looks like it's the
-  precursor to the system cgitb.py. (John Rouillard)
-- issue2551278 - datetime.datetime.utcnow deprecation. Replace
-  calls with equivalent that produces timezone aware dates rather than
-  naive dates. (John Rouillard)
-- when using "roundup-admin display" indent the listing only if
-  headers or protected fields are requested. This makes the output
-  look like it did previously to 2.3.0 if the new features aren't
-  used.  Roundup-admin output was never meant to be machine parsed, but
-  don't break it unless required. (John Rouillard)
-- issue2551290 - pip install roundup Hangs on Windows 10
-  The install under windows goes into an infinite loop using pip or
-  source install. (John Rouillard)
-- Document use of pyreadline3 to allow roundup-admin to have CLI editing
-  on windows. (John Rouillard)
-- issue2551293 - remove schema_hook from Tracker instance. Looks like
-  it was an obsolete hook used for testing. Never documented and not
-  accessible from schema.py.
-- Fix roundup-admin security command. Lowercase its optional
-  argument. Roles are indexed by lower case role name. So 'security
-  User' and 'security user' should generate the same output. (John
-  Rouillard from issue on mailing list by Chuck Cunningham)
-- make roundup-server exit more quickly on ^C. This seems to be
-  limited to windows. (John Rouillard)
-- Fix error handling so failure during import of a non-user item
-  doesn't cause a second traceback. (Found by Norbert Schlemmer, fix
-  John Rouillard)
-- Handle out of memory error when importing large trackers in
-  PostgreSQL. (Found by Norbert Schlemmer, extensive testing by
-  Norbert, fix John Rouillard)
-- use unittest.mock rather than mock for
-  test/test_hyperdbvals.py. (found by Ralf Schlatterbeck. Fix John
-  Rouillard)
-- disable proxy with wget in roundup_healthcheck. (Norbert Schlemmer
-  Noschvie on github.com)
-- support dicttoxml2.py for Roundup running on 3.7 and
-  newer. dicttoxml uses a type alias: collection.Iterator that is
-  dropped in Python 3.10. (found by Norbert Schlemmer, fix John
+- issue2551343 - Remove support for PySQLite. It is unmaintained
+  and sqlite3 is used which is the default for a Python
+  distribution.  (John Rouillard)
+- replace use of os.listdir with os.scandir. Performance
+  improvement.  Using with Python 2 requires 'pip install
+  scandir'. (John Rouillard)
+- issue2551131 - Return accept-patch if patch body not accepted
+  (415 code). Accept-Patch returned with acceptable values. (John
   Rouillard)
-- fix duplicate html id 'password' in user.item.html in all templates except
-  jinja2. (John Rouillard)
-- fix unclosed file when saving index in indexer_dbm.py. (John Rouillard)
-- fix task index in devel tracker so it doesn't cause a crash if all
-  fields are selected. (John Rouillard)
-- fix windows install. When using pip share directory is installed in
-  a directory tree under the lib directory. Fix it so that Lib/share
-  is used to install the share tree. The lets Roundup find tracker
-  templates and translation files. (Found by Simon Eigeldinger, fix
-  John Rouillard)
-- fix roundup-demo, interactive mode would nuke an existing tracker.
-  (Found Tonu Mikk, fix John Rouillard)
-- fix detection/reporting when using a SQLite3 library without FTS5
-  support. Install docs updated to state that FTS5 support is required
-  when using SQLite for back end. (Found Tonu Mikk, fix John
+- issue2551074 - In "responsive" template: click on hide comment leads
+  to a red error msg. (Report by Ludwig Reiter; fix John Rouillard)
+- issue2550698 - added documentation on filtering using RPN property
+  expressions. (John Rouillard)
+- issue2551372 - Better document necessary headers for REST and fix
+  logging to log missing Origin header (Ralf Schlatterbeck with
+  suggestions on documentation by John Rouillard)
+- issue2551289 - Invalid REST Accept header with post/put performs
+  change before returning 406. Error before making any changes to the
+  db if we can't respond with requested format. (John Rouillard)
+- issue2551356 - Add etag header when If-Modified-Since GET request
+  returns not-modified (304). Breaking change to function signature
+  for client.py-Client::_serve_file(). (John Rouillard)
+- issue2551381 - roundup-server parses URI's with multiple '?"
+  incorrectly. (John Rouillard)
+- issue2551382 - invalid @verbose, @page_* values in rest uri's
+  generate 409 not 400 error. (John Rouillard)
+- fix issues with rest doc and use of PUT on a property item. Response
+  is similar to use of PUT on the item, not a GET on the
+  item. Discovered while fuzz testing. (John Rouillard)
+- issue2551383 - Setting same address via REST PUT command results in
+  an error. Now the userauditor does not trigger an error if a user
+  sets the primary address to the existing value. (John Rouillard)
+- issue2551253 - Modify password PBKDF2 method to use SHA512. The
+  default password hashing algorithm has been upgraded to
+  PBKDF2-SHA512 from PBKDF2-SHA1. The default pbkdf2 rounds in the
+  config file has been changed to 250000. The admin should change it
+  manually if it is at 2 million. PBKDF2-SHA512 (PBKDF2S5) has been
+  available since release 2.3, but it required a manual step to make
+  it the default. (John Rouillard)
+- fixed a crash with roundup-admin perftest password when rounds not set
+  on command line. (John Rouillard)
+- issue2551374 - Add error handling for filter expressions. Filter
+  expression errors are now reported. (John Rouillard)
+- issue2551384: Modify flow in client.py's REST handler to verify
+  authorization earlier. The validation order for REST requests
+  has been changed. Checking user authorization to use the REST
+  interface is done before validating the Origin header. As a
+  result, incorrectly formatted CORS preflight requests
+  (e.g. missing Origin header) can now return HTTP status 403 as
+  well as status 400. (John Rouillard)
+- issue2551387 - TypeError: not indexable. Fix crash due to
+  uninitialized list element on a (Mini)FieldStorage when unexpected
+  input is posted via wsgi. (Reported and debugged by Christof
+  Meerwald; fix John Rouillard)
+- close http socket and send a 408 status when a timeout exception
+  is handed in roundup-server. This prevents another exception
+  caused by using a timed out socket. (John Rouillard)
+- issue2551391, partial fix for issue1513369. input fields were
+  not getting id's assigned. Fixed automatic id assignment to
+  input fields. Thinko in the code. (John Rouillard)
+- issue1895197 - translated help texts in admin.py not displayed
+  correctly. (Initial patch tobias-herp, John Rouillard)
+- issue2551238 - roundup-server should exit with error if -d
+  <pidfile> is used without -l <logfile>. Added code to report
+  the issue. Added issue with relative paths for log file whn
+  using -L and -d with roundup-server. (John Rouillard)
+- Allow the specification of a "form" parameter for Date fields to make
+  the popup calendar work when the enclosing form has a name different
+  from "itemSynopsis". (Ralf Schlatterbeck)
+- issue2551376: Fix tracebacks in item templates (Ralf Schlatterbeck)
+- issue2551396: Use of os.path.stat.ST_MTIME in python 3.13 crashes
+  roundup on windows. Replaced with equivalent stat.ST_MTIME. (Randy
+  on IRC, fix: John Rouillard and R. David Murray (bitdancer))
+- issue2551323: remove functions used for XHTML template
+  support. XHTML was deprecated in Roundup 2.3.0 and an invalid value
+  in 2.4.0. (John Rouillard)
+- issue2551406: 'Templating Error: too many values to unpack' crash
+  fixed. (reported by and patch Christof Meerwald, commit/test John
   Rouillard)
-- issue2551320: user.help-search.html doesn't respect
-  properties. Setting url parameter properties when using the
-  classhelp for users now shows the requested properties. (Found by
-  Patel Malav and Nikunj Thakkar of the UMass-Boston CS682 Spring
-  2024 class; fix John Rouillard)
-- use ast.eval_literal() rather than eval() to turn CSV exported
-  string values into Python object/values.
-- use template's guess at Content-Type in headers only if Content-Type
-  is not already set. This allows a template to set its own content
-  type. For example: _generic.translate can set content type (via
-  request.client.additional_headers) to application/json and return
-  json from the template. This json could access the 1i18n functions
-  for a javascript helper. (John Rouillard)
-- when template processing raises an exception the line number is
-  sometimes missing. This causes cgitb to raise a second exception
-  which clobbers the info about the template issue. As a stop-gap set
-  the line number to -1 so the original traceback can be seen. This
-  could be a bug in ZopeTAL. (John Rouillard)
-- issue2551328 - REST results show next link if number of results is a
-  multiple of page size. There should be no next link. (Found by Patel
-  Malav and Bharath Kanama of the UMass-Boston CS682 Spring 2024
-  class; fix John Rouillard)
-- issue2551264 - REST X-Total-Count header and @total_size count
-  incorrect when paginated - correct values are now returned.
-  (John Rouillard)
-- issue2551331 - Fix repeat first/last methods. (John Rouillard)
-- Fix import/export on windows. Use unix line terminating characters.
-  (John Rouillard)
-- Fix anydbm session/otks clear() method on windows when backed by
-  dumbdbm. Also make anydbm detect the initialized database when
-  using dumbdbm. (John Rouillard)
-- Use of '-' directory in static_files config option under windows
-  Python fixed. (John Rouillard)
-- issue2551334 - number of test bugs that prevented test suite from
-  running under Windows Python are fixed. WIP. (John Rouillard)
-- issue2551302 - Remove support for sqlite version 1 from
-  back_sqlite.py. We have been using sqlite3 for over a decade. (John
-  Rouillard)
-- issue2551285 - Remove StructuredText support. reStructuredText is
-  still supported. (John Rouillard)
-- Use roundup-demo -p option to set listening port. Was ignored
-  before. (John Rouillard)
-- issue2551346 - Classic tracker's statusauditor raises error if
-  detectors/config.ini missing
-  STATUSAUDITOR_CHATTING_REQUIRES_TWO_USERS.  The statusauditor.py for
-  jinja2 and classic templates has been changed to assume that this
-  option is off when the setting is missing from
-  detectors/config.ini. Other templates do not implement this option.
-  (John Rouillard)
-- issue2551350 - Python changes for 3.12 with roundup 2.3.0. Fixes for
-  cgitb.py crash due to pydoc.html.header() signature change. (Patch
-  by Andrew (kragacles), applied John Rouillard)
-- issue2551350 - Python changes for 3.12 with roundup 2.3.0. Fixes for
-  mailer.py crash due to change in starttls signature change. (Patch
-  by Andrew (kragacles), modified and applied John Rouillard)
-- make classhelper link open in a new window by setting
-  target="_blank". This prevents overwriting of current page with the
-  classhelper if javascript is disabled. (John Rouillard)
-- issue2551341 - if @columns missing from an index url, the
-  group headers colspan property = 0. Add "or 100" in
-  stanza's so headers span all rows (up to 100).
-- fix roundup-server response requiring a 301 redirect. Did
-  not set content length leading to hang/error. (John
-  Rouillard)
-- report basename of filename when template file is invalid
-  rather than reporting a TypeError. (John Rouillard)
-- Make Last-Modified header use GMT not -0000 timezone. Fix error
-  reported by redbot testing. (John Rouillard)
-- Send Vary: Accept-Encoding on any file that could be compressed
-  even if the file is not encoded/compressed. Found by Redbot
-  testing. (John Rouillard)
-- make If-None-Match work for static file (@@file) case. Found by
-  Redbot testing (John Rouillard)
-- Send vary: accept-encoding for if-modified-since conditional
-  requests where the file is not modified. (John Rouillard)
-- Update JWT example in rest.py to use replacement for
-  datetime.datetime.utcnow(). (John Rouillard)
-- issue2551219 - document requirements of PEM file when using
-  roundup-server in SSL/TLS mode. Report better error messages
-  when PEM file is missing certificate or private key. (John
-  Rouillard)
-- Cleanup tracker index generation by roundup-server. Send
-  correct Content-Length headers so HTTP/1.1 connections don't
-  hang. (John Rouillard)
-- Fix delay when using csv export actions. The CSV file is written
-  incrementally, so we can't determine the Content-Length. When using
-  HTTP/1.1, this causes a delay while the browser waits for a timeout.
-  Forcing the connection to close after the CSV file is written
-  removes the delay. (John Rouillard)
+- fix potential HTTP Response Splitting issue in
+  roundup-server. Discovered by CodeQL in CI. (John Rouillard)
 
 Features:
 
-- issue2551323 - Remove XHTML support. Disabled option to set
-  html_version to xhtml. Running roundup commands with html_version
-  set to xhtml will result in an "Invalid value for HTML_VERSION:
-  'xhtml'" error. (John Rouillard)
-- issue2551103 - add pragma 'display_protected' to roundup-admin. If
-  true, print protected attributes like id, activity, actor...
-  when using display or specification subcommands. (John Rouillard)
-- add -P pragma=value command line option to roundup-admin. Allows
-  setting pragmas when using non-interactive mode. (John Rouillard)
-- issue685275 - add pragma show_retired to control display of retired
-  items when using list/table. Add pragma display_header to print
-  headers for display command. Header displays designator and
-  retired/active status. (John Rouillard)
-- issue2551299 - support config.ini rdbms option 'service'. Allow use
-  of a PostgreSQL connection service file (pg_service.conf) for
-  configuring database on a per-tracker basis. Also replaces use of
-  PGSERVICE env variable for single instance trackers. (From ML
-  question by ivanov. John Rouillard)
-- issue2550852 - support for specifying a PostgreSQL schema to use for
-  the Roundup database. (Patch by Stuart McGraw; slight modifications,
-  tests, docs: John Rouillard).
-- issue2551274: add configurable logging for REST API when something
-  fails, we now log status code and error message.
-  (Ralf Schlatterbeck)
-- issue2551317 - add some Jinja2 examples to customizing.txt
-  document. (John Rouillard)
-- multiple scripts/... updates - Python3, linting, enhancements:
-  weekly-report,schema-dump.py, roundup-reminder, copy-user.py,
-  dump_dbm_sessions_db.py, contributors.py (John Rouillard)
-- roundup/msgfile.py can now be called as 'python msgfmt.py de.po de.mo'
-  or 'python msgfmt.py -o de.mo de.po' to compile a translation file if
-  GNU msgfmt is missing. (John Rouillard)
-- save roundup-admin history between sessions. Load
-  ~/.roundup_admin_rlrc file to set history-size persistently. Add
-  pragma history_length to override for a session. (John Rouillard)
-- the roundup-admin history command now dumps the journal entries
-  in a more human readable format. Use the raw option to get the older
-  machine parsible output. (John Rouillard)
-- Multiple JWT secrets are supported to allow key rotation. See
-  an updated config.ini for details. (John Rouillard)
-- issue2551212 - wsgi performance improvement feature added in 2.2.0
-  is active by default. Can be turned off if needed. See upgrading.txt
-  for info. (John Rouillard)
-- issue2551270 - Better templating support for JavaScript. Add
-  utils.readfile(file, optional=False) and utils.expandfile(file,
-  token_dict=None, optional=False). Allows reading an external file
-  (e.g. JavaScript) and inserting it using tal:contents or equivalent
-  jinja function. expandfile allows setting a dictionary and tokens in
-  the file of the form "%(token_name)s" will be replaced in the file
-  with the values from the dict. (John Rouillard)
-- add @group to rest interface collection queries. Useful when using
-  optgroup in select elements. (John Rouillard)
-- roundup-demo can set the hostname in the URL using the -H
-  parameter. So you can start a demo tracker that is available from
-  your network using 'roundup-demo ... -B hostname -H hostname'. (John
+- issue2551287 - Enhance roundup_gettext.py to extract strings from
+  detectors/extensions. If the polib module is available,
+  roundup-gettext will extract translatable strings from the tracker's
+  Python code. If polib is missing, it will print a warning. (Patch
+  Marcus Priesch, cleanup to remove python 2 issues, John Rouillard.)
+- issue2551315 - Document use of
+  RestfulInstance.max_response_row_size to limit data returned
+  from rest request. (John Rouillard)
+- issue2551330 - Add an optional 'filter' function to the Permission
+  objects and the addPermission method. This is used to optimize search
+  performance by not checking items returned from a database query
+  one-by-one (using the check function) but instead offload the
+  permission checks to the database. For SQL backends this performs the
+  filtering in the database.  (Ralf Schlatterbeck)
+- issue2551370 - mark roundup session cookie with __Secure-
+  prefix. (John Rouillard)
+- add -P flag to roundup-server to log client address from
+  X-Forwarded-For reverse proxy header rather than connecting
+  address. This logs the actual client address when
+  roundup-server is run behind a reverse proxy. It also appends a
+  + sign to the logged address/name. (John Rouillard)
+- issue2551068 - Provide way to retrieve file/msg data via rest
+  endpoint. Raw file/msg data can be retrieved using the
+  /binary_content attribute and an Accept header to select the mime
+  type for the data (e.g. image/png for a png file). The existing html
+  interface method still works and is supported, but is legacy. (John
+  Rouillard) 
+- added fuzz testing for some code. Found issue2551382 and
+  others. (John Rouillard)
+- issue2551116 - Replace xmlrpclib (xmlrpc.client) with defusedxml.
+  Added support for defusedxml to better secure the xmlrpc
+  endpoint. (John Rouillard)
+- Added new instance.registerUtilMethod() method to make using complex
+  templating easier as it provides a default Client instance to the
+  templating method. (John Rouillard)
+- Added new templating utils.set_http_response(integer) method to
+  allow reporting an error to the user from a template. (John
   Rouillard)
-- issue2551347 - make _generic.help.html work without property
-  settings. THis applies to classic or minimal trackers. It allows use
-  of classhelp without the property seting for informtion only
-  (e.g. description of what a priority or status means) without being
-  able to select the property in the classhelper.  Good for adding help
-  for Link properties. (John Rouilllard)
-- issue1525113 - notation to filter by logged-in user. Use
-  @current_user with properties that are a Link to the 'user' class to
-  match the currently logged in user. Allows sharing of queries like
-  "Issues I created" or "Issues I am assigned to" by removing the
-  hard coded user id number and replacing it with the current user's
-  id. Tracker templates updated to use it. (John Rouillard from a
-  patch by Jon C. Thomason)
-- Add a /rest/data/user/roles REST endpoint. (John Rouillard)
-- issue2551353 - Add roundup-classhelper for 2.4.0
-  release. Integrate new classhelper web component to wrap
-  existing classhelper link. This fixes a number of
-  outstanding bugs against the current classhelper using
-  current web features. (Patel Malav, Nikunj Thakkar,
-  Bharath Kanama with integration by John Rouillard)
-- disable spellcheck on all password fields to try to prevent
-  browser from exposing passwords to external servers. (John
-  Rouillard)
+- issue2551390 - Replace text input/calendar popup with native
+  date input. Also add double-click and exit keyboard handlers to
+  allow copy/paste/editing the text version of the date. Configurable
+  via the use_browser_date_input setting in the [web] section of
+  config.ini. By default browser native dates are turned off.
+  (John Rouillard, Ralf Schlatterbeck)
+- Use native number type input for Number() and Integer()
+  properties. Integer() uses step=1 as well. Configurable via the
+  use_browser_number_input setting in the [web] section of config.ini.
+  Set off by default. See
+  https://issues.roundup-tracker.org/issue2551398 for discussion of
+  issues with native number inputs.  (John Rouillard, Ralf
+  Schlatterbeck)
+- issue2551231 - template.py-HTMLClass::classhelp doesn't merge
+  user defined classes. It now merges them in. (John Rouillard)
+- re-enable support for GPG/PGP encrypted emails using new python gpg
+  package on the test pypi instance. (Paul Schwabauer)

Roundup Issue Tracker: http://roundup-tracker.org/