Title: Release Notes For Version 10.1.43
Changes
There have been some issues lately where a server cache that holds frequently accessed data, has been poisoned.
This happens when something that is correct at the time it was created is added to the cache, but later becomes inaccessible thereby making the cache broken.
While we have fixed errors that cause this problem, we now have a self-healing process in place that notices this situation, and causes the cache to be rebuilt.
The behaviour of the self-healing process can be modified using two flags.
In both cases, you would need to search for instances of Verbose (either in the general Search->Search page, or in the special
To allow problems found to be fixed, find and enable the Verbose instance with the name:
com.springsolutions.exprodo.core.server.persistence.LiveCacheHealth:autoFix
This is enabled by default.
Normally, the server cache is checked every 30 minutes and, if there’s a problem, it will then fix it. Alternatively, you can modify the the period of the check to every minute by enabling the Verbose instance with the name:
com.springsolutions.exprodo.core.server.persistence.LiveCacheHealth:highFrequencyChecks
Issue: 3414
Bug Fixes
BUGFIX: CustomTreePage miscounts items when using multiple nesting levels
If you add a menu item to show a custom tree page, and you configure it to show dynamic nodes using two or more property paths to group biskits by, then the count displayed of the number of items would be wrong.
Issue: 2980
BUGFIX: Select bookings calendar bookmark from menu shows exception
If you have a menu item that shows calendars by location, and from the template page, you select one of those calendars from the menu, then it takes you to the right page, but also showed an error in the corner of the screen briefly to say something went wrong on the server.
Issue: 3355
BUGFIX: Create copy of biskit with one-to-many properties can give exception
BUGFIX: Error if view old repeat booking where old changes not allowed
If you have a booking that is in the past, and which has repeat information set on it, and editing old bookings is disallowed, then viewing this booking in the search page pauses for some time and then gives an exception like “Maximum call stack size exceeded”.
Issue: 3371
BUGFIX: Generate calendar invitation from workflow produces no invitation
If you use the workflow function createCalendarInvite to generate an iCal file, and add it into an email, then the email contains a message like:
"Could not load data: Uploaded file cannot be found: JhGuja_RbdAfg-9v-444879784121345"
instead of the appropriate content.
Issue: 3372
BUGFIX: View user after creating bookings can give error
It was found when a user created a booking that also caused a linked booking to be created, and then if you go to a list of users and look at any user, it would give an error.
But this depended on the user performing these actions having limited permissions.
This bug is a consequence of a fix to an earlier bug (issue 3306) in 10.1.21.
Issue: 3398
BUGFIX: Exceptions follow after workflow generated linked bookings
This bug would not affect most customers. It would be most likely to occur when there are many custom biskit types that have been created that reference users or projects or resources, or groups thereof, and when there are workflows that update anything referencing any of the above.
When the problem occurs, the actions it takes work without problem, but it “poisons” a cache held on the server so that it will generate errors at some later time when the poisoned part is used.
The poisoning happens through a deep data traversal and modification process of historical origin whose original purpose no longer exists.
Consequently, it has now been removed.
Issue: 3398,3412
BUGFIX: Timed events creating biskit with auto-creator fail on update
Suppose:
Then the update fails with an exception.
This was caused by an earlier optimisation in 10.1.21 (issue 3259) that made loading a user’s projects happen lazily.
Issue: 3400
BUGFIX: Sort biskits by a string value and you can’t save default weight
If you create a Sort Workflow Action, and select a randomisation type of “Sorted”, and then choose a weight path that leads to a string property, then you should be able to set a default weight that is used whenever the weight found at the given path is null.
However, for string-valued properties, when you save the action, the default weight always defaults back to null.
Issue: 3401
BUGFIX: Sort biskits by a string value that’s sometimes null gives exception
If you set up a workflow and have it sort a list of biskits, where the sorting is by a string valued property that is null for at least one of the biskits, then the action fails with an exception.
Issue: 3402
BUGFIX: Iterate over double-map with FreeMarker gives an exception
If you have a workflow that includes a Map action, and it includes at least two keys, and then you feed that into a Templated Text action that uses FreeMarker to iterate over the the entries in the resulting map, then you get an exception.
Issue: 3403
BUGFIX: Repeat bookings that slip into the past not being handled
Whenever a repeat booking’s time goes into the past, then something should come along (by default every hour) and create a non-repeat instance to represent what happened, and then modify the repeating instance to reset its start time to the next repeating instance.
This had stopped working, generating an exception with the message:
"illegally attempted to associate a proxy with two open Sessions"
Issue: 3406,3359
BUGFIX: Confirming booking when no changes are required gives exception
If you confirm a booking, and then (perhaps in another tab where you already had the booking displayed) you ask to confirm it again, then you get an exception the second time.
Issue: 3409
BUGFIX: Exception when hover over booking in calendar to show tooltip
Displaying tooltip by hovering over booking in calendar can cause server data to get corrupted, resulting in exceptions.
As a bonus, fixing this has been done in such a way that makes it run much faster.
Depending on configuration, it could take a few seconds for the server to generate tooltip. Now it takes a fraction of a second in the cases tested.
Issue: 3412
Bug Fixes
On the bookings calendar, if you click “Bookmarks” and then “Edit resources to display”, then it shows a pop-up where you can choose which resources should be displayed on the calendar.
To help filter what’s here, you can choose some resource types.
However, the names of the resource types were formatted incorrectly.
In a default configuration, you would not notice.
But if you changed the BiskitDef for Resource (not Resource Type) and made it use a name property other than “name”, or set a format that used name plus something else, then the resource type filter would try to display the names of the resource types using the Resource format.
Issue: 3407
Bug Fixes
Security Fixes
Bug Fixes
You can put a URL onto a resource so that it will import its bookings from that URL in ical format.
If you put in a malformed URL for one resource, then any resources with an iCal URL that happen to be processed later, would not have their bookings imported.
Issue: 3410
If a daily repeat booking is created to start yesterday (at a time that is later than the current time of day today), then today’s booking is created as a non-repeat booking, where it should be the first of the sequence of repeats.
Issue: 3418
If you run a Map Workflow Action, and then use a FreeMarker-enabled Templates Text Workflow Action that expands the keys, then the result generates an exception.
Issue: 3461
When a workflow runs a User Workflow Event, it can configure a response that should be shown in a popup by:
However, whatever you specify for the title, it always shows as “Message”.
Issue: 3462
Changes
This is a workflow function that takes an argument of every PropertyType, and returns them all unchanged.
The function does nothing with them but return them.
This is intended for testing purposes only and is probably not of any other practical use.
This is here to help test the export of function action arguments of various types.
Issue: 3485,3486
Optimisations
When displaying a project, one of the things that happens is that each of the biskits it references must have a name calculated so that it can be displayed easily in the browser.
When you have a property that holds a file attachment, then Calpendo was loading the whole of the data contained in the attachment, even though it irrelevant to the name, which is stored as a separate property.
This optimisation improves things by loading only the necessary data when calculating the name of anything.
Issue: 3481
Bug Fixes
BUGFIX: Re-saving custom search page report makes it load as general search
If you create a report from a custom search page (such as the booking search page) and add some conditions, and save it, then editing the report in the report manager generates this message:
You have changed the conditions beyond the point where they will
be recognised by the page that originally created them. This
report will now be loaded by the general search page.
Loading the report no longer loads it into the custom search page it was created from, but the general search page, and the conditions show as much more complicated than the originals.
Issue: 3334
BUGFIX: Repeat widget description doesn’t initially reflect correct date
Suppose you create a new booking from the calendar so that you’re on the booking form.
Then add a repeat. It can be of any type except ‘Daily’ for this bug. Suppose you choose “Monthly by Date”
Then repeat description will read “Repeat on the 1st of every month” regardless of the date of the booking.
For example if you created your booking on the 15th it should read: “Repeat on the 15th of every month”.
The other repeat types also have a similar effect not reflecting the initial date of the booking.
You can work around this by changing the start date or time of the booking date range and the repeat description will update itself to display the correct date.
Note that this bug is visual only. It does not affect the data that’s actually saved.
Issue: 3484
BUGFIX: Workflow with function actions taking fixed values not exportable
Workflows can be exported to a SQL file so that they can be copied from one Calpendo to another.
A fix to issue 3461 in version 10.1.28 meant that some workflows could no longer be exported.
This affected any workflows containing a function action where at least one of the arguments to the function was specified as a “Fixed” value rather than “Variable” or “Null”.
Issue: 3485,3461
BUGFIX: Repeat widget shows description for a different type of repeat
If you change the type of a repeat (eg from “Monthly by Day” to “Monthly by Date”) then the description sometimes shows the wrong content (describing a previous repeat type).
Note: this bug is visual only. It does not affect the data saved, only the way the repeat description is displayed while editing a booking.
Issue: 3488
BUGFIX: Repeat widget sometimes shows description with end date when there is no end date
The description of a repeat booking can indicate the repeat has an end date when it does not.
To replicate this, create a booking, make it repeat and give the repeat an end date.
Then if you remove the end date, the repeat description still shows the old end date.
Note: this bug is visual only. It does not affect the data saved, only the way the repeat description is displayed while editing a booking.
Issue: 3489
BUGFIX: You can’t change repeat start date back to it’s original date after changing it
BUGFIX: Shallow exception editing ServiceOrder with layout without autoNumber
If you add a layout for ServiceOrder, then any change to a ServiceOrder gives an exception about a shallow autoNumber.
Issue: 3491
BUGFIX: Create a booking in the calendar and the history shows it was created by the system user
Bug Fixes
Suppose you add an attachment property to a biskit and then create it via a process.
On the second stop in the process (so after having created it), add an attachment larger than 320KB in side, and save that step of the process.
This gives an exception, saying:
"object references an unsaved transient instance
- save the transient instance before flushing: Attachment"
Issue: 3498
Bug Fixes
Changes
When you add a “Calendar By Location” page to the menu, then it generates submenu items for each defined resource location, with each menu item showing a calendar for the resources in that location.
These menu items were not always sorted by name, as one would expect.
Issue: 3514
Optimisations
Suppose you have a workflow that runs a TemplatedText action, and the template accesses some property of a user (but not the projects or projectsOwned properties).
Then when the workflow runs, it will prepare the data from the user for consumption by FreeMarker, and this will include projects and projectsOwned - even if they are never accessed.
If these things are large, then this can mean a lot of work unnecessarily.
Issue: 3513
Security Fixes
If you view the bookings calendar, and leave your browser like that, then it will automatically refresh every now and then.
These automatic refreshes do not cause your session to be extended - that requires manual intervention so that your login session period is extended only when you are actually doing things.
However, if one of these automatic refreshes were to generate an exception, then that exception would be registered with the server, and that registration message could extend your session.
This has now been changed so that an exception generated from an automated request is itself treated as automated.
Issue: 3512
Bug Fixes
BUGFIX: Exception message triggered switching to ‘no repeat’ type
BUGFIX: Login download can include bookings (and so cannot log in if bookings table missing a column)
Suppose you set up this situation:
This scenario has been seen when setting up invoicing and having a Line Item that references a booking, and allowing a booking to reference a Line Item.
Issue: 3503
BUGFIX: Exception running user workflow without awaiting outcome
If you create a user workflow event and configure a workflow button or menu to run it and not to await the result, then a Templated Text action will generate an exception.
Issue: 3507
BUGFIX: First login after un-suspending user can fail
BUGFIX: Menu-run workflow events never wait for completion even if told to
When you configure a menu item to run a workflow, there’s a setting where you can choose whether the UI will wait for the completion of the workflow.
Regardless of what you selected, it would not wait.
Issue: 3519
Bug Fixes
BUGFIX: Select booking owner using mouse sometimes does not work
BUGFIX: Copy/paste a templated text does not renumber freemarker loops
If you have a workflow that includes a TemplatedText action, then when you copy and paste something that includes it, then any references within the template to outputs from earlier actions may need renumbering to reference the new values.
This was not happening for FreeMarker loops. For example:
<#list source290.biskits as biskit>
</#list>
In this case, where this TemplatedText is inside an action #290, and that it copied elsewhere so its number changes, then the 290 inside the template should change in a corresponding manner.
Issue: 3475
BUGFIX: Update newly created project fails with custom one-to-many prop
If you add a one-to-many property to Project, and then create a project and immediately edit and save that project, then the update fails with an exception.
Issue: 3483
BUGFIX: Cannot set default value for automated property
BUGFIX: Trying to create a new theme gave an exception
BUGFIX: Exception on the calendar if the number of vertical pixels set to 1
BUGFIX: ServiceOrder permission broken in recently loaded module
BUGFIX: Some default Calpendo permissions are configured incorrectly
BUGFIX: Condition on user “self member of” shows list of user not group
If you search for users, and add a condition of the form:
self member of
then you should see a drop-down with a list of user groups so that the condition checks whether the user is in the selected user group.
However, it was instead showing a drop-down with a list of users, which makes no sense.
Issue: 3515
BUGFIX: Hidden formulaic prop on child of one-to-many causes save exception
BUGFIX: Exception viewing linked booking link if child resource is subtype
BUGFIX: Props on subtabs of Booking Layout not filtered based on resource
If you add properties to a booking layout, where those properties include a biskit drop-down whose values offered in the drop-down should be filtered depending on which resource is selected
then that filtering does not work when the properties are placed into a nested tab.
Issue: 3531
BUGFIX: Index Out Of Bounds exception when using Multi Column table in booking layout
BUGFIX: Export workflow and some action types don’t export fixed values This affects:
and also
StepUser
Issue: 3534
BUGFIX: Execute System Command actions can provide args in random order
An Execute System Command workflow action allows a workflow to make a call to a script or executable on the server.
You may pass arguments to that script, and the UI takes care to make sure that those arguments are displayed in a consistent order.
However, the order of the arguments is not guaranteed to be the same when it calls the script.
This fix ensures that the order shown in the UI is what is presented to the script.
Issue: 3535
BUGFIX: Workflow copy function fails on biskits of a generated BiskitDef
BUGFIX: Occasional exception when click on “References” button in bakery
This problem will show up only if you customise layouts and configure a “one to many import header” on a one-to-many property.
Issue: 3537
BUGFIX: Biskit Create action loses StringEnum values on save
If you create a workflow that involves a Biskit Create or Biskit Update action that sets the value of a StringEnum property to a fixed value, then when you save the workflow, the display does not show the value it is being set to.
The value is saved to the database, but not displayed.
Issue: 3539
BUGFIX: Exporting a ProcessDef makes their steps forget their editors
BUGFIX: Workflow copy function bad error message if try to save biskit of a generated BiskitDef
Suppose you:
Then this shows an error message, and on that looks like a server error.
However, it should show a nicer error that points to the copy function action, and tells you that you can’t save a biskit for a temporary BiskitDef.
Issue: 3542
BUGFIX: Export ProcessDef and initial step property is lost on import
Changes
Bug Fixes
Bug Fixes
The booking pop-up will filter options available in some drop-downs so that it will only include those values that will be allowed.
However, following a change in 10.1.32 to fix a different problem (issue 3503), there are some circumstances in which this auto-filtering is broken which results in there being no values to display in a drop down.
See the notes for 10.1.32 to see the circumstances of that issue, as it is the same situation that is broken here.
Issue: 3578
If a version 9 system is upgraded to version 10, and some of the ID numbers were larger than 2,097,151 then you can’t search for those items by their formatted ID number.
That’s because the code that handles parsing the formatted ID numbers generates an internal overflow when given something that had an old value above the 2,097,151 limit.
Issue: 3587
Optimisations
Suppose a booking is updated, and it triggers a workflow.
Then you run a Search Workflow Action where you search for ProjectResourceSettings with a condition:
value of project equals DatabaseEvent#1.New.project
That is, you’re searching for ProjectResourceSettings for the project used by the booking.
Then the project does not need to be fully fetched from the database to do this, because it only requires a comparison of primary keys.
However, this fetch was being done.
This optimisation is being done because it also avoids a bug that was discovered in production.
Issue: 3598
Bug Fixes
Suppose that:
Then if the user were to create a project, and immediately edit and save without a refresh of the browser in between, then the X and Y would be deleted.
Issue: 3592
Suppose you create a Database Workflow event that is triggered from a change to a project, and mark it as not vetoable (so it runs after the project change has been committed to the database)
Add a Templated Text action (with FreeMarker enabled) with this as the template:
<#if source1.New.users?size != 0> There are some users on this project <#else> There are no users on this project #if>
then if you edit/save a project, the workflow will generate an exception.
Note that, since this is not vetoable, and it runs after the transaction has been committed to the database, it means that the user triggering this change will not see any indication of a problem.
There will instead be a problem shortly afterwards, which could be seen in the log file or system event.
Issue: 3593
WARNING: Could not find BiskitDef 'RepeatableBiskit'
Suppose you create a workflow that defines a variable that is a set of biskits.
Suppose further that you use the “add” workflow function to add a biskit to that set, and then use a Biskit Update action to assign the result back to the variable.
Then doing that sequence twice will fail with an error saying
“Cannot convert value of property of type List to type Set”
Issue: 3602
Bug Fixes
If you have a particularly busy Calpendo, or one that is running for a long time between reboots, then Calpendo can get itself into an error state.
While in this state, viewing the workflow manager will display errors for any workflow that contains a Create Variables action or a Function action.
The workflows will continue to run perfectly okay, but they can’t be viewed or edited properly.
Issue: 3413
Suppose:
Now there are no variables, and so when selecting which property will be modified, there is nothing to choose.
In the case, the property drop-down says “There are no selectable properties”.
Suppose you now choose that this “unknown” property has its value set to the output of the create variables action, and then save the workflow.
If you try to run it, then it gives an infinite loop and an exception.
If you arrange for this workflow be triggered by something at boot time, then it will prevent Calpendo from booting properly.
Issue: 3617
Bug Fixes
If the owner of a booking defaults to the owner of the selected project (which is the default value), then the set of projects from which you can choose for your booking will exclude any project that is not related to the currently selected booking owner.
For example, suppose:
Then when you select either project, A or B in the booking pop-up, the other project would not be included in the drop-down of selectable projects.
Issue: 3653
Suppose you have a report that is scheduled to run every month on the 10th of the month and repeat forever.
With the report already saved, edit it. Whatever the start date on the repeat, set a different start date that is more than one month in the future, and save it again.
Then you should see that the “Next Send” date will show “nothing scheduled”, and if you wait for the report to be sent, it won’t ever be sent again.
Issue: 3662
When you edit a booking request, and the booking has a custom property storing a user, then the Approve button is greyed out.
This applies even if you have permission to approve the booking.
As a work-around, you can view the booking request instead, and from there, the Approve button works properly.
Issue: 3664
Changes
Bug Fixes
Changes
Prevent the system user from being added to permission ‘Applies To’ tab
Bug Fixes
If you configure a permission so that either the ‘Applies To’ or ‘Does Not Apply To’ tabs contain the system, then it causes mayhem.
Only root users can log in, and the root user only sees an error when trying to view the permissions page.
Issue: 3715
Bug Fixes
Security Fixes
Any user that can see the template calendar can click on a template, and click the “Duplicate Across Resources” option.
This happens even if permissions say the user cannot create templates.
This security hole only applies to users with access to the template calendar and only allows an existing template to be duplicated; users cannot choose anything at all about the newly created template apart from the resource it applies to.
No other changes to data are in any way affected by this - it’s limited to duplicating templates across resources.
Issue: 3908
Security Fixes
On every system, clicking the “Register New User” button results in a list of all registered users (their numerical id number, login name and real name) being sent to the browser.
On all Calpendo systems, it also sends the id number, project code and name of all projects.
This user and project information is not usually required, and should not be available before a user has logged in. This represents a data breech since it is possible to enumerate all users and projects on an enterprise system, and all projects on any Calpendo.
If users reference any other biskits, then all instances of whatever type is referenced is also sent to the browser. This is here so that a user that self-registers can select their user type or department etc.
However, if there were any sets of biskits attached to a user, for example their training records, then training record id numbers would also be sent, plus any name if they had one.
Clicking the “Register New User” button results in the browser being sent some information about all users in the system.
This includes their numerical ID number (which encodes the date/time the user was created), their login name and their real name.
The ID number, project code and name of all projects was also sent to the browser.
An attacker could use this to see the names of all users on Calpendo and the date on which they became a user.
When a user self-registers, there can be drop-downs, like the one that allows them to select their own user type. For this to work, the name and ID number for every user type must be sent to the browser.
This was looking for any type of biskit referenced by a user, and sending the name and ID number of every biskit of that type.
The fix specifically prevents user and project information from being included.
Further, we exclude any biskit type for which the user “nobody” does not have EXISTS permission on every instance of that biskit type. For example, if a user were given a property that referenced a resource, then the name and ID of all resources would be sent to the browser. But if just one resource has a permission that prevents user “nobody” from being able to know it exists, then no resources would be sent to the server.
Issue: 4294
Bug Fixes