mirror of
https://github.com/QuasarApp/installer-framework.git
synced 2025-04-29 06:54:31 +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;
|
QHash<QString, QPair<Repository, Repository> > update;
|
||||||
update.insert(QLatin1String("replace"), qMakePair(original, replacement));
|
update.insert(QLatin1String("replace"), qMakePair(original, replacement));
|
||||||
|
|
||||||
|
if (s.updateRepositoryCategories(update) == Settings::UpdatesApplied)
|
||||||
|
qDebug() << "Repository categories updated.";
|
||||||
|
|
||||||
if (s.updateDefaultRepositories(update) == Settings::UpdatesApplied
|
if (s.updateDefaultRepositories(update) == Settings::UpdatesApplied
|
||||||
|| s.updateUserRepositories(update) == Settings::UpdatesApplied) {
|
|| s.updateUserRepositories(update) == Settings::UpdatesApplied) {
|
||||||
if (m_core->isMaintainer()) {
|
if (m_core->isMaintainer()) {
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
|
|
||||||
#include "repositorycategory.h"
|
#include "repositorycategory.h"
|
||||||
#include "filedownloaderfactory.h"
|
#include "filedownloaderfactory.h"
|
||||||
|
#include "constants.h"
|
||||||
|
|
||||||
#include <QDataStream>
|
#include <QDataStream>
|
||||||
#include <QFileInfo>
|
#include <QFileInfo>
|
||||||
@ -102,16 +103,20 @@ void RepositoryCategory::setTooltip(const QString &tooltip)
|
|||||||
*/
|
*/
|
||||||
QSet<Repository> RepositoryCategory::repositories() const
|
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)
|
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)
|
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);
|
void setTooltip(const QString &tooltip);
|
||||||
|
|
||||||
QSet<Repository> repositories() const;
|
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);
|
void addRepository(const Repository repository);
|
||||||
|
|
||||||
bool isEnabled() const;
|
bool isEnabled() const;
|
||||||
|
@ -616,12 +616,46 @@ void Settings::addDefaultRepositories(const QSet<Repository> &repositories)
|
|||||||
d->m_data.insertMulti(scRepositories, QVariant().fromValue(repository));
|
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)
|
void Settings::addRepositoryCategories(const QSet<RepositoryCategory> &repositories)
|
||||||
{
|
{
|
||||||
foreach (const RepositoryCategory &repository, repositories)
|
foreach (const RepositoryCategory &repository, repositories)
|
||||||
d->m_data.insertMulti(scRepositoryCategories, QVariant().fromValue(repository));
|
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)
|
static bool apply(const RepoHash &updates, QHash<QUrl, Repository> *reposToUpdate)
|
||||||
{
|
{
|
||||||
bool update = false;
|
bool update = false;
|
||||||
|
@ -115,13 +115,16 @@ public:
|
|||||||
QSet<Repository> repositories() const;
|
QSet<Repository> repositories() const;
|
||||||
|
|
||||||
QSet<Repository> defaultRepositories() const;
|
QSet<Repository> defaultRepositories() const;
|
||||||
QSet<RepositoryCategory> repositoryCategories() const;
|
|
||||||
QMap<QString, RepositoryCategory> organizedRepositoryCategories() const;
|
|
||||||
void setDefaultRepositories(const QSet<Repository> &repositories);
|
void setDefaultRepositories(const QSet<Repository> &repositories);
|
||||||
void addDefaultRepositories(const QSet<Repository> &repositories);
|
void addDefaultRepositories(const QSet<Repository> &repositories);
|
||||||
void addRepositoryCategories(const QSet<RepositoryCategory> &repositories);
|
|
||||||
Settings::Update updateDefaultRepositories(const RepoHash &updates);
|
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;
|
QSet<Repository> temporaryRepositories() const;
|
||||||
void setTemporaryRepositories(const QSet<Repository> &repositories, bool replace);
|
void setTemporaryRepositories(const QSet<Repository> &repositories, bool replace);
|
||||||
void addTemporaryRepositories(const QSet<Repository> &repositories, bool replace);
|
void addTemporaryRepositories(const QSet<Repository> &repositories, bool replace);
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
#include "repository.h"
|
#include "repository.h"
|
||||||
|
#include "repositorycategory.h"
|
||||||
|
#include "settings.h"
|
||||||
|
|
||||||
#include <QDataStream>
|
#include <QDataStream>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
@ -114,6 +116,51 @@ private slots:
|
|||||||
s1 >> r1; s2 >> r2;
|
s1 >> r1; s2 >> r2;
|
||||||
QCOMPARE(r1, 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)
|
QTEST_MAIN(tst_Repository)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user