Skip to content

Commit

Permalink
Merge pull request #47037 from nextcloud/backport/46996/stable28
Browse files Browse the repository at this point in the history
[stable28] fix(trashbin): Correctly set original name as displayname
  • Loading branch information
susnux authored Aug 20, 2024
2 parents 2dea1a7 + d971047 commit 44cae23
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 69 deletions.
5 changes: 5 additions & 0 deletions apps/files_trashbin/lib/Sabre/TrashbinPlugin.php
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,11 @@ public function propFind(PropFind $propFind, INode $node) {
return;
}

// Pass the real filename as the DAV display name
$propFind->handle(FilesPlugin::DISPLAYNAME_PROPERTYNAME, function () use ($node) {
return $node->getFilename();
});

$propFind->handle(self::TRASHBIN_FILENAME, function () use ($node) {
return $node->getFilename();
});
Expand Down
25 changes: 4 additions & 21 deletions apps/files_trashbin/src/services/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,27 +20,10 @@
*
*/

import { createClient } from 'webdav'
import { generateRemoteUrl } from '@nextcloud/router'
import { getCurrentUser, getRequestToken, onRequestTokenUpdate } from '@nextcloud/auth'
import { getCurrentUser } from '@nextcloud/auth'
import { davGetClient } from '@nextcloud/files'

// init webdav client
// init WebDAV client
export const rootPath = `/trashbin/${getCurrentUser()?.uid}/trash`
export const rootUrl = generateRemoteUrl('dav' + rootPath)
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
export const client = davGetClient()
59 changes: 14 additions & 45 deletions apps/files_trashbin/src/services/trashbin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,69 +22,38 @@
import type { FileStat, ResponseDataDetailed } from 'webdav'
import type { ContentsWithRoot } from '@nextcloud/files'

import { File, Folder, davParsePermissions, getDavNameSpaces, getDavProperties } from '@nextcloud/files'
import { generateRemoteUrl, generateUrl } from '@nextcloud/router'
import { getCurrentUser } from '@nextcloud/auth'

import client, { rootPath } from './client'
import { File, Folder, davResultToNode, getDavNameSpaces, getDavProperties } from '@nextcloud/files'
import { client, rootPath } from './client'
import { generateUrl } from '@nextcloud/router'

const data = `<?xml version="1.0"?>
<d:propfind ${getDavNameSpaces()}>
<d:prop>
<nc:trashbin-filename />
<nc:trashbin-deletion-time />
<nc:trashbin-original-location />
<nc:trashbin-title />
${getDavProperties()}
</d:prop>
</d:propfind>`

const resultToNode = function(node: FileStat): File | Folder {
const permissions = davParsePermissions(node.props?.permissions)
const owner = getCurrentUser()?.uid as string
const previewUrl = generateUrl('/apps/files_trashbin/preview?fileId={fileid}&x=32&y=32', node.props)

const nodeData = {
id: node.props?.fileid as number || 0,
source: generateRemoteUrl('dav' + rootPath + node.filename),
// do not show the mtime column
// mtime: new Date(node.lastmod),
mime: node.mime as string,
size: node.props?.size as number || 0,
permissions,
owner,
root: rootPath,
attributes: {
...node,
...node.props,
// Override displayed name on the list
displayName: node.props?.['trashbin-filename'],
previewUrl,
},
}

delete nodeData.attributes.props

return node.type === 'file'
? new File(nodeData)
: new Folder(nodeData)
const resultToNode = (stat: FileStat): File | Folder => {
const node = davResultToNode(stat, rootPath)
node.attributes.previewUrl = generateUrl('/apps/files_trashbin/preview?fileId={fileid}&x=32&y=32', { fileid: node.fileid })
return node
}

export const getContents = async (path = '/'): Promise<ContentsWithRoot> => {
// TODO: use only one request when webdav-client supports it
// @see https://github.com/perry-mitchell/webdav-client/pull/334
const rootResponse = await client.stat(path, {
details: true,
data,
}) as ResponseDataDetailed<FileStat>

const contentsResponse = await client.getDirectoryContents(path, {
const contentsResponse = await client.getDirectoryContents(`${rootPath}${path}`, {
details: true,
data,
includeSelf: true,
}) as ResponseDataDetailed<FileStat[]>

const contents = contentsResponse.data.map(resultToNode)
const [folder] = contents.splice(contents.findIndex((node) => node.dirname === path), 1)

return {
folder: resultToNode(rootResponse.data) as Folder,
contents: contentsResponse.data.map(resultToNode),
folder: folder as Folder,
contents,
}
}
4 changes: 2 additions & 2 deletions dist/files_trashbin-init.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion dist/files_trashbin-init.js.map

Large diffs are not rendered by default.

0 comments on commit 44cae23

Please sign in to comment.