diff options
| author | Vaxry <43317083+vaxerski@users.noreply.github.com> | 2025-04-08 19:39:53 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-04-08 19:39:53 +0200 |
| commit | 260d8e1f71b1dc6f3f354747debdc87d96b9e99f (patch) | |
| tree | 9e13cd67a6b08e356a8773b093a9c8d9fdf645b0 /src/managers/permissions/DynamicPermissionManager.hpp | |
| parent | 642f394eb3f8fd99a51f4c8279497c458c40ba65 (diff) | |
Permission Manager: add permission management for screencopy (#9930)
Diffstat (limited to 'src/managers/permissions/DynamicPermissionManager.hpp')
| -rw-r--r-- | src/managers/permissions/DynamicPermissionManager.hpp | 85 |
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 |
