Skip to content

Commit

Permalink
Fix url resolution for app provider
Browse files Browse the repository at this point in the history
Fixes: #11296
  • Loading branch information
TheOneRing committed Nov 21, 2023
1 parent 8eb4b2d commit e91bd9a
Show file tree
Hide file tree
Showing 14 changed files with 39 additions and 39 deletions.
2 changes: 1 addition & 1 deletion src/cmd/cmd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -485,7 +485,7 @@ int main(int argc, char **argv)
.value(QStringLiteral("capabilities"))
.toObject();
qDebug() << "Server capabilities" << caps;
ctx.account->setCapabilities(caps.toVariantMap());
ctx.account->setCapabilities({ctx.account->url(), caps.toVariantMap()});

switch (ctx.account->serverSupportLevel()) {
case Account::ServerSupportLevel::Supported:
Expand Down
2 changes: 1 addition & 1 deletion src/gui/accountmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -285,7 +285,7 @@ AccountPtr AccountManager::loadAccountHelper(QSettings &settings)

acc->_davUser = settings.value(davUserC()).toString();
acc->_displayName = settings.value(davUserDisplyNameC()).toString();
acc->setCapabilities(settings.value(capabilitesC()).value<QVariantMap>());
acc->setCapabilities({acc->url(), settings.value(capabilitesC()).value<QVariantMap>()});
acc->setDefaultSyncRoot(settings.value(defaultSyncRootC()).toString());

// We want to only restore settings for that auth type and the user value
Expand Down
4 changes: 2 additions & 2 deletions src/gui/fetchserversettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ void FetchServerSettingsJob::start()
if (auto reply = job->reply()) {
_account->setHttp2Supported(reply->attribute(QNetworkRequest::Http2WasUsedAttribute).toBool());
}
_account->setCapabilities(caps.toVariantMap());
_account->setCapabilities({_account->url(), caps.toVariantMap()});
if (checkServerInfo()) {
auto *userJob = new JsonApiJob(_account, QStringLiteral("ocs/v2.php/cloud/user"), SimpleNetworkJob::UrlQuery{}, QNetworkRequest{}, this);
job->setAuthenticationJob(isAuthJob());
Expand Down Expand Up @@ -98,7 +98,7 @@ void FetchServerSettingsJob::runAsyncUpdates()
};

if (_account->capabilities().appProviders().enabled) {
auto *jsonJob = new JsonJob(_account, _account->url(), _account->capabilities().appProviders().appsUrl, "GET");
auto *jsonJob = new JsonJob(_account, _account->capabilities().appProviders().appsUrl, {}, "GET");
connect(jsonJob, &JsonJob::finishedSignal, this, [jsonJob, this] { _account->setAppProvider(AppProvider{jsonJob->data()}); });
jsonJob->start();
}
Expand Down
2 changes: 1 addition & 1 deletion src/libsync/account.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ QString Account::commonCacheDirectory()
Account::Account(const QUuid &uuid, QObject *parent)
: QObject(parent)
, _uuid(uuid)
, _capabilities(QVariantMap())
, _capabilities({}, {})
, _jobQueue(this)
, _queueGuard(&_jobQueue)
, _credentialManager(new CredentialManager(this))
Expand Down
2 changes: 1 addition & 1 deletion src/libsync/appprovider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ bool AppProvider::open(const AccountPtr &account, const QString &localPath, cons
const auto &a = app(localPath);
if (a.isValid()) {
SimpleNetworkJob::UrlQuery query { { QStringLiteral("file_id"), QString::fromUtf8(fileId) } };
auto *job = new JsonJob(account, account->url(), account->capabilities().appProviders().openWebUrl, "POST", query);
auto *job = new JsonJob(account, account->capabilities().appProviders().openWebUrl, {}, "POST", query);
QObject::connect(job, &JsonJob::finishedSignal, [account, job, localPath] {
if (job->httpStatusCode() == 200) {
const auto url = QUrl(job->data().value(QStringLiteral("uri")).toString());
Expand Down
22 changes: 11 additions & 11 deletions src/libsync/capabilities.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,23 +14,23 @@

#include "capabilities.h"

#include <QVariantMap>
#include <QDebug>
#include <QVariantMap>

using namespace std::chrono;

namespace OCC {


Capabilities::Capabilities(const QVariantMap &capabilities)
Capabilities::Capabilities(const QUrl &url, const QVariantMap &capabilities)
: _capabilities(capabilities)
, _fileSharingCapabilities(_capabilities.value(QStringLiteral("files_sharing")).toMap())
, _fileSharingPublicCapabilities(_fileSharingCapabilities.value(QStringLiteral("public"), {}).toMap())
, _tusSupport(_capabilities.value(QStringLiteral("files")).toMap().value(QStringLiteral("tus_support")).toMap())
, _spaces(_capabilities.value(QStringLiteral("spaces")).toMap())
, _status(_capabilities.value(QStringLiteral("core")).toMap().value(QStringLiteral("status")).toMap())
, _appProviders(AppProviders::findVersion(
_capabilities.value(QStringLiteral("files")).toMap().value(QStringLiteral("app_providers")).toList(), QVersionNumber({1, 1, 0})))
url, _capabilities.value(QStringLiteral("files")).toMap().value(QStringLiteral("app_providers")).toList(), QVersionNumber({1, 1, 0})))
, _filesSharing(_fileSharingCapabilities)
, _migration(_capabilities.value(QStringLiteral("migration")).toMap())
{
Expand Down Expand Up @@ -313,28 +313,28 @@ bool SpaceSupport::isValid() const
return !version.isNull();
}

Capabilities::AppProviders::AppProviders(const QVariantMap &appProviders)
Capabilities::AppProviders::AppProviders(const QUrl &baseUrl, const QVariantMap &appProviders)
: enabled(appProviders.value(QStringLiteral("enabled")).toBool())
, version(QVersionNumber::fromString(appProviders.value(QStringLiteral("version")).toString()))
, appsUrl(appProviders.value(QStringLiteral("apps_url")).toString())
, openUrl(appProviders.value(QStringLiteral("open_url")).toString())
, newUrl(appProviders.value(QStringLiteral("new_url")).toString())
, openWebUrl(appProviders.value(QStringLiteral("open_web_url")).toString())
, appsUrl(baseUrl.resolved(appProviders.value(QStringLiteral("apps_url")).toUrl()))
, openUrl(baseUrl.resolved(appProviders.value(QStringLiteral("open_url")).toUrl()))
, newUrl(baseUrl.resolved(appProviders.value(QStringLiteral("new_url")).toUrl()))
, openWebUrl(baseUrl.resolved(appProviders.value(QStringLiteral("open_web_url")).toUrl()))
{
}


const Capabilities::AppProviders &Capabilities::appProviders() const
{
return _appProviders;
}

Capabilities::AppProviders Capabilities::AppProviders::findVersion(const QVariantList &list, const QVersionNumber &v)
Capabilities::AppProviders Capabilities::AppProviders::findVersion(const QUrl &baseUrl, const QVariantList &list, const QVersionNumber &v)
{
auto it = std::find_if(list.cbegin(), list.cend(), [&v](const auto &it) {
return QVersionNumber::fromString(it.toMap().value(QStringLiteral("version")).toString()) == v;
});
return it != list.cend() ? Capabilities::AppProviders { it->toMap() }
: Capabilities::AppProviders();
return it != list.cend() ? Capabilities::AppProviders{baseUrl, it->toMap()} : Capabilities::AppProviders{};
}

const FilesSharing &Capabilities::filesSharing() const
Expand Down
14 changes: 7 additions & 7 deletions src/libsync/capabilities.h
Original file line number Diff line number Diff line change
Expand Up @@ -144,19 +144,19 @@ class OWNCLOUDSYNC_EXPORT Capabilities
}
*/
AppProviders() = default;
static AppProviders findVersion(const QVariantList &list, const QVersionNumber &v);
AppProviders(const QVariantMap &appProviders);
static AppProviders findVersion(const QUrl &baseUrl, const QVariantList &list, const QVersionNumber &v);
AppProviders(const QUrl &baseUrl, const QVariantMap &appProviders);

bool enabled = false;
QVersionNumber version;
QString appsUrl;
QString openUrl;
QString newUrl;
QString openWebUrl;
QUrl appsUrl;
QUrl openUrl;
QUrl newUrl;
QUrl openWebUrl;
};


Capabilities(const QVariantMap &capabilities);
Capabilities(const QUrl &url, const QVariantMap &capabilities);

bool shareAPI() const;
bool sharePublicLink() const;
Expand Down
2 changes: 1 addition & 1 deletion test/testlocaldiscovery.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,7 @@ private slots:
auto cap = TestUtils::testCapabilities();
cap.insert(
{{QStringLiteral("files"), QVariantMap{{QStringLiteral("blacklisted_files"), QVariantList{QStringLiteral(".foo"), QStringLiteral("bar")}}}}});
fakeFolder.account()->setCapabilities(cap);
fakeFolder.account()->setCapabilities({fakeFolder.account()->url(), cap});
fakeFolder.localModifier().insert(QStringLiteral("C/.foo"));
fakeFolder.localModifier().insert(QStringLiteral("C/bar"));
fakeFolder.localModifier().insert(QStringLiteral("C/moo"));
Expand Down
2 changes: 1 addition & 1 deletion test/testspacesmigration/testspacesmigration.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ private slots:
auto cap = TestUtils::testCapabilities();
cap[QStringLiteral("migration")] = QVariantMap{{QStringLiteral("space_migration"),
QVariantMap{{QStringLiteral("enabled"), true}, {QStringLiteral("endpoint"), QStringLiteral("migration/spaces")}}}};
fakeFolder.account()->setCapabilities(cap);
fakeFolder.account()->setCapabilities({fakeFolder.account()->url(), cap});


const QUrl personalUrl(
Expand Down
14 changes: 7 additions & 7 deletions test/testsyncconflict.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ private slots:
QFETCH_GLOBAL(bool, filesAreDehydrated);

FakeFolder fakeFolder(FileInfo::A12_B12_C12_S12(), vfsMode, filesAreDehydrated);
fakeFolder.account()->setCapabilities(uploadConflictFilesCapabilities(true));
fakeFolder.account()->setCapabilities({fakeFolder.account()->url(), uploadConflictFilesCapabilities(true)});
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());

QMap<QByteArray, QString> conflictMap;
Expand Down Expand Up @@ -194,7 +194,7 @@ private slots:
QFETCH_GLOBAL(bool, filesAreDehydrated);

FakeFolder fakeFolder(FileInfo::A12_B12_C12_S12(), vfsMode, filesAreDehydrated);
fakeFolder.account()->setCapabilities(uploadConflictFilesCapabilities(true));
fakeFolder.account()->setCapabilities({fakeFolder.account()->url(), uploadConflictFilesCapabilities(true)});
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());

QMap<QByteArray, QString> conflictMap;
Expand Down Expand Up @@ -269,7 +269,7 @@ private slots:
QFETCH_GLOBAL(bool, filesAreDehydrated);

FakeFolder fakeFolder(FileInfo::A12_B12_C12_S12(), vfsMode, filesAreDehydrated);
fakeFolder.account()->setCapabilities(uploadConflictFilesCapabilities(true));
fakeFolder.account()->setCapabilities({fakeFolder.account()->url(), uploadConflictFilesCapabilities(true)});
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());

// With no headers from the server
Expand Down Expand Up @@ -321,7 +321,7 @@ private slots:
QFETCH_GLOBAL(bool, filesAreDehydrated);

FakeFolder fakeFolder(FileInfo::A12_B12_C12_S12(), vfsMode, filesAreDehydrated);
fakeFolder.account()->setCapabilities(uploadConflictFilesCapabilities(true));
fakeFolder.account()->setCapabilities({fakeFolder.account()->url(), uploadConflictFilesCapabilities(true)});
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());

// Make conflict records
Expand Down Expand Up @@ -352,7 +352,7 @@ private slots:
QFETCH_GLOBAL(bool, filesAreDehydrated);

FakeFolder fakeFolder(FileInfo::A12_B12_C12_S12(), vfsMode, filesAreDehydrated);
fakeFolder.account()->setCapabilities(uploadConflictFilesCapabilities(false));
fakeFolder.account()->setCapabilities({fakeFolder.account()->url(), uploadConflictFilesCapabilities(false)});
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());

// Create two conflicts
Expand Down Expand Up @@ -478,7 +478,7 @@ private slots:
QFETCH_GLOBAL(bool, filesAreDehydrated);

FakeFolder fakeFolder(FileInfo::A12_B12_C12_S12(), vfsMode, filesAreDehydrated);
fakeFolder.account()->setCapabilities(uploadConflictFilesCapabilities(true));
fakeFolder.account()->setCapabilities({fakeFolder.account()->url(), uploadConflictFilesCapabilities(true)});
ItemCompletedSpy completeSpy(fakeFolder);

auto cleanup = [&]() {
Expand Down Expand Up @@ -563,7 +563,7 @@ private slots:
QFETCH_GLOBAL(bool, filesAreDehydrated);

FakeFolder fakeFolder(FileInfo::A12_B12_C12_S12(), vfsMode, filesAreDehydrated);
fakeFolder.account()->setCapabilities(uploadConflictFilesCapabilities(true));
fakeFolder.account()->setCapabilities({fakeFolder.account()->url(), uploadConflictFilesCapabilities(true)});
ItemCompletedSpy completeSpy(fakeFolder);

// 1) a NEW/NEW conflict
Expand Down
6 changes: 3 additions & 3 deletions test/testsyncengine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ private slots:
QFETCH_GLOBAL(bool, filesAreDehydrated);

FakeFolder fakeFolder(FileInfo {}, vfsMode, filesAreDehydrated);
fakeFolder.account()->setCapabilities(TestUtils::testCapabilities(CheckSums::Algorithm::SHA1));
fakeFolder.account()->setCapabilities({fakeFolder.account()->url(), TestUtils::testCapabilities(CheckSums::Algorithm::SHA1)});
fakeFolder.localModifier().insert(QStringLiteral("a1.eml"), 64_b, 'A');
fakeFolder.localModifier().insert(QStringLiteral("a2.eml"), 64_b, 'A');
fakeFolder.localModifier().insert(QStringLiteral("a3.eml"), 64_b, 'A');
Expand Down Expand Up @@ -713,7 +713,7 @@ private slots:
cap[QStringLiteral("dav")] = dav;
return cap;
};
fakeFolder.syncEngine().account()->setCapabilities(invalidFilenameRegexCapabilities(QStringLiteral("my[fgh]ile")));
fakeFolder.syncEngine().account()->setCapabilities({fakeFolder.account()->url(), invalidFilenameRegexCapabilities(QStringLiteral("my[fgh]ile"))});
fakeFolder.localModifier().insert(QStringLiteral("C/myfile.txt"));
QVERIFY(fakeFolder.applyLocalModificationsAndSync());
QVERIFY(!fakeFolder.currentRemoteState().find(QStringLiteral("C/myfile.txt")));
Expand Down Expand Up @@ -763,7 +763,7 @@ private slots:
auto cap = TestUtils::testCapabilities();
// unset chunking v1
cap.remove(QStringLiteral("dav"));
fakeFolder.account()->setCapabilities(cap);
fakeFolder.account()->setCapabilities({fakeFolder.account()->url(), cap});

auto counter = std::make_unique<OperationCounter>();
fakeFolder.setServerOverride([counter = counter.get(), fakeFolder = &fakeFolder](
Expand Down
2 changes: 1 addition & 1 deletion test/testsyncmove.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ private slots:
QFETCH_GLOBAL(bool, filesAreDehydrated);

FakeFolder fakeFolder(FileInfo::A12_B12_C12_S12(), vfsMode, filesAreDehydrated);
fakeFolder.account()->setCapabilities(TestUtils::testCapabilities(CheckSums::Algorithm::ADLER32));
fakeFolder.account()->setCapabilities({fakeFolder.account()->url(), TestUtils::testCapabilities(CheckSums::Algorithm::ADLER32)});

OperationCounter counter(fakeFolder);

Expand Down
2 changes: 1 addition & 1 deletion test/testuploadreset.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ private slots:
cap[QStringLiteral("dav")] = dav;
return cap;
};
fakeFolder.syncEngine().account()->setCapabilities(httpErrorCodesThatResetFailingChunkedUploadsCapabilities({ 500 }));
fakeFolder.syncEngine().account()->setCapabilities({fakeFolder.account()->url(), httpErrorCodesThatResetFailingChunkedUploadsCapabilities({500})});

const auto size = 100_mb; // 100 MB
fakeFolder.localModifier().insert(QStringLiteral("A/a0"), size);
Expand Down
2 changes: 1 addition & 1 deletion test/testutils/testutils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ namespace TestUtils {
acc->setCredentials(cred);
acc->setUrl(QUrl(QStringLiteral("http://localhost/owncloud")));
acc->setDavDisplayName(QStringLiteral("fakename") + acc->uuid().toString(QUuid::WithoutBraces));
acc->setCapabilities(OCC::TestUtils::testCapabilities());
acc->setCapabilities({acc->url(), OCC::TestUtils::testCapabilities()});
return {OCC::AccountManager::instance()->addAccount(acc).get(), &TestUtilsPrivate::accountStateDeleter};
}

Expand Down

0 comments on commit e91bd9a

Please sign in to comment.