summaryrefslogtreecommitdiff
path: root/hyprpm/src/core/Manifest.cpp
diff options
context:
space:
mode:
authorVaxry <43317083+vaxerski@users.noreply.github.com>2025-05-06 22:43:08 +0200
committerGitHub <noreply@github.com>2025-05-06 22:43:08 +0200
commitf8bbe5124c0012865ea36f52d304313084a31fe9 (patch)
tree803f46d75b4807c0bd1343eedfa1a3c1aeb0b8d0 /hyprpm/src/core/Manifest.cpp
parent948277895efba5e8bcc66d34dcafe87518fc7b61 (diff)
hyprpm: clean up root access and properly check input (#10304)
* manifest: reject bad names from parsing * sys: restructure root functions
Diffstat (limited to 'hyprpm/src/core/Manifest.cpp')
-rw-r--r--hyprpm/src/core/Manifest.cpp44
1 files changed, 31 insertions, 13 deletions
diff --git a/hyprpm/src/core/Manifest.cpp b/hyprpm/src/core/Manifest.cpp
index 754d9d69..90f6fbff 100644
--- a/hyprpm/src/core/Manifest.cpp
+++ b/hyprpm/src/core/Manifest.cpp
@@ -1,6 +1,12 @@
#include "Manifest.hpp"
#include <toml++/toml.hpp>
-#include <iostream>
+#include <algorithm>
+
+// Alphanumerics and -_ allowed for plugin names. No magic names.
+// [A-Za-z0-9\-_]*
+static bool validManifestName(const std::string_view& n) {
+ return std::ranges::all_of(n, [](const char& c) { return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '-' || c == '_' || c == '=' || (c >= '0' && c <= '9'); });
+}
CManifest::CManifest(const eManifestType type, const std::string& path) {
auto manifest = toml::parse_file(path);
@@ -11,11 +17,17 @@ CManifest::CManifest(const eManifestType type, const std::string& path) {
continue;
CManifest::SManifestPlugin plugin;
+
+ if (!validManifestName(key.str())) {
+ m_good = false;
+ return;
+ }
+
plugin.name = key;
- m_vPlugins.push_back(plugin);
+ m_plugins.push_back(plugin);
}
- for (auto& plugin : m_vPlugins) {
+ for (auto& plugin : m_plugins) {
plugin.description = manifest[plugin.name]["description"].value_or("?");
plugin.version = manifest[plugin.name]["version"].value_or("?");
plugin.output = manifest[plugin.name]["build"]["output"].value_or("?");
@@ -37,21 +49,21 @@ CManifest::CManifest(const eManifestType type, const std::string& path) {
}
if (plugin.output.empty() || plugin.buildSteps.empty()) {
- m_bGood = false;
+ m_good = false;
return;
}
}
} else if (type == MANIFEST_HYPRPM) {
- m_sRepository.name = manifest["repository"]["name"].value_or("");
- auto authors = manifest["repository"]["authors"].as_array();
+ m_repository.name = manifest["repository"]["name"].value_or("");
+ auto authors = manifest["repository"]["authors"].as_array();
if (authors) {
for (auto&& a : *authors) {
- m_sRepository.authors.push_back(a.as_string()->value_or("?"));
+ m_repository.authors.push_back(a.as_string()->value_or("?"));
}
} else {
auto author = manifest["repository"]["author"].value_or("");
if (!std::string{author}.empty())
- m_sRepository.authors.push_back(author);
+ m_repository.authors.push_back(author);
}
auto pins = manifest["repository"]["commit_pins"].as_array();
@@ -59,7 +71,7 @@ CManifest::CManifest(const eManifestType type, const std::string& path) {
for (auto&& pin : *pins) {
auto pinArr = pin.as_array();
if (pinArr && pinArr->get(1))
- m_sRepository.commitPins.push_back(std::make_pair<>(pinArr->get(0)->as_string()->get(), pinArr->get(1)->as_string()->get()));
+ m_repository.commitPins.push_back(std::make_pair<>(pinArr->get(0)->as_string()->get(), pinArr->get(1)->as_string()->get()));
}
}
@@ -68,11 +80,17 @@ CManifest::CManifest(const eManifestType type, const std::string& path) {
continue;
CManifest::SManifestPlugin plugin;
+
+ if (!validManifestName(key.str())) {
+ m_good = false;
+ return;
+ }
+
plugin.name = key;
- m_vPlugins.push_back(plugin);
+ m_plugins.push_back(plugin);
}
- for (auto& plugin : m_vPlugins) {
+ for (auto& plugin : m_plugins) {
plugin.description = manifest[plugin.name]["description"].value_or("?");
plugin.output = manifest[plugin.name]["output"].value_or("?");
plugin.since = manifest[plugin.name]["since_hyprland"].value_or(0);
@@ -94,12 +112,12 @@ CManifest::CManifest(const eManifestType type, const std::string& path) {
}
if (plugin.output.empty() || plugin.buildSteps.empty()) {
- m_bGood = false;
+ m_good = false;
return;
}
}
} else {
// ???
- m_bGood = false;
+ m_good = false;
}
} \ No newline at end of file