From d1b8370a4ad21c741da507f64a5dbfe82a3fad05 Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Mon, 11 Sep 2017 13:45:01 +0200 Subject: [PATCH] Wizard: Handle url-shortener redirects #5954 Grab any permanent redirects from the base url the user entered before attempting to connect to a modified url (with status.php added). --- src/gui/owncloudsetupwizard.cpp | 38 +++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/src/gui/owncloudsetupwizard.cpp b/src/gui/owncloudsetupwizard.cpp index 9e6853db8..3dd3bb117 100644 --- a/src/gui/owncloudsetupwizard.cpp +++ b/src/gui/owncloudsetupwizard.cpp @@ -173,13 +173,37 @@ void OwncloudSetupWizard::slotContinueDetermineAuth() // Set fake credentials before we check what credential it actually is. account->setCredentials(CredentialsFactory::create("dummy")); - CheckServerJob *job = new CheckServerJob(_ocWizard->account(), this); - job->setIgnoreCredentialFailure(true); - connect(job, SIGNAL(instanceFound(QUrl, QJsonObject)), SLOT(slotOwnCloudFoundAuth(QUrl, QJsonObject))); - connect(job, SIGNAL(instanceNotFound(QNetworkReply *)), SLOT(slotNoOwnCloudFoundAuth(QNetworkReply *))); - connect(job, SIGNAL(timeout(const QUrl &)), SLOT(slotNoOwnCloudFoundAuthTimeout(const QUrl &))); - job->setTimeout((account->url().scheme() == "https") ? 30 * 1000 : 10 * 1000); - job->start(); + + // Before we check the auth type, resolve any permanent redirect + // chain there might be. We cannot do this only on url/status.php + // in CheckServerJob, because things like url shorteners don't + // redirect subpaths. + auto redirectCheckJob = account->sendRequest("GET", account->url()); + + // Grab the chain of permanent redirects and adjust the account url + // accordingly + auto permanentRedirects = std::make_shared(0); + connect(redirectCheckJob, &AbstractNetworkJob::redirected, this, + [permanentRedirects, account](QNetworkReply *reply, const QUrl &targetUrl, int count) { + int httpCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + if (count == *permanentRedirects && (httpCode == 301 || httpCode == 308)) { + qCInfo(lcWizard) << account->url() << " was redirected to" << targetUrl; + account->setUrl(targetUrl); + *permanentRedirects += 1; + } + }); + + // When done, start checking status.php. + connect(redirectCheckJob, &SimpleNetworkJob::finishedSignal, this, + [this, account]() { + CheckServerJob *job = new CheckServerJob(account, this); + job->setIgnoreCredentialFailure(true); + connect(job, SIGNAL(instanceFound(QUrl, QJsonObject)), SLOT(slotOwnCloudFoundAuth(QUrl, QJsonObject))); + connect(job, SIGNAL(instanceNotFound(QNetworkReply *)), SLOT(slotNoOwnCloudFoundAuth(QNetworkReply *))); + connect(job, SIGNAL(timeout(const QUrl &)), SLOT(slotNoOwnCloudFoundAuthTimeout(const QUrl &))); + job->setTimeout((account->url().scheme() == "https") ? 30 * 1000 : 10 * 1000); + job->start(); + }); } void OwncloudSetupWizard::slotOwnCloudFoundAuth(const QUrl &url, const QJsonObject &info)