Добавлена функция для 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.stdio : writeln, writefln;
|
||||||
import std.getopt;
|
import std.getopt;
|
||||||
import std.algorithm : canFind;
|
import std.algorithm : canFind;
|
||||||
|
import core.sys.posix.unistd : readlink;
|
||||||
|
|
||||||
import core.stdc.stdint;
|
import core.stdc.stdint;
|
||||||
import std.exception;
|
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)
|
string maskToStr(uint64_t m)
|
||||||
{
|
{
|
||||||
|
@ -184,6 +204,15 @@ void main(string[] args)
|
||||||
|
|
||||||
foreach (ev; events)
|
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",
|
writefln("[%s] pid=%s mask=%s name=%s",
|
||||||
(tag == TAG_PRE) ? "PRE" : "NOTIF",
|
(tag == TAG_PRE) ? "PRE" : "NOTIF",
|
||||||
|
@ -192,28 +221,28 @@ void main(string[] args)
|
||||||
ev.name.length ? ev.name : "(unknown)");
|
ev.name.length ? ev.name : "(unknown)");
|
||||||
|
|
||||||
// --- ВЕТКА РЕШЕНИЯ ДЛЯ PERM-СОБЫТИЙ ---
|
// --- ВЕТКА РЕШЕНИЯ ДЛЯ PERM-СОБЫТИЙ ---
|
||||||
if (tag == TAG_PRE &&
|
// if (tag == TAG_PRE &&
|
||||||
(ev.isOpenPerm || ev.isAccessPerm || ev.isOpenExecPerm))
|
// (ev.isOpenPerm || ev.isAccessPerm || ev.isOpenExecPerm))
|
||||||
{
|
// {
|
||||||
// Пример «политики»: запрещать выполнение из временных директорий
|
// // Пример «политики»: запрещать выполнение из временных директорий
|
||||||
// (поменяй на свои условия)
|
// // (поменяй на свои условия)
|
||||||
bool deny = false;
|
// bool deny = false;
|
||||||
|
|
||||||
// простейший сэмпл-правил
|
// // простейший сэмпл-правил
|
||||||
auto nm = ev.name;
|
// auto nm = ev.name;
|
||||||
if (nm.length)
|
// if (nm.length)
|
||||||
{
|
// {
|
||||||
if (nm.canFind("/tmp/") && ev.isOpenExecPerm)
|
// if (nm.canFind("/tmp/") && ev.isOpenExecPerm)
|
||||||
{
|
// {
|
||||||
deny = true;
|
// 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)
|
if (tag == TAG_NOTIF)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue