mirror of
https://github.com/nextcloud/desktop.git
synced 2024-11-30 05:24:13 +03:00
4d1ff01654
In case of denormalized paths in the dav href (presence of . or .. in the path) simple string startsWith comparison wasn't enough to know if said href ended up in the right namespace. That's why we're now using QUrl (pretending local file since we don't have a full URL in the href) to normalize the path before comparison. This could happen with broken proxies for instance where we would wrongly validate the dav information resulting in potentially surprising syncing and name collisions. Signed-off-by: Kevin Ottens <kevin.ottens@nextcloud.com>
620 lines
25 KiB
C++
620 lines
25 KiB
C++
/*
|
|
* This software is in the public domain, furnished "as is", without technical
|
|
* support, and with no warranty, express or implied, as to its usefulness for
|
|
* any purpose.
|
|
* */
|
|
|
|
#include <QtTest>
|
|
|
|
#include "networkjobs.h"
|
|
|
|
using namespace OCC;
|
|
|
|
class TestXmlParse : public QObject
|
|
{
|
|
Q_OBJECT
|
|
|
|
private:
|
|
bool _success;
|
|
QStringList _subdirs;
|
|
QStringList _items;
|
|
|
|
public slots:
|
|
void slotDirectoryListingSubFolders(const QStringList& list)
|
|
{
|
|
qDebug() << "subfolders: " << list;
|
|
_subdirs.append(list);
|
|
}
|
|
|
|
void slotDirectoryListingIterated(const QString& item, const QMap<QString,QString>& )
|
|
{
|
|
qDebug() << " item: " << item;
|
|
_items.append(item);
|
|
}
|
|
|
|
void slotFinishedSuccessfully()
|
|
{
|
|
_success = true;
|
|
}
|
|
|
|
private slots:
|
|
void init() {
|
|
qDebug() << Q_FUNC_INFO;
|
|
_success = false;
|
|
_subdirs.clear();
|
|
_items.clear();
|
|
}
|
|
|
|
void cleanup() {
|
|
}
|
|
|
|
|
|
void testParser1() {
|
|
const QByteArray testXml = "<?xml version='1.0' encoding='utf-8'?>"
|
|
"<d:multistatus xmlns:d=\"DAV:\" xmlns:s=\"http://sabredav.org/ns\" xmlns:oc=\"http://owncloud.org/ns\">"
|
|
"<d:response>"
|
|
"<d:href>/oc/remote.php/webdav/sharefolder/</d:href>"
|
|
"<d:propstat>"
|
|
"<d:prop>"
|
|
"<oc:id>00004213ocobzus5kn6s</oc:id>"
|
|
"<oc:permissions>RDNVCK</oc:permissions>"
|
|
"<oc:size>121780</oc:size>"
|
|
"<d:getetag>\"5527beb0400b0\"</d:getetag>"
|
|
"<d:resourcetype>"
|
|
"<d:collection/>"
|
|
"</d:resourcetype>"
|
|
"<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>"
|
|
"</d:prop>"
|
|
"<d:status>HTTP/1.1 200 OK</d:status>"
|
|
"</d:propstat>"
|
|
"<d:propstat>"
|
|
"<d:prop>"
|
|
"<d:getcontentlength/>"
|
|
"<oc:downloadURL/>"
|
|
"<oc:dDC/>"
|
|
"</d:prop>"
|
|
"<d:status>HTTP/1.1 404 Not Found</d:status>"
|
|
"</d:propstat>"
|
|
"</d:response>"
|
|
"<d:response>"
|
|
"<d:href>/oc/remote.php/webdav/sharefolder/quitte.pdf</d:href>"
|
|
"<d:propstat>"
|
|
"<d:prop>"
|
|
"<oc:id>00004215ocobzus5kn6s</oc:id>"
|
|
"<oc:permissions>RDNVW</oc:permissions>"
|
|
"<d:getetag>\"2fa2f0d9ed49ea0c3e409d49e652dea0\"</d:getetag>"
|
|
"<d:resourcetype/>"
|
|
"<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>"
|
|
"<d:getcontentlength>121780</d:getcontentlength>"
|
|
"</d:prop>"
|
|
"<d:status>HTTP/1.1 200 OK</d:status>"
|
|
"</d:propstat>"
|
|
"<d:propstat>"
|
|
"<d:prop>"
|
|
"<oc:downloadURL/>"
|
|
"<oc:dDC/>"
|
|
"</d:prop>"
|
|
"<d:status>HTTP/1.1 404 Not Found</d:status>"
|
|
"</d:propstat>"
|
|
"</d:response>"
|
|
"</d:multistatus>";
|
|
|
|
|
|
LsColXMLParser parser;
|
|
|
|
connect( &parser, SIGNAL(directoryListingSubfolders(const QStringList&)),
|
|
this, SLOT(slotDirectoryListingSubFolders(const QStringList&)) );
|
|
connect( &parser, SIGNAL(directoryListingIterated(const QString&, const QMap<QString,QString>&)),
|
|
this, SLOT(slotDirectoryListingIterated(const QString&, const QMap<QString,QString>&)) );
|
|
connect( &parser, SIGNAL(finishedWithoutError()),
|
|
this, SLOT(slotFinishedSuccessfully()) );
|
|
|
|
QHash <QString, ExtraFolderInfo> sizes;
|
|
QVERIFY(parser.parse( testXml, &sizes, "/oc/remote.php/webdav/sharefolder" ));
|
|
|
|
QVERIFY(_success);
|
|
QCOMPARE(sizes.size(), 1 ); // Quota info in the XML
|
|
|
|
QVERIFY(_items.contains("/oc/remote.php/webdav/sharefolder/quitte.pdf"));
|
|
QVERIFY(_items.contains("/oc/remote.php/webdav/sharefolder"));
|
|
QVERIFY(_items.size() == 2 );
|
|
|
|
QVERIFY(_subdirs.contains("/oc/remote.php/webdav/sharefolder/"));
|
|
QVERIFY(_subdirs.size() == 1);
|
|
}
|
|
|
|
void testParserBrokenXml() {
|
|
const QByteArray testXml = "X<?xml version='1.0' encoding='utf-8'?>"
|
|
"<d:multistatus xmlns:d=\"DAV:\" xmlns:s=\"http://sabredav.org/ns\" xmlns:oc=\"http://owncloud.org/ns\">"
|
|
"<d:response>"
|
|
"<d:href>/oc/remote.php/webdav/sharefolder/</d:href>"
|
|
"<d:propstat>"
|
|
"<d:prop>"
|
|
"<oc:id>00004213ocobzus5kn6s</oc:id>"
|
|
"<oc:permissions>RDNVCK</oc:permissions>"
|
|
"<oc:size>121780</oc:size>"
|
|
"<d:getetag>\"5527beb0400b0\"</d:getetag>"
|
|
"<d:resourcetype>"
|
|
"<d:collection/>"
|
|
"</d:resourcetype>"
|
|
"<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>"
|
|
"</d:prop>"
|
|
"<d:status>HTTP/1.1 200 OK</d:status>"
|
|
"</d:propstat>"
|
|
"<d:propstat>"
|
|
"<d:prop>"
|
|
"<d:getcontentlength/>"
|
|
"<oc:downloadURL/>"
|
|
"<oc:dDC/>"
|
|
"</d:prop>"
|
|
"<d:status>HTTP/1.1 404 Not Found</d:status>"
|
|
"</d:propstat>"
|
|
"</d:response>"
|
|
"<d:response>"
|
|
"<d:href>/oc/remote.php/webdav/sharefolder/quitte.pdf</d:href>"
|
|
"<d:propstat>"
|
|
"<d:prop>"
|
|
"<oc:id>00004215ocobzus5kn6s</oc:id>"
|
|
"<oc:permissions>RDNVW</oc:permissions>"
|
|
"<d:getetag>\"2fa2f0d9ed49ea0c3e409d49e652dea0\"</d:getetag>"
|
|
"<d:resourcetype/>"
|
|
"<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>"
|
|
"<d:getcontentlength>121780</d:getcontentlength>"
|
|
"</d:prop>"
|
|
"<d:status>HTTP/1.1 200 OK</d:status>"
|
|
"</d:propstat>"
|
|
"<d:propstat>"
|
|
"<d:prop>"
|
|
"<oc:downloadURL/>"
|
|
"<oc:dDC/>"
|
|
"</d:prop>"
|
|
"<d:status>HTTP/1.1 404 Not Found</d:status>"
|
|
"</d:propstat>"
|
|
"</d:response>"
|
|
"</d:multistatus>";
|
|
|
|
|
|
LsColXMLParser parser;
|
|
|
|
connect( &parser, SIGNAL(directoryListingSubfolders(const QStringList&)),
|
|
this, SLOT(slotDirectoryListingSubFolders(const QStringList&)) );
|
|
connect( &parser, SIGNAL(directoryListingIterated(const QString&, const QMap<QString,QString>&)),
|
|
this, SLOT(slotDirectoryListingIterated(const QString&, const QMap<QString,QString>&)) );
|
|
connect( &parser, SIGNAL(finishedWithoutError()),
|
|
this, SLOT(slotFinishedSuccessfully()) );
|
|
|
|
QHash <QString, ExtraFolderInfo> sizes;
|
|
QVERIFY(false == parser.parse( testXml, &sizes, "/oc/remote.php/webdav/sharefolder" )); // verify false
|
|
|
|
QVERIFY(!_success);
|
|
QVERIFY(sizes.size() == 0 ); // No quota info in the XML
|
|
|
|
QVERIFY(_items.size() == 0 ); // FIXME: We should change the parser to not emit during parsing but at the end
|
|
|
|
QVERIFY(_subdirs.size() == 0);
|
|
}
|
|
|
|
void testParserEmptyXmlNoDav() {
|
|
const QByteArray testXml = "<html><body>I am under construction</body></html>";
|
|
|
|
LsColXMLParser parser;
|
|
|
|
connect( &parser, SIGNAL(directoryListingSubfolders(const QStringList&)),
|
|
this, SLOT(slotDirectoryListingSubFolders(const QStringList&)) );
|
|
connect( &parser, SIGNAL(directoryListingIterated(const QString&, const QMap<QString,QString>&)),
|
|
this, SLOT(slotDirectoryListingIterated(const QString&, const QMap<QString,QString>&)) );
|
|
connect( &parser, SIGNAL(finishedWithoutError()),
|
|
this, SLOT(slotFinishedSuccessfully()) );
|
|
|
|
QHash <QString, ExtraFolderInfo> sizes;
|
|
QVERIFY(false == parser.parse( testXml, &sizes, "/oc/remote.php/webdav/sharefolder" )); // verify false
|
|
|
|
QVERIFY(!_success);
|
|
QVERIFY(sizes.size() == 0 ); // No quota info in the XML
|
|
|
|
QVERIFY(_items.size() == 0 ); // FIXME: We should change the parser to not emit during parsing but at the end
|
|
QVERIFY(_subdirs.size() == 0);
|
|
}
|
|
|
|
void testParserEmptyXml() {
|
|
const QByteArray testXml = "";
|
|
|
|
LsColXMLParser parser;
|
|
|
|
connect( &parser, SIGNAL(directoryListingSubfolders(const QStringList&)),
|
|
this, SLOT(slotDirectoryListingSubFolders(const QStringList&)) );
|
|
connect( &parser, SIGNAL(directoryListingIterated(const QString&, const QMap<QString,QString>&)),
|
|
this, SLOT(slotDirectoryListingIterated(const QString&, const QMap<QString,QString>&)) );
|
|
connect( &parser, SIGNAL(finishedWithoutError()),
|
|
this, SLOT(slotFinishedSuccessfully()) );
|
|
|
|
QHash <QString, ExtraFolderInfo> sizes;
|
|
QVERIFY(false == parser.parse( testXml, &sizes, "/oc/remote.php/webdav/sharefolder" )); // verify false
|
|
|
|
QVERIFY(!_success);
|
|
QVERIFY(sizes.size() == 0 ); // No quota info in the XML
|
|
|
|
QVERIFY(_items.size() == 0 ); // FIXME: We should change the parser to not emit during parsing but at the end
|
|
QVERIFY(_subdirs.size() == 0);
|
|
}
|
|
|
|
void testParserTruncatedXml() {
|
|
const QByteArray testXml = "<?xml version='1.0' encoding='utf-8'?>"
|
|
"<d:multistatus xmlns:d=\"DAV:\" xmlns:s=\"http://sabredav.org/ns\" xmlns:oc=\"http://owncloud.org/ns\">"
|
|
"<d:response>"
|
|
"<d:href>/oc/remote.php/webdav/sharefolder/</d:href>"
|
|
"<d:propstat>"
|
|
"<d:prop>"
|
|
"<oc:id>00004213ocobzus5kn6s</oc:id>"
|
|
"<oc:permissions>RDNVCK</oc:permissions>"
|
|
"<oc:size>121780</oc:size>"
|
|
"<d:getetag>\"5527beb0400b0\"</d:getetag>"
|
|
"<d:resourcetype>"
|
|
"<d:collection/>"
|
|
"</d:resourcetype>"
|
|
"<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>"
|
|
"</d:prop>"
|
|
"<d:status>HTTP/1.1 200 OK</d:status>"
|
|
"</d:propstat>"; // no proper end here
|
|
|
|
|
|
LsColXMLParser parser;
|
|
|
|
connect( &parser, SIGNAL(directoryListingSubfolders(const QStringList&)),
|
|
this, SLOT(slotDirectoryListingSubFolders(const QStringList&)) );
|
|
connect( &parser, SIGNAL(directoryListingIterated(const QString&, const QMap<QString,QString>&)),
|
|
this, SLOT(slotDirectoryListingIterated(const QString&, const QMap<QString,QString>&)) );
|
|
connect( &parser, SIGNAL(finishedWithoutError()),
|
|
this, SLOT(slotFinishedSuccessfully()) );
|
|
|
|
QHash <QString, ExtraFolderInfo> sizes;
|
|
QVERIFY(!parser.parse( testXml, &sizes, "/oc/remote.php/webdav/sharefolder" ));
|
|
QVERIFY(!_success);
|
|
}
|
|
|
|
void testParserBogfusHref1() {
|
|
const QByteArray testXml = "<?xml version='1.0' encoding='utf-8'?>"
|
|
"<d:multistatus xmlns:d=\"DAV:\" xmlns:s=\"http://sabredav.org/ns\" xmlns:oc=\"http://owncloud.org/ns\">"
|
|
"<d:response>"
|
|
"<d:href>http://127.0.0.1:81/oc/remote.php/webdav/sharefolder/</d:href>"
|
|
"<d:propstat>"
|
|
"<d:prop>"
|
|
"<oc:id>00004213ocobzus5kn6s</oc:id>"
|
|
"<oc:permissions>RDNVCK</oc:permissions>"
|
|
"<oc:size>121780</oc:size>"
|
|
"<d:getetag>\"5527beb0400b0\"</d:getetag>"
|
|
"<d:resourcetype>"
|
|
"<d:collection/>"
|
|
"</d:resourcetype>"
|
|
"<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>"
|
|
"</d:prop>"
|
|
"<d:status>HTTP/1.1 200 OK</d:status>"
|
|
"</d:propstat>"
|
|
"<d:propstat>"
|
|
"<d:prop>"
|
|
"<d:getcontentlength/>"
|
|
"<oc:downloadURL/>"
|
|
"<oc:dDC/>"
|
|
"</d:prop>"
|
|
"<d:status>HTTP/1.1 404 Not Found</d:status>"
|
|
"</d:propstat>"
|
|
"</d:response>"
|
|
"<d:response>"
|
|
"<d:href>http://127.0.0.1:81/oc/remote.php/webdav/sharefolder/quitte.pdf</d:href>"
|
|
"<d:propstat>"
|
|
"<d:prop>"
|
|
"<oc:id>00004215ocobzus5kn6s</oc:id>"
|
|
"<oc:permissions>RDNVW</oc:permissions>"
|
|
"<d:getetag>\"2fa2f0d9ed49ea0c3e409d49e652dea0\"</d:getetag>"
|
|
"<d:resourcetype/>"
|
|
"<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>"
|
|
"<d:getcontentlength>121780</d:getcontentlength>"
|
|
"</d:prop>"
|
|
"<d:status>HTTP/1.1 200 OK</d:status>"
|
|
"</d:propstat>"
|
|
"<d:propstat>"
|
|
"<d:prop>"
|
|
"<oc:downloadURL/>"
|
|
"<oc:dDC/>"
|
|
"</d:prop>"
|
|
"<d:status>HTTP/1.1 404 Not Found</d:status>"
|
|
"</d:propstat>"
|
|
"</d:response>"
|
|
"</d:multistatus>";
|
|
|
|
|
|
LsColXMLParser parser;
|
|
|
|
connect( &parser, SIGNAL(directoryListingSubfolders(const QStringList&)),
|
|
this, SLOT(slotDirectoryListingSubFolders(const QStringList&)) );
|
|
connect( &parser, SIGNAL(directoryListingIterated(const QString&, const QMap<QString,QString>&)),
|
|
this, SLOT(slotDirectoryListingIterated(const QString&, const QMap<QString,QString>&)) );
|
|
connect( &parser, SIGNAL(finishedWithoutError()),
|
|
this, SLOT(slotFinishedSuccessfully()) );
|
|
|
|
QHash <QString, ExtraFolderInfo> sizes;
|
|
QVERIFY(false == parser.parse( testXml, &sizes, "/oc/remote.php/webdav/sharefolder" ));
|
|
QVERIFY(!_success);
|
|
}
|
|
|
|
void testParserBogfusHref2() {
|
|
const QByteArray testXml = "<?xml version='1.0' encoding='utf-8'?>"
|
|
"<d:multistatus xmlns:d=\"DAV:\" xmlns:s=\"http://sabredav.org/ns\" xmlns:oc=\"http://owncloud.org/ns\">"
|
|
"<d:response>"
|
|
"<d:href>/sharefolder</d:href>"
|
|
"<d:propstat>"
|
|
"<d:prop>"
|
|
"<oc:id>00004213ocobzus5kn6s</oc:id>"
|
|
"<oc:permissions>RDNVCK</oc:permissions>"
|
|
"<oc:size>121780</oc:size>"
|
|
"<d:getetag>\"5527beb0400b0\"</d:getetag>"
|
|
"<d:resourcetype>"
|
|
"<d:collection/>"
|
|
"</d:resourcetype>"
|
|
"<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>"
|
|
"</d:prop>"
|
|
"<d:status>HTTP/1.1 200 OK</d:status>"
|
|
"</d:propstat>"
|
|
"<d:propstat>"
|
|
"<d:prop>"
|
|
"<d:getcontentlength/>"
|
|
"<oc:downloadURL/>"
|
|
"<oc:dDC/>"
|
|
"</d:prop>"
|
|
"<d:status>HTTP/1.1 404 Not Found</d:status>"
|
|
"</d:propstat>"
|
|
"</d:response>"
|
|
"<d:response>"
|
|
"<d:href>/sharefolder/quitte.pdf</d:href>"
|
|
"<d:propstat>"
|
|
"<d:prop>"
|
|
"<oc:id>00004215ocobzus5kn6s</oc:id>"
|
|
"<oc:permissions>RDNVW</oc:permissions>"
|
|
"<d:getetag>\"2fa2f0d9ed49ea0c3e409d49e652dea0\"</d:getetag>"
|
|
"<d:resourcetype/>"
|
|
"<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>"
|
|
"<d:getcontentlength>121780</d:getcontentlength>"
|
|
"</d:prop>"
|
|
"<d:status>HTTP/1.1 200 OK</d:status>"
|
|
"</d:propstat>"
|
|
"<d:propstat>"
|
|
"<d:prop>"
|
|
"<oc:downloadURL/>"
|
|
"<oc:dDC/>"
|
|
"</d:prop>"
|
|
"<d:status>HTTP/1.1 404 Not Found</d:status>"
|
|
"</d:propstat>"
|
|
"</d:response>"
|
|
"</d:multistatus>";
|
|
|
|
|
|
LsColXMLParser parser;
|
|
|
|
connect( &parser, SIGNAL(directoryListingSubfolders(const QStringList&)),
|
|
this, SLOT(slotDirectoryListingSubFolders(const QStringList&)) );
|
|
connect( &parser, SIGNAL(directoryListingIterated(const QString&, const QMap<QString,QString>&)),
|
|
this, SLOT(slotDirectoryListingIterated(const QString&, const QMap<QString,QString>&)) );
|
|
connect( &parser, SIGNAL(finishedWithoutError()),
|
|
this, SLOT(slotFinishedSuccessfully()) );
|
|
|
|
QHash <QString, ExtraFolderInfo> sizes;
|
|
QVERIFY(false == parser.parse( testXml, &sizes, "/oc/remote.php/webdav/sharefolder" ));
|
|
QVERIFY(!_success);
|
|
}
|
|
|
|
void testParserDenormalizedPath() {
|
|
const QByteArray testXml = "<?xml version='1.0' encoding='utf-8'?>"
|
|
"<d:multistatus xmlns:d=\"DAV:\" xmlns:s=\"http://sabredav.org/ns\" xmlns:oc=\"http://owncloud.org/ns\">"
|
|
"<d:response>"
|
|
"<d:href>/oc/remote.php/webdav/sharefolder/</d:href>"
|
|
"<d:propstat>"
|
|
"<d:prop>"
|
|
"<oc:id>00004213ocobzus5kn6s</oc:id>"
|
|
"<oc:permissions>RDNVCK</oc:permissions>"
|
|
"<oc:size>121780</oc:size>"
|
|
"<d:getetag>\"5527beb0400b0\"</d:getetag>"
|
|
"<d:resourcetype>"
|
|
"<d:collection/>"
|
|
"</d:resourcetype>"
|
|
"<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>"
|
|
"</d:prop>"
|
|
"<d:status>HTTP/1.1 200 OK</d:status>"
|
|
"</d:propstat>"
|
|
"<d:propstat>"
|
|
"<d:prop>"
|
|
"<d:getcontentlength/>"
|
|
"<oc:downloadURL/>"
|
|
"<oc:dDC/>"
|
|
"</d:prop>"
|
|
"<d:status>HTTP/1.1 404 Not Found</d:status>"
|
|
"</d:propstat>"
|
|
"</d:response>"
|
|
"<d:response>"
|
|
"<d:href>/oc/remote.php/webdav/sharefolder/../sharefolder/quitte.pdf</d:href>"
|
|
"<d:propstat>"
|
|
"<d:prop>"
|
|
"<oc:id>00004215ocobzus5kn6s</oc:id>"
|
|
"<oc:permissions>RDNVW</oc:permissions>"
|
|
"<d:getetag>\"2fa2f0d9ed49ea0c3e409d49e652dea0\"</d:getetag>"
|
|
"<d:resourcetype/>"
|
|
"<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>"
|
|
"<d:getcontentlength>121780</d:getcontentlength>"
|
|
"</d:prop>"
|
|
"<d:status>HTTP/1.1 200 OK</d:status>"
|
|
"</d:propstat>"
|
|
"<d:propstat>"
|
|
"<d:prop>"
|
|
"<oc:downloadURL/>"
|
|
"<oc:dDC/>"
|
|
"</d:prop>"
|
|
"<d:status>HTTP/1.1 404 Not Found</d:status>"
|
|
"</d:propstat>"
|
|
"</d:response>"
|
|
"</d:multistatus>";
|
|
|
|
|
|
LsColXMLParser parser;
|
|
|
|
connect( &parser, SIGNAL(directoryListingSubfolders(const QStringList&)),
|
|
this, SLOT(slotDirectoryListingSubFolders(const QStringList&)) );
|
|
connect( &parser, SIGNAL(directoryListingIterated(const QString&, const QMap<QString,QString>&)),
|
|
this, SLOT(slotDirectoryListingIterated(const QString&, const QMap<QString,QString>&)) );
|
|
connect( &parser, SIGNAL(finishedWithoutError()),
|
|
this, SLOT(slotFinishedSuccessfully()) );
|
|
|
|
QHash <QString, ExtraFolderInfo> sizes;
|
|
QVERIFY(parser.parse( testXml, &sizes, "/oc/remote.php/webdav/sharefolder" ));
|
|
|
|
QVERIFY(_success);
|
|
QCOMPARE(sizes.size(), 1 ); // Quota info in the XML
|
|
|
|
QVERIFY(_items.contains("/oc/remote.php/webdav/sharefolder/quitte.pdf"));
|
|
QVERIFY(_items.contains("/oc/remote.php/webdav/sharefolder"));
|
|
QVERIFY(_items.size() == 2 );
|
|
|
|
QVERIFY(_subdirs.contains("/oc/remote.php/webdav/sharefolder/"));
|
|
QVERIFY(_subdirs.size() == 1);
|
|
}
|
|
|
|
void testParserDenormalizedPathOutsideNamespace() {
|
|
const QByteArray testXml = "<?xml version='1.0' encoding='utf-8'?>"
|
|
"<d:multistatus xmlns:d=\"DAV:\" xmlns:s=\"http://sabredav.org/ns\" xmlns:oc=\"http://owncloud.org/ns\">"
|
|
"<d:response>"
|
|
"<d:href>/oc/remote.php/webdav/sharefolder/</d:href>"
|
|
"<d:propstat>"
|
|
"<d:prop>"
|
|
"<oc:id>00004213ocobzus5kn6s</oc:id>"
|
|
"<oc:permissions>RDNVCK</oc:permissions>"
|
|
"<oc:size>121780</oc:size>"
|
|
"<d:getetag>\"5527beb0400b0\"</d:getetag>"
|
|
"<d:resourcetype>"
|
|
"<d:collection/>"
|
|
"</d:resourcetype>"
|
|
"<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>"
|
|
"</d:prop>"
|
|
"<d:status>HTTP/1.1 200 OK</d:status>"
|
|
"</d:propstat>"
|
|
"<d:propstat>"
|
|
"<d:prop>"
|
|
"<d:getcontentlength/>"
|
|
"<oc:downloadURL/>"
|
|
"<oc:dDC/>"
|
|
"</d:prop>"
|
|
"<d:status>HTTP/1.1 404 Not Found</d:status>"
|
|
"</d:propstat>"
|
|
"</d:response>"
|
|
"<d:response>"
|
|
"<d:href>/oc/remote.php/webdav/sharefolder/../quitte.pdf</d:href>"
|
|
"<d:propstat>"
|
|
"<d:prop>"
|
|
"<oc:id>00004215ocobzus5kn6s</oc:id>"
|
|
"<oc:permissions>RDNVW</oc:permissions>"
|
|
"<d:getetag>\"2fa2f0d9ed49ea0c3e409d49e652dea0\"</d:getetag>"
|
|
"<d:resourcetype/>"
|
|
"<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>"
|
|
"<d:getcontentlength>121780</d:getcontentlength>"
|
|
"</d:prop>"
|
|
"<d:status>HTTP/1.1 200 OK</d:status>"
|
|
"</d:propstat>"
|
|
"<d:propstat>"
|
|
"<d:prop>"
|
|
"<oc:downloadURL/>"
|
|
"<oc:dDC/>"
|
|
"</d:prop>"
|
|
"<d:status>HTTP/1.1 404 Not Found</d:status>"
|
|
"</d:propstat>"
|
|
"</d:response>"
|
|
"</d:multistatus>";
|
|
|
|
|
|
LsColXMLParser parser;
|
|
|
|
connect( &parser, SIGNAL(directoryListingSubfolders(const QStringList&)),
|
|
this, SLOT(slotDirectoryListingSubFolders(const QStringList&)) );
|
|
connect( &parser, SIGNAL(directoryListingIterated(const QString&, const QMap<QString,QString>&)),
|
|
this, SLOT(slotDirectoryListingIterated(const QString&, const QMap<QString,QString>&)) );
|
|
connect( &parser, SIGNAL(finishedWithoutError()),
|
|
this, SLOT(slotFinishedSuccessfully()) );
|
|
|
|
QHash <QString, ExtraFolderInfo> sizes;
|
|
QVERIFY(!parser.parse( testXml, &sizes, "/oc/remote.php/webdav/sharefolder" ));
|
|
|
|
QVERIFY(!_success);
|
|
}
|
|
|
|
void testHrefUrlEncoding() {
|
|
const QByteArray testXml = "<?xml version='1.0' encoding='utf-8'?>"
|
|
"<d:multistatus xmlns:d=\"DAV:\" xmlns:s=\"http://sabredav.org/ns\" xmlns:oc=\"http://owncloud.org/ns\">"
|
|
"<d:response>"
|
|
"<d:href>/%C3%A4</d:href>" // a-umlaut utf8
|
|
"<d:propstat>"
|
|
"<d:prop>"
|
|
"<oc:id>00004213ocobzus5kn6s</oc:id>"
|
|
"<oc:permissions>RDNVCK</oc:permissions>"
|
|
"<oc:size>121780</oc:size>"
|
|
"<d:getetag>\"5527beb0400b0\"</d:getetag>"
|
|
"<d:resourcetype>"
|
|
"<d:collection/>"
|
|
"</d:resourcetype>"
|
|
"<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>"
|
|
"</d:prop>"
|
|
"<d:status>HTTP/1.1 200 OK</d:status>"
|
|
"</d:propstat>"
|
|
"<d:propstat>"
|
|
"<d:prop>"
|
|
"<d:getcontentlength/>"
|
|
"<oc:downloadURL/>"
|
|
"<oc:dDC/>"
|
|
"</d:prop>"
|
|
"<d:status>HTTP/1.1 404 Not Found</d:status>"
|
|
"</d:propstat>"
|
|
"</d:response>"
|
|
"<d:response>"
|
|
"<d:href>/%C3%A4/%C3%A4.pdf</d:href>"
|
|
"<d:propstat>"
|
|
"<d:prop>"
|
|
"<oc:id>00004215ocobzus5kn6s</oc:id>"
|
|
"<oc:permissions>RDNVW</oc:permissions>"
|
|
"<d:getetag>\"2fa2f0d9ed49ea0c3e409d49e652dea0\"</d:getetag>"
|
|
"<d:resourcetype/>"
|
|
"<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>"
|
|
"<d:getcontentlength>121780</d:getcontentlength>"
|
|
"</d:prop>"
|
|
"<d:status>HTTP/1.1 200 OK</d:status>"
|
|
"</d:propstat>"
|
|
"<d:propstat>"
|
|
"<d:prop>"
|
|
"<oc:downloadURL/>"
|
|
"<oc:dDC/>"
|
|
"</d:prop>"
|
|
"<d:status>HTTP/1.1 404 Not Found</d:status>"
|
|
"</d:propstat>"
|
|
"</d:response>"
|
|
"</d:multistatus>";
|
|
|
|
LsColXMLParser parser;
|
|
|
|
connect( &parser, SIGNAL(directoryListingSubfolders(const QStringList&)),
|
|
this, SLOT(slotDirectoryListingSubFolders(const QStringList&)) );
|
|
connect( &parser, SIGNAL(directoryListingIterated(const QString&, const QMap<QString,QString>&)),
|
|
this, SLOT(slotDirectoryListingIterated(const QString&, const QMap<QString,QString>&)) );
|
|
connect( &parser, SIGNAL(finishedWithoutError()),
|
|
this, SLOT(slotFinishedSuccessfully()) );
|
|
|
|
QHash <QString, ExtraFolderInfo> sizes;
|
|
QVERIFY(parser.parse( testXml, &sizes, QString::fromUtf8("/ä") ));
|
|
QVERIFY(_success);
|
|
|
|
QVERIFY(_items.contains(QString::fromUtf8("/ä/ä.pdf")));
|
|
QVERIFY(_items.contains(QString::fromUtf8("/ä")));
|
|
QVERIFY(_items.size() == 2 );
|
|
|
|
QVERIFY(_subdirs.contains(QString::fromUtf8("/ä")));
|
|
QVERIFY(_subdirs.size() == 1);
|
|
}
|
|
|
|
};
|
|
|
|
QTEST_GUILESS_MAIN(TestXmlParse)
|
|
|
|
#include "testxmlparse.moc"
|