Добавлена функция для PERM режима, позволяющая получить путь к файлу события

This commit is contained in:
Alexander Zhirov 2025-08-29 01:17:03 +03:00
parent 7858416df9
commit 1f78d8eb83
Signed by: alexander
GPG key ID: C8D8BE544A27C511

View file

@ -11,10 +11,30 @@ import std.conv : to;
import std.stdio : writeln, writefln;
import std.getopt;
import std.algorithm : canFind;
import core.sys.posix.unistd : readlink;
import core.stdc.stdint;
import std.exception;
import std.path : baseName;
/// Вернуть путь для fd из события PRE_CONTENT.
/// Может вернуть "(deleted)" или пустую строку, если объект без имени.
string pathFromEventFd(int fd)
{
// Конструируем путь в /proc/self/fd
auto linkPath = "/proc/self/fd/" ~ fd.to!string;
char[4096] buf;
// readlink не добавляет '\0'
auto n = readlink(linkPath.toStringz, buf.ptr, buf.length);
if (n < 0)
{
return "";
}
return cast(string) buf[0 .. n].idup;
}
// Удобная печать маски (для живых логов)
string maskToStr(uint64_t m)
{
@ -184,6 +204,15 @@ void main(string[] args)
foreach (ev; events)
{
if (tag == TAG_PRE && (ev.isOpenPerm || ev.isAccessPerm))
{
string path = pathFromEventFd(ev.eventFd);
writeln("Попытка доступа к: ", path.length ? path
: "<неизвестно>");
// ev.respond(FAN_ALLOW); // или FAN_DENY по своей политике
baseName(path) == "test" ? ev.respond(FAN_DENY) : ev.respond(FAN_ALLOW);
}
// Лог
writefln("[%s] pid=%s mask=%s name=%s",
(tag == TAG_PRE) ? "PRE" : "NOTIF",
@ -192,28 +221,28 @@ void main(string[] args)
ev.name.length ? ev.name : "(unknown)");
// --- ВЕТКА РЕШЕНИЯ ДЛЯ PERM-СОБЫТИЙ ---
if (tag == TAG_PRE &&
(ev.isOpenPerm || ev.isAccessPerm || ev.isOpenExecPerm))
{
// Пример «политики»: запрещать выполнение из временных директорий
// (поменяй на свои условия)
bool deny = false;
// if (tag == TAG_PRE &&
// (ev.isOpenPerm || ev.isAccessPerm || ev.isOpenExecPerm))
// {
// // Пример «политики»: запрещать выполнение из временных директорий
// // (поменяй на свои условия)
// bool deny = false;
// простейший сэмпл-правил
auto nm = ev.name;
if (nm.length)
{
if (nm.canFind("/tmp/") && ev.isOpenExecPerm)
{
deny = true;
}
}
// // простейший сэмпл-правил
// auto nm = ev.name;
// if (nm.length)
// {
// if (nm.canFind("/tmp/") && ev.isOpenExecPerm)
// {
// deny = true;
// }
// }
// Отправляем решение ядру
ev.respond(deny ? FAN_DENY : FAN_ALLOW);
// // Отправляем решение ядру
// ev.respond(deny ? FAN_DENY : FAN_ALLOW);
writefln(" -> %s", deny ? "DENY" : "ALLOW");
}
// writefln(" -> %s", deny ? "DENY" : "ALLOW");
// }
// --- ПОСТ-ФАКТУМ УВЕДОМЛЕНИЯ ---
if (tag == TAG_NOTIF)