Beispiel #1
0
static int client_send_announce_request(Onion_Client *onion_c, uint32_t num, IP_Port dest, uint8_t *dest_pubkey,
                                        uint8_t *ping_id)
{
    if (num > onion_c->num_friends)
        return -1;

    uint8_t sendback[ONION_ANNOUNCE_SENDBACK_DATA_LENGTH];

    if (new_sendback(onion_c, 0, dest_pubkey, dest, sendback) == -1)
        return -1;

    uint8_t zero_ping_id[ONION_PING_ID_SIZE] = {0};

    if (ping_id == NULL)
        ping_id = zero_ping_id;

    Node_format nodes[4];

    if (random_path(onion_c, nodes) == -1)
        return -1;

    nodes[3].ip_port = dest;
    memcpy(nodes[3].client_id, dest_pubkey, crypto_box_PUBLICKEYBYTES);

    if (num == 0) {
        return send_announce_request(onion_c->dht, nodes, onion_c->dht->c->self_public_key,
                                     onion_c->dht->c->self_secret_key, ping_id,
                                     onion_c->dht->c->self_public_key, sendback);
    } else {
        return send_announce_request(onion_c->dht, nodes, onion_c->friends_list[num - 1].temp_public_key,
                                     onion_c->friends_list[num - 1].temp_secret_key, ping_id,
                                     onion_c->friends_list[num - 1].real_client_id, sendback);
    }
}
Beispiel #2
0
void p2p_cron_announce(ITEM * ti)
{
	ITEM *item = NULL;
	ITEM *t_new = NULL;
	int j = 0;
	TID *tid = list_value(ti);
	LOOKUP *l = tid->lookup;
	NODE_L *n = NULL;

	info(_log, NULL, "Start announcing after querying %lu nodes",
	     list_size(l->list));

	item = list_start(l->list);
	while (item != NULL && j < 8) {
		n = list_value(item);

		if (n->token_size != 0) {
			t_new = tdb_put(P2P_ANNOUNCE_ENGAGE);
			send_announce_request(&n->c_addr, tdb_tid(t_new),
					      l->target, n->token,
					      n->token_size);
			j++;
		}

		item = list_next(item);
	}
}
Beispiel #3
0
static int client_send_announce_request(Onion_Client *onion_c, uint32_t num, IP_Port dest, uint8_t *dest_pubkey,
                                        uint8_t *ping_id, uint32_t pathnum)
{
    if (num > onion_c->num_friends)
        return -1;

    uint64_t sendback;

    if (new_sendback(onion_c, num, dest_pubkey, dest, &sendback) == -1)
        return -1;

    uint8_t zero_ping_id[ONION_PING_ID_SIZE] = {0};

    if (ping_id == NULL)
        ping_id = zero_ping_id;

    Onion_Path path;

    Node_format dest_node;
    dest_node.ip_port = dest;
    memcpy(dest_node.client_id, dest_pubkey, crypto_box_PUBLICKEYBYTES);

    if (num == 0) {
        if (random_path(onion_c->dht, &onion_c->onion_paths, pathnum, &path) == -1)
            return -1;

        return send_announce_request(onion_c->net, &path, dest_node, onion_c->c->self_public_key,
                                     onion_c->c->self_secret_key, ping_id,
                                     onion_c->c->self_public_key, onion_c->temp_public_key, sendback);
    } else {
        if (random_path(onion_c->dht, &onion_c->friends_list[num - 1].onion_paths, pathnum, &path) == -1)
            return -1;

        return send_announce_request(onion_c->net, &path, dest_node, onion_c->friends_list[num - 1].temp_public_key,
                                     onion_c->friends_list[num - 1].temp_secret_key, ping_id,
                                     onion_c->friends_list[num - 1].real_client_id, zero_ping_id, sendback);
    }
}