Skip to content

Commit 0a93263

Browse files
committed
feat: add message IDs to private group packets
1 parent 99e0bcc commit 0a93263

File tree

9 files changed

+89
-43
lines changed

9 files changed

+89
-43
lines changed

auto_tests/group_message_test.c

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,6 @@ static void group_message_handler(const Tox_Event_Group_Message *event, void *us
274274
State *state = (State *)autotox->state;
275275

276276
state->message_received = true;
277-
278277
state->pseudo_msg_id = pseudo_msg_id;
279278
}
280279

@@ -288,6 +287,7 @@ static void group_private_message_handler(const Tox_Event_Group_Private_Message
288287
const Tox_Message_Type type = tox_event_group_private_message_get_type(event);
289288
const uint8_t *message = tox_event_group_private_message_get_message(event);
290289
const size_t length = tox_event_group_private_message_get_message_length(event);
290+
const uint32_t pseudo_msg_id = tox_event_group_private_message_get_message_id(event);
291291

292292
ck_assert_msg(length == TEST_PRIVATE_MESSAGE_LEN, "Failed to receive message. Invalid length: %zu\n", length);
293293

@@ -320,14 +320,15 @@ static void group_private_message_handler(const Tox_Event_Group_Private_Message
320320
ck_assert(s_err == TOX_ERR_GROUP_SELF_QUERY_OK);
321321
ck_assert(memcmp(self_name, PEER1_NICK, self_name_len) == 0);
322322

323-
printf("%s sent private action to %s: %s\n", peer_name, self_name, message_buf);
323+
printf("%s sent private action to %s:(id: %u) %s\n", peer_name, self_name, pseudo_msg_id, message_buf);
324324
ck_assert(memcmp(message_buf, TEST_PRIVATE_MESSAGE, length) == 0);
325325

326326
ck_assert(type == TOX_MESSAGE_TYPE_ACTION);
327327

328328
State *state = (State *)autotox->state;
329329

330330
state->private_message_received = true;
331+
state->pseudo_msg_id = pseudo_msg_id;
331332
}
332333

333334
static void group_message_handler_lossless_test(const Tox_Event_Group_Message *event, void *user_data)
@@ -435,7 +436,8 @@ static void group_message_test(AutoTox *autotoxes)
435436
}
436437
}
437438

438-
ck_assert_msg(state0->pseudo_msg_id == state1->pseudo_msg_id, "id0:%u id1:%u", state0->pseudo_msg_id, state1->pseudo_msg_id);
439+
ck_assert_msg(state0->pseudo_msg_id == state1->pseudo_msg_id, "id0:%u id1:%u",
440+
state0->pseudo_msg_id, state1->pseudo_msg_id);
439441

440442
// Make sure we're still connected to each friend
441443
Tox_Connection conn_1 = tox_friend_get_connection_status(tox0, 0, nullptr);
@@ -460,14 +462,23 @@ static void group_message_test(AutoTox *autotoxes)
460462
tox_group_set_ignore(tox0, group_number, state0->peer_id, false, &ig_err);
461463
ck_assert_msg(ig_err == TOX_ERR_GROUP_SET_IGNORE_OK, "%d", ig_err);
462464

463-
fprintf(stderr, "Sending private message...\n");
465+
fprintf(stderr, "Sending private action...\n");
464466

465-
// tox0 sends a private action to tox1
467+
// tox1 sends a private action to tox0
466468
Tox_Err_Group_Send_Private_Message m_err;
467-
tox_group_send_private_message(tox1, group_number, state1->peer_id, TOX_MESSAGE_TYPE_ACTION,
468-
(const uint8_t *)TEST_PRIVATE_MESSAGE, TEST_PRIVATE_MESSAGE_LEN, &m_err);
469+
state1->pseudo_msg_id = tox_group_send_private_message(tox1, group_number, state1->peer_id,
470+
TOX_MESSAGE_TYPE_ACTION, (const uint8_t *)TEST_PRIVATE_MESSAGE,
471+
TEST_PRIVATE_MESSAGE_LEN, &m_err);
472+
469473
ck_assert_msg(m_err == TOX_ERR_GROUP_SEND_PRIVATE_MESSAGE_OK, "%d", m_err);
470474

475+
while (!state0->private_message_received) {
476+
iterate_all_wait(autotoxes, NUM_GROUP_TOXES, ITERATION_INTERVAL);
477+
}
478+
479+
ck_assert_msg(state0->pseudo_msg_id == state1->pseudo_msg_id, "id0:%u id1:%u",
480+
state0->pseudo_msg_id, state1->pseudo_msg_id);
481+
471482
fprintf(stderr, "Sending custom packets...\n");
472483

473484
// tox0 sends a lossless and lossy custom packet to tox1
@@ -496,8 +507,7 @@ static void group_message_test(AutoTox *autotoxes)
496507

497508
ck_assert_msg(cperr == TOX_ERR_GROUP_SEND_CUSTOM_PRIVATE_PACKET_OK, "%d", cperr);
498509

499-
while (!state0->private_message_received || state0->custom_packets_received < 2
500-
|| state0->custom_private_packets_received < 2) {
510+
while (state0->custom_packets_received < 2 || state0->custom_private_packets_received < 2) {
501511
iterate_all_wait(autotoxes, NUM_GROUP_TOXES, ITERATION_INTERVAL);
502512
}
503513

other/event_tooling/generate_event_c.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -757,6 +757,7 @@ int main(int argc, char** argv) {
757757
EventTypeTrivial{"uint32_t", "peer_id"},
758758
EventTypeTrivial{"Tox_Message_Type", "type"},
759759
EventTypeByteRange{"message", "message_length", "length"}, // the latter two are ideally the same
760+
EventTypeTrivial{"uint32_t", "message_id"},
760761
}
761762
},
762763
{

toxcore/events/group_private_message.c

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ struct Tox_Event_Group_Private_Message {
3030
Tox_Message_Type type;
3131
uint8_t *message;
3232
uint32_t message_length;
33+
uint32_t message_id;
3334
};
3435

3536
non_null()
@@ -110,6 +111,19 @@ const uint8_t *tox_event_group_private_message_get_message(const Tox_Event_Group
110111
return group_private_message->message;
111112
}
112113

114+
non_null()
115+
static void tox_event_group_private_message_set_message_id(Tox_Event_Group_Private_Message *group_private_message,
116+
uint32_t message_id)
117+
{
118+
assert(group_private_message != nullptr);
119+
group_private_message->message_id = message_id;
120+
}
121+
uint32_t tox_event_group_private_message_get_message_id(const Tox_Event_Group_Private_Message *group_private_message)
122+
{
123+
assert(group_private_message != nullptr);
124+
return group_private_message->message_id;
125+
}
126+
113127
non_null()
114128
static void tox_event_group_private_message_construct(Tox_Event_Group_Private_Message *group_private_message)
115129
{
@@ -126,26 +140,28 @@ static void tox_event_group_private_message_destruct(Tox_Event_Group_Private_Mes
126140
bool tox_event_group_private_message_pack(
127141
const Tox_Event_Group_Private_Message *event, Bin_Pack *bp)
128142
{
129-
return bin_pack_array(bp, 4)
143+
return bin_pack_array(bp, 5)
130144
&& bin_pack_u32(bp, event->group_number)
131145
&& bin_pack_u32(bp, event->peer_id)
132146
&& tox_message_type_pack(event->type, bp)
133-
&& bin_pack_bin(bp, event->message, event->message_length);
147+
&& bin_pack_bin(bp, event->message, event->message_length)
148+
&& bin_pack_u32(bp, event->message_id);
134149
}
135150

136151
non_null()
137152
static bool tox_event_group_private_message_unpack_into(
138153
Tox_Event_Group_Private_Message *event, Bin_Unpack *bu)
139154
{
140155
assert(event != nullptr);
141-
if (!bin_unpack_array_fixed(bu, 4, nullptr)) {
156+
if (!bin_unpack_array_fixed(bu, 5, nullptr)) {
142157
return false;
143158
}
144159

145160
return bin_unpack_u32(bu, &event->group_number)
146161
&& bin_unpack_u32(bu, &event->peer_id)
147162
&& tox_message_type_unpack(&event->type, bu)
148-
&& bin_unpack_bin(bu, &event->message, &event->message_length);
163+
&& bin_unpack_bin(bu, &event->message, &event->message_length)
164+
&& bin_unpack_u32(bu, &event->message_id);
149165
}
150166

151167
/*****************************************************
@@ -238,7 +254,7 @@ static Tox_Event_Group_Private_Message *tox_event_group_private_message_alloc(vo
238254
*****************************************************/
239255

240256
void tox_events_handle_group_private_message(
241-
Tox *tox, uint32_t group_number, uint32_t peer_id, Tox_Message_Type type, const uint8_t *message, size_t length,
257+
Tox *tox, uint32_t group_number, uint32_t peer_id, Tox_Message_Type type, const uint8_t *message, size_t length, uint32_t message_id,
242258
void *user_data)
243259
{
244260
Tox_Event_Group_Private_Message *group_private_message = tox_event_group_private_message_alloc(user_data);
@@ -251,4 +267,5 @@ void tox_events_handle_group_private_message(
251267
tox_event_group_private_message_set_peer_id(group_private_message, peer_id);
252268
tox_event_group_private_message_set_type(group_private_message, type);
253269
tox_event_group_private_message_set_message(group_private_message, message, length);
270+
tox_event_group_private_message_set_message_id(group_private_message, message_id);
254271
}

toxcore/group_chats.c

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4911,11 +4911,12 @@ int gc_send_message(const GC_Chat *chat, const uint8_t *message, uint16_t length
49114911
return -5;
49124912
}
49134913

4914+
free(message_raw);
4915+
49144916
if (message_id != nullptr) {
49154917
*message_id = pseudo_msg_id;
49164918
}
49174919

4918-
free(message_raw);
49194920
return 0;
49204921
}
49214922

@@ -4955,7 +4956,7 @@ static int handle_gc_message(const GC_Session *c, const GC_Chat *chat, const GC_
49554956
}
49564957

49574958
int gc_send_private_message(const GC_Chat *chat, GC_Peer_Id peer_id, uint8_t type, const uint8_t *message,
4958-
uint16_t length)
4959+
uint16_t length, uint32_t *message_id)
49594960
{
49604961
if (length > MAX_GC_MESSAGE_SIZE) {
49614962
return -1;
@@ -4981,23 +4982,28 @@ int gc_send_private_message(const GC_Chat *chat, GC_Peer_Id peer_id, uint8_t typ
49814982
return -5;
49824983
}
49834984

4984-
uint8_t *message_with_type = (uint8_t *)malloc(length + 1);
4985+
const uint16_t raw_length = 1 + length + GC_MESSAGE_PSEUDO_ID_SIZE;
4986+
uint8_t *message_with_type = (uint8_t *)malloc(raw_length);
49854987

49864988
if (message_with_type == nullptr) {
49874989
return -6;
49884990
}
49894991

49904992
message_with_type[0] = type;
4991-
memcpy(message_with_type + 1, message, length);
49924993

4993-
uint8_t *packet = (uint8_t *)malloc(length + 1 + GC_BROADCAST_ENC_HEADER_SIZE);
4994+
const uint32_t pseudo_msg_id = random_u32(chat->rng);
4995+
net_pack_u32(message_with_type + 1, pseudo_msg_id);
4996+
4997+
memcpy(message_with_type + 1 + GC_MESSAGE_PSEUDO_ID_SIZE, message, length);
4998+
4999+
uint8_t *packet = (uint8_t *)malloc(raw_length + GC_BROADCAST_ENC_HEADER_SIZE);
49945000

49955001
if (packet == nullptr) {
49965002
free(message_with_type);
49975003
return -6;
49985004
}
49995005

5000-
const uint16_t packet_len = make_gc_broadcast_header(message_with_type, length + 1, packet, GM_PRIVATE_MESSAGE);
5006+
const uint16_t packet_len = make_gc_broadcast_header(message_with_type, raw_length, packet, GM_PRIVATE_MESSAGE);
50015007

50025008
free(message_with_type);
50035009

@@ -5008,6 +5014,10 @@ int gc_send_private_message(const GC_Chat *chat, GC_Peer_Id peer_id, uint8_t typ
50085014

50095015
free(packet);
50105016

5017+
if (message_id != nullptr) {
5018+
*message_id = pseudo_msg_id;
5019+
}
5020+
50115021
return 0;
50125022
}
50135023

@@ -5020,7 +5030,7 @@ non_null(1, 2, 3, 4) nullable(6)
50205030
static int handle_gc_private_message(const GC_Session *c, const GC_Chat *chat, const GC_Peer *peer, const uint8_t *data,
50215031
uint16_t length, void *userdata)
50225032
{
5023-
if (data == nullptr || length > MAX_GC_MESSAGE_SIZE || length <= 1) {
5033+
if (data == nullptr || length > MAX_GC_MESSAGE_SIZE || length <= 1 + GC_MESSAGE_PSEUDO_ID_SIZE) {
50245034
return -1;
50255035
}
50265036

@@ -5035,8 +5045,13 @@ static int handle_gc_private_message(const GC_Session *c, const GC_Chat *chat, c
50355045
return 0;
50365046
}
50375047

5048+
uint32_t message_id;
5049+
net_unpack_u32(data + 1, &message_id);
5050+
50385051
if (c->private_message != nullptr) {
5039-
c->private_message(c->messenger, chat->group_number, peer->peer_id, message_type, data + 1, length - 1, userdata);
5052+
c->private_message(c->messenger, chat->group_number, peer->peer_id, message_type,
5053+
data + 1 + GC_MESSAGE_PSEUDO_ID_SIZE, length - 1 - GC_MESSAGE_PSEUDO_ID_SIZE,
5054+
message_id, userdata);
50405055
}
50415056

50425057
return 0;

toxcore/group_chats.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,9 +181,9 @@ int gc_send_message(const GC_Chat *chat, const uint8_t *message, uint16_t length
181181
* Returns -5 if the sender has the observer role.
182182
* Returns -6 if the packet fails to send.
183183
*/
184-
non_null()
184+
non_null(1, 4) nullable(6)
185185
int gc_send_private_message(const GC_Chat *chat, GC_Peer_Id peer_id, uint8_t type, const uint8_t *message,
186-
uint16_t length);
186+
uint16_t length, uint32_t *message_id);
187187

188188
/** @brief Sends a custom packet to the group. If lossless is true, the packet will be lossless.
189189
*

toxcore/group_common.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,7 @@ typedef struct Messenger Messenger;
348348
typedef void gc_message_cb(const Messenger *m, uint32_t group_number, GC_Peer_Id peer_id, unsigned int type,
349349
const uint8_t *message, size_t length, uint32_t message_id, void *user_data);
350350
typedef void gc_private_message_cb(const Messenger *m, uint32_t group_number, GC_Peer_Id peer_id, unsigned int type,
351-
const uint8_t *message, size_t length, void *user_data);
351+
const uint8_t *message, size_t length, uint32_t message_id, void *user_data);
352352
typedef void gc_custom_packet_cb(const Messenger *m, uint32_t group_number, GC_Peer_Id peer_id, const uint8_t *data,
353353
size_t length, void *user_data);
354354
typedef void gc_custom_private_packet_cb(const Messenger *m, uint32_t group_number, GC_Peer_Id peer_id,

toxcore/tox.c

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -536,16 +536,16 @@ static void tox_group_message_handler(const Messenger *m, uint32_t group_number,
536536
}
537537
}
538538

539-
non_null(1, 5) nullable(7)
539+
non_null(1, 5) nullable(8)
540540
static void tox_group_private_message_handler(const Messenger *m, uint32_t group_number, GC_Peer_Id peer_id,
541-
unsigned int type, const uint8_t *message, size_t length, void *user_data)
541+
unsigned int type, const uint8_t *message, size_t length, uint32_t message_id, void *user_data)
542542
{
543543
struct Tox_Userdata *tox_data = (struct Tox_Userdata *)user_data;
544544

545545
if (tox_data->tox->group_private_message_callback != nullptr) {
546546
tox_unlock(tox_data->tox);
547547
tox_data->tox->group_private_message_callback(tox_data->tox, group_number, gc_peer_id_to_int(peer_id), (Tox_Message_Type)type, message,
548-
length, tox_data->user_data);
548+
length, message_id, tox_data->user_data);
549549
tox_lock(tox_data->tox);
550550
}
551551
}
@@ -3994,8 +3994,8 @@ Tox_Group_Message_Id tox_group_send_message(
39943994
return -1;
39953995
}
39963996

3997-
bool tox_group_send_private_message(const Tox *tox, uint32_t group_number, uint32_t peer_id, Tox_Message_Type type,
3998-
const uint8_t *message, size_t length, Tox_Err_Group_Send_Private_Message *error)
3997+
Tox_Group_Message_Id tox_group_send_private_message(const Tox *tox, uint32_t group_number, uint32_t peer_id,
3998+
Tox_Message_Type type, const uint8_t *message, size_t length, Tox_Err_Group_Send_Private_Message *error)
39993999
{
40004000
assert(tox != nullptr);
40014001

@@ -4005,59 +4005,60 @@ bool tox_group_send_private_message(const Tox *tox, uint32_t group_number, uint3
40054005
if (chat == nullptr) {
40064006
SET_ERROR_PARAMETER(error, TOX_ERR_GROUP_SEND_PRIVATE_MESSAGE_GROUP_NOT_FOUND);
40074007
tox_unlock(tox);
4008-
return false;
4008+
return -1;
40094009
}
40104010

40114011
if (chat->connection_state == CS_DISCONNECTED) {
40124012
SET_ERROR_PARAMETER(error, TOX_ERR_GROUP_SEND_PRIVATE_MESSAGE_DISCONNECTED);
40134013
tox_unlock(tox);
4014-
return false;
4014+
return -1;
40154015
}
40164016

4017-
const int ret = gc_send_private_message(chat, gc_peer_id_from_int(peer_id), type, message, length);
4017+
uint32_t message_id = 0;
4018+
const int ret = gc_send_private_message(chat, gc_peer_id_from_int(peer_id), type, message, length, &message_id);
40184019
tox_unlock(tox);
40194020

40204021
switch (ret) {
40214022
case 0: {
40224023
SET_ERROR_PARAMETER(error, TOX_ERR_GROUP_SEND_PRIVATE_MESSAGE_OK);
4023-
return true;
4024+
return message_id;
40244025
}
40254026

40264027
case -1: {
40274028
SET_ERROR_PARAMETER(error, TOX_ERR_GROUP_SEND_PRIVATE_MESSAGE_TOO_LONG);
4028-
return false;
4029+
return -1;
40294030
}
40304031

40314032
case -2: {
40324033
SET_ERROR_PARAMETER(error, TOX_ERR_GROUP_SEND_PRIVATE_MESSAGE_EMPTY);
4033-
return false;
4034+
return -1;
40344035
}
40354036

40364037
case -3: {
40374038
SET_ERROR_PARAMETER(error, TOX_ERR_GROUP_SEND_PRIVATE_MESSAGE_PEER_NOT_FOUND);
4038-
return false;
4039+
return -1;
40394040
}
40404041

40414042
case -4: {
40424043
SET_ERROR_PARAMETER(error, TOX_ERR_GROUP_SEND_PRIVATE_MESSAGE_BAD_TYPE);
4043-
return false;
4044+
return -1;
40444045
}
40454046

40464047
case -5: {
40474048
SET_ERROR_PARAMETER(error, TOX_ERR_GROUP_SEND_PRIVATE_MESSAGE_PERMISSIONS);
4048-
return false;
4049+
return -1;
40494050
}
40504051

40514052
case -6: {
40524053
SET_ERROR_PARAMETER(error, TOX_ERR_GROUP_SEND_PRIVATE_MESSAGE_FAIL_SEND);
4053-
return false;
4054+
return -1;
40544055
}
40554056
}
40564057

40574058
/* can't happen */
40584059
LOGGER_FATAL(tox->m->log, "impossible return value: %d", ret);
40594060

4060-
return false;
4061+
return -1;
40614062
}
40624063

40634064
bool tox_group_send_custom_packet(const Tox *tox, uint32_t group_number, bool lossless, const uint8_t *data,

toxcore/tox.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4575,7 +4575,7 @@ const char *tox_err_group_send_private_message_to_string(Tox_Err_Group_Send_Priv
45754575
*
45764576
* @return true on success.
45774577
*/
4578-
bool tox_group_send_private_message(
4578+
Tox_Group_Message_Id tox_group_send_private_message(
45794579
const Tox *tox, Tox_Group_Number group_number, Tox_Group_Peer_Number peer_id, Tox_Message_Type type,
45804580
const uint8_t message[], size_t length,
45814581
Tox_Err_Group_Send_Private_Message *error);
@@ -4753,7 +4753,7 @@ void tox_callback_group_message(Tox *tox, tox_group_message_cb *callback);
47534753
*/
47544754
typedef void tox_group_private_message_cb(
47554755
Tox *tox, Tox_Group_Number group_number, Tox_Group_Peer_Number peer_id, Tox_Message_Type type,
4756-
const uint8_t message[], size_t length, void *user_data);
4756+
const uint8_t message[], size_t length, uint32_t message_id, void *user_data);
47574757

47584758
/**
47594759
* Set the callback for the `group_private_message` event. Pass NULL to unset.

0 commit comments

Comments
 (0)