]> git.meshlink.io Git - meshlink/commitdiff
Check blacklist status before committing an invitation.
authorGuus Sliepen <guus@meshlink.io>
Sun, 25 Oct 2020 21:17:29 +0000 (22:17 +0100)
committerGuus Sliepen <guus@meshlink.io>
Sun, 25 Oct 2020 21:17:29 +0000 (22:17 +0100)
Although we delete invitation files when blacklisting a node, there is a
race condition where an invitation connection is created right before the
invitee is blacklisted. So check that the node is blacklisted right before
committing the node config file to disk.

src/protocol_auth.c

index 7bf121989b308558a0305d29cb0478a943818e07..e1a9a31341f8b73846628e49509335b1f4c0e511 100644 (file)
@@ -48,8 +48,21 @@ bool send_id(meshlink_handle_t *mesh, connection_t *c) {
 }
 
 static bool commit_invitation(meshlink_handle_t *mesh, connection_t *c, const void *data) {
 }
 
 static bool commit_invitation(meshlink_handle_t *mesh, connection_t *c, const void *data) {
+       // Check if the node is known
+       node_t *n = lookup_node(mesh, c->name);
+
+       if(n) {
+               if(n->status.blacklisted) {
+                       logger(mesh, MESHLINK_ERROR, "Invitee %s is blacklisted", c->name);
+               } else {
+                       logger(mesh, MESHLINK_ERROR, "Invitee %s already known", c->name);
+               }
+
+               return false;
+       }
+
        // Create a new node
        // Create a new node
-       node_t *n = new_node();
+       n = new_node();
        n->name = xstrdup(c->name);
        n->devclass = DEV_CLASS_UNKNOWN;
        n->ecdsa = ecdsa_set_public_key(data);
        n->name = xstrdup(c->name);
        n->devclass = DEV_CLASS_UNKNOWN;
        n->ecdsa = ecdsa_set_public_key(data);