ubus: hide local private key in network_get
authorFelix Fietkau <nbd@nbd.name>
Wed, 29 Jan 2025 19:12:51 +0000 (20:12 +0100)
committerFelix Fietkau <nbd@nbd.name>
Wed, 29 Jan 2025 19:12:53 +0000 (20:12 +0100)
Private key should only be written, not returned

Signed-off-by: Felix Fietkau <nbd@nbd.name>
network.c
network.h
ubus.c

index 721d48ef614c085b3deca3e2fe2c76e2049cea18..09fd01b964077fa1e0d7451975f9aaddec2b2d44 100644 (file)
--- a/network.c
+++ b/network.c
@@ -585,6 +585,21 @@ network_destroy(struct network *net)
        free(net);
 }
 
+void network_get_config(struct network *net, struct blob_buf *buf)
+{
+       struct blob_attr *tb[__NETWORK_ATTR_MAX];
+
+       if (!net->config.data)
+               return;
+
+       blobmsg_parse_attr(network_policy, __NETWORK_ATTR_MAX, tb,
+                          net->config.data);
+       tb[NETWORK_ATTR_KEY] = NULL;
+       for (size_t i = 0; i < ARRAY_SIZE(tb); i++)
+               if (tb[i])
+                       blobmsg_add_blob(buf, tb[i]);
+}
+
 static int
 network_set_config(struct network *net, struct blob_attr *config)
 {
@@ -600,9 +615,8 @@ network_set_config(struct network *net, struct blob_attr *config)
        memset(&net->config, 0, sizeof(net->config));
 
        net->config.data = blob_memdup(config);
-       blobmsg_parse(network_policy, __NETWORK_ATTR_MAX, tb,
-                     blobmsg_data(net->config.data),
-                     blobmsg_len(net->config.data));
+       blobmsg_parse_attr(network_policy, __NETWORK_ATTR_MAX, tb,
+                          net->config.data);
 
        if ((cur = tb[NETWORK_ATTR_TYPE]) == NULL ||
            !strlen(blobmsg_get_string(cur)) ||
index f713fd35688bb0ff75517114841d8df9ce6d2b60..aa45b6b27ae642e51a59bb6880c0313f722ede8b 100644 (file)
--- a/network.h
+++ b/network.h
@@ -102,6 +102,7 @@ static inline const char *network_name(struct network *net)
        return net->node.key;
 }
 
+void network_get_config(struct network *net, struct blob_buf *buf);
 bool network_skip_endpoint_route(struct network *net, union network_endpoint *ep);
 void network_fill_host_addr(union network_addr *addr, uint8_t *key);
 int network_save_dynamic(struct network *net);
diff --git a/ubus.c b/ubus.c
index 6e289da5c152e7e88eb8733ddd64d46bbfe4bd88..11bacc2dd08c2810059c5d5440e600c6d006f29d 100644 (file)
--- a/ubus.c
+++ b/ubus.c
@@ -58,9 +58,9 @@ __network_dump(struct blob_buf *buf, struct network *net)
        void *c, *p;
        char *str;
 
-       blobmsg_add_field(buf, BLOBMSG_TYPE_TABLE, "config",
-                         blobmsg_data(net->config.data),
-                         blobmsg_len(net->config.data));
+       c = blobmsg_open_table(buf, "config");
+       network_get_config(net, buf);
+       blobmsg_close_table(buf, c);
 
        if (local)
                blobmsg_add_string(buf, "local_host", network_host_name(local));