Skip to content
API Documentation
BastionGuard™
bsc::rule::Loader Class Reference

#include <Rule.hpp>

Public Member Functions

void load_aliases (const std::string &path)
void load_directory (const std::string &dir)
bool save_rule (const Rule &rule, const std::string &dir) const
const std::vector< Rule > & rules () const noexcept
std::optional< Rule > find_match (const bsc::model::Connection &conn) const

Private Attributes

std::vector< Rule > rules_
std::map< std::string, std::vector< std::string > > aliases_

Detailed Description

Definition at line 37 of file Rule.hpp.

Member Function Documentation

◆ find_match()

std::optional< Rule > bsc::rule::Loader::find_match ( const bsc::model::Connection & conn) const
nodiscard

Definition at line 358 of file Rule.cpp.

358 {
359 for (const auto& r : rules_) if (r.matches(conn)) return r;
360 return std::nullopt;
361}
std::vector< Rule > rules_
Definition Rule.hpp:45

References rules_.

◆ load_aliases()

void bsc::rule::Loader::load_aliases ( const std::string & path)

Definition at line 292 of file Rule.cpp.

292 {
293 aliases_.clear();
294 g_aliases.clear();
295 if (path.empty()) return;
296 std::ifstream in(path);
297 if (!in) return;
298 try {
299 json j; in >> j;
300 if (!j.is_object()) return;
301 for (auto it = j.begin(); it != j.end(); ++it) {
302 if (!it.value().is_array()) continue;
303 std::vector<std::string> vals;
304 for (const auto& item : it.value()) if (item.is_string()) vals.push_back(item.get<std::string>());
305 aliases_[it.key()] = vals;
306 g_aliases[it.key()] = std::move(vals);
307 }
308 } catch (...) {}
309}
std::map< std::string, std::vector< std::string > > aliases_
Definition Rule.hpp:46
std::map< std::string, std::vector< std::string > > g_aliases
Definition Rule.cpp:23
nlohmann::json json
Definition Rule.cpp:20

References aliases_.

Referenced by bsc::service::DaemonService::DaemonService().

◆ load_directory()

void bsc::rule::Loader::load_directory ( const std::string & dir)

Definition at line 311 of file Rule.cpp.

311 {
312 rules_.clear();
313 std::error_code ec;
314 if (!fs::exists(dir, ec)) return;
315 for (const auto& entry : fs::directory_iterator(dir, ec)) {
316 if (!entry.is_regular_file() || entry.path().extension() != ".json") continue;
317 std::ifstream in(entry.path());
318 if (!in) continue;
319 json j; in >> j;
320 Rule r;
321 if (j.contains("created")) {
322 if (j["created"].is_number_integer()) r.created = j["created"].get<std::int64_t>();
323 else r.created = static_cast<std::int64_t>(std::chrono::duration_cast<std::chrono::seconds>(std::chrono::file_clock::to_sys(fs::last_write_time(entry.path())).time_since_epoch()).count());
324 }
325 r.name = j.value("name", entry.path().stem().string());
326 r.description = j.value("description", "");
327 r.enabled = j.value("enabled", true);
328 r.precedence = j.value("precedence", false);
329 r.nolog = j.value("nolog", false);
330 r.action = j.value("action", "allow");
331 r.duration = j.value("duration", "once");
332 if (j.contains("operator")) r.op = parse_operator(j["operator"]);
333 rules_.push_back(std::move(r));
334 }
335 std::sort(rules_.begin(), rules_.end(), [](const Rule& a, const Rule& b) {
336 if (a.precedence != b.precedence) return a.precedence > b.precedence;
337 if (a.created != b.created) return a.created < b.created;
338 return a.name < b.name;
339 });
340}
Operator parse_operator(const json &j)
Definition Rule.cpp:192

References rules_.

Referenced by bsc::service::DaemonService::DaemonService().

◆ rules()

const std::vector< Rule > & bsc::rule::Loader::rules ( ) const
inlinenodiscardnoexcept

Definition at line 42 of file Rule.hpp.

42{ return rules_; }

References rules_.

◆ save_rule()

bool bsc::rule::Loader::save_rule ( const Rule & rule,
const std::string & dir ) const

Definition at line 342 of file Rule.cpp.

342 {
343 std::error_code ec;
344 fs::create_directories(dir, ec);
345 if (ec) return false;
346 auto safe_name = rule.name;
347 for (char& c : safe_name) if (!(std::isalnum(static_cast<unsigned char>(c)) || c == '-' || c == '_' || c == '.')) c = '_';
348 const auto path = fs::path(dir) / (safe_name + ".json");
349 json j{{"created", rule.created}, {"name", rule.name}, {"description", rule.description}, {"enabled", rule.enabled},
350 {"precedence", rule.precedence}, {"nolog", rule.nolog}, {"action", rule.action}, {"duration", rule.duration},
351 {"operator", to_json_op(rule.op)}};
352 std::ofstream out(path);
353 if (!out) return false;
354 out << j.dump(2) << '\n';
355 return true;
356}
json to_json_op(const Operator &op)
Definition Rule.cpp:213

Member Data Documentation

◆ aliases_

std::map<std::string, std::vector<std::string> > bsc::rule::Loader::aliases_
private

Definition at line 46 of file Rule.hpp.

Referenced by load_aliases().

◆ rules_

std::vector<Rule> bsc::rule::Loader::rules_
private

Definition at line 45 of file Rule.hpp.

Referenced by find_match(), load_directory(), and rules().


The documentation for this class was generated from the following files:
  • BastionGuard/thirdparty/bastionguard-secure-connection/daemon/include/bsc/rule/Rule.hpp
  • BastionGuard/thirdparty/bastionguard-secure-connection/daemon/src/rule/Rule.cpp