summaryrefslogtreecommitdiff
path: root/src/managers/permissions/DynamicPermissionManager.hpp
diff options
context:
space:
mode:
authorVaxry <43317083+vaxerski@users.noreply.github.com>2025-04-08 19:39:53 +0200
committerGitHub <noreply@github.com>2025-04-08 19:39:53 +0200
commit260d8e1f71b1dc6f3f354747debdc87d96b9e99f (patch)
tree9e13cd67a6b08e356a8773b093a9c8d9fdf645b0 /src/managers/permissions/DynamicPermissionManager.hpp
parent642f394eb3f8fd99a51f4c8279497c458c40ba65 (diff)
Permission Manager: add permission management for screencopy (#9930)
Diffstat (limited to 'src/managers/permissions/DynamicPermissionManager.hpp')
-rw-r--r--src/managers/permissions/DynamicPermissionManager.hpp85
1 files changed, 85 insertions, 0 deletions
diff --git a/src/managers/permissions/DynamicPermissionManager.hpp b/src/managers/permissions/DynamicPermissionManager.hpp
new file mode 100644
index 00000000..681cbc1c
--- /dev/null
+++ b/src/managers/permissions/DynamicPermissionManager.hpp
@@ -0,0 +1,85 @@
+#pragma once
+
+#include "../../macros.hpp"
+#include "../../helpers/memory/Memory.hpp"
+#include "../../helpers/AsyncDialogBox.hpp"
+#include <vector>
+#include <wayland-server-core.h>
+#include <optional>
+
+// NOLINTNEXTLINE
+namespace re2 {
+ class RE2;
+};
+
+enum eDynamicPermissionType : uint8_t {
+ PERMISSION_TYPE_UNKNOWN = 0,
+ PERMISSION_TYPE_SCREENCOPY,
+};
+
+enum eDynamicPermissionRuleSource : uint8_t {
+ PERMISSION_RULE_SOURCE_UNKNOWN = 0,
+ PERMISSION_RULE_SOURCE_CONFIG,
+ PERMISSION_RULE_SOURCE_RUNTIME_USER,
+};
+
+enum eDynamicPermissionAllowMode : uint8_t {
+ PERMISSION_RULE_ALLOW_MODE_UNKNOWN = 0,
+ PERMISSION_RULE_ALLOW_MODE_DENY,
+ PERMISSION_RULE_ALLOW_MODE_ASK,
+ PERMISSION_RULE_ALLOW_MODE_ALLOW,
+ PERMISSION_RULE_ALLOW_MODE_PENDING, // popup is open
+};
+
+class CDynamicPermissionRule;
+
+struct SDynamicPermissionRuleDestroyWrapper {
+ wl_listener listener;
+ CDynamicPermissionRule* parent = nullptr;
+};
+
+class CDynamicPermissionRule {
+ public:
+ ~CDynamicPermissionRule();
+
+ wl_client* client() const;
+
+ private:
+ // config rule
+ CDynamicPermissionRule(const std::string& binaryPathRegex, eDynamicPermissionType type, eDynamicPermissionAllowMode defaultAllowMode = PERMISSION_RULE_ALLOW_MODE_ASK);
+ // user rule
+ CDynamicPermissionRule(wl_client* const client, eDynamicPermissionType type, eDynamicPermissionAllowMode defaultAllowMode = PERMISSION_RULE_ALLOW_MODE_ASK);
+
+ const eDynamicPermissionType m_type = PERMISSION_TYPE_UNKNOWN;
+ const eDynamicPermissionRuleSource m_source = PERMISSION_RULE_SOURCE_UNKNOWN;
+ wl_client* const m_client = nullptr;
+ std::string m_binaryPath = "";
+ UP<re2::RE2> m_binaryRegex;
+
+ eDynamicPermissionAllowMode m_allowMode = PERMISSION_RULE_ALLOW_MODE_ASK;
+ SP<CAsyncDialogBox> m_dialogBox; // for pending
+
+ SDynamicPermissionRuleDestroyWrapper m_destroyWrapper;
+
+ friend class CDynamicPermissionManager;
+};
+
+class CDynamicPermissionManager {
+ public:
+ void clearConfigPermissions();
+ void addConfigPermissionRule(const std::string& binaryPath, eDynamicPermissionType type, eDynamicPermissionAllowMode mode);
+
+ // if the rule is "ask", or missing, will pop up a dialog and return false until the user agrees.
+ // (will continue returning false if the user does not agree, of course.)
+ eDynamicPermissionAllowMode clientPermissionMode(wl_client* client, eDynamicPermissionType permission);
+
+ void removeRulesForClient(wl_client* client);
+
+ private:
+ void askForPermission(wl_client* client, const std::string& binaryName, eDynamicPermissionType type);
+
+ //
+ std::vector<SP<CDynamicPermissionRule>> m_rules;
+};
+
+inline UP<CDynamicPermissionManager> g_pDynamicPermissionManager; \ No newline at end of file