blob P2PFolder::remote_token() { return derive_token(folder_group()->secret(), remote_pubkey()); }
static rstatus_t parse_seeds(struct string *seeds, struct string *dc_name, struct string *rack_name, struct string *port_str, struct string *address, struct string *name, struct dyn_token *ptoken) { rstatus_t status; uint8_t *p, *q, *start; uint8_t *pname, *port, *rack, *dc, *token, *addr; uint32_t k, delimlen, pnamelen, portlen, racklen, dclen, tokenlen, addrlen; char delim[] = "::::"; /* parse "hostname:port:rack:dc:tokens" */ p = seeds->data + seeds->len - 1; start = seeds->data; rack = NULL; dc = NULL; racklen = 0; dclen = 0; token = NULL; tokenlen = 0; port = NULL; portlen = 0; delimlen = 4; for (k = 0; k < sizeof(delim)-1; k++) { q = dn_strrchr(p, start, delim[k]); switch (k) { case 0: token = q + 1; tokenlen = (uint32_t)(p - token + 1); break; case 1: dc = q + 1; dclen = (uint32_t)(p - dc + 1); string_copy(dc_name, dc, dclen); break; case 2: rack = q + 1; racklen = (uint32_t)(p - rack + 1); string_copy(rack_name, rack, racklen); break; case 3: port = q + 1; portlen = (uint32_t)(p - port + 1); string_copy(port_str, port, portlen); break; default: NOT_REACHED(); } p = q - 1; } if (k != delimlen) { return GOS_ERROR; } //pname = hostname:port pname = seeds->data; pnamelen = seeds->len - (tokenlen + racklen + dclen + 3); status = string_copy(address, pname, pnamelen); //addr = hostname or ip only addr = start; addrlen = (uint32_t)(p - start + 1); //if it is a dns name, convert to IP or otherwise keep that IP if (!isdigit( (char) addr[0])) { addr[addrlen] = '\0'; char *local_ip4 = hostname_to_private_ip4( (char *) addr); if (local_ip4 != NULL) { status = string_copy_c(name, local_ip4); } else status = string_copy(name, addr, addrlen); } else { status = string_copy(name, addr, addrlen); } if (status != DN_OK) { return GOS_ERROR; } uint8_t *t_end = token + tokenlen; status = derive_token(ptoken, token, t_end); if (status != DN_OK) { return GOS_ERROR; } //status = dn_resolve(&address, field->port, &field->info); //if (status != DN_OK) { // string_deinit(&address); // return CONF_ERROR; //} return GOS_OK; }
blob P2PFolder::local_token() { return derive_token(folder_group()->secret(), provider_.node_key().public_key()); }