diff options
author | Raimund Schlüßler <raimund.schluessler@mailbox.org> | 2021-08-02 22:20:16 +0300 |
---|---|---|
committer | Raimund Schlüßler <raimund.schluessler@mailbox.org> | 2021-08-02 22:20:16 +0300 |
commit | 8de84abda64496b04a64822ffd48c7259f036452 (patch) | |
tree | 6b383d8c06e3655455c27e7e30dc7e6ed47c0900 | |
parent | 34c46559a840c9d4d570837441e3a7af1264533d (diff) |
Properly decode share name in share search
Signed-off-by: Raimund Schlüßler <raimund.schluessler@mailbox.org>
-rw-r--r-- | src/components/AppNavigation/CalendarShare.vue | 31 | ||||
-rw-r--r-- | src/utils/url.js | 31 | ||||
-rw-r--r-- | tests/javascript/unit/utils/url.spec.js | 38 |
3 files changed, 90 insertions, 10 deletions
diff --git a/src/components/AppNavigation/CalendarShare.vue b/src/components/AppNavigation/CalendarShare.vue index 62c674d4..6833c30d 100644 --- a/src/components/AppNavigation/CalendarShare.vue +++ b/src/components/AppNavigation/CalendarShare.vue @@ -42,9 +42,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. :user-select="true" open-direction="bottom" track-by="user" - label="user" + label="displayName" @search-change="findSharee" - @change="shareCalendar" /> + @change="shareCalendar"> + <template #noResult> + <span>{{ noResult }}</span> + </template> + </Multiselect> </li> <!-- list of user or groups calendar is shared with --> <CalendarSharee v-for="sharee in calendar.shares" @@ -58,6 +62,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. <script> import CalendarSharee from './CalendarSharee.vue' import client from '../../services/cdav.js' +import { urldecode } from '../../utils/url' import Axios from '@nextcloud/axios' import { generateOcsUrl } from '@nextcloud/router' @@ -110,10 +115,7 @@ export default { * @param {boolean} data.isCircle is this a circle? */ shareCalendar({ user, displayName, uri, isGroup, isCircle }) { - const calendar = this.calendar - uri = decodeURI(uri) - user = decodeURI(user) - this.$store.dispatch('shareCalendar', { calendar, user, displayName, uri, isGroup, isCircle }) + this.$store.dispatch('shareCalendar', { calendar: this.calendar, user, displayName, uri, isGroup, isCircle }) }, /** @@ -170,7 +172,17 @@ export default { } return results.reduce((list, result) => { - if (hiddenPrincipals.includes(decodeURI(result.principalScheme))) { + if (['ROOM', 'RESOURCE'].includes(result.calendarUserType)) { + return list + } + + const isGroup = result.calendarUserType === 'GROUP' + + // TODO: Why do we have to decode those two values? + const user = urldecode(result[isGroup ? 'groupId' : 'userId']) + const decodedPrincipalScheme = urldecode(result.principalScheme) + + if (hiddenPrincipals.includes(decodedPrincipalScheme)) { return list } if (hiddenUrls.includes(result.url)) { @@ -182,12 +194,11 @@ export default { return list } - const isGroup = result.calendarUserType === 'GROUP' list.push({ - user: result[isGroup ? 'groupId' : 'userId'], + user, displayName: result.displayname, icon: isGroup ? 'icon-group' : 'icon-user', - uri: result.principalScheme, + uri: decodedPrincipalScheme, isGroup, isCircle: false, isNoUser: isGroup, diff --git a/src/utils/url.js b/src/utils/url.js new file mode 100644 index 00000000..d0dce26d --- /dev/null +++ b/src/utils/url.js @@ -0,0 +1,31 @@ +/** + * Nextcloud - Tasks + * + * @copyright Copyright (c) 2021 Richard Steinmetz <richard@steinmetz.cloud> + * @author Richard Steinmetz <richard@steinmetz.cloud> + * @license AGPL-3.0-or-later + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +/** + * Works like urldecode() from php + * + * @see https://www.php.net/manual/en/function.urldecode.php + * @param {string} url The url to be decoded + * @return {string} The decoded url + */ +export function urldecode(url) { + return decodeURIComponent(url.replace(/\+/g, ' ')) +} diff --git a/tests/javascript/unit/utils/url.spec.js b/tests/javascript/unit/utils/url.spec.js new file mode 100644 index 00000000..c168e435 --- /dev/null +++ b/tests/javascript/unit/utils/url.spec.js @@ -0,0 +1,38 @@ +/** + * @copyright Copyright (c) 2021 Richard Steinmetz <richard@steinmetz.cloud> + * + * @author Richard Steinmetz <richard@steinmetz.cloud> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +import { urldecode } from '../../../../src/utils/url' + +describe('utils/url test suite', () => { + it('should decode urls encoded by php', () => { + const testData = [ + ['my+group+%2B%26%3F%25', 'my group +&?%'], + ['my%2520+group', 'my%20 group'], + ['group%20with%20spaces', 'group with spaces'], + ] + + for (const [encoded, expected] of testData) { + const decoded = urldecode(encoded) + expect(decoded).toEqual(expected) + } + }) +}) |