123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- /**
- * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>
- *
- * @author John Molakvoæ <skjnldsv@protonmail.com>
- *
- * @license AGPL-3.0-or-later
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
- import { File, Folder, Permission, davParsePermissions } from '@nextcloud/files'
- import { generateRemoteUrl } from '@nextcloud/router'
- import { getClient, rootPath } from './WebdavClient'
- import { getCurrentUser } from '@nextcloud/auth'
- import { getDavNameSpaces, getDavProperties } from './DavProperties'
- import type { ContentsWithRoot } from './Navigation'
- import type { FileStat, ResponseDataDetailed, DAVResultResponseProps } from 'webdav'
-
- const client = getClient(generateRemoteUrl('dav'))
-
- const lastTwoWeeksTimestamp = Math.round((Date.now() / 1000) - (60 * 60 * 24 * 14))
- const searchPayload = `<?xml version="1.0" encoding="UTF-8"?>
- <d:searchrequest ${getDavNameSpaces()}
- xmlns:ns="https://github.com/icewind1991/SearchDAV/ns">
- <d:basicsearch>
- <d:select>
- <d:prop>
- ${getDavProperties()}
- </d:prop>
- </d:select>
- <d:from>
- <d:scope>
- <d:href>/files/${getCurrentUser()?.uid}/</d:href>
- <d:depth>infinity</d:depth>
- </d:scope>
- </d:from>
- <d:where>
- <d:and>
- <d:or>
- <d:not>
- <d:eq>
- <d:prop>
- <d:getcontenttype/>
- </d:prop>
- <d:literal>httpd/unix-directory</d:literal>
- </d:eq>
- </d:not>
- <d:eq>
- <d:prop>
- <oc:size/>
- </d:prop>
- <d:literal>0</d:literal>
- </d:eq>
- </d:or>
- <d:gt>
- <d:prop>
- <d:getlastmodified/>
- </d:prop>
- <d:literal>${lastTwoWeeksTimestamp}</d:literal>
- </d:gt>
- </d:and>
- </d:where>
- <d:orderby>
- <d:order>
- <d:prop>
- <d:getlastmodified/>
- </d:prop>
- <d:descending/>
- </d:order>
- </d:orderby>
- <d:limit>
- <d:nresults>100</d:nresults>
- <ns:firstresult>0</ns:firstresult>
- </d:limit>
- </d:basicsearch>
- </d:searchrequest>`
-
- interface ResponseProps extends DAVResultResponseProps {
- permissions: string,
- fileid: number,
- size: number,
- }
-
- const resultToNode = function(node: FileStat): File | Folder {
- const props = node.props as ResponseProps
- const permissions = davParsePermissions(props?.permissions)
- const owner = getCurrentUser()?.uid as string
-
- const nodeData = {
- id: props?.fileid as number || 0,
- source: generateRemoteUrl('dav' + node.filename),
- mtime: new Date(node.lastmod),
- mime: node.mime as string,
- size: props?.size as number || 0,
- permissions,
- owner,
- root: rootPath,
- attributes: {
- ...node,
- ...props,
- hasPreview: props?.['has-preview'],
- },
- }
-
- delete nodeData.attributes.props
-
- return node.type === 'file'
- ? new File(nodeData)
- : new Folder(nodeData)
- }
-
- export const getContents = async (path = '/'): Promise<ContentsWithRoot> => {
- const contentsResponse = await client.getDirectoryContents(path, {
- details: true,
- data: searchPayload,
- headers: {
- // Patched in WebdavClient.ts
- method: 'SEARCH',
- // Somehow it's needed to get the correct response
- 'Content-Type': 'application/xml; charset=utf-8',
- },
- deep: true,
- }) as ResponseDataDetailed<FileStat[]>
-
- const contents = contentsResponse.data
-
- return {
- folder: new Folder({
- id: 0,
- source: generateRemoteUrl('dav' + rootPath),
- root: rootPath,
- owner: getCurrentUser()?.uid || null,
- permissions: Permission.READ,
- }),
- contents: contents.map(resultToNode),
- }
- }
|