Добавлена функция для PERM режима, позволяющая получить путь к файлу события
This commit is contained in:
parent
7858416df9
commit
1f78d8eb83
1 changed files with 48 additions and 19 deletions
67
source/app.d
67
source/app.d
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue