Title: Release Notes For Version 12.0.19

0.1 Table Of Contents

1 Upgrading to 12.0

1.1 Software Requirements

To run Calpendo version 12.0, you should use:

1.2 Before Upgrading to 12.0

If you are upgrading from version 9.0.x or earlier, then:

If you are upgrading from version 10.0.x, 10.1.x or 10.2.x to 12.0, then:

If you are upgrading from version 11.0.x to 12.0, then:

1.3 How To Perform The Upgrade

Upgrading from any version to the latest (including applying bug fix updates) should be done with the following procedure:

1.4 Downgrading If Things Go Wrong

If something goes wrong during an upgrade, and you want to downgrade to a previous version, then it is important that you follow the right method.

If you are downgrading across patch versions, for example from 12.0.x to 12.0.y, then you can generally do that without making any changes to the database. Just change the program files to the version you want, and it will automatically handle any database changes required.

However, if you are downgrading across major or minor versions, for example from 12.0.x to 11.0.x, or from 12.0.x to 10.1.x, then it is very important that you follow the sequence described below.

If an upgrade fails for some reason, then the database may well be partially upgraded. Automatic recovery from a partial upgrade is not supported.

The general procedure for downgrading is:

As you can see, for this procedure it is essential that you took a backup of the database before the upgrade began, otherwise downgrading in the event of a failure may not be possible or may be difficult.

Examples of sequences for downgrading that are not supported and likely to result in a broken system are:

  1. Don’t bother loading a backup of the database. Just change the program files to an old version and reboot.

  2. Don’t bother dropping the database and recreate it. Just load a backup of the old database on top of an upgraded or partially upgraded database and run an old Calpendo.

Recovery from these kind of errors can be difficult and possibly labour intensive. Please avoid this by following the prescribed downgrade procedure as laid out above.

2 New Features

2.1 Enterprise

2.1.1 Introduction to Enterprise

Version 12.0 sees the first production release of Calpendo Enterprise, completing the changes begun in version 10.0. A full description is beyond the scope of these release notes, and so what follows is a summary of what it is and does.

2.1.2 Summary of Enterprise Features

In a Calpendo enterprise system, multiple Calpendos work together in a single federation that allows (some) data and users to be shared. Each single Calpendo instance is known as a “shard”.

Each Calpendo shard in the federation would own its resources and it would control them. Some or all of the resources can be shared to other Calpendo shards.

A user can see a bookings calendar that shows resources that are owned by the current Calpendo shard, and those that have been shared to the current Calpendo shard.

They can create and edit bookings for each of the resources displayed, regardless of which Calpendo shard the resource belongs to. However, the user must have an account on the Calpendo shard that owns the resource, and it’s all the rules and permissions that apply on the shard that owns the resource that will be used to decide whether this user can make bookings or not.

From a user’s perspective, it will appear that they can just use many resources, some of of which are from other core facilities. The distinction between which core facility owns the resources does not get in their way at all, provided they have access to that core facility’s Calpendo.

For those using Calpendo projects, they can also be shared between shards. This means a user may book a resource from another facility using their own project.

Users that have accounts across multiple Calpendo shards can seamlessly move from one shard to another. That is, once they have authenticated on one shard, then they can access another that they have an account on without having to authenticate again.

2.1.3 Use Cases For Enterprise

There are two main use cases for Enterprise:

2.1.4 Who Controls Enterprise?

Enterprise can be configured with a top-level Calpendo shard that enforces control over many aspects of how the individual Calpendo shards work. Alternatively, there can be very little top-down control. The choice of how this should work will always reflect the politics involved at your institution.

2.1.5 Migrating To Enterprise

A non-Enterprise Calpendo cannot be converted into an Enterprise system. If you want to migrate to Enterprise, then this requires a new Calpendo Enterprise that takes some configuration ideas from your old Calpendo. This will always be the case because the way one designs an Enterprise system will always be different from designing a standalone system.

2.1.6 API Calls

If you use the API to connect to Calpendo, then you should specify the URL as one that targets one particular Calpendo shard. For example, when we host an Enterprise Calpendo, the URLs would be like this:

https://x.calpendo.com/y/api/

where ‘x’ would be the name of your institution, and ‘y’ would be the name of the particular shard within your Enterprise federation.

Further, if you use the query API, then this will search through the data on one or more Calpendo shards. By default, it will search the shard whose URL you used. For example, this would return the name of all projects on the shard called “y”:

https://x.calpendo.com/y/api/q/Calpendo.Project/status/EQ/Approved?paths=name

If you want the names of projects regardless of which shard knows about them, then you would do this:

https://x.calpendo.com/y/api/q/Calpendo.Project/status/EQ/Approved?paths=name&shards=all

whereas if you wanted projects from a particular selection of shards, then you would target them with their shard numbers (rather than names) like this:

https://x.calpendo.com/y/api/q/Calpendo.Project/status/EQ/Approved?paths=name&shards=3,56,76

2.2 Add support for Two Factor Authentication

Calpendo now supports two factor authentication. This applies to both Enterprise and non-Enterprise systems.

Users will need to install an authenticator app, typically on a mobile phone, or use one they already have. This authenticator app provides time-based one-time passwords (TOTP). That means the app would show a number that changes every 30 seconds or so and has to be given to Calpendo as a part of the authentication procedure.

The two factor authentication system works with all of our existing authentication methods. That mean you can use it with single sign on, LDAP authentication and local Calpendo authentication and it does not require any change to your Calpendo authentication method configuration to work.

Each user has their own two factor authentication status, stored in a property on the user account called auth2FAStatus. This status is one of the following:

Status Description
OFF The user account is not configured for 2FA. They may choose to configure it.
ON The user is configured for 2FA and must provide a TOTP password to log in.
REMIND On logging in, the user will be reminded that they ought to configure 2FA.
FORCE When the user next logs in, they will be forced to configure 2FA.

An administrator may choose to force all users to configure 2FA by setting the status to FORCE, or they may set it to REMIND and perhaps later set those not configured for 2FA to FORCE.

If an administrator does nothing, then users can still opt in to configuring 2FA themselves. This is done by clicking their username in the top-right corner of every screen and selecting “Two Factor Authentication”. This will trigger a wizard that takes the user through the steps required.

System settings also let you specify who should be forced to configure 2FA, optionally depending on their roles. This is controlled in the Security tab, and the options of who should be forced to use 2FA are:

This means that somebody will be forced to configure 2FA if either their 2FA status is set to FORCE or if the system settings say everybody should be forced to use 2FA or if the system settings specifies roles matching the user should be forced to use 2FA.

As well as being able to specify in system settings who should be forced to configure 2FA, you can also specify who should be given a reminder to configure 2FA on login. This has the same options for who can be forced to configure 2FA. That is, everybody, nobody or those with specific roles.

Finally, if you configure an Exprodo Authentication Method, then this means that the password for a user is stored in another Exprodo database, known as the “proxy”. So if you have multiple databases, you can have one of them store the passwords for all. In this case, if a user either has 2FA configured on the proxy, or will be forced to configure 2FA next time they log in to the proxy, then they will be forced to configure 2FA when they log in to any other system that uses the proxy for authentication.

2.3 Skipping 2FA Validation

The system settings allows an admin to choose whether users can skip 2FA for a time, and if so, for how long.

On the Security/2FA section of the system settings is an option labelled “Allow 2FA to be skipped for a while”. This defaults to 7 days.

If a user with 2FA enabled authenticates, they are shown a pop-up that asks for their 2FA validation code. If validation can be skipped, then next to the text entry for the code is a checkbox that the user can tick to say they don’t want to enter the code again on this machine for 7 days (or whatever the duration is configured to be).

If they tick this, then when they log in again over the 7 days from the same browser, they will not be asked for their 2FA validation code.

This process relies on a cookie stored in the browser that records the setting that says 2FA is not required.

2.4 Pinnable pop-ups

Many pop-ups you see can now be pinned so that they remain displayed while you continue to do other things in the system.

For example, you might go to the bookings calendar and edit a booking. When you do this, a pop-up appears, and the rest of the display is darkened to indicate you can’t click in it. You can now pin that pop-up. When you do this, the darkened effect from the rest of the display is removed, and the pop-up indicates that it is pinned. You can now use the menus or any other part of Calpendo while the pinned pop-up remains displayed and functional.

Pinned pop-ups can be:

2.5 Formatted text editor using syntax colouring

Some pages allow you to edit text that is of a particular type or format.

For example, in the bakery, a formula is SQL (mostly). So the formula now displays in an editor that understands SQL syntax. Also, system settings lets you provide custom CSS to control the system’s appearance. That is now displayed using an editor that understands CSS syntax.

These text editors can also be used for custom properties that you create. To do this, create a layout for the biskit type, and then on the property in the layout, choose the format you want it to use.

We currently support the following content types:

2.6 Pop-out text editors

In the layout editor, there are now more options for how you can display string properties.

You can choose the content type (SQL, CSS etc) to use an editor that provides syntax colouring. You can also choose whether the text should be displayed:

An example of its use is in the bakery where the space available for displaying a formula is very limited. This is now displayed using the “Always popup” mode.

2.7 Auto-generate hash tags from text and use auto-completion for tags

In the bakery, you can now specify that a text property has a type of “Text with tags”. This then allows you to associate a separate property (on the same biskit) that stores a set of tags. The set of tags would be marked as automated.

When editing the text property, if you were to enter this:

Hello #world this is a #test of the tag system

Then the set of tags would automatically be set to contain “world” and “test”.

This means that when typing in some text, any word that you want to marked as a tag just needs to be prefixed with the # symbol.

The link between the tags and the text also feeds back from the tags to the editor. Suppose you have entered the above text and saved the biskit. Then the tag will have recorded that “world” and “test” are known tags. When you then edit another biskit, if you were to type “#wo” and press CONTROL-SPACE, then a drop-down would appear with suggestions for which tags might complete what you’ve typed. Use the mouse or keyboard to select “world” from the drop-down, and the text would be modified to say “#world”.

2.8 Audit log entries tied to the user action that caused them

There are times when a user might perform one action, and it results in multiple biskits being modified. Examples where this might happen are when linked bookings create multiple bookings or a workflow that makes many changes in response to the user action.

This can mean that when you examine the audit log, it is not very clear what the user has actually done. There may be many changes, and it may not be obvious that they are tied to a single action.

To help with this, the audit log has been modified so that every change it records includes the name and number of the user request that generated the change. For example, if a user creates a booking, and a child linked booking is also created, then you get two audit log entries: one for creating each booking. But both would record that it was the same user request number and request name that caused them.

2.9 Bakery now allows set/list properties of misc atomic types

The bakery will now let you add a property that stores a set or list of integer, long, double, date, datetime, boolean and string.

Apart from a set of string tags, which was previously supported, the new options all store their data in a new table, whose name is calculated from the biskit’s table name plus the column name set on the set/list property.

For example, if you add a list of integers called “numbers” to a biskit store in table “things”, then the table name for the integers would be “things_numbers”.

2.10 New Workflow Functions

2.11 Using Calpendo’s built-in database dump on the command line

The Calpendo UI has a feature that lets you dump the database, generating a SQL file.

This works on both MariaDB and MySQL, and the file generated can be loaded into either flavour of database.

However, recent versions of MariaDB have changed their command line utility for dumping the database so that the file it generates cannot be loaded into a MySQL database.

It may therefore be useful to convert the database dump code in Calpendo to something that is also callable from the command line.

Those who host their own Calpendo can find the relevant documentation in a README file in the INSTALL directory of their expanded Calpendo archive.

2.12 Virus scanning of uploaded files

When anybody uploads a file, this can now be automatically scanned for viruses.

For this to work, it requires that clamav-daemon be installed somewhere on the network, and configured to accept requests on a TCP socket.

There is now a new section on the system settings’ “Security” tab that lets you specify the hostname and port number where Calpendo can access the clamav daemon. The port number defaults to 3310, and the hostname defaults to localhost.

Installing clamav-daemon on Ubuntu for this requires:

sudo apt install clamav-daemon
echo TCPSocket 3310 | sudo tee -a /etc/clamav/clamd.conf
echo TCPAddr localhost | sudo tee -a /etc/clamav/clamd.conf
sudo systemctl restart clamav-daemon.service

2.13 Auto-filtering to remove HTML from string properties

Some string properties will be used in a context where HTML is allowed. In order to prevent some types of security attack, there is now support for automatic filtering of the content of string-valued properties.

In the bakery, each string-valued property now displays a new “HTML Allowed Type” option. The value you choose is from a drop-down with the following values, in decreasing order of strictness:

For example, if a string property has an HTML Allowed Type of “NONE”, then whenever any value for it is saved to the database, it will be examined to see if it contains any HTML, and the HTML parts will be removed completely.

For example, something like this:

Hello

would be modified to:

Hello

You can choose how strict the filtering should be by the drop-down choice.

2.14 Acceptable Passwords

We have for a long time had the ability to restrict passwords to have at least a certain length, contain upper and lower case letters, numbers and characters that are not digits or letters.

We also implemented support for haveibeenpwned.com a long time ago so that we can check whether a password somebody uses has been exposed in a previous security breach.

There are three changes with this:

  1. When a user updates a password and it fails some of the checks, we were telling them only about the first one we encountered. It now tells them about all of them.
  2. As they update a password, each time they type a character, we update the screen to show how acceptable that password is.
  3. We can now estimate the entropy in a password which is a measure of its complexity. This is the kind of thing that recognises that “Passw0rd!” is incredibly weak, despite passing tests about length, upper and lower case letters, digits and non-number/non-letter characters, while recognising that “oerhkdjrkd” is strong despite containing only lower case letters.

3 Changes

3.1 “Account Details” item added to user drop-down in top-right corner

3.2 Audit log now downloadable

The audit log history page now has a button to download the contents currently displayed.

3.3 Biskit suggestion drop-down changes when there are no possible values

Suppose you have a system where there are no user types created, and you run a report to show users. Then, you add a condition that looks like this:

value of userType equals Fixed

Then what appears at the end should be a widget that lets you select a user type. It should do this with a box you can type in, and it gives a drop-down of suggestions similar to what you typed, and also a button to the right that shows a drop-down of all possible values.

However, when there are no possible values, such as there being no user types that exist, then the button to the right that shows all possible values is not displayed. You only get the text box to type in to.

However, this is confusing as it says it wants you to select an item, but nothing happens when you click in it. It just looks like a text entry and nothing else.

This has now changed in two ways:

  1. The button to the right always appears, and if there are no selectable values, then clicking the button shows a message to indicate there are no selectable values.
  2. When you click in the text box, if there are no selectable values, it shows a message to that effect.

3.4 Conditions allow “equals” and “not equals” relations on tag set properties

3.5 Logging has been upgraded to Log4j2

We used to use Log4J version 1.x for create Calpendo log files. This was replaced with Reload4J, which was a drop-in replacement for Log4J 1.x, but had the vulnerabilities fixed. We have now migrated to Log4J2.

Previously, log files would be rotated into a new file whenever the file grew large, with a limit on how many log files were kept. This would mean that old log files would be lost. We now shift to a standard configuration that rotates log files every day, with all files (apart from today’s) having the date in the file name.

This provides more stability for backing up log files, if required, but does add a burden of needing to delete sufficiently old log files depending on what is required to be kept.

3.6 Permissions error message changed when server detects possible bad permissions/algorithm

3.7 Projects can be deleted without having to remove users first

It used to be the case that you had to remove all users from a project and save it before you would be able to delete that project. This is no longer the case.

3.8 Pseudo date properties “quarter” and “yearQuarter” added

3.9 Rules allow TotalTimeBooked rule to limit time per calendar week

3.10 Rules now support comments

3.11 Tag set properties can be marked as sorted

When adding a property that is a set of string tags in the bakery, it is now possible to mark them as sorted so that they always display in alphabetical order.

3.12 User created for disabled authentication method gives warning

If a user is manually created and assigned an authentication method that does not let them log in, then a warning will be displayed. It is possible to do this deliberately, but it’s not common that one would create a user for a disabled authentication method.

3.13 Workflow action (+) and (-) buttons changed order

3.14 Workflow actions created automatically choose a unique sort order

3.15 Workflow debugger frames-by-type calls split by action-specific category

3.16 Workflow system event recording can be disabled with a system setting

There was a time when the workflow debugger did not exist. At that point, the only option for recording any information about what was happening in a workflow was to edit the workflow and turn on recording of system events. This records a system event for each action when the action starts, and then when it finishes.

Complex workflows result in large number of system events that mean you can’t then easily view the system events.

Other problems with this are:

So there is now a new system setting, on the General tab, that lets you turn off all system event recording by workflows. When this is disabled, it overrides anything set on the workflows themselves.

This new setting is disabled by default so that we will no longer have recording of system events for workflows unless somebody manually turns it on.

3.17 Workflow validation error pop-up shows path to each action

3.18 Workflow validation now checks for non-deterministic execution order

4 Releases

4.1 12.0.0 February 1, 2024

Changes

Optimisations

Bug Fixes

4.2 12.0.1 December 5, 2024

Changes

Bug Fixes

4.3 12.0.2 December 31, 2024

Changes

Security Fixes

Bug Fixes

4.4 12.0.3 January 21, 2025

Changes

Bug Fixes

4.5 12.0.4 February 10, 2025

Changes

Security Fixes

Bug Fixes

4.6 12.0.5 February 10, 2025

Changes

Bug Fixes

4.7 12.0.6 February 12, 2025

Changes

Security Fixes

Bug Fixes

4.8 12.0.7 May 14, 2025

Changes

Security Fixes

Bug Fixes

4.9 12.0.8 May 21, 2025

Changes

Bug Fixes

4.10 12.0.9 September 23, 2025

Changes

Bug Fixes

4.11 12.0.10 October 9, 2025

Security Fixes

Bug Fixes

4.12 12.0.11 November 10, 2025

Optimisations

Security Fixes

Bug Fixes

4.13 12.0.12 December 12, 2025

Changes

Bug Fixes

4.14 12.0.13 January 22, 2026

Changes

Optimisations

Bug Fixes

4.15 12.0.14 February 10, 2026

Changes

Bug Fixes

4.16 12.0.15 February 16, 2026

Changes

Bug Fixes

4.17 12.0.16 March 13, 2026

Changes

Bug Fixes

4.18 12.0.17 March 24, 2026

Changes

Bug Fixes

4.19 12.0.18 March 26, 2026

Bug Fixes

4.20 12.0.19 March 31, 2026

Changes