From b298ecb3b680df351731722505e95e3dc92daaa6 Mon Sep 17 00:00:00 2001 From: Ferdinand Thiessen Date: Mon, 16 Feb 2026 12:40:04 +0100 Subject: [PATCH] fix(files_sharing): ensure the server share API errors are shown - fix https://github.com/nextcloud/server/issues/58359 To reproduce: 1. Setup password policy. 2. Try to set a share password like `1234` 3. See that no visual error message is show but only in the console Signed-off-by: Ferdinand Thiessen --- .../files_sharing/src/mixins/ShareRequests.js | 53 +++++++++---------- build/frontend-legacy/package-lock.json | 7 --- build/frontend-legacy/package.json | 1 - 3 files changed, 26 insertions(+), 35 deletions(-) diff --git a/apps/files_sharing/src/mixins/ShareRequests.js b/apps/files_sharing/src/mixins/ShareRequests.js index 4eca330fffc..4206a0135ec 100644 --- a/apps/files_sharing/src/mixins/ShareRequests.js +++ b/apps/files_sharing/src/mixins/ShareRequests.js @@ -3,16 +3,13 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import axios from '@nextcloud/axios' +import axios, { isAxiosError } from '@nextcloud/axios' import { showError } from '@nextcloud/dialogs' import { emit } from '@nextcloud/event-bus' import { generateOcsUrl } from '@nextcloud/router' import Share from '../models/Share.ts' import logger from '../services/logger.ts' -// TODO: remove when ie not supported -import 'url-search-params-polyfill' - const shareUrl = generateOcsUrl('apps/files_sharing/api/v1/shares') export default { @@ -45,13 +42,9 @@ export default { emit('files_sharing:share:created', { share }) return share } catch (error) { - logger.error('Error while creating share', { error }) - const errorMessage = error?.response?.data?.ocs?.meta?.message - showError( - errorMessage ? t('files_sharing', 'Error creating the share: {errorMessage}', { errorMessage }) : t('files_sharing', 'Error creating the share'), - { type: 'error' }, - ) - throw error + const errorMessage = getErrorMessage(error) ?? t('files_sharing', 'Error creating the share') + showError(errorMessage) + throw new Error(errorMessage, { cause: error }) } }, @@ -70,13 +63,9 @@ export default { emit('files_sharing:share:deleted', { id }) return true } catch (error) { - logger.error('Error while deleting share', { error }) - const errorMessage = error?.response?.data?.ocs?.meta?.message - OC.Notification.showTemporary( - errorMessage ? t('files_sharing', 'Error deleting the share: {errorMessage}', { errorMessage }) : t('files_sharing', 'Error deleting the share'), - { type: 'error' }, - ) - throw error + const errorMessage = getErrorMessage(error) ?? t('files_sharing', 'Error deleting the share') + showError(errorMessage) + throw new Error(errorMessage, { cause: error }) } }, @@ -97,16 +86,26 @@ export default { } } catch (error) { logger.error('Error while updating share', { error }) - if (error.response.status !== 400) { - const errorMessage = error?.response?.data?.ocs?.meta?.message - OC.Notification.showTemporary( - errorMessage ? t('files_sharing', 'Error updating the share: {errorMessage}', { errorMessage }) : t('files_sharing', 'Error updating the share'), - { type: 'error' }, - ) - } - const message = error.response.data.ocs.meta.message - throw new Error(message) + const errorMessage = getErrorMessage(error) ?? t('files_sharing', 'Error updating the share') + // the error will be shown in apps/files_sharing/src/mixins/SharesMixin.js + throw new Error(errorMessage, { cause: error }) } }, }, } + +/** + * Handle an error response from the server and show a notification with the error message if possible + * + * @param {unknown} error - The received error + * @return {string|undefined} the error message if it could be extracted from the response, otherwise undefined + */ +function getErrorMessage(error) { + if (isAxiosError(error) && error.response.data?.ocs) { + /** @type {import('@nextcloud/typings/ocs').OCSResponse} */ + const response = error.response.data + if (response.ocs.meta?.message) { + return response.ocs.meta.message + } + } +} diff --git a/build/frontend-legacy/package-lock.json b/build/frontend-legacy/package-lock.json index 96784ca4f15..d8d4efbc0f3 100644 --- a/build/frontend-legacy/package-lock.json +++ b/build/frontend-legacy/package-lock.json @@ -70,7 +70,6 @@ "strengthify": "github:nextcloud/strengthify#0.5.9", "throttle-debounce": "^5.0.2", "underscore": "1.13.7", - "url-search-params-polyfill": "^8.2.5", "v-click-outside": "^3.2.0", "v-tooltip": "^2.1.3", "vue": "^2.7.16", @@ -17476,12 +17475,6 @@ "requires-port": "^1.0.0" } }, - "node_modules/url-search-params-polyfill": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/url-search-params-polyfill/-/url-search-params-polyfill-8.2.5.tgz", - "integrity": "sha512-FOEojW4XReTmtZOB7xqSHmJZhrNTmClhBriwLTmle4iA7bwuCo6ldSfbtsFSb8bTf3E0a3XpfonAdaur9vqq8A==", - "license": "MIT" - }, "node_modules/util": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", diff --git a/build/frontend-legacy/package.json b/build/frontend-legacy/package.json index 8607b50e065..de354a14cd0 100644 --- a/build/frontend-legacy/package.json +++ b/build/frontend-legacy/package.json @@ -86,7 +86,6 @@ "strengthify": "github:nextcloud/strengthify#0.5.9", "throttle-debounce": "^5.0.2", "underscore": "1.13.7", - "url-search-params-polyfill": "^8.2.5", "v-click-outside": "^3.2.0", "v-tooltip": "^2.1.3", "vue": "^2.7.16",