summaryrefslogtreecommitdiffstats
path: root/src/libs/installer/getrepositorymetainfojob.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/installer/getrepositorymetainfojob.cpp')
-rw-r--r--src/libs/installer/getrepositorymetainfojob.cpp135
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."));
}
}