Beispiel #1
0
blob P2PFolder::remote_token() {
	return derive_token(folder_group()->secret(), remote_pubkey());
}
Beispiel #2
0
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;
}
Beispiel #3
0
blob P2PFolder::local_token() {
	return derive_token(folder_group()->secret(), provider_.node_key().public_key());
}