From 158c0f2911894f5f97af7361f639f97f6d100c82 Mon Sep 17 00:00:00 2001 From: Vaxry <43317083+vaxerski@users.noreply.github.com> Date: Sun, 18 May 2025 18:13:20 +0100 Subject: permissions: add permission management for keyboards (#10367) --- .../permissions/DynamicPermissionManager.cpp | 30 ++++++++++++++-------- 1 file changed, 19 insertions(+), 11 deletions(-) (limited to 'src/managers/permissions/DynamicPermissionManager.cpp') diff --git a/src/managers/permissions/DynamicPermissionManager.cpp b/src/managers/permissions/DynamicPermissionManager.cpp index e111343e..dd1fd4cf 100644 --- a/src/managers/permissions/DynamicPermissionManager.cpp +++ b/src/managers/permissions/DynamicPermissionManager.cpp @@ -52,6 +52,7 @@ static const char* permissionToString(eDynamicPermissionType type) { case PERMISSION_TYPE_UNKNOWN: return "PERMISSION_TYPE_UNKNOWN"; case PERMISSION_TYPE_SCREENCOPY: return "PERMISSION_TYPE_SCREENCOPY"; case PERMISSION_TYPE_PLUGIN: return "PERMISSION_TYPE_PLUGIN"; + case PERMISSION_TYPE_KEYBOARD: return "PERMISSION_TYPE_KEYBOARD"; } return "error"; @@ -59,9 +60,10 @@ static const char* permissionToString(eDynamicPermissionType type) { static const char* permissionToHumanString(eDynamicPermissionType type) { switch (type) { - case PERMISSION_TYPE_UNKNOWN: return "requesting an unknown permission"; - case PERMISSION_TYPE_SCREENCOPY: return "trying to capture your screen"; - case PERMISSION_TYPE_PLUGIN: return "trying to load a plugin"; + case PERMISSION_TYPE_UNKNOWN: return "An application {} is requesting an unknown permission."; + case PERMISSION_TYPE_SCREENCOPY: return "An application {} is trying to capture your screen.

Do you want to allow it to do so?"; + case PERMISSION_TYPE_PLUGIN: return "An application {} is trying to load a plugin: {}.

Do you want to load it?"; + case PERMISSION_TYPE_KEYBOARD: return "A new keyboard has been plugged in: {}.

Do you want to allow it to operate?"; } return "error"; @@ -184,7 +186,7 @@ eDynamicPermissionAllowMode CDynamicPermissionManager::clientPermissionMode(wl_c return PERMISSION_RULE_ALLOW_MODE_PENDING; } - // if we are here, we need to ask. + // if we are here, we need to ask, that's the fallback for all these (keyboards wont come here) askForPermission(client, LOOKUP.value_or(""), permission); return PERMISSION_RULE_ALLOW_MODE_PENDING; @@ -232,6 +234,10 @@ eDynamicPermissionAllowMode CDynamicPermissionManager::clientPermissionModeWithS } else if ((*it)->m_allowMode == PERMISSION_RULE_ALLOW_MODE_PENDING) { Debug::log(TRACE, "CDynamicPermissionManager::clientHasPermission: permission pending by config rule"); return PERMISSION_RULE_ALLOW_MODE_PENDING; + } else if ((*it)->m_allowMode == PERMISSION_RULE_ALLOW_MODE_ASK) { + Debug::log(TRACE, "CDynamicPermissionManager::clientHasPermission: permission ask by config rule"); + askForPermission(nullptr, str, permission, pid); + return PERMISSION_RULE_ALLOW_MODE_PENDING; } else Debug::log(TRACE, "CDynamicPermissionManager::clientHasPermission: permission ask by config rule"); } @@ -247,6 +253,10 @@ eDynamicPermissionAllowMode CDynamicPermissionManager::clientPermissionModeWithS return PERMISSION_RULE_ALLOW_MODE_PENDING; } + // keyboards are allow default + if (permission == PERMISSION_TYPE_KEYBOARD) + return PERMISSION_RULE_ALLOW_MODE_ALLOW; + // if we are here, we need to ask. askForPermission(nullptr, str, permission, pid); @@ -263,22 +273,20 @@ void CDynamicPermissionManager::askForPermission(wl_client* client, const std::s std::string description = ""; if (binaryPath.empty()) - description = std::format("An unknown application (wayland client ID 0x{:x}) is {}.", (uintptr_t)client, permissionToHumanString(type)); + description = std::format(std::runtime_format(permissionToHumanString(type)), std::format("unknown application (wayland client ID 0x{:x})", (uintptr_t)client)); else if (client) { std::string binaryName = binaryPath.contains("/") ? binaryPath.substr(binaryPath.find_last_of('/') + 1) : binaryPath; - description = std::format("An application {} ({}) is {}.", binaryName, binaryPath, permissionToHumanString(type)); + description = std::format(std::runtime_format(permissionToHumanString(type)), std::format("{} ({})", binaryName, binaryPath)); } else if (pid >= 0) { if (type == PERMISSION_TYPE_PLUGIN) { const auto LOOKUP = binaryNameForPid(pid); - description = std::format("An application {} is {}:
{}", LOOKUP.value_or("Unknown"), permissionToHumanString(type), binaryPath); + description = std::format(std::runtime_format(permissionToHumanString(type)), LOOKUP.value_or("Unknown"), binaryPath); } else { const auto LOOKUP = binaryNameForPid(pid); - description = std::format("An application {} ({}) is {}.", LOOKUP.value_or("Unknown"), binaryPath, permissionToHumanString(type)); + description = std::format(std::runtime_format(permissionToHumanString(type)), LOOKUP.value_or("Unknown"), binaryPath); } } else - description = std::format("An application is {}:
{}", permissionToHumanString(type), binaryPath); - - description += "

Do you want to allow this?"; + description = std::format(std::runtime_format(permissionToHumanString(type)), binaryPath); std::vector options; -- cgit v1.2.3