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 <katja.marttila@qt.io>
This commit is contained in:
Arttu Tarkiainen 2019-06-24 09:21:39 +03:00
parent 120e527ed1
commit 55ecbb9660
6 changed files with 101 additions and 9 deletions

View File

@ -326,6 +326,9 @@ void MetadataJob::xmlTaskFinished()
QHash<QString, QPair<Repository, Repository> > 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()) {

View File

@ -28,6 +28,7 @@
#include "repositorycategory.h"
#include "filedownloaderfactory.h"
#include "constants.h"
#include <QDataStream>
#include <QFileInfo>
@ -102,16 +103,20 @@ void RepositoryCategory::setTooltip(const QString &tooltip)
*/
QSet<Repository> RepositoryCategory::repositories() const
{
return variantListToSet<Repository>(m_data.values(QLatin1String("Repositories")));
return variantListToSet<Repository>(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<Repository> repositories)
void RepositoryCategory::setRepositories(const QSet<Repository> 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<Repository> repositories)
*/
void RepositoryCategory::addRepository(const Repository repository)
{
m_data.insertMulti(QLatin1String("Repositories"), QVariant().fromValue(repository));
m_data.insertMulti(scRepositories, QVariant().fromValue(repository));
}
/*!

View File

@ -54,7 +54,7 @@ public:
void setTooltip(const QString &tooltip);
QSet<Repository> repositories() const;
void setRepositories(const QSet<Repository> repositories);
void setRepositories(const QSet<Repository> repositories, const bool replace = false);
void addRepository(const Repository repository);
bool isEnabled() const;

View File

@ -616,12 +616,46 @@ void Settings::addDefaultRepositories(const QSet<Repository> &repositories)
d->m_data.insertMulti(scRepositories, QVariant().fromValue(repository));
}
void Settings::setRepositoryCategories(const QSet<RepositoryCategory> &repositories)
{
d->m_data.remove(scRepositoryCategories);
addRepositoryCategories(repositories);
}
void Settings::addRepositoryCategories(const QSet<RepositoryCategory> &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<RepositoryCategory> categories = repositoryCategories();
QList<RepositoryCategory> categoriesList = categories.values();
QPair<Repository, Repository> updateValues = updates.value(QLatin1String("replace"));
bool update = false;
foreach (RepositoryCategory category, categoriesList) {
QSet<Repository> 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<QUrl, Repository> *reposToUpdate)
{
bool update = false;

View File

@ -115,13 +115,16 @@ public:
QSet<Repository> repositories() const;
QSet<Repository> defaultRepositories() const;
QSet<RepositoryCategory> repositoryCategories() const;
QMap<QString, RepositoryCategory> organizedRepositoryCategories() const;
void setDefaultRepositories(const QSet<Repository> &repositories);
void addDefaultRepositories(const QSet<Repository> &repositories);
void addRepositoryCategories(const QSet<RepositoryCategory> &repositories);
Settings::Update updateDefaultRepositories(const RepoHash &updates);
QSet<RepositoryCategory> repositoryCategories() const;
QMap<QString, RepositoryCategory> organizedRepositoryCategories() const;
void setRepositoryCategories(const QSet<RepositoryCategory> &repositories);
void addRepositoryCategories(const QSet<RepositoryCategory> &repositories);
Settings::Update updateRepositoryCategories(const RepoHash &updates);
QSet<Repository> temporaryRepositories() const;
void setTemporaryRepositories(const QSet<Repository> &repositories, bool replace);
void addTemporaryRepositories(const QSet<Repository> &repositories, bool replace);

View File

@ -1,4 +1,6 @@
#include "repository.h"
#include "repositorycategory.h"
#include "settings.h"
#include <QDataStream>
#include <QString>
@ -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<RepositoryCategory> categories;
categories.insert(category);
settings.setRepositoryCategories(categories);
QHash<QString, QPair<Repository, Repository>> 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)