With debug logging enabled, the unixctl server logs every request with its arguments. A command that receives secrets, such as encryption keys, must not have them logged.
Add unixctl_command_register_sensitive() for such commands. Their arguments are logged as "[<hidden>]". A later patch, which adds the first such command, tests this. Assisted-by: claude-opus-5-5, Claude Code Signed-off-by: Thilak Raj Surendra Babu <[email protected]> --- lib/unixctl.c | 22 ++++++++++++++++++++-- lib/unixctl.h | 3 +++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/lib/unixctl.c b/lib/unixctl.c index 6e9386947..d4bdbf097 100644 --- a/lib/unixctl.c +++ b/lib/unixctl.c @@ -43,6 +43,7 @@ struct unixctl_command { int min_args, max_args; unixctl_cb_func *cb; void *aux; + bool sensitive; /* Do not log the arguments. */ }; struct unixctl_conn { @@ -215,9 +216,24 @@ unixctl_command_register(const char *name, const char *usage, command->max_args = max_args; command->cb = cb; command->aux = aux; + command->sensitive = false; shash_add(&commands, name, command); } +/* Like unixctl_command_register(), for a command whose arguments contain + * secrets, such as keys, that must not be logged. */ +void +unixctl_command_register_sensitive(const char *name, const char *usage, + int min_args, int max_args, + unixctl_cb_func *cb, void *aux) +{ + struct unixctl_command *command; + + unixctl_command_register(name, usage, min_args, max_args, cb, aux); + command = shash_find_data(&commands, name); + command->sensitive = true; +} + enum unixctl_output_fmt unixctl_command_get_output_format(struct unixctl_conn *conn) { @@ -376,8 +392,11 @@ process_command(struct unixctl_conn *conn, struct jsonrpc_msg *request) COVERAGE_INC(unixctl_received); conn->request_id = json_clone(request->id); + command = shash_find_data(&commands, request->method); if (VLOG_IS_DBG_ENABLED()) { - char *params_s = json_to_string(request->params, 0); + char *params_s = (command && command->sensitive + ? xstrdup("[<hidden>]") + : json_to_string(request->params, 0)); char *id_s = json_to_string(request->id, 0); VLOG_DBG("received request %s%s, id=%s", request->method, params_s, id_s); @@ -386,7 +405,6 @@ process_command(struct unixctl_conn *conn, struct jsonrpc_msg *request) } params = request->params; - command = shash_find_data(&commands, request->method); if (!command) { error = xasprintf("\"%s\" is not a valid command (use " "\"list-commands\" to see a list of valid commands)", diff --git a/lib/unixctl.h b/lib/unixctl.h index 1965f100d..d762bdbca 100644 --- a/lib/unixctl.h +++ b/lib/unixctl.h @@ -56,6 +56,9 @@ typedef void unixctl_cb_func(struct unixctl_conn *, void unixctl_command_register(const char *name, const char *usage, int min_args, int max_args, unixctl_cb_func *cb, void *aux); +void unixctl_command_register_sensitive(const char *name, const char *usage, + int min_args, int max_args, + unixctl_cb_func *cb, void *aux); enum unixctl_output_fmt unixctl_command_get_output_format( struct unixctl_conn *); void unixctl_command_reply_error(struct unixctl_conn *, const char *error); -- 2.43.0 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
