feat(api/ui): add client enable/disable access control (#4771)

This commit is contained in:
neatnoise
2026-03-29 18:58:00 +02:00
committed by GitHub
parent dc2dc61d8c
commit d03334693c
5 changed files with 122 additions and 2 deletions

View File

@@ -132,6 +132,7 @@ namespace nvhttp {
std::string name;
std::string uuid;
std::string cert;
bool enabled = true;
};
struct client_t {
@@ -190,6 +191,7 @@ namespace nvhttp {
named_cert_node.put("name"s, named_cert.name);
named_cert_node.put("cert"s, named_cert.cert);
named_cert_node.put("uuid"s, named_cert.uuid);
named_cert_node.put("enabled"s, named_cert.enabled);
named_cert_nodes.push_back(std::make_pair(""s, named_cert_node));
}
root.add_child("root.named_devices"s, named_cert_nodes);
@@ -253,6 +255,7 @@ namespace nvhttp {
named_cert.name = el.get_child("name").get_value<std::string>();
named_cert.cert = el.get_child("cert").get_value<std::string>();
named_cert.uuid = el.get_child("uuid").get_value<std::string>();
named_cert.enabled = el.get<bool>("enabled", true);
client.named_devices.emplace_back(named_cert);
}
}
@@ -777,6 +780,7 @@ namespace nvhttp {
nlohmann::json named_cert_node;
named_cert_node["name"] = named_cert.name;
named_cert_node["uuid"] = named_cert.uuid;
named_cert_node["enabled"] = named_cert.enabled;
named_cert_nodes.push_back(named_cert_node);
}
@@ -1056,6 +1060,8 @@ namespace nvhttp {
conf_intern.servercert = cert;
}
bool is_client_enabled(const std::string_view cert_pem);
void start() {
platf::set_thread_name("nvhttp");
auto shutdown_event = mail::man->event<bool>(mail::shutdown);
@@ -1124,6 +1130,13 @@ namespace nvhttp {
return verified;
}
// Check if this client is enabled
auto pem = crypto::pem(x509);
if (!is_client_enabled(pem)) {
BOOST_LOG(info) << "Client is disabled -- denied"sv;
return verified;
}
verified = 1;
return verified;
@@ -1225,4 +1238,26 @@ namespace nvhttp {
load_state();
return removed;
}
bool set_client_enabled(const std::string_view uuid, bool enabled) {
client_t &client = client_root;
for (auto &named_cert : client.named_devices) {
if (named_cert.uuid == uuid) {
named_cert.enabled = enabled;
save_state();
return true;
}
}
return false;
}
bool is_client_enabled(const std::string_view cert_pem) {
const client_t &client = client_root;
for (const auto &named_cert : client.named_devices) {
if (named_cert.cert == cert_pem) {
return named_cert.enabled;
}
}
return true;
}
} // namespace nvhttp