mirror of
https://github.com/QuasarApp/installer-framework.git
synced 2025-04-27 14:04:32 +00:00
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:
parent
120e527ed1
commit
55ecbb9660
@ -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()) {
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
/*!
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user