diff --git a/encrypted_scheme17.tl b/encrypted_scheme17.tl index cc4a76d..95e661b 100644 --- a/encrypted_scheme17.tl +++ b/encrypted_scheme17.tl @@ -24,6 +24,7 @@ decryptedMessageActionScreenshotMessages#8ac1f475 random_ids:Vector = Decr decryptedMessageActionFlushHistory#6719e45c = DecryptedMessageAction; decryptedMessageActionNotifyLayer#f3048883 layer:int = DecryptedMessageAction; +decryptedMessageActionResend#511110b0 start_seq_no:int end_seq_no:int = DecryptedMessageAction; decryptedMessageActionTyping#ccb27641 action:SendMessageAction = DecryptedMessageAction; diff --git a/interface.c b/interface.c index ec2fe64..b5efc47 100644 --- a/interface.c +++ b/interface.c @@ -2612,6 +2612,9 @@ void print_service_message (struct in_ev *ev, struct tgl_message *M) { case tgl_message_action_flush_history: mprintf (ev, " cleared history\n"); break; + case tgl_message_action_resend: + mprintf (ev, " resend query\n"); + break; case tgl_message_action_notify_layer: mprintf (ev, " updated layer to %d\n", M->action.layer); break; diff --git a/lua-tg.c b/lua-tg.c index c1b2628..f27ccb0 100644 --- a/lua-tg.c +++ b/lua-tg.c @@ -287,7 +287,7 @@ void push_media (struct tgl_message_media *M) { } } -void push_message (struct tgl_message *M) { +void push_message (struct tgl_message *M) { assert (M); my_lua_checkstack (luaState, 10); lua_newtable (luaState); @@ -295,6 +295,7 @@ void push_message (struct tgl_message *M) { static char s[30]; snprintf (s, 30, "%lld", M->id); lua_add_string_field ("id", s); + if (!(M->flags & FLAG_CREATED)) { return; } lua_add_num_field ("flags", M->flags); if (tgl_get_peer_type (M->fwd_from_id)) { diff --git a/structures.c b/structures.c index c459915..ce3473a 100644 --- a/structures.c +++ b/structures.c @@ -1010,6 +1010,11 @@ void tglf_fetch_message_action_encrypted (struct tgl_state *TLS, struct tgl_mess M->type = tgl_message_action_typing; M->typing = tglf_fetch_typing (); break; + case CODE_decrypted_message_action_resend: + M->type = tgl_message_action_resend; + M->start_seq_no = fetch_int (); + M->end_seq_no = fetch_int (); + break; default: vlogprintf (E_ERROR, "x = 0x%08x\n", x); assert (0); @@ -1250,35 +1255,37 @@ void tglf_fetch_encrypted_message (struct tgl_state *TLS, struct tgl_message *M) vlogprintf (E_DEBUG - 2, "layer = %d, in = %d, out = %d\n", layer, in_seq_no, out_seq_no); } if (!(x == CODE_decrypted_message || x == CODE_decrypted_message_service || x == CODE_decrypted_message_l16 || x == CODE_decrypted_message_service_l16)) { - vlogprintf (E_ERROR, "x = 0x%08x\n", x); - assert (x == CODE_decrypted_message || x == CODE_decrypted_message_service || x == CODE_decrypted_message_l16 || x == CODE_decrypted_message_service_l16); + vlogprintf (E_ERROR, "Incorrect message: x = 0x%08x\n", x); + drop = 1; } //assert (id == fetch_long ()); - long long new_id = fetch_long (); - if (P && P->encr_chat.layer >= 17) { - assert (new_id == id); - } - if (x == CODE_decrypted_message || x == CODE_decrypted_message_service) { - if (x == CODE_decrypted_message) { - fetch_int (); // ttl + if (!drop) { + long long new_id = fetch_long (); + if (P && P->encr_chat.layer >= 17) { + assert (new_id == id); } - } else { - ll = prefetch_strlen (); - fetch_str (ll); // random_bytes - } - if (x == CODE_decrypted_message || x == CODE_decrypted_message_l16) { - l = prefetch_strlen (); - s = fetch_str (l); - start = in_ptr; - assert (skip_type_any (TYPE_TO_PARAM (decrypted_message_media)) >= 0); - end = in_ptr; - } else { - start = in_ptr; - if (skip_type_any (TYPE_TO_PARAM (decrypted_message_action)) < 0) { - vlogprintf (E_ERROR, "Can not decrypt: Skipped %ld int out of %ld. Magic = 0x%08x\n", (long)(in_ptr - start), (long)(in_end - start), *start); - drop = 1; + if (x == CODE_decrypted_message || x == CODE_decrypted_message_service) { + if (x == CODE_decrypted_message) { + fetch_int (); // ttl + } + } else { + ll = prefetch_strlen (); + fetch_str (ll); // random_bytes + } + if (x == CODE_decrypted_message || x == CODE_decrypted_message_l16) { + l = prefetch_strlen (); + s = fetch_str (l); + start = in_ptr; + assert (skip_type_any (TYPE_TO_PARAM (decrypted_message_media)) >= 0); + end = in_ptr; + } else { + start = in_ptr; + if (skip_type_any (TYPE_TO_PARAM (decrypted_message_action)) < 0) { + vlogprintf (E_ERROR, "Can not decrypt: Skipped %ld int out of %ld. Magic = 0x%08x\n", (long)(in_ptr - start), (long)(in_end - start), *start); + drop = 1; + } + end = in_ptr; } - end = in_ptr; } in_ptr = save_in_ptr; in_end = save_in_end; @@ -1661,6 +1668,7 @@ void tgls_free_message_action (struct tgl_state *TLS, struct tgl_message_action case tgl_message_action_delete_messages: case tgl_message_action_screenshot_messages: case tgl_message_action_flush_history: + case tgl_message_action_resend: case tgl_message_action_notify_layer: break; diff --git a/tgl-layout.h b/tgl-layout.h index a11c15f..8f1c4db 100644 --- a/tgl-layout.h +++ b/tgl-layout.h @@ -119,6 +119,7 @@ enum tgl_message_action_type { tgl_message_action_delete_messages, tgl_message_action_screenshot_messages, tgl_message_action_flush_history, + tgl_message_action_resend, tgl_message_action_notify_layer, tgl_message_action_typing }; @@ -386,6 +387,10 @@ struct tgl_message_action { int delete_cnt; int screenshot_cnt; enum tgl_typing_status typing; + struct { + int start_seq_no; + int end_seq_no; + }; }; };