// The actual check void ConnectionValidator::slotCheckServerAndAuth() { CheckServerJob *checkJob = new CheckServerJob(_account, this); checkJob->setIgnoreCredentialFailure(true); connect(checkJob, SIGNAL(instanceFound(QUrl,QVariantMap)), SLOT(slotStatusFound(QUrl,QVariantMap))); connect(checkJob, SIGNAL(networkError(QNetworkReply*)), SLOT(slotNoStatusFound(QNetworkReply*))); connect(checkJob, SIGNAL(timeout(QUrl)), SLOT(slotJobTimeout(QUrl))); checkJob->start(); }
bool CheckServerJob::finished() { account()->setSslConfiguration(reply()->sslConfiguration()); // ### the qDebugs here should be exported via displayErrors() so they // ### can be presented to the user if the job executor has a GUI QUrl requestedUrl = reply()->request().url(); QUrl redirectUrl = reply()->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); if (!redirectUrl.isEmpty()) { _redirectCount++; if (requestedUrl.scheme() == QLatin1String("https") && redirectUrl.scheme() == QLatin1String("http")) { qDebug() << Q_FUNC_INFO << "HTTPS->HTTP downgrade detected!"; } else if (requestedUrl == redirectUrl || _redirectCount >= maxRedirects()) { qDebug() << Q_FUNC_INFO << "Redirect loop detected!"; } else { resetTimeout(); setReply(getRequest(redirectUrl)); setupConnections(reply()); return false; } } // The serverInstalls to /owncloud. Let's try that if the file wasn't found // at the original location if ((reply()->error() == QNetworkReply::ContentNotFoundError) && (!_subdirFallback)) { _subdirFallback = true; setPath(QLatin1String(owncloudDirC)+QLatin1String(statusphpC)); start(); qDebug() << "Retrying with" << reply()->url(); return false; } bool success = false; QByteArray body = reply()->readAll(); if( body.isEmpty() ) { emit instanceNotFound(reply()); } else { QVariantMap status = QtJson::parse(QString::fromUtf8(body), success).toMap(); // empty or invalid response if (!success || status.isEmpty()) { qDebug() << "status.php from server is not valid JSON!"; } qDebug() << "status.php returns: " << status << " " << reply()->error() << " Reply: " << reply(); if( status.contains("installed") && status.contains("version") && status.contains("versionstring") ) { emit instanceFound(reply()->url(), status); } else { qDebug() << "No proper answer on " << requestedUrl; emit instanceNotFound(reply()); } } return true; }
void ConnectionValidator::checkConnection() { if( _account ) { CheckServerJob *checkJob = new CheckServerJob(_account, false, this); checkJob->setIgnoreCredentialFailure(true); connect(checkJob, SIGNAL(instanceFound(QUrl,QVariantMap)), SLOT(slotStatusFound(QUrl,QVariantMap))); connect(checkJob, SIGNAL(networkError(QNetworkReply*)), SLOT(slotNoStatusFound(QNetworkReply*))); checkJob->start(); } else { _errors << tr("No ownCloud account configured"); emit connectionResult( NotConfigured ); } }
// also checks if an installation is valid and determines auth type in a second step void OwncloudSetupWizard::slotDetermineAuthType(const QString &urlString) { QString fixedUrl = urlString; QUrl url = QUrl::fromUserInput(fixedUrl); // fromUserInput defaults to http, not http if no scheme is specified if (!fixedUrl.startsWith("http://") && !fixedUrl.startsWith("https://")) { url.setScheme("https"); } Account *account = _ocWizard->account(); account->setUrl(url); CheckServerJob *job = new CheckServerJob(_ocWizard->account(), false, this); job->setIgnoreCredentialFailure(true); connect(job, SIGNAL(instanceFound(QUrl,QVariantMap)), SLOT(slotOwnCloudFoundAuth(QUrl,QVariantMap))); connect(job, SIGNAL(instanceNotFound(QNetworkReply*)), SLOT(slotNoOwnCloudFoundAuth(QNetworkReply*))); connect(job, SIGNAL(timeout(const QUrl&)), SLOT(slotNoOwnCloudFoundAuthTimeout(const QUrl&))); job->setTimeout(10*1000); job->start(); }
bool CheckServerJob::finished() { if (reply()->request().url().scheme() == QLatin1String("https") && reply()->sslConfiguration().sessionTicket().isEmpty() && reply()->error() == QNetworkReply::NoError) { qCWarning(lcCheckServerJob) << "No SSL session identifier / session ticket is used, this might impact sync performance negatively."; } mergeSslConfigurationForSslButton(reply()->sslConfiguration(), account()); // The server installs to /owncloud. Let's try that if the file wasn't found // at the original location if ((reply()->error() == QNetworkReply::ContentNotFoundError) && (!_subdirFallback)) { _subdirFallback = true; setPath(QLatin1String(nextcloudDirC) + QLatin1String(statusphpC)); start(); qCInfo(lcCheckServerJob) << "Retrying with" << reply()->url(); return false; } QByteArray body = reply()->peek(4 * 1024); int httpStatus = reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); if (body.isEmpty() || httpStatus != 200) { qCWarning(lcCheckServerJob) << "error: status.php replied " << httpStatus << body; emit instanceNotFound(reply()); } else { QJsonParseError error; auto status = QJsonDocument::fromJson(body, &error); // empty or invalid response if (error.error != QJsonParseError::NoError || status.isNull()) { qCWarning(lcCheckServerJob) << "status.php from server is not valid JSON!" << body << reply()->request().url() << error.errorString(); } qCInfo(lcCheckServerJob) << "status.php returns: " << status << " " << reply()->error() << " Reply: " << reply(); if (status.object().contains("installed")) { emit instanceFound(_serverUrl, status.object()); } else { qCWarning(lcCheckServerJob) << "No proper answer on " << reply()->url(); emit instanceNotFound(reply()); } } return true; }
bool CheckServerJob::finished() { account()->setSslConfiguration(reply()->sslConfiguration()); // The serverInstalls to /owncloud. Let's try that if the file wasn't found // at the original location if ((reply()->error() == QNetworkReply::ContentNotFoundError) && (!_subdirFallback)) { _subdirFallback = true; setPath(QLatin1String(owncloudDirC)+QLatin1String(statusphpC)); start(); qDebug() << "Retrying with" << reply()->url(); return false; } bool success = false; QByteArray body = reply()->readAll(); int httpStatus = reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); if( body.isEmpty() || httpStatus != 200) { qDebug() << "error: status.php replied " << httpStatus << body; emit instanceNotFound(reply()); } else { QVariantMap status = QtJson::parse(QString::fromUtf8(body), success).toMap(); // empty or invalid response if (!success || status.isEmpty()) { qDebug() << "status.php from server is not valid JSON!"; } qDebug() << "status.php returns: " << status << " " << reply()->error() << " Reply: " << reply(); if( status.contains("installed") && status.contains("version") && status.contains("versionstring") ) { emit instanceFound(reply()->url(), status); } else { qDebug() << "No proper answer on " << reply()->url(); emit instanceNotFound(reply()); } } return true; }
// also checks if an installation is valid and determines auth type in a second step void OwncloudSetupWizard::slotDetermineAuthType(const QString &urlString) { QString fixedUrl = urlString; QUrl url = QUrl::fromUserInput(fixedUrl); // fromUserInput defaults to http, not http if no scheme is specified if (!fixedUrl.startsWith("http://") && !fixedUrl.startsWith("https://")) { url.setScheme("https"); } AccountPtr account = _ocWizard->account(); account->setUrl(url); // Reset the proxy which might had been determined previously in ConnectionValidator::checkServerAndAuth() // when there was a previous account. account->networkAccessManager()->setProxy(QNetworkProxy(QNetworkProxy::DefaultProxy)); // Set fake credentials beforfe 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,QVariantMap)), SLOT(slotOwnCloudFoundAuth(QUrl,QVariantMap))); connect(job, SIGNAL(instanceNotFound(QNetworkReply*)), SLOT(slotNoOwnCloudFoundAuth(QNetworkReply*))); connect(job, SIGNAL(timeout(const QUrl&)), SLOT(slotNoOwnCloudFoundAuthTimeout(const QUrl&))); job->setTimeout(10*1000); job->start(); }
/** Returns the next instance Loops through all the entries in the cached entry list and finds the earliest instance that appears after the current index instance time. @return The next instance @internalComponent */ CCalInstance* CCalInstanceIteratorUid::NextL() { CCalInstance* retInstance = NULL; TInt numSameTimeEntry = iEntryWithSameTime.Count(); if(numSameTimeEntry >0 && iCurrentIndex < numSameTimeEntry - 1) { //If there are entries in iEntryWithSameTime, their instance time is same as the iCurrentIndexTime, we should return this instance. return iInstanceViewImpl.CreateInstanceL(*iCalLiteEntries[iEntryWithSameTime[++iCurrentIndex]], iCurrentIndexTime); } TCalTime bestSoFar; bestSoFar.SetTimeUtcL(TCalTime::MaxTime()); TInt thisAgnSimpleEntryIndex(KErrNotFound); const TInt KEntryCount(iCalLiteEntries.Count()); TInt i(0); for (; i < KEntryCount ; ++i) { TCalTime entryNextTime; entryNextTime.SetTimeUtcL(TCalTime::MaxTime()); CAgnRptDef* thisEntryRptDef = iCalLiteEntries[i]->LiteEntry().RptDef(); if (thisEntryRptDef) { TTime entryNextTimeUtc; TBool instanceFound(EFalse); TTime fromTimeUtc(iCurrentIndexTime.TimeUtcL() + TTimeIntervalMicroSeconds(1)); do { // keep looping until we find an unexcepted instance or there are no more instances instanceFound = thisEntryRptDef->NudgeNextInstanceUtcL(fromTimeUtc, entryNextTimeUtc); fromTimeUtc = entryNextTimeUtc + TTimeIntervalMicroSeconds(1); } while (instanceFound && !thisEntryRptDef->IsAnUnexceptedInstanceL(AgnDateTime::ConvertToLocalTimeL(entryNextTimeUtc) ) ); if (instanceFound) { entryNextTime.SetTimeUtcL(entryNextTimeUtc); } } else { TCalTime entryInstanceTime = NonRptEntryInstanceTimeL(iCalLiteEntries[i]->LiteEntry()); if (entryInstanceTime.TimeUtcL() > iCurrentIndexTime.TimeUtcL()) { // The entry's instance time is after the current index time // so it is a valid possible next instance entryNextTime = entryInstanceTime; } } if (entryNextTime.TimeUtcL() < bestSoFar.TimeUtcL()) { // This time is better than best time so far so update the best so far bestSoFar = entryNextTime; thisAgnSimpleEntryIndex = i; iEntryWithSameTime.Reset(); iCurrentIndex = -1; } else if (entryNextTime.TimeUtcL() == bestSoFar.TimeUtcL() && entryNextTime.TimeUtcL()!= TCalTime::MaxTime()) { //Store the index of the entry which has the instance time as the "bestSoFar" time iEntryWithSameTime.AppendL(i); } } if (bestSoFar.TimeUtcL() != TCalTime::MaxTime()) { retInstance = iInstanceViewImpl.CreateInstanceL(*iCalLiteEntries[thisAgnSimpleEntryIndex], bestSoFar); iCurrentIndexTime = bestSoFar; } return retInstance; }