From 55ecbb9660048b06959d471b783a05e4f6b47efd Mon Sep 17 00:00:00 2001 From: Arttu Tarkiainen Date: Mon, 24 Jun 2019 09:21:39 +0300 Subject: Update repository categories on server authentication request If repositories in a category were located on a server that requires user authentication, IFW couldn't update information of the repositories inside a category during runtime. This prevents for example storing credentials from the authentication request dialog and blocks the usage of that category. Add a method for updating contents in repository categories and a unit test for the new method. Also some minor tweaks to relevant bits of code. Task-number: QTIFW-1358 Change-Id: Idfa2559df6d0d2a6de428b8d5fb1f7672aa1e300 Reviewed-by: Katja Marttila --- src/libs/installer/metadatajob.cpp | 3 ++ src/libs/installer/repositorycategory.cpp | 15 ++++--- src/libs/installer/repositorycategory.h | 2 +- src/libs/installer/settings.cpp | 34 ++++++++++++++++ src/libs/installer/settings.h | 9 +++-- tests/auto/installer/repository/tst_repository.cpp | 47 ++++++++++++++++++++++ 6 files changed, 101 insertions(+), 9 deletions(-) diff --git a/src/libs/installer/metadatajob.cpp b/src/libs/installer/metadatajob.cpp index ecdf1cd31..7d7b46e72 100644 --- a/src/libs/installer/metadatajob.cpp +++ b/src/libs/installer/metadatajob.cpp @@ -326,6 +326,9 @@ void MetadataJob::xmlTaskFinished() QHash > update; update.insert(QLatin1String("replace"), qMakePair(original, replacement)); + if (s.updateRepositoryCategories(update) == Settings::UpdatesApplied) + qDebug() << "Repository categories updated."; + if (s.updateDefaultRepositories(update) == Settings::UpdatesApplied || s.updateUserRepositories(update) == Settings::UpdatesApplied) { if (m_core->isMaintainer()) { diff --git a/src/libs/installer/repositorycategory.cpp b/src/libs/installer/repositorycategory.cpp index 42fb41c99..ce06480c8 100644 --- a/src/libs/installer/repositorycategory.cpp +++ b/src/libs/installer/repositorycategory.cpp @@ -28,6 +28,7 @@ #include "repositorycategory.h" #include "filedownloaderfactory.h" +#include "constants.h" #include #include @@ -102,16 +103,20 @@ void RepositoryCategory::setTooltip(const QString &tooltip) */ QSet RepositoryCategory::repositories() const { - return variantListToSet(m_data.values(QLatin1String("Repositories"))); + return variantListToSet(m_data.values(scRepositories)); } /*! - Inserts a set of \a repositories to the category. + Inserts a set of \a repositories to the category. Removes old \a repositories + if \a replace is set to \c true. */ -void RepositoryCategory::setRepositories(const QSet repositories) +void RepositoryCategory::setRepositories(const QSet repositories, const bool replace) { + if (replace) + m_data.remove(scRepositories); + foreach (const Repository &repository, repositories) - m_data.insertMulti(QLatin1String("Repositories"), QVariant().fromValue(repository)); + m_data.insertMulti(scRepositories, QVariant().fromValue(repository)); } /*! @@ -119,7 +124,7 @@ void RepositoryCategory::setRepositories(const QSet repositories) */ void RepositoryCategory::addRepository(const Repository repository) { - m_data.insertMulti(QLatin1String("Repositories"), QVariant().fromValue(repository)); + m_data.insertMulti(scRepositories, QVariant().fromValue(repository)); } /*! diff --git a/src/libs/installer/repositorycategory.h b/src/libs/installer/repositorycategory.h index 98d5df7bd..1996103a5 100644 --- a/src/libs/installer/repositorycategory.h +++ b/src/libs/installer/repositorycategory.h @@ -54,7 +54,7 @@ public: void setTooltip(const QString &tooltip); QSet repositories() const; - void setRepositories(const QSet repositories); + void setRepositories(const QSet repositories, const bool replace = false); void addRepository(const Repository repository); bool isEnabled() const; diff --git a/src/libs/installer/settings.cpp b/src/libs/installer/settings.cpp index e0c9a3970..0963f2208 100644 --- a/src/libs/installer/settings.cpp +++ b/src/libs/installer/settings.cpp @@ -616,12 +616,46 @@ void Settings::addDefaultRepositories(const QSet &repositories) d->m_data.insertMulti(scRepositories, QVariant().fromValue(repository)); } +void Settings::setRepositoryCategories(const QSet &repositories) +{ + d->m_data.remove(scRepositoryCategories); + addRepositoryCategories(repositories); +} + void Settings::addRepositoryCategories(const QSet &repositories) { foreach (const RepositoryCategory &repository, repositories) d->m_data.insertMulti(scRepositoryCategories, QVariant().fromValue(repository)); } +Settings::Update Settings::updateRepositoryCategories(const RepoHash &updates) +{ + if (updates.isEmpty()) + return Settings::NoUpdatesApplied; + + QSet categories = repositoryCategories(); + QList categoriesList = categories.values(); + QPair updateValues = updates.value(QLatin1String("replace")); + + bool update = false; + + foreach (RepositoryCategory category, categoriesList) { + QSet repositories = category.repositories(); + if (repositories.contains(updateValues.first)) { + update = true; + repositories.remove(updateValues.first); + repositories.insert(updateValues.second); + category.setRepositories(repositories, true); + categoriesList.replace(categoriesList.indexOf(category), category); + } + } + if (update) { + categories = categoriesList.toSet(); + setRepositoryCategories(categories); + } + return update ? Settings::UpdatesApplied : Settings::NoUpdatesApplied; +} + static bool apply(const RepoHash &updates, QHash *reposToUpdate) { bool update = false; diff --git a/src/libs/installer/settings.h b/src/libs/installer/settings.h index 55b94d745..fff2324f1 100644 --- a/src/libs/installer/settings.h +++ b/src/libs/installer/settings.h @@ -115,13 +115,16 @@ public: QSet repositories() const; QSet defaultRepositories() const; - QSet repositoryCategories() const; - QMap organizedRepositoryCategories() const; void setDefaultRepositories(const QSet &repositories); void addDefaultRepositories(const QSet &repositories); - void addRepositoryCategories(const QSet &repositories); Settings::Update updateDefaultRepositories(const RepoHash &updates); + QSet repositoryCategories() const; + QMap organizedRepositoryCategories() const; + void setRepositoryCategories(const QSet &repositories); + void addRepositoryCategories(const QSet &repositories); + Settings::Update updateRepositoryCategories(const RepoHash &updates); + QSet temporaryRepositories() const; void setTemporaryRepositories(const QSet &repositories, bool replace); void addTemporaryRepositories(const QSet &repositories, bool replace); diff --git a/tests/auto/installer/repository/tst_repository.cpp b/tests/auto/installer/repository/tst_repository.cpp index 8d5d278a2..7b8405baf 100644 --- a/tests/auto/installer/repository/tst_repository.cpp +++ b/tests/auto/installer/repository/tst_repository.cpp @@ -1,4 +1,6 @@ #include "repository.h" +#include "repositorycategory.h" +#include "settings.h" #include #include @@ -114,6 +116,51 @@ private slots: s1 >> r1; s2 >> r2; QCOMPARE(r1, r2); } + + void testUpdateRepositoryCategories() + { + Settings settings; + + RepositoryCategory category; + category.setEnabled(true); + category.setDisplayName(QLatin1String("category")); + + Repository original(QUrl("http://example.com/"), true); + original.setEnabled(true); + category.addRepository(original); + + Repository replacement = original; + replacement.setUsername(QLatin1String("user")); + replacement.setPassword(QLatin1String("pass")); + + QSet categories; + categories.insert(category); + settings.setRepositoryCategories(categories); + + QHash> update; + + // non-empty update + update.insert(QLatin1String("replace"), qMakePair(original, replacement)); + QVERIFY(settings.updateRepositoryCategories(update) == Settings::UpdatesApplied); + + // verify that the values really updated + QVERIFY(settings.repositoryCategories().values().at(0) + .repositories().values().at(0).username() == "user"); + + QVERIFY(settings.repositoryCategories().values().at(0) + .repositories().values().at(0).password() == "pass"); + + // empty update + update.clear(); + QVERIFY(settings.updateRepositoryCategories(update) == Settings::NoUpdatesApplied); + + // non-matching repository update + Repository nonMatching(QUrl("https://www.qt.io/"), true); + nonMatching.setEnabled(true); + + update.insert(QLatin1String("replace"), qMakePair(nonMatching, replacement)); + QVERIFY(settings.updateRepositoryCategories(update) == Settings::NoUpdatesApplied); + } }; QTEST_MAIN(tst_Repository) -- cgit v1.2.3