correctly check if an item is a folder or file. closes https://github.com/PhilippC/keepass2android/issues/2589

This commit is contained in:
Philipp Crocoll
2025-07-15 09:10:41 +02:00
parent d6ce2a32e9
commit 3e6d86c206
2 changed files with 42 additions and 1 deletions

View File

@@ -290,7 +290,10 @@ public class WebDavStorage extends JavaFileStorageBase {
e.sizeInBytes = -1; e.sizeInBytes = -1;
} }
} }
e.isDirectory = r.href.endsWith("/");
e.isDirectory = r.href.endsWith("/") || okprop.IsCollection;
e.displayName = okprop.DisplayName; e.displayName = okprop.DisplayName;
if (e.displayName == null) if (e.displayName == null)

View File

@@ -57,6 +57,8 @@ public class PropfindXmlParser
public String DisplayName; public String DisplayName;
public String LastModified; public String LastModified;
public String ContentLength; public String ContentLength;
public boolean IsCollection;
} }
public String status; public String status;
public Prop prop; public Prop prop;
@@ -191,6 +193,8 @@ public class PropfindXmlParser
continue; continue;
} }
String name = parser.getName(); String name = parser.getName();
String namespace = parser.getNamespace();
android.util.Log.d("PARSE", "4name = " + name); android.util.Log.d("PARSE", "4name = " + name);
if (name.equals("getcontentlength")) if (name.equals("getcontentlength"))
@@ -200,6 +204,9 @@ public class PropfindXmlParser
prop.LastModified = readText(parser); prop.LastModified = readText(parser);
} else if (name.equals("displayname")) { } else if (name.equals("displayname")) {
prop.DisplayName = readText(parser); prop.DisplayName = readText(parser);
} else if (name.equals("resourcetype") && namespace.equals(ns)) {
// We found the <d:resourcetype> tag
prop.IsCollection = readResourceType(parser);
} else { } else {
skip(parser); skip(parser);
} }
@@ -208,6 +215,37 @@ public class PropfindXmlParser
return prop; 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 <d:collection/>, so it's a folder
isCollection = true;
// Since <d:collection/> 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 <d:resourcetype>
skip(parser);
}
}
// After reading all children of <d:resourcetype>, ensure we are at its END_TAG
parser.require(XmlPullParser.END_TAG, ns, "resourcetype");
return isCollection;
}
private void skip(XmlPullParser parser) throws XmlPullParserException, IOException { private void skip(XmlPullParser parser) throws XmlPullParserException, IOException {
android.util.Log.d("PARSE", "skipping " + parser.getName()); android.util.Log.d("PARSE", "skipping " + parser.getName());