diff --git a/changelog/unreleased/bugfix-unique-request-ids b/changelog/unreleased/bugfix-unique-request-ids new file mode 100644 index 00000000000..d64ef732144 --- /dev/null +++ b/changelog/unreleased/bugfix-unique-request-ids @@ -0,0 +1,6 @@ +Bugfix: Unique request ids + +We've fixed an issue where the request ids for upload- and worker-requests were not unique. + +https://github.com/owncloud/web/pull/11929 +https://github.com/owncloud/web/issues/11925 diff --git a/packages/web-pkg/src/composables/upload/useUpload.ts b/packages/web-pkg/src/composables/upload/useUpload.ts index 3a2d773b97a..f9d69fcaf1f 100644 --- a/packages/web-pkg/src/composables/upload/useUpload.ts +++ b/packages/web-pkg/src/composables/upload/useUpload.ts @@ -1,10 +1,12 @@ import { computed, unref, watch } from 'vue' +import { v4 as uuidV4 } from 'uuid' import { UppyService } from '../../services/uppy/uppyService' -import { useCapabilityStore } from '../piniaStores' +import { useAuthStore, useCapabilityStore } from '../piniaStores' import { TusOptions } from '@uppy/tus' import { XHRUploadOptions } from '@uppy/xhr-upload' import { UppyFile } from '@uppy/core' -import { useRequestHeaders } from '../requestHeaders' +import { useClientService } from '../clientService' +import { useGettext } from 'vue3-gettext' interface UploadOptions { uppyService: UppyService @@ -12,18 +14,38 @@ interface UploadOptions { export function useUpload(options: UploadOptions) { const capabilityStore = useCapabilityStore() - const { headers } = useRequestHeaders() + const authStore = useAuthStore() + const clientService = useClientService() + const language = useGettext() const isTusSupported = computed(() => capabilityStore.tusMaxChunkSize > 0) + const getHeaders = () => { + const headers: Record = {} + + if (authStore.publicLinkPassword) { + headers['Authorization'] = + 'Basic ' + + Buffer.from(['public', authStore.publicLinkPassword].join(':')).toString('base64') + } else if (authStore.accessToken && !authStore.publicLinkPassword) { + headers['Authorization'] = 'Bearer ' + authStore.accessToken + } + + headers['X-Request-ID'] = uuidV4() + headers['Accept-Language'] = language.current + headers['Initiator-ID'] = clientService.initiatorId + return headers + } + const tusOptions = computed(() => { const options: TusOptions = { onBeforeRequest: (req, file) => new Promise((resolve) => { - req.setHeader('Authorization', unref(headers).Authorization) - req.setHeader('X-Request-ID', unref(headers)['X-Request-ID']) - req.setHeader('Accept-Language', unref(headers)['Accept-Language']) - req.setHeader('Initiator-ID', unref(headers)['Initiator-ID']) + const headers = getHeaders() + req.setHeader('Authorization', headers.Authorization) + req.setHeader('X-Request-ID', headers['X-Request-ID']) + req.setHeader('Accept-Language', headers['Accept-Language']) + req.setHeader('Initiator-ID', headers['Initiator-ID']) if (file?.isRemote) { req.setHeader('x-oc-mtime', (file?.data?.lastModified / 1000).toString()) } @@ -37,7 +59,7 @@ export function useUpload(options: UploadOptions) { // FIXME: remove if cloud upload still works without this ;(options as any)['headers'] = (file: UppyFile) => { if (!!file.xhrUpload || file?.isRemote) { - return { 'x-oc-mtime': file?.data?.lastModified / 1000, ...unref(headers) } + return { 'x-oc-mtime': file?.data?.lastModified / 1000, ...getHeaders() } } } @@ -50,7 +72,7 @@ export function useUpload(options: UploadOptions) { endpoint: '', headers: (file) => ({ 'x-oc-mtime': file?.data?.lastModified / 1000, - ...unref(headers) + ...getHeaders() }) } }) diff --git a/packages/web-pkg/src/composables/webWorkers/deleteWorker/useDeleteWorker.ts b/packages/web-pkg/src/composables/webWorkers/deleteWorker/useDeleteWorker.ts index 0d2bb9dd2e7..ccac9f32368 100644 --- a/packages/web-pkg/src/composables/webWorkers/deleteWorker/useDeleteWorker.ts +++ b/packages/web-pkg/src/composables/webWorkers/deleteWorker/useDeleteWorker.ts @@ -85,7 +85,10 @@ export const useDeleteWorker = ({ resources, concurrentRequests, baseUrl: configStore.serverUrl, - headers: unref(headers) + headers: { + ...unref(headers), + 'X-Request-ID': undefined // is being generated by the dav client in the worker + } } }) } diff --git a/packages/web-pkg/src/composables/webWorkers/pasteWorker/usePasteWorker.ts b/packages/web-pkg/src/composables/webWorkers/pasteWorker/usePasteWorker.ts index 96f6123f1bd..db7bb258190 100644 --- a/packages/web-pkg/src/composables/webWorkers/pasteWorker/usePasteWorker.ts +++ b/packages/web-pkg/src/composables/webWorkers/pasteWorker/usePasteWorker.ts @@ -66,7 +66,10 @@ export const usePasteWorker = () => { data: { transferData, baseUrl: configStore.serverUrl, - headers: unref(headers) + headers: { + ...unref(headers), + 'X-Request-ID': undefined // is being generated by the dav client in the worker + } } }) } diff --git a/packages/web-pkg/src/composables/webWorkers/restoreWorker/useRestoreWorker.ts b/packages/web-pkg/src/composables/webWorkers/restoreWorker/useRestoreWorker.ts index f879ad5638f..6e140af3be9 100644 --- a/packages/web-pkg/src/composables/webWorkers/restoreWorker/useRestoreWorker.ts +++ b/packages/web-pkg/src/composables/webWorkers/restoreWorker/useRestoreWorker.ts @@ -84,7 +84,10 @@ export const useRestoreWorker = () => { resources, missingFolderPaths, baseUrl: configStore.serverUrl, - headers: unref(headers) + headers: { + ...unref(headers), + 'X-Request-ID': undefined // is being generated by the dav client in the worker + } } }) }