From 3e6d86c206e52bbae6b83d50d06fddc57ba6be46 Mon Sep 17 00:00:00 2001 From: Philipp Crocoll Date: Tue, 15 Jul 2025 09:10:41 +0200 Subject: [PATCH] correctly check if an item is a folder or file. closes https://github.com/PhilippC/keepass2android/issues/2589 --- .../javafilestorage/WebDavStorage.java | 5 ++- .../webdav/PropfindXmlParser.java | 38 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/WebDavStorage.java b/src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/WebDavStorage.java index 26710fdf..fd3b6386 100644 --- a/src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/WebDavStorage.java +++ b/src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/WebDavStorage.java @@ -290,7 +290,10 @@ public class WebDavStorage extends JavaFileStorageBase { e.sizeInBytes = -1; } } - e.isDirectory = r.href.endsWith("/"); + + e.isDirectory = r.href.endsWith("/") || okprop.IsCollection; + + e.displayName = okprop.DisplayName; if (e.displayName == null) diff --git a/src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/webdav/PropfindXmlParser.java b/src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/webdav/PropfindXmlParser.java index 59ed2034..f424fb27 100644 --- a/src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/webdav/PropfindXmlParser.java +++ b/src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/webdav/PropfindXmlParser.java @@ -57,6 +57,8 @@ public class PropfindXmlParser public String DisplayName; public String LastModified; public String ContentLength; + + public boolean IsCollection; } public String status; public Prop prop; @@ -191,6 +193,8 @@ public class PropfindXmlParser continue; } String name = parser.getName(); + String namespace = parser.getNamespace(); + android.util.Log.d("PARSE", "4name = " + name); if (name.equals("getcontentlength")) @@ -200,6 +204,9 @@ public class PropfindXmlParser prop.LastModified = readText(parser); } else if (name.equals("displayname")) { prop.DisplayName = readText(parser); + } else if (name.equals("resourcetype") && namespace.equals(ns)) { + // We found the tag + prop.IsCollection = readResourceType(parser); } else { skip(parser); } @@ -208,6 +215,37 @@ public class PropfindXmlParser return prop; } + private boolean readResourceType(XmlPullParser parser) throws IOException, XmlPullParserException { + boolean isCollection = false; + parser.require(XmlPullParser.START_TAG, ns, "resourcetype"); + + while (parser.next() != XmlPullParser.END_TAG) { + + if (parser.getEventType() != XmlPullParser.START_TAG) { + continue; + } + String name = parser.getName(); + String namespace = parser.getNamespace(); + + if (name.equals("collection") && namespace.equals(ns)) { + // We found , so it's a folder + isCollection = true; + // Since is usually an empty tag, just consume it. + // It might contain text if there's whitespace, so consume text then end tag. + if (parser.next() == XmlPullParser.TEXT) { + parser.nextTag(); // Move to the end tag + } + parser.require(XmlPullParser.END_TAG, ns, "collection"); + } else { + // Skip any other unexpected tags within + skip(parser); + } + } + // After reading all children of , ensure we are at its END_TAG + parser.require(XmlPullParser.END_TAG, ns, "resourcetype"); + return isCollection; + } + private void skip(XmlPullParser parser) throws XmlPullParserException, IOException { android.util.Log.d("PARSE", "skipping " + parser.getName());