Skip to content
API Documentation
BastionGuard™
bastionguard::rootguard::anonymous_namespace{PolicyLoader.cpp} Namespace Reference

Functions

std::string trim (std::string value)
std::string lower (std::string value)
std::string unquote (std::string value)
bool parseBool (const std::string &value, const std::size_t line)
Mode parseMode (const std::string &value, const std::size_t line)
Action parseAction (const std::string &value, const std::size_t line, const char *keyName)
std::uint32_t parseUint32 (const std::string &value, const std::size_t line, const char *keyName)
std::string normalizedPolicyPath (const std::filesystem::path &path)
void validatePathList (const std::vector< PolicyPath > &entries, const char *label, std::set< std::string > &output)
void validate (const Policy &policy)

Function Documentation

◆ lower()

std::string bastionguard::rootguard::anonymous_namespace{PolicyLoader.cpp}::lower ( std::string value)

Definition at line 28 of file PolicyLoader.cpp.

29{
30 std::transform(value.begin(), value.end(), value.begin(),
31 [](const unsigned char character) {
32 return static_cast<char>(std::tolower(character));
33 });
34 return value;
35}

References lower().

Referenced by lower(), parseAction(), parseBool(), and parseMode().

◆ normalizedPolicyPath()

std::string bastionguard::rootguard::anonymous_namespace{PolicyLoader.cpp}::normalizedPolicyPath ( const std::filesystem::path & path)

Definition at line 97 of file PolicyLoader.cpp.

98{
99 return path.lexically_normal().string();
100}

References normalizedPolicyPath().

Referenced by normalizedPolicyPath(), and validatePathList().

◆ parseAction()

Action bastionguard::rootguard::anonymous_namespace{PolicyLoader.cpp}::parseAction ( const std::string & value,
const std::size_t line,
const char * keyName )

Definition at line 70 of file PolicyLoader.cpp.

72{
73 const std::string normalized = lower(trim(value));
74 if (normalized == "audit")
75 return Action::Audit;
76 if (normalized == "block")
77 return Action::Block;
78 throw std::runtime_error(std::string(keyName) +
79 " non valida alla riga " +
80 std::to_string(line));
81}

References bastionguard::rootguard::Audit, bastionguard::rootguard::Block, lower(), parseAction(), and trim().

Referenced by parseAction().

◆ parseBool()

bool bastionguard::rootguard::anonymous_namespace{PolicyLoader.cpp}::parseBool ( const std::string & value,
const std::size_t line )

Definition at line 48 of file PolicyLoader.cpp.

49{
50 const std::string normalized = lower(trim(value));
51 if (normalized == "true" || normalized == "yes" || normalized == "1")
52 return true;
53 if (normalized == "false" || normalized == "no" || normalized == "0")
54 return false;
55 throw std::runtime_error("valore booleano non valido alla riga " +
56 std::to_string(line));
57}

References lower(), parseBool(), and trim().

Referenced by parseBool().

◆ parseMode()

Mode bastionguard::rootguard::anonymous_namespace{PolicyLoader.cpp}::parseMode ( const std::string & value,
const std::size_t line )

Definition at line 59 of file PolicyLoader.cpp.

60{
61 const std::string normalized = lower(trim(value));
62 if (normalized == "audit")
63 return Mode::Audit;
64 if (normalized == "enforce")
65 return Mode::Enforce;
66 throw std::runtime_error("modalità non valida alla riga " +
67 std::to_string(line));
68}

References bastionguard::rootguard::Audit, bastionguard::rootguard::Enforce, lower(), parseMode(), and trim().

Referenced by parseMode().

◆ parseUint32()

std::uint32_t bastionguard::rootguard::anonymous_namespace{PolicyLoader.cpp}::parseUint32 ( const std::string & value,
const std::size_t line,
const char * keyName )

Definition at line 83 of file PolicyLoader.cpp.

85{
86 std::size_t consumed = 0;
87 const unsigned long parsed = std::stoul(value, &consumed, 10);
88 if (consumed != value.size() ||
89 parsed > std::numeric_limits<std::uint32_t>::max()) {
90 throw std::runtime_error(std::string(keyName) +
91 " non valido alla riga " +
92 std::to_string(line));
93 }
94 return static_cast<std::uint32_t>(parsed);
95}

References parseUint32().

Referenced by parseUint32().

◆ trim()

std::string bastionguard::rootguard::anonymous_namespace{PolicyLoader.cpp}::trim ( std::string value)

Definition at line 17 of file PolicyLoader.cpp.

18{
19 const auto notSpace = [](const unsigned char character) {
20 return !std::isspace(character);
21 };
22
23 value.erase(value.begin(), std::find_if(value.begin(), value.end(), notSpace));
24 value.erase(std::find_if(value.rbegin(), value.rend(), notSpace).base(), value.end());
25 return value;
26}

References trim().

Referenced by parseAction(), parseBool(), parseMode(), trim(), and unquote().

◆ unquote()

std::string bastionguard::rootguard::anonymous_namespace{PolicyLoader.cpp}::unquote ( std::string value)

Definition at line 37 of file PolicyLoader.cpp.

38{
39 value = trim(std::move(value));
40 if (value.size() >= 2 &&
41 ((value.front() == '"' && value.back() == '"') ||
42 (value.front() == '\'' && value.back() == '\''))) {
43 value = value.substr(1, value.size() - 2);
44 }
45 return value;
46}

References trim(), and unquote().

Referenced by unquote().

◆ validate()

void bastionguard::rootguard::anonymous_namespace{PolicyLoader.cpp}::validate ( const Policy & policy)

Definition at line 116 of file PolicyLoader.cpp.

117{
118 if (policy.version != 2)
119 throw std::runtime_error("versione policy non supportata: attesa 2");
120
121 if (policy.integrityPollSeconds > 3600)
122 throw std::runtime_error("integrity_poll_seconds deve essere compreso tra 0 e 3600");
123
124 if (policy.globalMetadataSampleLimit > 64)
125 throw std::runtime_error("global_metadata_sample_limit deve essere compreso tra 0 e 64");
126 if (policy.metadataBurstThreshold < 8 || policy.metadataBurstThreshold > 100000)
127 throw std::runtime_error("metadata_burst_threshold deve essere compreso tra 8 e 100000");
128 if (policy.metadataBurstWindowMs < 250 || policy.metadataBurstWindowMs > 60000)
129 throw std::runtime_error("metadata_burst_window_ms deve essere compreso tra 250 e 60000");
131 policy.metadataBurstCooldownMs > 3600000)
132 throw std::runtime_error("metadata_burst_cooldown_ms deve essere >= metadata_burst_window_ms e <= 3600000");
133
134 if (policy.globalMetadataAction == Action::Block) {
135 throw std::runtime_error(
136 "global_metadata_action=block non e supportato: la sorveglianza globale "
137 "deve restare audit-only per non bloccare la home utente; aggiungere gli "
138 "oggetti di sistema a [protected-paths]");
139 }
140
141 if (policy.mode == Mode::Enforce &&
142 (policy.unknownAction == Action::Block ||
144 policy.trustedExecutables.empty()) {
145 throw std::runtime_error(
146 "enforcement con blocco delle elevazioni richiede almeno un eseguibile trusted");
147 }
148
149 std::set<std::string> trustedApplications;
150 std::set<std::string> trusted;
151 std::set<std::string> denied;
152 std::set<std::string> protectedPaths;
153 std::set<std::string> ignoredPaths;
154 validatePathList(policy.trustedApplications, "trusted application", trustedApplications);
155 validatePathList(policy.trustedExecutables, "trusted", trusted);
156 validatePathList(policy.deniedExecutables, "denied", denied);
157 validatePathList(policy.protectedPaths, "protected", protectedPaths);
158 validatePathList(policy.ignoredPaths, "ignored", ignoredPaths);
159
160 for (const auto& key : trusted) {
161 if (denied.count(key) != 0)
162 throw std::runtime_error("percorso presente sia in trusted sia in denied: " + key);
163 }
164 for (const auto& key : trustedApplications) {
165 if (denied.count(key) != 0)
166 throw std::runtime_error("applicazione presente sia in trusted-applications sia in denied: " + key);
167 }
168}
void validatePathList(const std::vector< PolicyPath > &entries, const char *label, std::set< std::string > &output)
std::vector< PolicyPath > trustedExecutables
Definition Policy.hpp:56
std::vector< PolicyPath > deniedExecutables
Definition Policy.hpp:57
std::uint32_t metadataBurstThreshold
Definition Policy.hpp:44
std::vector< PolicyPath > ignoredPaths
Definition Policy.hpp:59
std::uint32_t globalMetadataSampleLimit
Definition Policy.hpp:43
std::uint32_t integrityPollSeconds
Definition Policy.hpp:53
std::uint32_t metadataBurstCooldownMs
Definition Policy.hpp:46
std::vector< PolicyPath > protectedPaths
Definition Policy.hpp:58
std::uint32_t metadataBurstWindowMs
Definition Policy.hpp:45
std::vector< PolicyPath > trustedApplications
Definition Policy.hpp:55

References bastionguard::rootguard::Block, bastionguard::rootguard::Policy::credentialAnomalyAction, bastionguard::rootguard::Policy::deniedExecutables, bastionguard::rootguard::Enforce, bastionguard::rootguard::Policy::globalMetadataAction, bastionguard::rootguard::Policy::globalMetadataSampleLimit, bastionguard::rootguard::Policy::ignoredPaths, bastionguard::rootguard::Policy::integrityPollSeconds, bastionguard::rootguard::Policy::metadataBurstCooldownMs, bastionguard::rootguard::Policy::metadataBurstThreshold, bastionguard::rootguard::Policy::metadataBurstWindowMs, bastionguard::rootguard::Policy::mode, bastionguard::rootguard::Policy::protectedPaths, bastionguard::rootguard::Policy::trustedApplications, bastionguard::rootguard::Policy::trustedExecutables, bastionguard::rootguard::Policy::unknownAction, validate(), validatePathList(), and bastionguard::rootguard::Policy::version.

Referenced by validate().

◆ validatePathList()

void bastionguard::rootguard::anonymous_namespace{PolicyLoader.cpp}::validatePathList ( const std::vector< PolicyPath > & entries,
const char * label,
std::set< std::string > & output )

Definition at line 102 of file PolicyLoader.cpp.

105{
106 for (const auto& entry : entries) {
107 if (entry.path.empty())
108 throw std::runtime_error(std::string("percorso ") + label + " vuoto");
109 const auto key = normalizedPolicyPath(entry.path);
110 if (!output.insert(key).second)
111 throw std::runtime_error(std::string("percorso ") + label +
112 " duplicato: " + key);
113 }
114}
std::string normalizedPolicyPath(const std::filesystem::path &path)

References normalizedPolicyPath(), and validatePathList().

Referenced by validate(), and validatePathList().