Skip to content

Commit 8f7831d

Browse files
authored
Merge pull request #45575 from nextcloud/fix/new-folder-refresh
[stable28] fix: Refresh file picker on folder creation
2 parents 49b9704 + 837b246 commit 8f7831d

File tree

141 files changed

+553
-728
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

141 files changed

+553
-728
lines changed

apps/comments/src/services/DavClient.js

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,23 @@
2222

2323
import { createClient } from 'webdav'
2424
import { getRootPath } from '../utils/davUtils.js'
25-
import { getRequestToken } from '@nextcloud/auth'
25+
import { getRequestToken, onRequestTokenUpdate } from '@nextcloud/auth'
2626

2727
// init webdav client
28-
const client = createClient(getRootPath(), {
29-
headers: {
30-
// Add this so the server knows it is an request from the browser
31-
'X-Requested-With': 'XMLHttpRequest',
32-
// Inject user auth
33-
requesttoken: getRequestToken() ?? '',
34-
},
35-
})
28+
const client = createClient(getRootPath())
29+
30+
// set CSRF token header
31+
const setHeaders = (token) => {
32+
client.setHeaders({
33+
// Add this so the server knows it is an request from the browser
34+
'X-Requested-With': 'XMLHttpRequest',
35+
// Inject user auth
36+
requesttoken: token ?? '',
37+
})
38+
}
39+
40+
// refresh headers when request token changes
41+
onRequestTokenUpdate(setHeaders)
42+
setHeaders(getRequestToken())
3643

3744
export default client

apps/comments/src/services/GetComments.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323
import { parseXML, type DAVResult, type FileStat, type ResponseDataDetailed } from 'webdav'
2424

2525
// https://github.com/perry-mitchell/webdav-client/issues/339
26-
import { processResponsePayload } from '../../../../node_modules/webdav/dist/node/response.js'
27-
import { prepareFileFromProps } from '../../../../node_modules/webdav/dist/node/tools/dav.js'
26+
import { processResponsePayload } from 'webdav/dist/node/response.js'
27+
import { prepareFileFromProps } from 'webdav/dist/node/tools/dav.js'
2828
import client from './DavClient.js'
2929

3030
export const DEFAULT_LIMIT = 20
@@ -77,10 +77,8 @@ const getDirectoryFiles = function(
7777
// Map all items to a consistent output structure (results)
7878
return responseItems.map(item => {
7979
// Each item should contain a stat object
80-
const {
81-
propstat: { prop: props },
82-
} = item
80+
const props = item.propstat!.prop!;
8381

84-
return prepareFileFromProps(props, props.id.toString(), isDetailed)
82+
return prepareFileFromProps(props, props.id!.toString(), isDetailed)
8583
})
8684
}

apps/dav/src/dav/client.js

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,29 @@
1919
* along with this program. If not, see <http://www.gnu.org/licenses/>.
2020
*/
2121

22-
import * as webdav from 'webdav'
23-
import axios from '@nextcloud/axios'
22+
import { createClient } from 'webdav'
2423
import memoize from 'lodash/fp/memoize.js'
2524
import { generateRemoteUrl } from '@nextcloud/router'
26-
import { getCurrentUser } from '@nextcloud/auth'
25+
import { getCurrentUser, getRequestToken, onRequestTokenUpdate } from '@nextcloud/auth'
2726

2827
export const getClient = memoize((service) => {
29-
// Add this so the server knows it is an request from the browser
30-
axios.defaults.headers['X-Requested-With'] = 'XMLHttpRequest'
28+
// init webdav client
29+
const remote = generateRemoteUrl(`dav/${service}/${getCurrentUser().uid}`)
30+
const client = createClient(remote)
3131

32-
// force our axios
33-
const patcher = webdav.getPatcher()
34-
patcher.patch('request', axios)
32+
// set CSRF token header
33+
const setHeaders = (token) => {
34+
client.setHeaders({
35+
// Add this so the server knows it is an request from the browser
36+
'X-Requested-With': 'XMLHttpRequest',
37+
// Inject user auth
38+
requesttoken: token ?? '',
39+
})
40+
}
3541

36-
return webdav.createClient(
37-
generateRemoteUrl(`dav/${service}/${getCurrentUser().uid}`)
38-
)
42+
// refresh headers when request token changes
43+
onRequestTokenUpdate(setHeaders)
44+
setHeaders(getRequestToken())
45+
46+
return client;
3947
})

apps/files/src/actions/deleteAction.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import { action } from './deleteAction'
2323
import { expect } from '@jest/globals'
2424
import { File, Folder, Permission, View, FileAction } from '@nextcloud/files'
25-
import * as eventBus from '@nextcloud/event-bus'
25+
import eventBus from '@nextcloud/event-bus'
2626
import axios from '@nextcloud/axios'
2727

2828
import logger from '../logger'

apps/files/src/actions/favoriteAction.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import { action } from './favoriteAction'
2323
import { expect } from '@jest/globals'
2424
import { File, Permission, View, FileAction } from '@nextcloud/files'
25-
import * as eventBus from '@nextcloud/event-bus'
25+
import eventBus from '@nextcloud/event-bus'
2626
import * as favoriteAction from './favoriteAction'
2727
import axios from '@nextcloud/axios'
2828
import logger from '../logger'

apps/files/src/actions/renameAction.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import { action } from './renameAction'
2323
import { expect } from '@jest/globals'
2424
import { File, Permission, View, FileAction } from '@nextcloud/files'
25-
import * as eventBus from '@nextcloud/event-bus'
25+
import eventBus from '@nextcloud/event-bus'
2626

2727
const view = {
2828
id: 'files',

apps/files/src/eventbus.d.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import type { Node } from '@nextcloud/files'
2+
3+
declare module '@nextcloud/event-bus' {
4+
export interface NextcloudEvents {
5+
// mapping of 'event name' => 'event type'
6+
'files:favorites:removed': Node
7+
'files:favorites:added': Node
8+
}
9+
}
10+
11+
export {}

apps/files/src/services/WebdavClient.ts

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,22 +19,30 @@
1919
* along with this program. If not, see <http://www.gnu.org/licenses/>.
2020
*
2121
*/
22-
import type { RequestOptions, Response } from 'webdav'
2322

2423
import { createClient, getPatcher } from 'webdav'
2524
import { generateRemoteUrl } from '@nextcloud/router'
26-
import { getCurrentUser, getRequestToken } from '@nextcloud/auth'
27-
import { request } from 'webdav/dist/node/request.js'
25+
import { getCurrentUser, getRequestToken, onRequestTokenUpdate } from '@nextcloud/auth'
2826

2927
export const rootPath = `/files/${getCurrentUser()?.uid}`
3028
export const defaultRootUrl = generateRemoteUrl('dav' + rootPath)
3129

3230
export const getClient = (rootUrl = defaultRootUrl) => {
33-
const client = createClient(rootUrl, {
34-
headers: {
35-
requesttoken: getRequestToken() || '',
36-
},
37-
})
31+
const client = createClient(rootUrl)
32+
33+
// set CSRF token header
34+
const setHeaders = (token: string | null) => {
35+
client?.setHeaders({
36+
// Add this so the server knows it is an request from the browser
37+
'X-Requested-With': 'XMLHttpRequest',
38+
// Inject user auth
39+
requesttoken: token ?? '',
40+
});
41+
}
42+
43+
// refresh headers when request token changes
44+
onRequestTokenUpdate(setHeaders)
45+
setHeaders(getRequestToken())
3846

3947
/**
4048
* Allow to override the METHOD to support dav REPORT
@@ -45,12 +53,14 @@ export const getClient = (rootUrl = defaultRootUrl) => {
4553
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
4654
// @ts-ignore
4755
// https://github.com/perry-mitchell/hot-patcher/issues/6
48-
patcher.patch('request', (options: RequestOptions): Promise<Response> => {
49-
if (options.headers?.method) {
50-
options.method = options.headers.method
51-
delete options.headers.method
56+
patcher.patch('fetch', (url: string, options: RequestInit): Promise<Response> => {
57+
const headers = options.headers as Record<string, string>
58+
if (headers?.method) {
59+
options.method = headers.method
60+
delete headers.method
5261
}
53-
return request(options)
62+
return fetch(url, options)
5463
})
55-
return client
64+
65+
return client;
5666
}

apps/files/src/views/favorites.spec.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
/* eslint-disable import/no-named-as-default-member */
12
/**
23
* @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>
34
*
@@ -22,7 +23,7 @@
2223
import { basename } from 'path'
2324
import { expect } from '@jest/globals'
2425
import { Folder, Navigation, getNavigation } from '@nextcloud/files'
25-
import * as eventBus from '@nextcloud/event-bus'
26+
import eventBus from '@nextcloud/event-bus'
2627
import * as initialState from '@nextcloud/initial-state'
2728

2829
import { action } from '../actions/favoriteAction'

apps/files_sharing/src/actions/acceptShareAction.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import { action } from './acceptShareAction'
2323
import { expect } from '@jest/globals'
2424
import { File, Permission, View, FileAction } from '@nextcloud/files'
25-
import * as eventBus from '@nextcloud/event-bus'
25+
import eventBus from '@nextcloud/event-bus'
2626
import axios from '@nextcloud/axios'
2727
import '../main'
2828

0 commit comments

Comments
 (0)