]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
unetmsg: fix publish notification timing around remote auth
authorFelix Fietkau <nbd@nbd.name>
Fri, 6 Feb 2026 09:22:30 +0000 (09:22 +0000)
committerFelix Fietkau <nbd@nbd.name>
Sat, 7 Feb 2026 09:04:17 +0000 (10:04 +0100)
When a remote peer's publish registrations arrive via RX before the
local TX connection is authenticated, handle_publish fires but the
subscriber can't reach the remote publisher yet since the TX channel
isn't ready.

Suppress publish notifications on the RX side when no authenticated TX
channel exists for the remote host. After TX authentication completes,
re-trigger handle_publish only for topics that the specific peer
publishes and that have local subscribers.

Signed-off-by: John Crispin <john@phrozen.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
package/network/services/unetmsg/files/usr/share/ucode/unetmsg/unetmsgd-remote.uc

index 92f81262efb2f2581d1d4c882bdbed82cae6226f..1f1c97a2cae7ab14684f9374112944547c3a2fc3 100644 (file)
@@ -93,6 +93,8 @@ function network_socket_handle_request(sock_data, req)
        let host = sock_data.name;
        let network = sock_data.network;
        let args = { ...req.args, host, network };
+       let tx_chan = net.tx_channels[host];
+       let tx_auth = tx_chan && tx_chan.auth;
        switch (msgtype) {
        case "publish":
        case "subscribe":
@@ -102,7 +104,8 @@ function network_socket_handle_request(sock_data, req)
                        return;
                if (args.enabled) {
                        if (list[name]) {
-                               core.handle_publish(null, name);
+                               if (tx_auth)
+                                       core.handle_publish(null, name);
                                return 0;
                        }
 
@@ -121,7 +124,8 @@ function network_socket_handle_request(sock_data, req)
                                network: sock_data.network,
                                name: host,
                        }, pubsub_proto);
-                       core.handle_publish(null, name);
+                       if (tx_auth)
+                               core.handle_publish(null, name);
                        list[name] = true;
                } else {
                        if (!list[name])
@@ -318,6 +322,11 @@ function network_open_channel(net, name, peer)
                                        data: { name, enabled: true },
                                        return: "ignore",
                                });
+
+               let rx_chan = net.rx_channels[name];
+               if (rx_chan)
+                       for (let sub_name in rx_chan.publish)
+                               core.handle_publish(null, sub_name);
        };
        let auth_cb = () => {
                if (!sock_data.auth)