From: Christian Kamm Date: Mon, 11 Sep 2017 11:45:01 +0000 (+0200) Subject: Wizard: Handle url-shortener redirects #5954 X-Git-Tag: archive/raspbian/3.16.7-1_deb13u1+rpi1~1^2~701^2~97 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=1aa1e7f833fb913aceb1ea39641bbc08106c032e;p=nextcloud-desktop.git 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). --- 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)