diff options
author | Varun Patil <varunpatil@ucla.edu> | 2024-05-29 15:17:49 -0700 |
---|---|---|
committer | Christopher Ng <chrng8@gmail.com> | 2024-05-31 15:38:45 -0700 |
commit | 39ddfb07b59fba74d00a49194bdb16b521d01e6a (patch) | |
tree | 17329f3080a0a47056456c7817210e0d8fa3b687 /apps | |
parent | 0f90cc97ca653a16f19769ba6d5c31a68196d136 (diff) | |
download | nextcloud-server-39ddfb07b59fba74d00a49194bdb16b521d01e6a.tar.gz nextcloud-server-39ddfb07b59fba74d00a49194bdb16b521d01e6a.zip |
fix(dav): multiple fixes in usage of webdav library
1. Refresh token on update
2. Fix some very weird imports
3. Patch fetch instead of request to prevent accessing impl details
Signed-off-by: Varun Patil <varunpatil@ucla.edu>
Diffstat (limited to 'apps')
-rw-r--r-- | apps/comments/src/services/DavClient.js | 25 | ||||
-rw-r--r-- | apps/comments/src/services/GetComments.ts | 10 | ||||
-rw-r--r-- | apps/dav/src/dav/client.js | 30 | ||||
-rw-r--r-- | apps/files/src/services/WebdavClient.ts | 38 | ||||
-rw-r--r-- | apps/files_trashbin/src/services/client.ts | 25 | ||||
-rw-r--r-- | apps/files_versions/src/utils/davClient.js | 30 | ||||
-rw-r--r-- | apps/systemtags/src/services/davClient.ts | 22 |
7 files changed, 117 insertions, 63 deletions
diff --git a/apps/comments/src/services/DavClient.js b/apps/comments/src/services/DavClient.js index 5c2fc96e4db..78bc056357e 100644 --- a/apps/comments/src/services/DavClient.js +++ b/apps/comments/src/services/DavClient.js @@ -22,16 +22,23 @@ import { createClient } from 'webdav' import { getRootPath } from '../utils/davUtils.js' -import { getRequestToken } from '@nextcloud/auth' +import { getRequestToken, onRequestTokenUpdate } from '@nextcloud/auth' // init webdav client -const client = createClient(getRootPath(), { - headers: { - // Add this so the server knows it is an request from the browser - 'X-Requested-With': 'XMLHttpRequest', - // Inject user auth - requesttoken: getRequestToken() ?? '', - }, -}) +const client = createClient(getRootPath()) + +// set CSRF token header +const setHeaders = (token) => { + client.setHeaders({ + // Add this so the server knows it is an request from the browser + 'X-Requested-With': 'XMLHttpRequest', + // Inject user auth + requesttoken: token ?? '', + }) +} + +// refresh headers when request token changes +onRequestTokenUpdate(setHeaders) +setHeaders(getRequestToken()) export default client diff --git a/apps/comments/src/services/GetComments.ts b/apps/comments/src/services/GetComments.ts index c55cb4ee4a0..0736632192d 100644 --- a/apps/comments/src/services/GetComments.ts +++ b/apps/comments/src/services/GetComments.ts @@ -23,8 +23,8 @@ import { parseXML, type DAVResult, type FileStat, type ResponseDataDetailed } from 'webdav' // https://github.com/perry-mitchell/webdav-client/issues/339 -import { processResponsePayload } from '../../../../node_modules/webdav/dist/node/response.js' -import { prepareFileFromProps } from '../../../../node_modules/webdav/dist/node/tools/dav.js' +import { processResponsePayload } from 'webdav/dist/node/response.js' +import { prepareFileFromProps } from 'webdav/dist/node/tools/dav.js' import client from './DavClient.js' export const DEFAULT_LIMIT = 20 @@ -77,10 +77,8 @@ const getDirectoryFiles = function( // Map all items to a consistent output structure (results) return responseItems.map(item => { // Each item should contain a stat object - const { - propstat: { prop: props }, - } = item + const props = item.propstat!.prop!; - return prepareFileFromProps(props, props.id.toString(), isDetailed) + return prepareFileFromProps(props, props.id!.toString(), isDetailed) }) } diff --git a/apps/dav/src/dav/client.js b/apps/dav/src/dav/client.js index b053e585ce8..d6fe3d2680a 100644 --- a/apps/dav/src/dav/client.js +++ b/apps/dav/src/dav/client.js @@ -19,21 +19,29 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -import * as webdav from 'webdav' -import axios from '@nextcloud/axios' +import { createClient } from 'webdav' import memoize from 'lodash/fp/memoize.js' import { generateRemoteUrl } from '@nextcloud/router' -import { getCurrentUser } from '@nextcloud/auth' +import { getCurrentUser, getRequestToken, onRequestTokenUpdate } from '@nextcloud/auth' export const getClient = memoize((service) => { - // Add this so the server knows it is an request from the browser - axios.defaults.headers['X-Requested-With'] = 'XMLHttpRequest' + // init webdav client + const remote = generateRemoteUrl(`dav/${service}/${getCurrentUser().uid}`) + const client = createClient(remote) - // force our axios - const patcher = webdav.getPatcher() - patcher.patch('request', axios) + // set CSRF token header + const setHeaders = (token) => { + client.setHeaders({ + // Add this so the server knows it is an request from the browser + 'X-Requested-With': 'XMLHttpRequest', + // Inject user auth + requesttoken: token ?? '', + }) + } - return webdav.createClient( - generateRemoteUrl(`dav/${service}/${getCurrentUser().uid}`) - ) + // refresh headers when request token changes + onRequestTokenUpdate(setHeaders) + setHeaders(getRequestToken()) + + return client; }) diff --git a/apps/files/src/services/WebdavClient.ts b/apps/files/src/services/WebdavClient.ts index ae2ab27b9db..6c98b299703 100644 --- a/apps/files/src/services/WebdavClient.ts +++ b/apps/files/src/services/WebdavClient.ts @@ -19,22 +19,30 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ -import type { RequestOptions, Response } from 'webdav' import { createClient, getPatcher } from 'webdav' import { generateRemoteUrl } from '@nextcloud/router' -import { getCurrentUser, getRequestToken } from '@nextcloud/auth' -import { request } from 'webdav/dist/node/request.js' +import { getCurrentUser, getRequestToken, onRequestTokenUpdate } from '@nextcloud/auth' export const rootPath = `/files/${getCurrentUser()?.uid}` export const defaultRootUrl = generateRemoteUrl('dav' + rootPath) export const getClient = (rootUrl = defaultRootUrl) => { - const client = createClient(rootUrl, { - headers: { - requesttoken: getRequestToken() || '', - }, - }) + const client = createClient(rootUrl) + + // set CSRF token header + const setHeaders = (token: string | null) => { + client?.setHeaders({ + // Add this so the server knows it is an request from the browser + 'X-Requested-With': 'XMLHttpRequest', + // Inject user auth + requesttoken: token ?? '', + }); + } + + // refresh headers when request token changes + onRequestTokenUpdate(setHeaders) + setHeaders(getRequestToken()) /** * Allow to override the METHOD to support dav REPORT @@ -45,12 +53,14 @@ export const getClient = (rootUrl = defaultRootUrl) => { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore // https://github.com/perry-mitchell/hot-patcher/issues/6 - patcher.patch('request', (options: RequestOptions): Promise<Response> => { - if (options.headers?.method) { - options.method = options.headers.method - delete options.headers.method + patcher.patch('fetch', (url: string, options: RequestInit): Promise<Response> => { + const headers = options.headers as Record<string, string> + if (headers?.method) { + options.method = headers.method + delete headers.method } - return request(options) + return fetch(url, options) }) - return client + + return client; } diff --git a/apps/files_trashbin/src/services/client.ts b/apps/files_trashbin/src/services/client.ts index 9fb3361839a..e9ea06a9a5e 100644 --- a/apps/files_trashbin/src/services/client.ts +++ b/apps/files_trashbin/src/services/client.ts @@ -19,15 +19,28 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ + import { createClient } from 'webdav' import { generateRemoteUrl } from '@nextcloud/router' -import { getCurrentUser, getRequestToken } from '@nextcloud/auth' +import { getCurrentUser, getRequestToken, onRequestTokenUpdate } from '@nextcloud/auth' +// init webdav client export const rootPath = `/trashbin/${getCurrentUser()?.uid}/trash` export const rootUrl = generateRemoteUrl('dav' + rootPath) -const client = createClient(rootUrl, { - headers: { - requesttoken: getRequestToken(), - }, -}) +const client = createClient(rootUrl) + +// set CSRF token header +const setHeaders = (token: string | null) => { + client.setHeaders({ + // Add this so the server knows it is an request from the browser + 'X-Requested-With': 'XMLHttpRequest', + // Inject user auth + requesttoken: token ?? '', + }) +} + +// refresh headers when request token changes +onRequestTokenUpdate(setHeaders) +setHeaders(getRequestToken()) + export default client diff --git a/apps/files_versions/src/utils/davClient.js b/apps/files_versions/src/utils/davClient.js index 022d34bbba4..b091935fc31 100644 --- a/apps/files_versions/src/utils/davClient.js +++ b/apps/files_versions/src/utils/davClient.js @@ -21,17 +21,25 @@ import { createClient } from 'webdav' import { generateRemoteUrl } from '@nextcloud/router' -import { getRequestToken } from '@nextcloud/auth' +import { getRequestToken, onRequestTokenUpdate } from '@nextcloud/auth' +// init webdav client const rootPath = 'dav' - -// init webdav client on default dav endpoint const remote = generateRemoteUrl(rootPath) -export default createClient(remote, { - headers: { - // Add this so the server knows it is an request from the browser - 'X-Requested-With': 'XMLHttpRequest', - // Inject user auth - requesttoken: getRequestToken() ?? '', - }, -}) +const client = createClient(remote) + +// set CSRF token header +const setHeaders = (token) => { + client.setHeaders({ + // Add this so the server knows it is an request from the browser + 'X-Requested-With': 'XMLHttpRequest', + // Inject user auth + requesttoken: token ?? '', + }) +} + +// refresh headers when request token changes +onRequestTokenUpdate(setHeaders) +setHeaders(getRequestToken()) + +export default client
\ No newline at end of file diff --git a/apps/systemtags/src/services/davClient.ts b/apps/systemtags/src/services/davClient.ts index 3ac327f65e5..399ebadf05a 100644 --- a/apps/systemtags/src/services/davClient.ts +++ b/apps/systemtags/src/services/davClient.ts @@ -22,12 +22,22 @@ import { createClient } from 'webdav' import { generateRemoteUrl } from '@nextcloud/router' -import { getRequestToken } from '@nextcloud/auth' +import { getRequestToken, onRequestTokenUpdate } from '@nextcloud/auth' +// init webdav client const rootUrl = generateRemoteUrl('dav') +export const davClient = createClient(rootUrl) -export const davClient = createClient(rootUrl, { - headers: { - requesttoken: getRequestToken() ?? '', - }, -}) +// set CSRF token header +const setHeaders = (token: string | null) => { + davClient.setHeaders({ + // Add this so the server knows it is an request from the browser + 'X-Requested-With': 'XMLHttpRequest', + // Inject user auth + requesttoken: token ?? '', + }) +} + +// refresh headers when request token changes +onRequestTokenUpdate(setHeaders) +setHeaders(getRequestToken()) |