Skip to content

Commit 35c44b3

Browse files
committed
Fix url resolution for app provider
Fixes: #11296
1 parent 30d40ff commit 35c44b3

15 files changed

Lines changed: 47 additions & 39 deletions

changelog/unreleased/11296

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
Bugfix: Fix url resolution for app provider
2+
3+
We fixed a bug in the url resolution for the app provider.
4+
If owncloud is installed to a non root directory we computed a wrong url for the app provider urls.
5+
This could trigger a connection validation in the client, which intern triggered a request to the app provider.
6+
Reulting in an endless loop rendering the client unusable.
7+
8+
https://github.com/owncloud/client/issues/11296

src/cmd/cmd.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,7 @@ int main(int argc, char **argv)
485485
.value(QStringLiteral("capabilities"))
486486
.toObject();
487487
qDebug() << "Server capabilities" << caps;
488-
ctx.account->setCapabilities(caps.toVariantMap());
488+
ctx.account->setCapabilities({ctx.account->url(), caps.toVariantMap()});
489489

490490
switch (ctx.account->serverSupportLevel()) {
491491
case Account::ServerSupportLevel::Supported:

src/gui/accountmanager.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ AccountPtr AccountManager::loadAccountHelper(QSettings &settings)
285285

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

291291
// We want to only restore settings for that auth type and the user value

src/gui/fetchserversettings.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ void FetchServerSettingsJob::start()
5656
if (auto reply = job->reply()) {
5757
_account->setHttp2Supported(reply->attribute(QNetworkRequest::Http2WasUsedAttribute).toBool());
5858
}
59-
_account->setCapabilities(caps.toVariantMap());
59+
_account->setCapabilities({_account->url(), caps.toVariantMap()});
6060
if (checkServerInfo()) {
6161
auto *userJob = new JsonApiJob(_account, QStringLiteral("ocs/v2.php/cloud/user"), SimpleNetworkJob::UrlQuery{}, QNetworkRequest{}, this);
6262
job->setAuthenticationJob(isAuthJob());
@@ -98,7 +98,7 @@ void FetchServerSettingsJob::runAsyncUpdates()
9898
};
9999

100100
if (_account->capabilities().appProviders().enabled) {
101-
auto *jsonJob = new JsonJob(_account, _account->url(), _account->capabilities().appProviders().appsUrl, "GET");
101+
auto *jsonJob = new JsonJob(_account, _account->capabilities().appProviders().appsUrl, {}, "GET");
102102
connect(jsonJob, &JsonJob::finishedSignal, this, [jsonJob, this] { _account->setAppProvider(AppProvider{jsonJob->data()}); });
103103
jsonJob->start();
104104
}

src/libsync/account.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ QString Account::commonCacheDirectory()
6161
Account::Account(const QUuid &uuid, QObject *parent)
6262
: QObject(parent)
6363
, _uuid(uuid)
64-
, _capabilities(QVariantMap())
64+
, _capabilities({}, {})
6565
, _jobQueue(this)
6666
, _queueGuard(&_jobQueue)
6767
, _credentialManager(new CredentialManager(this))

src/libsync/appprovider.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ bool AppProvider::open(const AccountPtr &account, const QString &localPath, cons
7878
const auto &a = app(localPath);
7979
if (a.isValid()) {
8080
SimpleNetworkJob::UrlQuery query { { QStringLiteral("file_id"), QString::fromUtf8(fileId) } };
81-
auto *job = new JsonJob(account, account->url(), account->capabilities().appProviders().openWebUrl, "POST", query);
81+
auto *job = new JsonJob(account, account->capabilities().appProviders().openWebUrl, {}, "POST", query);
8282
QObject::connect(job, &JsonJob::finishedSignal, [account, job, localPath] {
8383
if (job->httpStatusCode() == 200) {
8484
const auto url = QUrl(job->data().value(QStringLiteral("uri")).toString());

src/libsync/capabilities.cpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,23 @@
1414

1515
#include "capabilities.h"
1616

17-
#include <QVariantMap>
1817
#include <QDebug>
18+
#include <QVariantMap>
1919

2020
using namespace std::chrono;
2121

2222
namespace OCC {
2323

2424

25-
Capabilities::Capabilities(const QVariantMap &capabilities)
25+
Capabilities::Capabilities(const QUrl &url, const QVariantMap &capabilities)
2626
: _capabilities(capabilities)
2727
, _fileSharingCapabilities(_capabilities.value(QStringLiteral("files_sharing")).toMap())
2828
, _fileSharingPublicCapabilities(_fileSharingCapabilities.value(QStringLiteral("public"), {}).toMap())
2929
, _tusSupport(_capabilities.value(QStringLiteral("files")).toMap().value(QStringLiteral("tus_support")).toMap())
3030
, _spaces(_capabilities.value(QStringLiteral("spaces")).toMap())
3131
, _status(_capabilities.value(QStringLiteral("core")).toMap().value(QStringLiteral("status")).toMap())
3232
, _appProviders(AppProviders::findVersion(
33-
_capabilities.value(QStringLiteral("files")).toMap().value(QStringLiteral("app_providers")).toList(), QVersionNumber({1, 1, 0})))
33+
url, _capabilities.value(QStringLiteral("files")).toMap().value(QStringLiteral("app_providers")).toList(), QVersionNumber({1, 1, 0})))
3434
, _filesSharing(_fileSharingCapabilities)
3535
, _migration(_capabilities.value(QStringLiteral("migration")).toMap())
3636
{
@@ -313,28 +313,28 @@ bool SpaceSupport::isValid() const
313313
return !version.isNull();
314314
}
315315

316-
Capabilities::AppProviders::AppProviders(const QVariantMap &appProviders)
316+
Capabilities::AppProviders::AppProviders(const QUrl &baseUrl, const QVariantMap &appProviders)
317317
: enabled(appProviders.value(QStringLiteral("enabled")).toBool())
318318
, version(QVersionNumber::fromString(appProviders.value(QStringLiteral("version")).toString()))
319-
, appsUrl(appProviders.value(QStringLiteral("apps_url")).toString())
320-
, openUrl(appProviders.value(QStringLiteral("open_url")).toString())
321-
, newUrl(appProviders.value(QStringLiteral("new_url")).toString())
322-
, openWebUrl(appProviders.value(QStringLiteral("open_web_url")).toString())
319+
, appsUrl(baseUrl.resolved(appProviders.value(QStringLiteral("apps_url")).toUrl()))
320+
, openUrl(baseUrl.resolved(appProviders.value(QStringLiteral("open_url")).toUrl()))
321+
, newUrl(baseUrl.resolved(appProviders.value(QStringLiteral("new_url")).toUrl()))
322+
, openWebUrl(baseUrl.resolved(appProviders.value(QStringLiteral("open_web_url")).toUrl()))
323323
{
324324
}
325325

326+
326327
const Capabilities::AppProviders &Capabilities::appProviders() const
327328
{
328329
return _appProviders;
329330
}
330331

331-
Capabilities::AppProviders Capabilities::AppProviders::findVersion(const QVariantList &list, const QVersionNumber &v)
332+
Capabilities::AppProviders Capabilities::AppProviders::findVersion(const QUrl &baseUrl, const QVariantList &list, const QVersionNumber &v)
332333
{
333334
auto it = std::find_if(list.cbegin(), list.cend(), [&v](const auto &it) {
334335
return QVersionNumber::fromString(it.toMap().value(QStringLiteral("version")).toString()) == v;
335336
});
336-
return it != list.cend() ? Capabilities::AppProviders { it->toMap() }
337-
: Capabilities::AppProviders();
337+
return it != list.cend() ? Capabilities::AppProviders{baseUrl, it->toMap()} : Capabilities::AppProviders{};
338338
}
339339

340340
const FilesSharing &Capabilities::filesSharing() const

src/libsync/capabilities.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -144,19 +144,19 @@ class OWNCLOUDSYNC_EXPORT Capabilities
144144
}
145145
*/
146146
AppProviders() = default;
147-
static AppProviders findVersion(const QVariantList &list, const QVersionNumber &v);
148-
AppProviders(const QVariantMap &appProviders);
147+
static AppProviders findVersion(const QUrl &baseUrl, const QVariantList &list, const QVersionNumber &v);
148+
AppProviders(const QUrl &baseUrl, const QVariantMap &appProviders);
149149

150150
bool enabled = false;
151151
QVersionNumber version;
152-
QString appsUrl;
153-
QString openUrl;
154-
QString newUrl;
155-
QString openWebUrl;
152+
QUrl appsUrl;
153+
QUrl openUrl;
154+
QUrl newUrl;
155+
QUrl openWebUrl;
156156
};
157157

158158

159-
Capabilities(const QVariantMap &capabilities);
159+
Capabilities(const QUrl &url, const QVariantMap &capabilities);
160160

161161
bool shareAPI() const;
162162
bool sharePublicLink() const;

test/testlocaldiscovery.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ private slots:
226226
auto cap = TestUtils::testCapabilities();
227227
cap.insert(
228228
{{QStringLiteral("files"), QVariantMap{{QStringLiteral("blacklisted_files"), QVariantList{QStringLiteral(".foo"), QStringLiteral("bar")}}}}});
229-
fakeFolder.account()->setCapabilities(cap);
229+
fakeFolder.account()->setCapabilities({fakeFolder.account()->url(), cap});
230230
fakeFolder.localModifier().insert(QStringLiteral("C/.foo"));
231231
fakeFolder.localModifier().insert(QStringLiteral("C/bar"));
232232
fakeFolder.localModifier().insert(QStringLiteral("C/moo"));

test/testspacesmigration/testspacesmigration.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ private slots:
5252
auto cap = TestUtils::testCapabilities();
5353
cap[QStringLiteral("migration")] = QVariantMap{{QStringLiteral("space_migration"),
5454
QVariantMap{{QStringLiteral("enabled"), true}, {QStringLiteral("endpoint"), QStringLiteral("migration/spaces")}}}};
55-
fakeFolder.account()->setCapabilities(cap);
55+
fakeFolder.account()->setCapabilities({fakeFolder.account()->url(), cap});
5656

5757

5858
const QUrl personalUrl(

0 commit comments

Comments
 (0)