diff options
Diffstat (limited to 'src/libs/installer/getrepositorymetainfojob.cpp')
-rw-r--r-- | src/libs/installer/getrepositorymetainfojob.cpp | 135 |
1 files changed, 77 insertions, 58 deletions
diff --git a/src/libs/installer/getrepositorymetainfojob.cpp b/src/libs/installer/getrepositorymetainfojob.cpp index b0386c223..14bcf26f2 100644 --- a/src/libs/installer/getrepositorymetainfojob.cpp +++ b/src/libs/installer/getrepositorymetainfojob.cpp @@ -44,22 +44,15 @@ #include "lib7z_facade.h" #include "messageboxhandler.h" #include "packagemanagercore_p.h" -#include "qinstallerglobal.h" #include "utils.h" #include "kdupdaterfiledownloader.h" #include "kdupdaterfiledownloaderfactory.h" -#include <QtCore/QFile> -#include <QtCore/QTimer> -#include <QtCore/QUrl> +#include "productkeycheck.h" -#include <QMessageBox> +#include <QTimer> -#include <QtNetwork/QAuthenticator> - -#include <QtXml/QDomDocument> -#include <QtXml/QDomElement> using namespace KDUpdater; using namespace QInstaller; @@ -120,14 +113,14 @@ private: // -- GetRepositoryMetaInfoJob -GetRepositoryMetaInfoJob::GetRepositoryMetaInfoJob(PackageManagerCorePrivate *corePrivate, QObject *parent) - : KDJob(parent), - m_canceled(false), - m_silentRetries(4), - m_retriesLeft(m_silentRetries), - m_downloader(0), - m_waitForDone(false), - m_corePrivate(corePrivate) +GetRepositoryMetaInfoJob::GetRepositoryMetaInfoJob(PackageManagerCore *core, QObject *parent) + : KDJob(parent) + , m_canceled(false) + , m_silentRetries(4) + , m_retriesLeft(m_silentRetries) + , m_downloader(0) + , m_waitForDone(false) + , m_core(core) { setCapabilities(Cancelable); } @@ -206,14 +199,14 @@ void GetRepositoryMetaInfoJob::startUpdatesXmlDownload() } if (!url.isValid()) { - finished(QInstaller::InvalidUrl, tr("Invalid repository URL: %1").arg(url.toString())); + finished(QInstaller::InvalidUrl, tr("Invalid repository URL: %1").arg(m_repository.displayname())); return; } m_downloader = FileDownloaderFactory::instance().create(url.scheme(), this); if (!m_downloader) { finished(QInstaller::InvalidUrl, tr("URL scheme not supported: %1 (%2)").arg(url.scheme(), - url.toString())); + m_repository.displayname())); return; } @@ -253,20 +246,7 @@ void GetRepositoryMetaInfoJob::updatesXmlDownloadFinished() Q_ASSERT(!fn.isEmpty()); Q_ASSERT(QFile::exists(fn)); - try { - m_temporaryDirectory = createTemporaryDirectory(QLatin1String("remoterepo")); - m_tempDirDeleter.add(m_temporaryDirectory); - } catch (const QInstaller::Error& e) { - finished(QInstaller::ExtractionError, e.message()); - return; - } - QFile updatesFile(fn); - if (!updatesFile.rename(m_temporaryDirectory + QLatin1String("/Updates.xml"))) { - finished(QInstaller::DownloadError, tr("Could not move Updates.xml to target location. Error: %1") - .arg(updatesFile.errorString())); - return; - } if (!updatesFile.open(QIODevice::ReadOnly)) { finished(QInstaller::DownloadError, tr("Could not open Updates.xml for reading. Error: %1") @@ -276,9 +256,12 @@ void GetRepositoryMetaInfoJob::updatesXmlDownloadFinished() QString err; QDomDocument doc; - if (!doc.setContent(&updatesFile, &err)) { + const bool success = doc.setContent(&updatesFile, &err); + updatesFile.close(); + + if (!success) { const QString msg = tr("Could not fetch a valid version of Updates.xml from repository: %1. " - "Error: %2").arg(m_repository.url().toString(), err); + "Error: %2").arg(m_repository.displayname(), err); const QMessageBox::StandardButton b = MessageBoxHandler::critical(MessageBoxHandler::currentBestSuitParent(), @@ -308,15 +291,16 @@ void GetRepositoryMetaInfoJob::updatesXmlDownloadFinished() repository.setUsername(el.attribute(QLatin1String("username"))); repository.setPassword(el.attribute(QLatin1String("password"))); repository.setDisplayName(el.attribute(QLatin1String("displayname"))); - repositoryUpdates.insertMulti(action, qMakePair(repository, Repository())); - - qDebug() << "Repository to add:" << repository.url().toString(); + if (ProductKeyCheck::instance()->isValidRepository(repository)) { + repositoryUpdates.insertMulti(action, qMakePair(repository, Repository())); + qDebug() << "Repository to add:" << repository.displayname(); + } } else if (action == QLatin1String("remove")) { // remove possible default repositories using the given server url Repository repository(el.attribute(QLatin1String("url")), true); repositoryUpdates.insertMulti(action, qMakePair(repository, Repository())); - qDebug() << "Repository to remove:" << repository.url().toString(); + qDebug() << "Repository to remove:" << repository.displayname(); } else if (action == QLatin1String("replace")) { // replace possible default repositories using the given server url Repository oldRepository(el.attribute(QLatin1String("oldUrl")), true); @@ -325,24 +309,46 @@ void GetRepositoryMetaInfoJob::updatesXmlDownloadFinished() newRepository.setPassword(el.attribute(QLatin1String("password"))); newRepository.setDisplayName(el.attribute(QLatin1String("displayname"))); - // store the new repository and the one old it replaces - repositoryUpdates.insertMulti(action, qMakePair(newRepository, oldRepository)); - qDebug() << "Replace repository:" << oldRepository.url().toString() << "with:" - << newRepository.url().toString(); + if (ProductKeyCheck::instance()->isValidRepository(newRepository)) { + // store the new repository and the one old it replaces + repositoryUpdates.insertMulti(action, qMakePair(newRepository, oldRepository)); + qDebug() << "Replace repository:" << oldRepository.displayname() << "with:" + << newRepository.displayname(); + } } else { qDebug() << "Invalid additional repositories action set in Updates.xml fetched from:" - << m_repository.url().toString() << "Line:" << el.lineNumber(); + << m_repository.displayname() << "Line:" << el.lineNumber(); } } } if (!repositoryUpdates.isEmpty()) { - if (m_corePrivate->m_data.settings().updateDefaultRepositories(repositoryUpdates) - == Settings::UpdatesApplied) { - if (m_corePrivate->isUpdater() || m_corePrivate->isPackageManager()) - m_corePrivate->writeMaintenanceConfigFiles(); + const QSet<Repository> temporaries = m_core->settings().temporaryRepositories(); + // in case the temp repository introduced something new, we only want that temporary + if (temporaries.contains(m_repository)) { + + QSet<Repository> childTempRepositories; + typedef QPair<Repository, Repository> RepositoryPair; + + QList<RepositoryPair> values = repositoryUpdates.values(QLatin1String("add")); + foreach (const RepositoryPair &value, values) + childTempRepositories.insert(value.first); + + values = repositoryUpdates.values(QLatin1String("replace")); + foreach (const RepositoryPair &value, values) + childTempRepositories.insert(value.first); + + QSet<Repository> newChildTempRepositories = childTempRepositories.subtract(temporaries); + if (newChildTempRepositories.count() > 0) { + m_core->settings().addTemporaryRepositories(newChildTempRepositories, true); finished(QInstaller::RepositoryUpdatesReceived, tr("Repository updates received.")); return; + } + } else if (m_core->settings().updateDefaultRepositories(repositoryUpdates) == Settings::UpdatesApplied) { + if (m_core->isUpdater() || m_core->isPackageManager()) + m_core->writeMaintenanceConfigFiles(); + finished(QInstaller::RepositoryUpdatesReceived, tr("Repository updates received.")); + return; } } } @@ -365,6 +371,19 @@ void GetRepositoryMetaInfoJob::updatesXmlDownloadFinished() } } + try { + m_temporaryDirectory = createTemporaryDirectory(QLatin1String("remoterepo-")); + m_tempDirDeleter.add(m_temporaryDirectory); + } catch (const QInstaller::Error& e) { + finished(QInstaller::ExtractionError, e.message()); + return; + } + if (!updatesFile.rename(m_temporaryDirectory + QLatin1String("/Updates.xml"))) { + finished(QInstaller::DownloadError, tr("Could not move Updates.xml to target location. Error: %1") + .arg(updatesFile.errorString())); + return; + } + setTotalAmount(m_packageNames.count() + 1); setProcessedAmount(1); emit infoMessage(this, tr("Finished updating component meta information.")); @@ -379,7 +398,7 @@ void GetRepositoryMetaInfoJob::updatesXmlDownloadError(const QString &err) { if (m_retriesLeft <= 0) { const QString msg = tr("Could not fetch Updates.xml from repository: %1. Error: %2") - .arg(m_repository.url().toString(), err); + .arg(m_repository.displayname(), err); QMessageBox::StandardButtons buttons = QMessageBox::Retry | QMessageBox::Cancel; const QMessageBox::StandardButton b = @@ -434,7 +453,7 @@ void GetRepositoryMetaInfoJob::fetchNextMetaInfo() if (!m_downloader) { m_currentPackageName.clear(); m_currentPackageVersion.clear(); - qWarning() << "Scheme not supported:" << url.toString(); + qWarning() << "Scheme not supported:" << m_repository.displayname(); QMetaObject::invokeMethod(this, "fetchNextMetaInfo", Qt::QueuedConnection); return; } @@ -544,26 +563,26 @@ void GetRepositoryMetaInfoJob::onAuthenticatorChanged(const QAuthenticator &auth const QString username = authenticator.user(); const QString password = authenticator.password(); if (username != m_repository.username() || password != m_repository.password()) { - QSet<Repository> repositories = m_corePrivate->m_data.settings().defaultRepositories(); + QSet<Repository> repositories = m_core->settings().defaultRepositories(); bool reposChanged = updateRepositories(&repositories, username, password); if (reposChanged) - m_corePrivate->m_data.settings().setDefaultRepositories(repositories); + m_core->settings().setDefaultRepositories(repositories); - repositories = m_corePrivate->m_data.settings().temporaryRepositories(); + repositories = m_core->settings().temporaryRepositories(); reposChanged |= updateRepositories(&repositories, username, password); if (reposChanged) { - m_corePrivate->m_data.settings().setTemporaryRepositories(repositories, - m_corePrivate->m_data.settings().hasReplacementRepos()); + m_core->settings().setTemporaryRepositories(repositories, + m_core->settings().hasReplacementRepos()); } - repositories = m_corePrivate->m_data.settings().userRepositories(); + repositories = m_core->settings().userRepositories(); reposChanged |= updateRepositories(&repositories, username, password); if (reposChanged) - m_corePrivate->m_data.settings().setUserRepositories(repositories); + m_core->settings().setUserRepositories(repositories); if (reposChanged) { - if (m_corePrivate->isUpdater() || m_corePrivate->isPackageManager()) - m_corePrivate->writeMaintenanceConfigFiles(); + if (m_core->isUpdater() || m_core->isPackageManager()) + m_core->writeMaintenanceConfigFiles(); finished(QInstaller::RepositoryUpdatesReceived, tr("Repository updates received.")); } } |