Skip to content

Commit

Permalink
extra ensure that summaries can't be empty
Browse files Browse the repository at this point in the history
  • Loading branch information
benapetr committed Apr 11, 2019
1 parent a9b07d0 commit c02a2ff
Show file tree
Hide file tree
Showing 9 changed files with 93 additions and 57 deletions.
2 changes: 1 addition & 1 deletion src/3rd/libirc
Submodule libirc updated 1 files
+13 −0 libirc/irc_numerics.h
25 changes: 23 additions & 2 deletions src/huggle_core/huggleparser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,22 @@

using namespace Huggle;

QString HuggleParser::ConfigurationParse(const QString &key, const QString &content, const QString &missing)
QString HuggleParser::UserConfig_NonEmpty(const QString& key, const QString& value, const QString& default_val)
{
// We have to copy the string here, because replace() in Qt alters the string itself
QString temp = value;
// Remove all whitespace and special symbols
temp.replace(" ", "");
temp.replace("\t", "");
if (temp.isEmpty())
{
HUGGLE_WARNING("User configuration key " + key + " had empty value, which is not allowed for this key. Restoring to project config value: " + default_val);
return default_val;
}
return value;
}

QString HuggleParser::ConfigurationParse(const QString &key, const QString &content, const QString &missing, bool non_empty)
{
HUGGLE_PROFILER_INCRCALL(BOOST_CURRENT_FUNCTION);
/// \todo this parses the config a lot different than HG2 (here only one line, mising replaces...)
Expand All @@ -33,6 +48,8 @@ QString HuggleParser::ConfigurationParse(const QString &key, const QString &cont
{
value = value.mid(0, value.indexOf("\n"));
}
if (non_empty)
return UserConfig_NonEmpty(key, value, missing);
return value;
}

Expand All @@ -44,6 +61,8 @@ QString HuggleParser::ConfigurationParse(const QString &key, const QString &cont
{
value = value.mid(0, value.indexOf("\n"));
}
if (non_empty)
return UserConfig_NonEmpty(key, value, missing);
return value;
}
return missing;
Expand Down Expand Up @@ -689,7 +708,7 @@ bool HuggleParser::YAML2Bool(const QString& key, YAML::Node &node, bool missing)
return missing;
}

QString HuggleParser::YAML2String(const QString& key, YAML::Node &node, const QString &missing)
QString HuggleParser::YAML2String(const QString& key, YAML::Node &node, const QString &missing, bool non_empty)
{
try
{
Expand All @@ -701,6 +720,8 @@ QString HuggleParser::YAML2String(const QString& key, YAML::Node &node, const QS

// This is needed for some really weird OSX related bug that randomly segfaults, if we don't make a copy of strings
std::string temp = node[key.toStdString()].as<std::string>(missing.toStdString());
if (non_empty)
return UserConfig_NonEmpty(key, QString::fromStdString(temp), missing);
return QString::fromStdString(temp);
} catch (YAML::Exception exception)
{
Expand Down
9 changes: 7 additions & 2 deletions src/huggle_core/huggleparser.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,17 +35,22 @@ namespace Huggle
//! This namespace contains functions to parse various text, such as configuration keys
namespace HuggleParser
{
//! Returns default value in case that obtained value is empty, prevents issues where user configuration has empty keys
//! or even where the converted config from previous versions had empty values
HUGGLE_EX_CORE QString UserConfig_NonEmpty(const QString& key, const QString& value, const QString& default_val);
//! Parse a string from configuration which has format used by huggle 2x
/*!
* \param key Key
* \param content Text to parse from
* \param missing Default value in case this key is missing in text
* \param non_empty if true value of key must be non empty. If empty default value is returned instead. Expected to be used when parsing
* user config only.
* \return Value of key, in case there is no such a key content of missing is returned
*/
HUGGLE_EX_CORE QString ConfigurationParse(const QString &key, const QString &content, const QString &missing = "");
HUGGLE_EX_CORE QString ConfigurationParse(const QString &key, const QString &content, const QString &missing = "", bool non_empty = false);
HUGGLE_EX_CORE bool ConfigurationParseBool(const QString &key, const QString &content, bool missing);
HUGGLE_EX_CORE bool YAML2Bool(const QString& key, YAML::Node &node, bool missing = false);
HUGGLE_EX_CORE QString YAML2String(const QString& key, YAML::Node &node, const QString &missing = "");
HUGGLE_EX_CORE QString YAML2String(const QString& key, YAML::Node &node, const QString &missing = "", bool non_empty = false);
HUGGLE_EX_CORE int YAML2Int(const QString& key, YAML::Node &node, int missing = 0);
HUGGLE_EX_CORE unsigned int YAML2UInt(const QString& key, YAML::Node &node, unsigned int missing = 0);
HUGGLE_EX_CORE double YAML2Double(const QString& key, YAML::Node &node, double missing = 0);
Expand Down
12 changes: 5 additions & 7 deletions src/huggle_core/projectconfiguration.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ QHash<QString, int> ProjectConfiguration::Yaml_FetchScoreTags(YAML::Node &node)
return QHash<QString, int>();
}

ProjectConfiguration::ProjectConfiguration(QString project_name)
ProjectConfiguration::ProjectConfiguration(const QString &project_name)
{
// these headers are parsed by project config so don't change them
// no matter if there is a nice function to retrieve them
Expand Down Expand Up @@ -156,7 +156,7 @@ QStringList temp_compat_hash2list(QHash<QString, QString> hash, bool sort = fals
return result;
}

bool ProjectConfiguration::Parse(QString config, QString *reason, WikiSite *site)
bool ProjectConfiguration::Parse(const QString& config, QString *reason, WikiSite *site)
{
this->configurationBuffer = config;
this->cache.clear();
Expand Down Expand Up @@ -470,15 +470,13 @@ bool ProjectConfiguration::Parse(QString config, QString *reason, WikiSite *site
HuggleQueueFilter::Filters[site]->clear();
HuggleQueueFilter::Filters[site]->append(HuggleQueueFilter::DefaultFilter);
(*HuggleQueueFilter::Filters[site]) += HuggleParser::ConfigurationParseQueueList(config, true);
if (this->AIVP != nullptr)
delete this->AIVP;
delete this->AIVP;
this->AIVP = new WikiPage(this->ReportAIV, site);
HuggleParser::ParsePatterns(config, site);
HuggleParser::ParseNoTalkPatterns(config, site);
HuggleParser::ParseNoTalkWords(config, site);
HuggleParser::ParseWords(config, site);
if (this->UAAP != nullptr)
delete this->UAAP;
delete this->UAAP;
this->UAAP = new WikiPage(this->UAAPath, site);
// templates
int CurrentTemplate=0;
Expand All @@ -502,7 +500,7 @@ bool ProjectConfiguration::Parse(QString config, QString *reason, WikiSite *site
return true;
}

bool ProjectConfiguration::ParseYAML(QString yaml_src, QString *reason, WikiSite *site)
bool ProjectConfiguration::ParseYAML(const QString& yaml_src, QString *reason, WikiSite *site)
{
this->UsingYAML = true;
this->configurationBuffer = yaml_src;
Expand Down
6 changes: 3 additions & 3 deletions src/huggle_core/projectconfiguration.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -93,12 +93,12 @@ namespace Huggle
static QList<ProjectConfiguration::SpeedyOption> Yaml_FetchSpeedyOptions(YAML::Node &node);
static QHash<QString, int> Yaml_FetchScoreTags(YAML::Node &node);

ProjectConfiguration(QString project_name);
ProjectConfiguration(const QString& project_name);
~ProjectConfiguration();
QDateTime ServerTime();
//! Parse all information from local config, this function is used in login
bool Parse(QString config, QString *reason, WikiSite *site);
bool ParseYAML(QString yaml_src, QString *reason, WikiSite *site);
bool Parse(const QString& config, QString *reason, WikiSite *site);
bool ParseYAML(const QString& yaml_src, QString *reason, WikiSite *site);
void RequestLogin();
QString GetConfig(QString key, QString dv = "");
//! \todo This needs to be later used as a default value for user config, however it's not being ensured
Expand Down
2 changes: 2 additions & 0 deletions src/huggle_core/scripting/hugglejs.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,10 +63,12 @@ namespace Huggle
Q_INVOKABLE void warning_log(const QString& text);
Q_INVOKABLE void error_log(const QString& text);
Q_INVOKABLE void debug_log(const QString& text, int verbosity);
// Timers
Q_INVOKABLE unsigned int create_timer(int interval, const QString& function, bool start = true);
Q_INVOKABLE bool destroy_timer(unsigned int timer);
Q_INVOKABLE bool start_timer(unsigned int timer, int interval);
Q_INVOKABLE bool stop_timer(unsigned int timer);
// System
Q_INVOKABLE QString get_ring_log();
Q_INVOKABLE QJSValue get_site_by_name(const QString& site);
Q_INVOKABLE QList<QString> get_sites();
Expand Down
62 changes: 31 additions & 31 deletions src/huggle_core/userconfiguration.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ static QString Bool2ExcludeRequire(HuggleQueueFilterMatch match)
throw Huggle::Exception("Invalid enum", BOOST_CURRENT_FUNCTION);
}

WatchlistOption UserConfiguration::WatchlistOptionFromString(QString string)
WatchlistOption UserConfiguration::WatchlistOptionFromString(const QString& string)
{
if (string == "nochange")
return WatchlistOption_NoChange;
Expand Down Expand Up @@ -96,7 +96,7 @@ Huggle::UserConfiguration::~UserConfiguration()
}
}

HuggleOption *UserConfiguration::GetOption(QString key)
HuggleOption *UserConfiguration::GetOption(const QString& key)
{
if (this->UserOptions.contains(key))
{
Expand All @@ -105,7 +105,7 @@ HuggleOption *UserConfiguration::GetOption(QString key)
return nullptr;
}

QVariant UserConfiguration::SetOption(QString key, QString config, QVariant def)
QVariant UserConfiguration::SetOption(const QString& key, const QString& config, const QVariant& def)
{
if (this->UserOptions.contains(key))
{
Expand All @@ -131,7 +131,7 @@ QVariant UserConfiguration::SetOption(QString key, QString config, QVariant def)
return h->GetVariant();
}

QVariant UserConfiguration::SetOptionYAML(QString key, YAML::Node &config, QVariant def)
QVariant UserConfiguration::SetOptionYAML(const QString& key, YAML::Node &config, const QVariant& def)
{
if (this->UserOptions.contains(key))
{
Expand Down Expand Up @@ -164,32 +164,32 @@ QString SanitizeString(QString s)
return s;
}

void AppendConf(QString *conf, QString key, QString value)
void AppendConf(QString *conf, const QString& key, const QString &value)
{
conf->append(key + ": \"" + SanitizeString(value) + "\"\n");
}

void AppendConf(QString *conf, QString key, bool value)
void AppendConf(QString *conf, const QString& key, bool value)
{
conf->append(key + ": " + Bool2String(value) + "\n");
}

void AppendConf(QString *conf, QString key, int value)
void AppendConf(QString *conf, const QString& key, int value)
{
conf->append(key + ": " + QString::number(value) + "\n");
}

void AppendConf(QString *conf, QString key, unsigned int value)
void AppendConf(QString *conf, const QString& key, unsigned int value)
{
conf->append(key + ": " + QString::number(value) + "\n");
}

void AppendComment(QString *conf, QString text)
void AppendComment(QString *conf, const QString& text)
{
conf->append("# // " + text + "\n");
}

void AppendConf(QString *conf, QString key, long long value)
void AppendConf(QString *conf, const QString& key, long long value)
{
conf->append(key + ": " + QString::number(value) + "\n");
}
Expand Down Expand Up @@ -365,7 +365,7 @@ bool UserConfiguration::EnforceSoftwareRollback()
return this->EnforceManualSoftwareRollback || this->EnforceManualSRT;
}

QStringList UserConfiguration::SetUserOptionList(QString key, QString config, QStringList def, bool CS)
QStringList UserConfiguration::SetUserOptionList(const QString& key, const QString& config, const QStringList& def, bool CS)
{
if (this->UserOptions.contains(key))
{
Expand All @@ -378,7 +378,7 @@ QStringList UserConfiguration::SetUserOptionList(QString key, QString config, QS
return value;
}

QStringList UserConfiguration::SetUserOptionListYAML(QString key, YAML::Node &config, QStringList def)
QStringList UserConfiguration::SetUserOptionListYAML(const QString& key, YAML::Node &config, const QStringList& def)
{
if (this->UserOptions.contains(key))
{
Expand All @@ -391,7 +391,7 @@ QStringList UserConfiguration::SetUserOptionListYAML(QString key, YAML::Node &co
return value;
}

bool UserConfiguration::Parse(QString config, ProjectConfiguration *ProjectConfig, bool IsHome)
bool UserConfiguration::Parse(const QString& config, ProjectConfiguration *ProjectConfig, bool IsHome)
{
this->RevertOnMultipleEdits = SafeBool(ConfigurationParse("RevertOnMultipleEdits", config));
ProjectConfig->EnableAll = SafeBool(ConfigurationParse("enable", config));
Expand All @@ -402,17 +402,17 @@ bool UserConfiguration::Parse(QString config, ProjectConfiguration *ProjectConfi
ProjectConfig->ScoreFlag = this->SetOption("score-flag", config, ProjectConfig->ScoreFlag).toLongLong();
this->EnforceManualSoftwareRollback = SafeBool(ConfigurationParse("software-rollback", config));
if (ProjectConfig->WarningSummaries.contains(1))
ProjectConfig->WarningSummaries[1] = this->SetOption("warn-summary", config, ProjectConfig->WarningSummaries[1]).toString();
ProjectConfig->WarningSummaries[1] = UserConfig_NonEmpty("warn-summary", this->SetOption("warn-summary", config, ProjectConfig->WarningSummaries[1]).toString(), ProjectConfig->WarningSummaries[1]);
if (ProjectConfig->WarningSummaries.contains(2))
ProjectConfig->WarningSummaries[2] = this->SetOption("warn-summary-2", config, ProjectConfig->WarningSummaries[2]).toString();
ProjectConfig->WarningSummaries[2] = UserConfig_NonEmpty("warn-summary-2", this->SetOption("warn-summary-2", config, ProjectConfig->WarningSummaries[2]).toString(), ProjectConfig->WarningSummaries[2]);
if (ProjectConfig->WarningSummaries.contains(3))
ProjectConfig->WarningSummaries[3] = this->SetOption("warn-summary-3", config, ProjectConfig->WarningSummaries[3]).toString();
ProjectConfig->WarningSummaries[3] = UserConfig_NonEmpty("warn-summary-3", this->SetOption("warn-summary-3", config, ProjectConfig->WarningSummaries[3]).toString(), ProjectConfig->WarningSummaries[3]);
if (ProjectConfig->WarningSummaries.contains(4))
ProjectConfig->WarningSummaries[4] = this->SetOption("warn-summary-4", config, ProjectConfig->WarningSummaries[4]).toString();
ProjectConfig->WarningSummaries[4] = UserConfig_NonEmpty("warn-summary-4", this->SetOption("warn-summary-4", config, ProjectConfig->WarningSummaries[4]).toString(), ProjectConfig->WarningSummaries[4]);
this->AutomaticallyResolveConflicts = SafeBool(ConfigurationParse("automatically-resolve-conflicts", config), false);
this->DefaultSummary = HuggleParser::ConfigurationParse("default-summary", config, ProjectConfig->DefaultSummary);
this->RollbackSummary = HuggleParser::ConfigurationParse("rollback-summary", config, ProjectConfig->RollbackSummary);
this->RollbackSummaryUnknownTarget = HuggleParser::ConfigurationParse("rollback-summary-unknown", config, ProjectConfig->RollbackSummaryUnknownTarget);
this->DefaultSummary = HuggleParser::ConfigurationParse("default-summary", config, ProjectConfig->DefaultSummary, true);
this->RollbackSummary = HuggleParser::ConfigurationParse("rollback-summary", config, ProjectConfig->RollbackSummary, true);
this->RollbackSummaryUnknownTarget = HuggleParser::ConfigurationParse("rollback-summary-unknown", config, ProjectConfig->RollbackSummaryUnknownTarget, true);
ProjectConfig->TemplateAge = this->SetOption("template-age", config, ProjectConfig->TemplateAge).toInt();
ProjectConfig->RevertSummaries = this->SetUserOptionList("template-summ", config, ProjectConfig->RevertSummaries);
ProjectConfig->WarningTypes = this->SetUserOptionList("warning-types", config, ProjectConfig->WarningTypes);
Expand Down Expand Up @@ -513,7 +513,7 @@ bool UserConfiguration::Parse(QString config, ProjectConfiguration *ProjectConfi
return true;
}

bool UserConfiguration::ParseYAML(QString config, ProjectConfiguration *ProjectConfig, bool IsHome, QString *reason)
bool UserConfiguration::ParseYAML(const QString &config, ProjectConfiguration *ProjectConfig, bool IsHome, QString *reason)
{
// Fetch the YAML
std::string config_std = HuggleParser::FetchYAML(config).toStdString();
Expand Down Expand Up @@ -548,17 +548,17 @@ bool UserConfiguration::ParseYAML(QString config, ProjectConfiguration *ProjectC
ProjectConfig->ScoreFlag = this->SetOptionYAML("score-flag", yaml, ProjectConfig->ScoreFlag).toLongLong();
this->EnforceManualSoftwareRollback = YAML2Bool("software-rollback", yaml, this->EnforceManualSoftwareRollback);
if (ProjectConfig->WarningSummaries.contains(1))
ProjectConfig->WarningSummaries[1] = this->SetOptionYAML("warn-summary", yaml, ProjectConfig->WarningSummaries[1]).toString();
ProjectConfig->WarningSummaries[1] = UserConfig_NonEmpty("warn-summary", this->SetOptionYAML("warn-summary", yaml, ProjectConfig->WarningSummaries[1]).toString(), ProjectConfig->WarningSummaries[1]);
if (ProjectConfig->WarningSummaries.contains(2))
ProjectConfig->WarningSummaries[2] = this->SetOptionYAML("warn-summary-2", yaml, ProjectConfig->WarningSummaries[2]).toString();
ProjectConfig->WarningSummaries[2] = UserConfig_NonEmpty("warn-summary-2", this->SetOptionYAML("warn-summary-2", yaml, ProjectConfig->WarningSummaries[2]).toString(), ProjectConfig->WarningSummaries[2]);
if (ProjectConfig->WarningSummaries.contains(3))
ProjectConfig->WarningSummaries[3] = this->SetOptionYAML("warn-summary-3", yaml, ProjectConfig->WarningSummaries[3]).toString();
ProjectConfig->WarningSummaries[3] = UserConfig_NonEmpty("warn-summary-3", this->SetOptionYAML("warn-summary-3", yaml, ProjectConfig->WarningSummaries[3]).toString(), ProjectConfig->WarningSummaries[3]);
if (ProjectConfig->WarningSummaries.contains(4))
ProjectConfig->WarningSummaries[4] = this->SetOptionYAML("warn-summary-4", yaml, ProjectConfig->WarningSummaries[4]).toString();
ProjectConfig->WarningSummaries[4] = UserConfig_NonEmpty("warn-summary-4", this->SetOptionYAML("warn-summary-4", yaml, ProjectConfig->WarningSummaries[4]).toString(), ProjectConfig->WarningSummaries[4]);
this->AutomaticallyResolveConflicts = YAML2Bool("automatically-resolve-conflicts", yaml, this->AutomaticallyResolveConflicts);
this->DefaultSummary = YAML2String("default-summary", yaml, ProjectConfig->DefaultSummary);
this->RollbackSummary = YAML2String("rollback-summary", yaml, ProjectConfig->RollbackSummary);
this->RollbackSummaryUnknownTarget = YAML2String("rollback-summary-unknown", yaml, ProjectConfig->RollbackSummaryUnknownTarget);
this->DefaultSummary = YAML2String("default-summary", yaml, ProjectConfig->DefaultSummary, true);
this->RollbackSummary = YAML2String("rollback-summary", yaml, ProjectConfig->RollbackSummary, true);
this->RollbackSummaryUnknownTarget = YAML2String("rollback-summary-unknown", yaml, ProjectConfig->RollbackSummaryUnknownTarget, true);
ProjectConfig->TemplateAge = this->SetOptionYAML("template-age", yaml, ProjectConfig->TemplateAge).toInt();
ProjectConfig->RevertSummaries = this->SetUserOptionListYAML("template-summ", yaml, ProjectConfig->RevertSummaries);
ProjectConfig->WarningTypes = this->SetUserOptionListYAML("warning-types", yaml, ProjectConfig->WarningTypes);
Expand Down Expand Up @@ -658,23 +658,23 @@ bool UserConfiguration::ParseYAML(QString config, ProjectConfiguration *ProjectC
return true;
}

int Huggle::UserConfiguration::GetSafeUserInt(QString key, int default_value)
int Huggle::UserConfiguration::GetSafeUserInt(const QString& key, int default_value)
{
HuggleOption *option = this->GetOption(key);
if (option != nullptr)
return option->GetVariant().toInt();
return default_value;
}

bool Huggle::UserConfiguration::GetSafeUserBool(QString key, bool default_value)
bool Huggle::UserConfiguration::GetSafeUserBool(const QString& key, bool default_value)
{
HuggleOption *option = this->GetOption(key);
if (option != nullptr)
return option->GetVariant().toBool();
return default_value;
}

QString Huggle::UserConfiguration::GetSafeUserString(QString key, QString default_value)
QString Huggle::UserConfiguration::GetSafeUserString(const QString& key, QString default_value)
{
HuggleOption *option = this->GetOption(key);
if (option != nullptr)
Expand Down
Loading

0 comments on commit c02a2ff

Please sign in to comment.