From 5bfaa47c2d438cdff0e1aba8d8dd4c12296bd66a Mon Sep 17 00:00:00 2001 From: skjnldsv Date: Tue, 12 Nov 2024 12:00:12 +0100 Subject: [PATCH] fix(dav): crtime parsing and invalid date handling Signed-off-by: skjnldsv --- __tests__/dav/dav.spec.ts | 19 +++++++++++++++++++ lib/dav/dav.ts | 7 ++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/__tests__/dav/dav.spec.ts b/__tests__/dav/dav.spec.ts index e29d13e01..341311a5d 100644 --- a/__tests__/dav/dav.spec.ts +++ b/__tests__/dav/dav.spec.ts @@ -143,6 +143,25 @@ describe('davResultToNode', () => { const node = davResultToNode(remoteResult) expect(node.status).toBe(NodeStatus.FAILED) }) + + test('Ignore invalid times', () => { + vi.spyOn(auth, 'getCurrentUser').mockReturnValue({ uid: 'user1', displayName: 'User 1', isAdmin: false }) + + // Invalid dates + const remoteResult = { ...result } + remoteResult.lastmod = 'invalid' + remoteResult.props!.creationdate = 'invalid' + const node = davResultToNode(remoteResult) + expect(node.mtime).toBeUndefined() + expect(node.crtime).toBeUndefined() + + // Zero dates + remoteResult.lastmod = 'Thu, 01 Jan 1970 00:00:00 GMT' + remoteResult.props!.creationdate = 'Thu, 01 Jan 1970 00:00:00 GMT' + const node2 = davResultToNode(remoteResult) + expect(node2.mtime).toBeUndefined() + expect(node2.crtime).toBeUndefined() + }) }) describe('DAV requests', () => { diff --git a/lib/dav/dav.ts b/lib/dav/dav.ts index 1b4c5a71a..4e9648657 100644 --- a/lib/dav/dav.ts +++ b/lib/dav/dav.ts @@ -22,6 +22,7 @@ import { getSharingToken, isPublicShare } from '@nextcloud/sharing/public' * Nextcloud DAV result response */ interface ResponseProps extends DAVResultResponseProps { + creationdate: string permissions: string mime: string fileid: number @@ -174,10 +175,14 @@ export const davResultToNode = function(node: FileStat, filesRoot = davRootPath, const owner = String(props?.['owner-id'] || userId) const id = props.fileid || 0 + const mtime = new Date(Date.parse(node.lastmod)) + const crtime = new Date(Date.parse(props.creationdate)) + const nodeData: NodeData = { id, source: `${remoteURL}${node.filename}`, - mtime: new Date(Date.parse(node.lastmod)), + mtime: !isNaN(mtime.getTime()) && mtime.getTime() !== 0 ? mtime : undefined, + crtime: !isNaN(crtime.getTime()) && crtime.getTime() !== 0 ? crtime : undefined, mime: node.mime || 'application/octet-stream', // Manually cast to work around for https://github.com/perry-mitchell/webdav-client/pull/380 displayname: props.displayname !== undefined ? String(props.displayname) : undefined,