]> source.dussan.org Git - nextcloud-server.git/commitdiff
feat(core): offer clipboard fallback for non-secure environments
authorskjnldsv <skjnldsv@protonmail.com>
Fri, 8 Nov 2024 07:44:28 +0000 (08:44 +0100)
committerskjnldsv <skjnldsv@protonmail.com>
Fri, 8 Nov 2024 13:01:33 +0000 (14:01 +0100)
Signed-off-by: skjnldsv <skjnldsv@protonmail.com>
core/src/init.js
core/src/utils/ClipboardFallback.ts [new file with mode: 0644]

index fab97d2ee2b090c4578a8c16aa7ffcf33518aa85..9e10a6941e14ad129b21a04a458a08c7c7107d5d 100644 (file)
@@ -14,6 +14,7 @@ import { setUp as setUpContactsMenu } from './components/ContactsMenu.js'
 import { setUp as setUpMainMenu } from './components/MainMenu.js'
 import { setUp as setUpUserMenu } from './components/UserMenu.js'
 import { interceptRequests } from './utils/xhr-request.js'
+import { initFallbackClipboardAPI } from './utils/ClipboardFallback.ts'
 
 // keep in sync with core/css/variables.scss
 const breakpointMobileWidth = 1024
@@ -58,6 +59,7 @@ moment.locale(locale)
  */
 export const initCore = () => {
        interceptRequests()
+       initFallbackClipboardAPI()
 
        $(window).on('unload.main', () => { OC._unloadCalled = true })
        $(window).on('beforeunload.main', () => {
diff --git a/core/src/utils/ClipboardFallback.ts b/core/src/utils/ClipboardFallback.ts
new file mode 100644 (file)
index 0000000..b374f9d
--- /dev/null
@@ -0,0 +1,47 @@
+/**
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import { t } from '@nextcloud/l10n'
+
+/**
+ *
+ * @param text
+ */
+function unsecuredCopyToClipboard(text) {
+       const textArea = document.createElement('textarea')
+       const textAreaContent = document.createTextNode(text)
+       textArea.appendChild(textAreaContent)
+       document.body.appendChild(textArea)
+
+       textArea.focus({ preventScroll: true })
+       textArea.select()
+
+       try {
+               // This is a fallback for browsers that do not support the Clipboard API
+               // execCommand is deprecated, but it is the only way to copy text to the clipboard in some browsers
+               document.execCommand('copy')
+       } catch (err) {
+               window.prompt(t('core', 'Clipboard not available, please copy manually'), text)
+               console.error('[ERROR] core:  files Unable to copy to clipboard', err)
+       }
+
+       document.body.removeChild(textArea)
+}
+
+/**
+ *
+ */
+function initFallbackClipboardAPI() {
+       if (!window.navigator?.clipboard?.writeText) {
+               console.info('[INFO] core: Clipboard API not available, using fallback')
+               Object.defineProperty(window.navigator, 'clipboard', {
+                       value: {
+                               writeText: unsecuredCopyToClipboard,
+                       },
+                       writable: false,
+               })
+       }
+}
+
+export { initFallbackClipboardAPI }