}
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);
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);