From e2f94343c543df278c23e7d098139b3816e606d3 Mon Sep 17 00:00:00 2001 From: Yasin Wachendorfer Date: Wed, 24 Jan 2024 11:10:27 +0100 Subject: [PATCH 1/3] Fix parsing of option dates causes crashes --- lib/src/xml.dart | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/lib/src/xml.dart b/lib/src/xml.dart index 4c1eda8..2c816a2 100644 --- a/lib/src/xml.dart +++ b/lib/src/xml.dart @@ -83,15 +83,25 @@ class WebdavXml { // create time final cTimeElements = findElements(prop, 'creationdate'); - DateTime? cTime = cTimeElements.isNotEmpty - ? DateTime.parse(cTimeElements.single.text).toLocal() - : null; + DateTime? cTime; + try { + cTime = cTimeElements.isNotEmpty + ? DateTime.parse(cTimeElements.single.text).toLocal() + : null; + } catch (e) { + cTime = null; + } // modified time final mTimeElements = findElements(prop, 'getlastmodified'); - DateTime? mTime = mTimeElements.isNotEmpty - ? str2LocalTime(mTimeElements.single.text) - : null; + DateTime? mTime; + try { + mTime = mTimeElements.isNotEmpty + ? str2LocalTime(mTimeElements.single.text) + : null; + } catch (e) { + mTime = null; + } // var str = Uri.decodeFull(href); From fafe4eb5833e15408539b7e375a781b9431fa270 Mon Sep 17 00:00:00 2001 From: Yasin Wachendorfer Date: Mon, 7 Oct 2024 15:12:06 +0200 Subject: [PATCH 2/3] Adjust handling of second 409 --- lib/src/client.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/src/client.dart b/lib/src/client.dart index 56cf7d9..6d8f1d0 100644 --- a/lib/src/client.dart +++ b/lib/src/client.dart @@ -95,6 +95,7 @@ class Client { /// Recursively create folders Future mkdirAll(String path, [CancelToken? cancelToken]) async { path = fixSlashes(path); + var resp = await this.c.wdMkcol(this, path, cancelToken: cancelToken); var status = resp.statusCode; if (status == 201 || status == 405) { @@ -107,9 +108,10 @@ class Client { continue; } sub += e + '/'; + resp = await this.c.wdMkcol(this, sub, cancelToken: cancelToken); status = resp.statusCode; - if (status != 201 && status != 405) { + if (status != 201 && status != 405 && status != 409) { throw newResponseError(resp); } } From d67d6c090348564c9f8e6b106a2b2730bb8ae44d Mon Sep 17 00:00:00 2001 From: Daniel Kononov Date: Thu, 28 Nov 2024 12:02:33 +0100 Subject: [PATCH 3/3] REL-5239: extract displayname from props and handle filenames/paths with URI nonconform characters --- lib/src/xml.dart | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/lib/src/xml.dart b/lib/src/xml.dart index 2c816a2..bd4344a 100644 --- a/lib/src/xml.dart +++ b/lib/src/xml.dart @@ -103,10 +103,35 @@ class WebdavXml { mTime = null; } - // - var str = Uri.decodeFull(href); - var name = path2Name(str); - var filePath = path + name + (isDir ? '/' : ''); + // displayname + final displayNameElements = findElements(prop, 'displayname'); + String? displayName = displayNameElements.isNotEmpty + ? displayNameElements.single.text + : null; + + // Try to parse href to Uri. Use encoded version of hrefas fallback + // so filename with special characters wont lead to crash + var hrefAsUri = + Uri.tryParse(href) ?? Uri.tryParse(Uri.encodeFull(href)); + + String pathElementName; + String name; + // use manual path splitting as fallback + if (hrefAsUri != null) { + pathElementName = hrefAsUri.pathSegments.lastWhere( + (element) => element != "", + orElse: () => path2Name(href), + ); + } else { + pathElementName = path2Name(href); + } + + // some WebDav serve provides a custom name for path, if not use jsut the path name + name = displayName ?? pathElementName; + // uri.pathSegments will be decoded so we need to encode it back to sue + // it as path for further requests + var filePath = + path + Uri.encodeFull(pathElementName) + (isDir ? '/' : ''); files.add(File( path: filePath,