fix: Settings, add a new private cleanScreenName method to update the screenName
Fixes: #9156 Names: contain only A-Z a-z 0-9 or - or . or _ replace any spaces with _ are < 256 characters in length can not start or end with - _ or . Set a screen name if the settings does not have one do this instead of returning a default value
This commit is contained in:
parent
94b7e2ffff
commit
22d27f7245
4 changed files with 79 additions and 12 deletions
|
|
@ -33,6 +33,8 @@ void Settings::setSettingsFile(const QString &settingsFile)
|
||||||
instance()->m_settings = new QSettings(settingsFile, QSettings::IniFormat, instance());
|
instance()->m_settings = new QSettings(settingsFile, QSettings::IniFormat, instance());
|
||||||
instance()->m_settingsProxy->load(settingsFile);
|
instance()->m_settingsProxy->load(settingsFile);
|
||||||
qInfo().noquote() << "settings file changed:" << instance()->m_settings->fileName();
|
qInfo().noquote() << "settings file changed:" << instance()->m_settings->fileName();
|
||||||
|
|
||||||
|
instance()->setupScreenName();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Settings::setStateFile(const QString &stateFile)
|
void Settings::setStateFile(const QString &stateFile)
|
||||||
|
|
@ -80,6 +82,8 @@ Settings::Settings(QObject *parent) : QObject(parent)
|
||||||
const auto stateFile = QStringLiteral("%1/%2.state").arg(stateBase, kAppName);
|
const auto stateFile = QStringLiteral("%1/%2.state").arg(stateBase, kAppName);
|
||||||
|
|
||||||
m_stateSettings = new QSettings(stateFile, QSettings::IniFormat, this);
|
m_stateSettings = new QSettings(stateFile, QSettings::IniFormat, this);
|
||||||
|
|
||||||
|
setupScreenName();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Settings::cleanSettings()
|
void Settings::cleanSettings()
|
||||||
|
|
@ -104,6 +108,35 @@ void Settings::cleanStateSettings()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Settings::setupScreenName()
|
||||||
|
{
|
||||||
|
if (m_settings->value(Settings::Core::ScreenName).isNull())
|
||||||
|
m_settings->setValue(Settings::Core::ScreenName, cleanScreenName(QSysInfo::machineHostName()));
|
||||||
|
}
|
||||||
|
|
||||||
|
QString Settings::cleanScreenName(const QString &name)
|
||||||
|
{
|
||||||
|
static const auto hyphen = QStringLiteral("-");
|
||||||
|
static const auto space = QStringLiteral(" ");
|
||||||
|
static const auto underscore = QStringLiteral("_");
|
||||||
|
static const auto peroid = QStringLiteral(".");
|
||||||
|
static const auto nothing = QStringLiteral("");
|
||||||
|
static const auto nameRegex = QRegularExpression(QStringLiteral("[^\\w\\-\\.]"));
|
||||||
|
|
||||||
|
QString cleanName = name.simplified();
|
||||||
|
cleanName.replace(space, underscore);
|
||||||
|
cleanName.replace(nameRegex, nothing);
|
||||||
|
while (cleanName.startsWith(hyphen) || cleanName.startsWith(underscore) || cleanName.startsWith(peroid))
|
||||||
|
cleanName.removeFirst();
|
||||||
|
while (cleanName.endsWith(hyphen) || cleanName.endsWith(underscore) || cleanName.endsWith(peroid))
|
||||||
|
cleanName.removeLast();
|
||||||
|
if (cleanName.length() > 255) {
|
||||||
|
cleanName.truncate(255);
|
||||||
|
cleanName = cleanScreenName(cleanName);
|
||||||
|
}
|
||||||
|
return cleanName;
|
||||||
|
}
|
||||||
|
|
||||||
int Settings::logLevelToInt(const QString &level)
|
int Settings::logLevelToInt(const QString &level)
|
||||||
{
|
{
|
||||||
// Can do this better later ?
|
// Can do this better later ?
|
||||||
|
|
@ -152,15 +185,6 @@ QVariant Settings::defaultValue(const QString &key)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (key == Core::ScreenName) {
|
|
||||||
// The localhost name can contain spaces and non word characters
|
|
||||||
QString name = QSysInfo::machineHostName().simplified();
|
|
||||||
name.replace(QLatin1String(" "), QStringLiteral("_"));
|
|
||||||
static const auto nameRegex = QRegularExpression(QLatin1String("\\W"));
|
|
||||||
name.replace(nameRegex, QLatin1String(""));
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (key == Gui::WindowGeometry)
|
if (key == Gui::WindowGeometry)
|
||||||
return QRect();
|
return QRect();
|
||||||
|
|
||||||
|
|
@ -287,8 +311,12 @@ void Settings::setValue(const QString &key, const QVariant &value)
|
||||||
|
|
||||||
if (!value.isValid())
|
if (!value.isValid())
|
||||||
settings->remove(key);
|
settings->remove(key);
|
||||||
else
|
else {
|
||||||
settings->setValue(key, value);
|
if (key == Settings::Core::ScreenName)
|
||||||
|
settings->setValue(key, cleanScreenName(value.toString()));
|
||||||
|
else
|
||||||
|
settings->setValue(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
settings->sync();
|
settings->sync();
|
||||||
Q_EMIT instance()->settingsChanged(key);
|
Q_EMIT instance()->settingsChanged(key);
|
||||||
|
|
|
||||||
|
|
@ -149,6 +149,18 @@ private:
|
||||||
void cleanSettings();
|
void cleanSettings();
|
||||||
void cleanStateSettings();
|
void cleanStateSettings();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief write an initial screen name
|
||||||
|
*/
|
||||||
|
void setupScreenName();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief cleanScreenName ensure a valid screenName from the provided one
|
||||||
|
* @param name any string to be used as the screenName
|
||||||
|
* @return a valid screeName
|
||||||
|
*/
|
||||||
|
static QString cleanScreenName(const QString &name);
|
||||||
|
|
||||||
QSettings *m_settings = nullptr;
|
QSettings *m_settings = nullptr;
|
||||||
QSettings *m_stateSettings = nullptr;
|
QSettings *m_stateSettings = nullptr;
|
||||||
std::shared_ptr<QSettingsProxy> m_settingsProxy;
|
std::shared_ptr<QSettingsProxy> m_settingsProxy;
|
||||||
|
|
|
||||||
|
|
@ -61,7 +61,8 @@ void SettingsTests::checkValidSettings()
|
||||||
QSignalSpy spy(Settings::instance(), &Settings::settingsChanged);
|
QSignalSpy spy(Settings::instance(), &Settings::settingsChanged);
|
||||||
QVERIFY(spy.isValid());
|
QVERIFY(spy.isValid());
|
||||||
|
|
||||||
const auto validKeys = Settings::validKeys();
|
const auto keysToCheck = QRegularExpression(QLatin1String("[^%1]").arg(Settings::Core::ScreenName));
|
||||||
|
const auto validKeys = Settings::validKeys().filter(keysToCheck);
|
||||||
for (const auto &setting : validKeys) {
|
for (const auto &setting : validKeys) {
|
||||||
const auto value = Settings::value(setting).toString();
|
const auto value = Settings::value(setting).toString();
|
||||||
QCOMPARE(Settings::defaultValue(setting).toString(), value);
|
QCOMPARE(Settings::defaultValue(setting).toString(), value);
|
||||||
|
|
@ -81,4 +82,28 @@ void SettingsTests::checkValidSettings()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SettingsTests::checkCleanScreenName()
|
||||||
|
{
|
||||||
|
const auto input = QStringLiteral("--!_ _-S@c#r$e%e^&*(n)= +Name\n[1]2|3?4--5>6<,7`~/8*90\\.lan--.. ..");
|
||||||
|
const auto expected = QStringLiteral("Screen_Name_1234--567890.lan");
|
||||||
|
|
||||||
|
Settings::setValue(Settings::Core::ScreenName, input);
|
||||||
|
|
||||||
|
QCOMPARE(Settings::value(Settings::Core::ScreenName).toString(), expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SettingsTests::checkCleanScreenName_LongName()
|
||||||
|
{
|
||||||
|
QString input;
|
||||||
|
input.fill('f', 300);
|
||||||
|
input.prepend('.');
|
||||||
|
|
||||||
|
QString expected;
|
||||||
|
expected.fill('f', 255);
|
||||||
|
|
||||||
|
Settings::setValue(Settings::Core::ScreenName, input);
|
||||||
|
|
||||||
|
QCOMPARE(Settings::value(Settings::Core::ScreenName).toString(), expected);
|
||||||
|
}
|
||||||
|
|
||||||
QTEST_MAIN(SettingsTests)
|
QTEST_MAIN(SettingsTests)
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,8 @@ private Q_SLOTS:
|
||||||
void tlsTrustedServersDb();
|
void tlsTrustedServersDb();
|
||||||
void tlsTrustedClientsDb();
|
void tlsTrustedClientsDb();
|
||||||
void checkValidSettings();
|
void checkValidSettings();
|
||||||
|
void checkCleanScreenName();
|
||||||
|
void checkCleanScreenName_LongName();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
inline static const QString m_settingsPathTemp = QStringLiteral("tmp/test");
|
inline static const QString m_settingsPathTemp = QStringLiteral("tmp/test");
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue