Issue Description
"An error occurred while saving the changes" message appears when enabling the Privacy Preference Policy Control Profile, and/or the Jamf Notifications Profile for Jamf Pro, Jamf Connect, Jamf Protect or Jamf Remote Assist under Settings > Computer Management > Security > Enable certificate-based authentication > Enable push notifications.
From a Debug Server Log:
2021-03-18 11:09:42,954 [DEBUG] [Thread-4 ] [HTMLController ] - Requested URI: computerSecurity.html ... 2021-03-18 11:09:42,955 [DEBUG] [Thread-4 ] [lientSecurityHTMLResponse] - Updating computer enrollment object from request... 2021-03-18 11:09:43,005 [ERROR] [Thread-4 ] [HTMLResponse ] - An unhandled exception occurred during a save operation java.lang.StringIndexOutOfBoundsException: begin 0, end 2, length 0 at java.base/java.lang.String.checkBoundsBeginEnd(String.java:3319) at java.base/java.lang.String.substring(String.java:1874) at com.jamfsoftware.jss.objects.computer.ComputerHelper.isSelectedOSOrLater(ComputerHelper.java:5473) at com.jamfsoftware.jss.service.predefinedprofile.install.PredefinedProfileDao.mapRowIfCorrectBuildNumber(PredefinedProfileDao.java:43) at com.jamfsoftware.jss.service.predefinedprofile.install.PredefinedProfileDao.lambda$findComputersWithoutProfile$0(PredefinedProfileDao.java:32)
A computer in Jamf Pro may not include an operating system build number in its corresponding inventory record.
Troubleshooting Steps
Use a MySQL Query like the following example to check for computer records with an empty operating_system_build field in the database:
select computer_id,operating_system_build from computers_denormalized where operating_system_build='';
Note: If the Jamf Server is cloud-hosted, reach out to Jamf Support regarding the execution of this query on the cloud server and reference this article.
If one or more computer_id is returned in the results, see the procedure below:
In a browser, open any existing computer inventory record in the Jamf Pro console.
Edit the 'id=' portion of the web site address (in the browser) to reflect one of the three computer_id numbers returned from the query (one at a time of course).
Determine if the resulting inventory records are currently needed, or if they relate to devices that could potentially be erased and re-enrolled without a serious impact on the assigned user(s).
Important Note: The act of deleting an inventory record is not something that has 'an undo button', so if any information is needed - it may be best to collect screenshots of the information before the deletion.
If it is determined safe in light of the information above, delete the inventory records for the computer_id numbers that were returned from the query.
After the deletion process is complete, attempt the changes again and observe the results.