Compare commits
1 commit
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d29f723288 |
2 changed files with 165 additions and 1 deletions
156
usbguard-notifier-rhbz1972505-merge-notifications.patch
Normal file
156
usbguard-notifier-rhbz1972505-merge-notifications.patch
Normal file
|
|
@ -0,0 +1,156 @@
|
|||
diff --git a/src/Notifier.cpp b/src/Notifier.cpp
|
||||
index a98ca31..6653b93 100644
|
||||
--- a/src/Notifier.cpp
|
||||
+++ b/src/Notifier.cpp
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
#include <unistd.h>
|
||||
+#include <chrono>
|
||||
|
||||
#include <usbguard/DeviceManager.hpp>
|
||||
#include <usbguard/Rule.hpp>
|
||||
@@ -41,6 +42,14 @@ Notifier::Notifier(const std::string& app_name) :
|
||||
_ser.setFileName(path);
|
||||
}
|
||||
|
||||
+Notifier::~Notifier()
|
||||
+{
|
||||
+ for (auto t : _countdownThreads) {
|
||||
+ t->join();
|
||||
+ delete t;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
void Notifier::DevicePolicyChanged(
|
||||
uint32_t id,
|
||||
usbguard::Rule::Target target_old,
|
||||
@@ -53,6 +62,20 @@ void Notifier::DevicePolicyChanged(
|
||||
|
||||
const std::string target_old_str = Rule::targetToString(target_old);
|
||||
const std::string target_new_str = Rule::targetToString(target_new);
|
||||
+
|
||||
+ DevicePresenceInfo info = getDevicePresenceObject(id);
|
||||
+ if (info.isInitialized) {
|
||||
+ if (info.target == target_old ||
|
||||
+ device_rule.substr(target_new_str.size()) == info.device_rule.substr(target_old_str.size())) {
|
||||
+ info.target = target_new;
|
||||
+ sendDevicePresenceNotification(info);
|
||||
+ return;
|
||||
+ } else {
|
||||
+ NOTIFIER_LOG() << "DevicePolicyChanged and DevicePresenceChanged " <<
|
||||
+ "with same id do not share the same rule.";
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
Rule rule = Rule::fromString(device_rule);
|
||||
|
||||
std::ostringstream body;
|
||||
@@ -70,7 +93,7 @@ void Notifier::DevicePolicyChanged(
|
||||
}
|
||||
|
||||
void Notifier::DevicePresenceChanged(
|
||||
- uint32_t /*id*/,
|
||||
+ uint32_t id,
|
||||
usbguard::DeviceManager::EventType event,
|
||||
usbguard::Rule::Target target,
|
||||
const std::string& device_rule)
|
||||
@@ -78,9 +101,41 @@ void Notifier::DevicePresenceChanged(
|
||||
using namespace usbguard;
|
||||
NOTIFIER_LOG() << "Device presence changed signal";
|
||||
|
||||
- const std::string event_str = DeviceManager::eventTypeToString(event);
|
||||
- const std::string target_str = Rule::targetToString(target);
|
||||
- Rule rule = Rule::fromString(device_rule);
|
||||
+ _deviceNotifications.emplace(std::make_pair(id, DevicePresenceInfo(event, target, device_rule)));
|
||||
+ std::thread* t = new std::thread( [this, id] { sendDevicePresenceCountdownCallback(id); } );
|
||||
+ _countdownThreads.push_back(t);
|
||||
+}
|
||||
+
|
||||
+Notifier::DevicePresenceInfo Notifier::getDevicePresenceObject(uint32_t id)
|
||||
+{
|
||||
+ DevicePresenceInfo info;
|
||||
+ _mtx.lock();
|
||||
+ auto it = _deviceNotifications.find(id);
|
||||
+ if (it != _deviceNotifications.end()) {
|
||||
+ info = it->second;
|
||||
+ _deviceNotifications.erase(it);
|
||||
+ }
|
||||
+ _mtx.unlock();
|
||||
+ return info;
|
||||
+}
|
||||
+
|
||||
+void Notifier::sendDevicePresenceCountdownCallback(uint32_t id)
|
||||
+{
|
||||
+ std::this_thread::sleep_for(std::chrono::milliseconds(_kMillisecondsDevicePolicyWait));
|
||||
+
|
||||
+ DevicePresenceInfo info = getDevicePresenceObject(id);
|
||||
+ if (info.isInitialized) {
|
||||
+ sendDevicePresenceNotification(info);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+void Notifier::sendDevicePresenceNotification(DevicePresenceInfo& info)
|
||||
+{
|
||||
+ using namespace usbguard;
|
||||
+
|
||||
+ const std::string event_str = DeviceManager::eventTypeToString(info.event);
|
||||
+ const std::string target_str = Rule::targetToString(info.target);
|
||||
+ Rule rule = Rule::fromString(info.device_rule);
|
||||
|
||||
std::ostringstream body;
|
||||
body << event_str << ' ' << rule.getName() << ": " << target_str;
|
||||
diff --git a/src/Notifier.hpp b/src/Notifier.hpp
|
||||
index 92f5c03..e420adb 100644
|
||||
--- a/src/Notifier.hpp
|
||||
+++ b/src/Notifier.hpp
|
||||
@@ -26,6 +26,9 @@
|
||||
#include <usbguard/ConfigFile.hpp>
|
||||
#include <usbguard/IPCClient.hpp>
|
||||
|
||||
+#include <thread>
|
||||
+#include <mutex>
|
||||
+
|
||||
namespace usbguardNotifier
|
||||
{
|
||||
|
||||
@@ -33,6 +36,7 @@ class Notifier : public usbguard::IPCClient
|
||||
{
|
||||
public:
|
||||
explicit Notifier(const std::string& app_name);
|
||||
+ ~Notifier();
|
||||
|
||||
void DevicePolicyChanged(
|
||||
uint32_t id,
|
||||
@@ -53,8 +57,31 @@ class Notifier : public usbguard::IPCClient
|
||||
const std::string& value_new);
|
||||
*/
|
||||
private:
|
||||
+ struct DevicePresenceInfo {
|
||||
+ bool isInitialized = false;
|
||||
+ usbguard::DeviceManager::EventType event;
|
||||
+ usbguard::Rule::Target target;
|
||||
+ std::string device_rule;
|
||||
+
|
||||
+ DevicePresenceInfo(const usbguard::DeviceManager::EventType& e,
|
||||
+ const usbguard::Rule::Target& t,
|
||||
+ const std::string& r): isInitialized(true), event(e), target(t), device_rule(r) {}
|
||||
+
|
||||
+ DevicePresenceInfo() : event(), target(), device_rule() {}
|
||||
+ };
|
||||
+
|
||||
+ DevicePresenceInfo getDevicePresenceObject(uint32_t id);
|
||||
+
|
||||
+ void sendDevicePresenceCountdownCallback(uint32_t id);
|
||||
+
|
||||
+ void sendDevicePresenceNotification(DevicePresenceInfo& info);
|
||||
+
|
||||
notify::Notify _lib;
|
||||
Serializer _ser;
|
||||
+ std::map<uint32_t, DevicePresenceInfo> _deviceNotifications;
|
||||
+ std::mutex _mtx;
|
||||
+ std::vector<std::thread*> _countdownThreads;
|
||||
+ const int _kMillisecondsDevicePolicyWait = 500;
|
||||
};
|
||||
|
||||
} // namespace usbguardNotifier
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
Name: usbguard-notifier
|
||||
Version: 0.0.6
|
||||
Release: 3%{?dist}
|
||||
Release: 4%{?dist}
|
||||
Summary: A tool for detecting usbguard policy and device presence changes
|
||||
|
||||
License: GPLv2+
|
||||
|
|
@ -20,6 +20,8 @@ BuildRequires: catch1-devel
|
|||
BuildRequires: execstack
|
||||
BuildRequires: systemd-rpm-macros
|
||||
|
||||
Patch0: usbguard-notifier-rhbz1972505-merge-notifications.patch
|
||||
|
||||
%description
|
||||
USBGuard Notifier software framework detects usbguard policy modifications
|
||||
as well as device presence changes and displays them as pop-up notifications.
|
||||
|
|
@ -27,6 +29,8 @@ as well as device presence changes and displays them as pop-up notifications.
|
|||
%prep
|
||||
%setup -q
|
||||
|
||||
%patch0 -p1 -b .merge-notifications
|
||||
|
||||
%build
|
||||
mkdir -p ./m4
|
||||
autoreconf -i -f -v --no-recursive ./
|
||||
|
|
@ -69,6 +73,10 @@ execstack -c %{buildroot}%{_bindir}/usbguard-notifier-cli
|
|||
|
||||
|
||||
%changelog
|
||||
* Wed Jun 16 2021 Attila Lakatos <alakatos@redhat.com> - 0.0.6-4
|
||||
- Merge notifications when inserting a usb device
|
||||
resolves: rhbz#1972505
|
||||
|
||||
* Fri Jan 15 2021 Radovan Sroka <rsroka@redhat.com> - 0.0.6-3
|
||||
- Rebuild with the usbguard 1.0.0 - soname bump
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue