Permission Manager: add permission management for screencopy (#9930)

This commit is contained in:
Vaxry
2025-04-08 19:39:53 +02:00
committed by GitHub
parent 642f394eb3
commit 260d8e1f71
13 changed files with 481 additions and 32 deletions

View File

@@ -22,6 +22,7 @@
#include "../managers/eventLoop/EventLoopManager.hpp"
#include "../managers/LayoutManager.hpp"
#include "../managers/EventManager.hpp"
#include "../managers/permissions/DynamicPermissionManager.hpp"
#include "../debug/HyprNotificationOverlay.hpp"
#include "../plugins/PluginSystem.hpp"
@@ -374,6 +375,18 @@ static Hyprlang::CParseResult handlePlugin(const char* c, const char* v) {
return result;
}
static Hyprlang::CParseResult handlePermission(const char* c, const char* v) {
const std::string VALUE = v;
const std::string COMMAND = c;
const auto RESULT = g_pConfigManager->handlePermission(COMMAND, VALUE);
Hyprlang::CParseResult result;
if (RESULT.has_value())
result.setError(RESULT.value().c_str());
return result;
}
void CConfigManager::registerConfigVar(const char* name, const Hyprlang::INT& val) {
m_configValueNumber++;
m_pConfig->addConfigValue(name, val);
@@ -703,6 +716,7 @@ CConfigManager::CConfigManager() {
registerConfigVar("ecosystem:no_update_news", Hyprlang::INT{0});
registerConfigVar("ecosystem:no_donation_nag", Hyprlang::INT{0});
registerConfigVar("ecosystem:enforce_permissions", Hyprlang::INT{0});
registerConfigVar("experimental:xx_color_management_v4", Hyprlang::INT{0});
@@ -764,6 +778,7 @@ CConfigManager::CConfigManager() {
m_pConfig->registerHandler(&::handleSubmap, "submap", {false});
m_pConfig->registerHandler(&::handleBlurLS, "blurls", {false});
m_pConfig->registerHandler(&::handlePlugin, "plugin", {false});
m_pConfig->registerHandler(&::handlePermission, "permission", {false});
m_pConfig->registerHandler(&::handleEnv, "env", {true});
// pluginza
@@ -946,6 +961,8 @@ std::optional<std::string> CConfigManager::resetHLConfig() {
m_vFailedPluginConfigValues.clear();
finalExecRequests.clear();
g_pDynamicPermissionManager->clearConfigPermissions();
// paths
m_configPaths.clear();
std::string mainConfigPath = getMainConfigPath();
@@ -2831,6 +2848,32 @@ std::optional<std::string> CConfigManager::handlePlugin(const std::string& comma
return {};
}
std::optional<std::string> CConfigManager::handlePermission(const std::string& command, const std::string& value) {
CVarList data(value);
eDynamicPermissionType type = PERMISSION_TYPE_UNKNOWN;
eDynamicPermissionAllowMode mode = PERMISSION_RULE_ALLOW_MODE_UNKNOWN;
if (data[1] == "screencopy")
type = PERMISSION_TYPE_SCREENCOPY;
if (data[2] == "ask")
mode = PERMISSION_RULE_ALLOW_MODE_ASK;
else if (data[2] == "allow")
mode = PERMISSION_RULE_ALLOW_MODE_ALLOW;
else if (data[2] == "deny")
mode = PERMISSION_RULE_ALLOW_MODE_DENY;
if (type == PERMISSION_TYPE_UNKNOWN)
return "unknown permission type";
if (mode == PERMISSION_RULE_ALLOW_MODE_UNKNOWN)
return "unknown permission allow mode";
g_pDynamicPermissionManager->addConfigPermissionRule(data[0], type, mode);
return {};
}
const std::vector<SConfigOptionDescription>& CConfigManager::getAllDescriptions() {
return CONFIG_OPTIONS;
}