diff --git a/src/modules/users/CMakeLists.txt b/src/modules/users/CMakeLists.txt
index bf93eb26a..e2d2e3117 100644
--- a/src/modules/users/CMakeLists.txt
+++ b/src/modules/users/CMakeLists.txt
@@ -55,6 +55,7 @@ calamares_add_test(
SOURCES
CreateUserTests.cpp
CreateUserJob.cpp
+ Config.cpp
)
calamares_add_test(
diff --git a/src/modules/users/Config.cpp b/src/modules/users/Config.cpp
index bb739cbd1..060600894 100644
--- a/src/modules/users/Config.cpp
+++ b/src/modules/users/Config.cpp
@@ -351,6 +351,21 @@ Config::setAutoLogin( bool b )
}
}
+STATICTEST inline void
+setConfigurationDefaultGroups( const QVariantMap& map, QStringList& defaultGroups )
+{
+ // '#' is not a valid group name; use that to distinguish an empty-list
+ // in the configuration (which is a legitimate, if unusual, choice)
+ // from a bad or missing configuration value.
+ defaultGroups = CalamaresUtils::getStringList( map, QStringLiteral( "defaultGroups" ), QStringList { "#" } );
+ if ( defaultGroups.contains( QStringLiteral( "#" ) ) )
+ {
+ cWarning() << "Using fallback groups. Please check *defaultGroups* in users.conf";
+ defaultGroups = QStringList { "lp", "video", "network", "storage", "wheel", "audio" };
+ }
+}
+
+
void
Config::setConfigurationMap( const QVariantMap& configurationMap )
{
@@ -365,6 +380,7 @@ Config::setConfigurationMap( const QVariantMap& configurationMap )
setAutologinGroup( CalamaresUtils::getString( configurationMap, "autologinGroup" ) );
setSudoersGroup( CalamaresUtils::getString( configurationMap, "sudoersGroup" ) );
+ setConfigurationDefaultGroups( configurationMap, m_defaultGroups );
m_doAutoLogin = CalamaresUtils::getBool( configurationMap, "doAutologin", false );
m_writeRootPassword = CalamaresUtils::getBool( configurationMap, "setRootPassword", true );
diff --git a/src/modules/users/Config.h b/src/modules/users/Config.h
index d32ddc8f2..b84dc5aaf 100644
--- a/src/modules/users/Config.h
+++ b/src/modules/users/Config.h
@@ -77,6 +77,8 @@ public:
/// Should the root password be written (if false, no password is set and the root account is disabled for login)
bool writeRootPassword() const { return m_writeRootPassword; }
+ const QStringList& defaultGroups() const { return m_defaultGroups; }
+
static const QStringList& forbiddenLoginNames();
static const QStringList& forbiddenHostNames();
@@ -119,6 +121,7 @@ signals:
void autoLoginChanged( bool );
private:
+ QStringList m_defaultGroups;
QString m_userShell;
QString m_autologinGroup;
QString m_sudoersGroup;
diff --git a/src/modules/users/CreateUserTests.cpp b/src/modules/users/CreateUserTests.cpp
index b351109b3..50592a384 100644
--- a/src/modules/users/CreateUserTests.cpp
+++ b/src/modules/users/CreateUserTests.cpp
@@ -17,6 +17,7 @@
* along with Calamares. If not, see .
*/
+#include "Config.h"
#include "CreateUserJob.h"
#include "utils/Logger.h"
@@ -25,8 +26,8 @@
#include
// Implementation details
-extern QStringList groupsInTargetSystem( const QDir& targetRoot );
-
+extern QStringList groupsInTargetSystem( const QDir& targetRoot ); // CreateUserJob
+extern void setConfigurationDefaultGroups( const QVariantMap& map, QStringList& defaultGroups );
class CreateUserTests : public QObject
{
@@ -39,6 +40,7 @@ private Q_SLOTS:
void initTestCase();
void testReadGroup();
+ void testDefaultGroups();
};
CreateUserTests::CreateUserTests() {}
@@ -73,6 +75,61 @@ CreateUserTests::testReadGroup()
}
}
+void
+CreateUserTests::testDefaultGroups()
+{
+ {
+ QStringList groups;
+ QVariantMap hweelGroup;
+ QVERIFY( groups.isEmpty() );
+ hweelGroup.insert( "defaultGroups", QStringList { "hweel" } );
+ setConfigurationDefaultGroups( hweelGroup, groups );
+ QCOMPARE( groups.count(), 1 );
+ QVERIFY( groups.contains( "hweel" ) );
+ }
+
+ {
+ QStringList desired { "wheel", "root", "operator" };
+ QStringList groups;
+ QVariantMap threeGroup;
+ QVERIFY( groups.isEmpty() );
+ threeGroup.insert( "defaultGroups", desired );
+ setConfigurationDefaultGroups( threeGroup, groups );
+ QCOMPARE( groups.count(), 3 );
+ QVERIFY( !groups.contains( "hweel" ) );
+ QCOMPARE( groups, desired );
+ }
+
+ {
+ QStringList groups;
+ QVariantMap explicitEmpty;
+ QVERIFY( groups.isEmpty() );
+ explicitEmpty.insert( "defaultGroups", QStringList() );
+ setConfigurationDefaultGroups( explicitEmpty, groups );
+ QCOMPARE( groups.count(), 0 );
+ }
+
+ {
+ QStringList groups;
+ QVariantMap missing;
+ QVERIFY( groups.isEmpty() );
+ setConfigurationDefaultGroups( missing, groups );
+ QCOMPARE( groups.count(), 6 ); // because of fallback!
+ QVERIFY( groups.contains( "lp" ) );
+ }
+
+ {
+ QStringList groups;
+ QVariantMap typeMismatch;
+ QVERIFY( groups.isEmpty() );
+ typeMismatch.insert( "defaultGroups", 1 );
+ setConfigurationDefaultGroups( typeMismatch, groups );
+ QCOMPARE( groups.count(), 6 ); // because of fallback!
+ QVERIFY( groups.contains( "lp" ) );
+ }
+}
+
+
QTEST_GUILESS_MAIN( CreateUserTests )
#include "utils/moc-warnings.h"
diff --git a/src/modules/users/UsersViewStep.cpp b/src/modules/users/UsersViewStep.cpp
index ddaf4837b..b9ea3ae17 100644
--- a/src/modules/users/UsersViewStep.cpp
+++ b/src/modules/users/UsersViewStep.cpp
@@ -145,10 +145,11 @@ UsersViewStep::onLeave()
}
Calamares::Job* j;
+ // TODO: Config object should create jobs, like this one, that depend only on config values
j = new CreateUserJob( m_config->loginName(),
m_config->fullName().isEmpty() ? m_config->loginName() : m_config->fullName(),
m_config->doAutoLogin(),
- m_defaultGroups );
+ m_config->defaultGroups() );
auto userPW = m_widget->getUserPassword();
j = new SetPasswordJob( userPW.first, userPW.second );
@@ -171,17 +172,6 @@ UsersViewStep::setConfigurationMap( const QVariantMap& configurationMap )
(void)this->widget();
using CalamaresUtils::getBool;
- if ( configurationMap.contains( "defaultGroups" )
- && configurationMap.value( "defaultGroups" ).type() == QVariant::List )
- {
- m_defaultGroups = configurationMap.value( "defaultGroups" ).toStringList();
- }
- else
- {
- cWarning() << "Using fallback groups. Please check defaultGroups in users.conf";
- m_defaultGroups = QStringList { "lp", "video", "network", "storage", "wheel", "audio" };
- }
-
m_widget->setReusePasswordDefault( getBool( configurationMap, "doReusePassword", false ) );
if ( configurationMap.contains( "passwordRequirements" )
diff --git a/src/modules/users/UsersViewStep.h b/src/modules/users/UsersViewStep.h
index aacf11f2a..5c3674571 100644
--- a/src/modules/users/UsersViewStep.h
+++ b/src/modules/users/UsersViewStep.h
@@ -61,7 +61,6 @@ private:
UsersPage* m_widget;
QList< Calamares::job_ptr > m_jobs;
- QStringList m_defaultGroups;
SetHostNameJob::Actions m_actions;
Config* m_config;