From ba54a3aa18859272b02507f29d92a69512b1c12a Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Thu, 31 Mar 2022 18:06:06 +0000 Subject: [PATCH 1/2] GUACAMOLE-462: Request correct sort order from REST API when searching history. --- .../guacSettingsConnectionHistory.js | 35 +++++++++++++++++-- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/guacamole/src/main/frontend/src/app/settings/directives/guacSettingsConnectionHistory.js b/guacamole/src/main/frontend/src/app/settings/directives/guacSettingsConnectionHistory.js index 58ffca938..f52fc0f9d 100644 --- a/guacamole/src/main/frontend/src/app/settings/directives/guacSettingsConnectionHistory.js +++ b/guacamole/src/main/frontend/src/app/settings/directives/guacSettingsConnectionHistory.js @@ -89,6 +89,37 @@ angular.module('settings').directive('guacSettingsConnectionHistory', [function 'entry.remoteHost' ]); + /** + * The names of sortable properties supported by the REST API that + * correspond to the properties that may be stored within + * $scope.order. + * + * @type {!Object.} + */ + const apiSortProperties = { + 'entry.startDate' : 'startDate', + '-entry.startDate' : '-startDate' + }; + + /** + * Converts the given sort predicate to a correponding array of + * sortable properties supported by the REST API. Any properties + * within the predicate that are not supported will be dropped. + * + * @param {!string[]} predicate + * The sort predicate to convert, as exposed by the predicate + * property of SortOrder. + * + * @returns {!string[]} + * A corresponding array of sortable properties, omitting any + * properties not supported by the REST API. + */ + var toAPISortPredicate = function toAPISortPredicate(predicate) { + return predicate + .map((name) => apiSortProperties[name]) + .filter((name) => !!name); + }; + // Get session date format $translate('SETTINGS_CONNECTION_HISTORY.FORMAT_DATE') .then(function dateFormatReceived(retrievedDateFormat) { @@ -166,9 +197,7 @@ angular.module('settings').directive('guacSettingsConnectionHistory', [function historyService.getConnectionHistory( $scope.dataSource, requiredContents, - $scope.order.predicate.filter(function isSupportedPredicate(predicate) { - return predicate === 'startDate' || predicate === '-startDate'; - }) + toAPISortPredicate($scope.order.predicate) ) .then(function historyRetrieved(historyEntries) { From 98abadaef5f9694707037ce308972c900fd3d467 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Thu, 31 Mar 2022 19:56:50 +0000 Subject: [PATCH 2/2] GUACAMOLE-462: Do not attempt to retrieve recordings for records with null UUIDs. --- .../connection/HistoryConnectionRecord.java | 35 ++++++++++++++++--- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/extensions/guacamole-history-recording-storage/src/main/java/org/apache/guacamole/history/connection/HistoryConnectionRecord.java b/extensions/guacamole-history-recording-storage/src/main/java/org/apache/guacamole/history/connection/HistoryConnectionRecord.java index 676682130..fbc7bdf08 100644 --- a/extensions/guacamole-history-recording-storage/src/main/java/org/apache/guacamole/history/connection/HistoryConnectionRecord.java +++ b/extensions/guacamole-history-recording-storage/src/main/java/org/apache/guacamole/history/connection/HistoryConnectionRecord.java @@ -71,6 +71,35 @@ public class HistoryConnectionRecord extends DelegatingConnectionRecord { */ private final File recording; + /** + * Returns the file or directory providing recording storage for the given + * history record. If no such file or directory exists, or the file cannot + * be read, null is returned. + * + * @param record + * The ConnectionRecord whose associated recording storage file + * or directory should be returned. + * + * @return + * A File pointing to the file or directory providing recording storage + * for the given history record, or null if no such file exists. + * + * @throws GuacamoleException + * If the configured path for stored recordings cannot be read. + */ + private static File getRecordingFile(ConnectionRecord record) throws GuacamoleException { + + UUID uuid = record.getUUID(); + if (uuid != null) { + File recordingFile = new File(HistoryAuthenticationProvider.getRecordingSearchPath(), uuid.toString()); + if (recordingFile.canRead()) + return recordingFile; + } + + return null; + + } + /** * Creates a new HistoryConnectionRecord that wraps the given * ConnectionRecord, automatically associating ActivityLogs based on @@ -84,11 +113,7 @@ public class HistoryConnectionRecord extends DelegatingConnectionRecord { */ public HistoryConnectionRecord(ConnectionRecord record) throws GuacamoleException { super(record); - - String uuid = record.getUUID().toString(); - File recordingFile = new File(HistoryAuthenticationProvider.getRecordingSearchPath(), uuid); - this.recording = recordingFile.canRead() ? recordingFile : null; - + this.recording = getRecordingFile(record); } /**