]> git.meshlink.io Git - meshlink/blobdiff - src/protocol_auth.c
Check blacklist status before committing an invitation.
[meshlink] / src / protocol_auth.c
index 7db41d51eb0d54159955fdbf0f74705ac7fe3095..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) {
+       // 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
-       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);
@@ -381,6 +394,25 @@ bool ack_h(meshlink_handle_t *mesh, connection_t *c, const char *request) {
                mesh->meta_status_cb(mesh, (meshlink_node_t *)n, true);
        }
 
+       /*  Terminate any connections to this node that are not activated yet */
+
+       for list_each(connection_t, other, mesh->connections) {
+               if(!other->status.active && !strcmp(other->name, c->name)) {
+                       if(other->outgoing) {
+                               if(c->outgoing) {
+                                       logger(mesh, MESHLINK_WARNING, "Two outgoing connections to the same node!");
+                               } else {
+                                       c->outgoing = other->outgoing;
+                               }
+
+                               other->outgoing = NULL;
+                       }
+
+                       logger(mesh, MESHLINK_DEBUG, "Terminating pending second connection with %s", n->name);
+                       terminate_connection(mesh, other, false);
+               }
+       }
+
        /* Send him everything we know */
 
        send_everything(mesh, c);