Commit 862ae34b authored by Vysheng's avatar Vysheng

Added partial support for action resend. Fix crush on incorrect encrypted message in lua mode

parent 31bd1749
......@@ -24,6 +24,7 @@ decryptedMessageActionScreenshotMessages#8ac1f475 random_ids:Vector<long> = 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;
......
......@@ -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;
......
......@@ -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)) {
......
......@@ -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;
......
......@@ -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;
};
};
};
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment