X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fprotocol_auth.c;h=b7f6acdda03315f2ec72aa899983f56f473022dd;hb=ad87362afd13c4f14ce9a4b2cf0586a753b5a422;hp=487f34c96ebef3f640ea2339540dc7607100fe62;hpb=ae73e19ce57b80c561b81170ab48f3cf6f1a41eb;p=meshlink diff --git a/src/protocol_auth.c b/src/protocol_auth.c index 487f34c9..b7f6acdd 100644 --- a/src/protocol_auth.c +++ b/src/protocol_auth.c @@ -48,7 +48,7 @@ static bool send_proxyrequest(meshlink_handle_t *mesh, connection_t *c) { char *port; sockaddr2str(&c->address, &host, &port); - send_request(mesh, c, "CONNECT %s:%s HTTP/1.1\r\n\r", host, port); + send_request(mesh, c, NULL, "CONNECT %s:%s HTTP/1.1\r\n\r", host, port); free(host); free(port); return true; @@ -151,7 +151,7 @@ bool send_id(meshlink_handle_t *mesh, connection_t *c) { return false; } - return send_request(mesh, c, "%d %s %d.%d %s", ID, mesh->self->connection->name, mesh->self->connection->protocol_major, minor, mesh->appname); + return send_request(mesh, c, NULL, "%d %s %d.%d %s", ID, mesh->self->connection->name, mesh->self->connection->protocol_major, minor, mesh->appname); } static bool finalize_invitation(meshlink_handle_t *mesh, connection_t *c, const void *data, uint16_t len) { @@ -179,9 +179,14 @@ static bool finalize_invitation(meshlink_handle_t *mesh, connection_t *c, const } fprintf(f, "ECDSAPublicKey = %s\n", (const char *)data); + + if(c->submesh) { + fprintf(f, "SubMesh = %s\n", c->submesh->name); + } + fclose(f); - logger(mesh, MESHLINK_INFO, "Key succesfully received from %s", c->name); + logger(mesh, MESHLINK_INFO, "Key successfully received from %s", c->name); //TODO: callback to application to inform of an accepted invitation @@ -253,7 +258,7 @@ static bool receive_invitation_sptps(void *handle, uint8_t type, const void *dat return false; } - if(time(NULL) > st.st_mtime + mesh->invitation_timeout) { + if(time(NULL) > (time_t)(st.st_mtime + mesh->invitation_timeout)) { logger(mesh, MESHLINK_ERROR, "Peer %s tried to use an outdated invitation file %s\n", c->name, usedname); fclose(f); unlink(usedname); @@ -288,6 +293,38 @@ static bool receive_invitation_sptps(void *handle, uint8_t type, const void *dat free(c->name); c->name = xstrdup(name); + // Check if the file contains Sub-Mesh information + buf[0] = 0; + fgets(buf, sizeof(buf), f); + + if(*buf) { + buf[strlen(buf) - 1] = 0; + } + + if(!strncmp(buf, "SubMesh", 7)) { + len = strcspn(buf, " \t="); + char *submesh_name = buf + len; + submesh_name += strspn(submesh_name, " \t"); + + if(*submesh_name == '=') { + submesh_name++; + submesh_name += strspn(submesh_name, " \t"); + } + + if(!check_id(submesh_name)) { + logger(mesh, MESHLINK_ERROR, "Invalid invitation file %s\n", cookie); + fclose(f); + return false; + } + + c->submesh = NULL; + c->submesh = lookup_or_create_submesh(mesh, submesh_name); + + if(!c->submesh) { + return false; + } + } + // Send the node the contents of the invitation file rewind(f); size_t result; @@ -302,7 +339,7 @@ static bool receive_invitation_sptps(void *handle, uint8_t type, const void *dat c->status.invitation_used = true; - logger(mesh, MESHLINK_INFO, "Invitation %s succesfully sent to %s", cookie, c->name); + logger(mesh, MESHLINK_INFO, "Invitation %s successfully sent to %s", cookie, c->name); return true; } @@ -336,7 +373,7 @@ bool id_h(meshlink_handle_t *mesh, connection_t *c, const char *request) { return false; } - if(!send_request(mesh, c, "%d %s", ACK, mykey)) { + if(!send_request(mesh, c, NULL, "%d %s", ACK, mykey)) { return false; } @@ -391,7 +428,7 @@ bool id_h(meshlink_handle_t *mesh, connection_t *c, const char *request) { get_config_bool(lookup_config(c->config_tree, "blacklisted"), &blacklisted); if(blacklisted) { - logger(mesh, MESHLINK_EPEER, "Peer %s is blacklisted", c->name); + logger(mesh, MESHLINK_INFO, "Peer %s is blacklisted", c->name); return false; } @@ -438,7 +475,7 @@ bool send_ack(meshlink_handle_t *mesh, connection_t *c) { c->options |= OPTION_PMTU_DISCOVERY; } - return send_request(mesh, c, "%d %s %d %x", ACK, mesh->myport, mesh->devclass, (c->options & 0xffffff) | (PROT_MINOR << 24)); + return send_request(mesh, c, NULL, "%d %s %d %x", ACK, mesh->myport, mesh->devclass, (c->options & 0xffffff) | (PROT_MINOR << 24)); } static void send_everything(meshlink_handle_t *mesh, connection_t *c) {