hs init recv logic, + fs send init ack (not tracking it yet)
This commit is contained in:
parent
bd0c45f885
commit
e6803275a0
@ -28,7 +28,7 @@ enum _PacketType : uint8_t {
|
|||||||
// - peer_key bytes (the msg_ids are from)
|
// - peer_key bytes (the msg_ids are from)
|
||||||
// - 1 byte (uint8_t count ids, can be 0)
|
// - 1 byte (uint8_t count ids, can be 0)
|
||||||
// - array [
|
// - array [
|
||||||
// - msg_id bytes (the message id
|
// - msg_id bytes (the message id)
|
||||||
// - ]
|
// - ]
|
||||||
HS1_RESPONSE_LAST_IDS,
|
HS1_RESPONSE_LAST_IDS,
|
||||||
|
|
||||||
@ -49,7 +49,7 @@ enum _PacketType : uint8_t {
|
|||||||
|
|
||||||
// acknowlage init (like an accept)
|
// acknowlage init (like an accept)
|
||||||
// like tox ft control continue
|
// like tox ft control continue
|
||||||
// - 1 byte (temporary_file_tf_id)
|
// - 1 byte (transfer_id)
|
||||||
FT1_INIT_ACK,
|
FT1_INIT_ACK,
|
||||||
|
|
||||||
// TODO: init deny, speed up non acceptance
|
// TODO: init deny, speed up non acceptance
|
||||||
|
12
ngc_ft1.cpp
12
ngc_ft1.cpp
@ -300,6 +300,7 @@ static void _handle_FT1_INIT(
|
|||||||
fprintf(stderr, "]\n");
|
fprintf(stderr, "]\n");
|
||||||
|
|
||||||
// check if slot free ?
|
// check if slot free ?
|
||||||
|
// did we allready ack this and the other side just did not see the ack?
|
||||||
|
|
||||||
NGC_FT1_recv_init_cb* fn_ptr = nullptr;
|
NGC_FT1_recv_init_cb* fn_ptr = nullptr;
|
||||||
if (ngc_ext_ctx->ngc_ft1_ctx->cb_init.count(file_kind)) {
|
if (ngc_ext_ctx->ngc_ft1_ctx->cb_init.count(file_kind)) {
|
||||||
@ -316,8 +317,19 @@ static void _handle_FT1_INIT(
|
|||||||
|
|
||||||
if (accept_ft) {
|
if (accept_ft) {
|
||||||
// send ack
|
// send ack
|
||||||
|
// - 1 byte packet id
|
||||||
|
// - 1 byte transfer_id
|
||||||
|
std::vector<uint8_t> pkg;
|
||||||
|
pkg.push_back(FT1_INIT_ACK);
|
||||||
|
pkg.push_back(transfer_id);
|
||||||
|
|
||||||
|
// lossless
|
||||||
|
tox_group_send_custom_private_packet(tox, group_number, peer_number, true, pkg.data(), pkg.size(), nullptr);
|
||||||
|
|
||||||
|
fprintf(stderr, "accepted init\n");
|
||||||
} else {
|
} else {
|
||||||
// TODO deny?
|
// TODO deny?
|
||||||
|
fprintf(stderr, "rejected init\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
45
ngc_hs1.cpp
45
ngc_hs1.cpp
@ -39,7 +39,7 @@ struct NGC_HS1 {
|
|||||||
uint32_t peer_number; // the peer we requested the message from
|
uint32_t peer_number; // the peer we requested the message from
|
||||||
float time_since_ft_activity {0.f};
|
float time_since_ft_activity {0.f};
|
||||||
};
|
};
|
||||||
std::map<uint32_t, PendingFTRequest> pending;
|
std::map<uint32_t, PendingFTRequest> pending; // key msg_id
|
||||||
|
|
||||||
// dont start immediatly
|
// dont start immediatly
|
||||||
float time_since_last_request_sent {0.f};
|
float time_since_last_request_sent {0.f};
|
||||||
@ -465,7 +465,50 @@ static bool _handle_HS1_ft_init_message(
|
|||||||
const size_t file_size
|
const size_t file_size
|
||||||
) {
|
) {
|
||||||
fprintf(stderr, "-------hs handle ft init\n");
|
fprintf(stderr, "-------hs handle ft init\n");
|
||||||
|
|
||||||
|
// peer id and msg id from file id
|
||||||
|
// TODO: replace, remote crash
|
||||||
|
assert(file_id_size == TOX_GROUP_PEER_PUBLIC_KEY_SIZE+sizeof(uint32_t));
|
||||||
|
|
||||||
|
// get peer_key from file_id
|
||||||
|
_PeerKey peer_key;
|
||||||
|
std::copy(file_id, file_id+peer_key.size(), peer_key.data.begin());
|
||||||
|
|
||||||
|
// get msg_id from file_id
|
||||||
|
// HACK: little endian
|
||||||
|
uint32_t msg_id;
|
||||||
|
uint8_t* tmp_ptr = reinterpret_cast<uint8_t*>(&msg_id);
|
||||||
|
std::copy(file_id+TOX_GROUP_PEER_PUBLIC_KEY_SIZE, file_id+TOX_GROUP_PEER_PUBLIC_KEY_SIZE+sizeof(uint32_t), tmp_ptr);
|
||||||
|
|
||||||
|
// did we ask for this?
|
||||||
|
|
||||||
|
// get group id
|
||||||
|
_GroupKey g_id{};
|
||||||
|
{ // TODO: error
|
||||||
|
tox_group_get_chat_id(tox, group_number, g_id.data.data(), nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto& group = ngc_ext_ctx->ngc_hs1_ctx->history[g_id];
|
||||||
|
|
||||||
|
auto& pending = group.peers[peer_key].pending;
|
||||||
|
|
||||||
|
if (!pending.count(msg_id)) {
|
||||||
|
// we did not ask for this
|
||||||
|
// TODO: accept?
|
||||||
|
fprintf(stderr, "ft init from peer we did not ask\n");
|
||||||
return false; // deny
|
return false; // deny
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pending.at(msg_id).peer_number != peer_number) {
|
||||||
|
// wrong peer ?
|
||||||
|
fprintf(stderr, "ft init from peer we did not ask while asking someone else\n");
|
||||||
|
return false; // deny
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: more?
|
||||||
|
pending.at(msg_id).time_since_ft_activity = 0.f;
|
||||||
|
|
||||||
|
return true; // accept
|
||||||
}
|
}
|
||||||
|
|
||||||
#define _HS1_HAVE(x, error) if ((length - curser) < (x)) { error; }
|
#define _HS1_HAVE(x, error) if ((length - curser) < (x)) { error; }
|
||||||
|
Reference in New Issue
Block a user