void OwncloudSetupWizard::slotAuthError() { QString errorMsg; PropfindJob* job = qobject_cast<PropfindJob*>(sender()); if (!job) { qWarning() << "Can't check for authed redirects. This slot should be invoked from PropfindJob!"; return; } QNetworkReply* reply = job->reply(); // If there were redirects on the *authed* requests, also store // the updated server URL, similar to redirects on status.php. QUrl redirectUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); if (!redirectUrl.isEmpty()) { qDebug() << "authed request was redirected to" << redirectUrl.toString(); // strip the expected path QString path = redirectUrl.path(); static QString expectedPath = "/" + _ocWizard->account()->davPath(); if (path.endsWith(expectedPath)) { path.chop(expectedPath.size()); redirectUrl.setPath(path); qDebug() << "setting account url to" << redirectUrl.toString(); _ocWizard->account()->setUrl(redirectUrl); testOwnCloudConnect(); return; } errorMsg = tr("The authenticated request to the server was redirected to " "'%1'. The URL is bad, the server is misconfigured.") .arg(redirectUrl.toString()); // A 404 is actually a success: we were authorized to know that the folder does // not exist. It will be created later... } else if (reply->error() == QNetworkReply::ContentNotFoundError) { _ocWizard->successfulStep(); return; // Provide messages for other errors, such as invalid credentials. } else if (reply->error() != QNetworkReply::NoError) { if (!_ocWizard->account()->credentials()->stillValid(reply)) { errorMsg = tr("Access forbidden by server. To verify that you have proper access, " "<a href=\"%1\">click here</a> to access the service with your browser.") .arg(_ocWizard->account()->url().toString()); } else { errorMsg = errorMessage(reply->errorString(), reply->readAll()); } // Something else went wrong, maybe the response was 200 but with invalid data. } else { errorMsg = tr("There was an invalid response to an authenticated webdav request"); } _ocWizard->show(); if (_ocWizard->currentId() == WizardCommon::Page_ShibbolethCreds) { _ocWizard->back(); } _ocWizard->displayError(errorMsg, _ocWizard->currentId() == WizardCommon::Page_ServerSetup && checkDowngradeAdvised(reply)); }
void fetchPrivateLinkUrl(AccountPtr account, const QString &remotePath, const QByteArray &numericFileId, QObject *target, std::function<void(const QString &url)> targetFun) { QString oldUrl; if (!numericFileId.isEmpty()) oldUrl = account->deprecatedPrivateLinkUrl(numericFileId).toString(QUrl::FullyEncoded); // Retrieve the new link by PROPFIND PropfindJob *job = new PropfindJob(account, remotePath, target); job->setProperties( QList<QByteArray>() << "http://owncloud.org/ns:fileid" // numeric file id for fallback private link generation << "http://owncloud.org/ns:privatelink"); job->setTimeout(10 * 1000); QObject::connect(job, &PropfindJob::result, target, [=](const QVariantMap &result) { auto privateLinkUrl = result["privatelink"].toString(); auto numericFileId = result["fileid"].toByteArray(); if (!privateLinkUrl.isEmpty()) { targetFun(privateLinkUrl); } else if (!numericFileId.isEmpty()) { targetFun(account->deprecatedPrivateLinkUrl(numericFileId).toString(QUrl::FullyEncoded)); } else { targetFun(oldUrl); } }); QObject::connect(job, &PropfindJob::finishedWithError, target, [=](QNetworkReply *) { targetFun(oldUrl); }); job->start(); }
void ConnectionValidator::slotCheckAuthentication() { // simply GET the webdav root, will fail if credentials are wrong. // continue in slotAuthCheck here :-) PropfindJob *job = new PropfindJob(_account, "/", this); job->setIgnoreCredentialFailure(true); job->setProperties(QList<QByteArray>() << "getlastmodified"); connect(job, SIGNAL(result(QVariantMap)), SLOT(slotAuthSuccess())); connect(job, SIGNAL(networkError(QNetworkReply*)), SLOT(slotAuthFailed(QNetworkReply*))); job->start(); qDebug() << "# checking for authentication settings."; }
void ConnectionValidator::checkAuthentication() { AbstractCredentials *creds = _account->credentials(); if (!creds->ready()) { // The user canceled reportResult(UserCanceledCredentials); } // simply GET the webdav root, will fail if credentials are wrong. // continue in slotAuthCheck here :-) qDebug() << "# Check whether authenticated propfind works."; PropfindJob *job = new PropfindJob(_account, "/", this); job->setProperties(QList<QByteArray>() << "getlastmodified"); connect(job, SIGNAL(result(QVariantMap)), SLOT(slotAuthSuccess())); connect(job, SIGNAL(networkError(QNetworkReply*)), SLOT(slotAuthFailed(QNetworkReply*))); job->start(); }