Line data Source code
1 : /* SPDX-License-Identifier: GPL-3.0-or-later */
2 : /* Copyright 2026 Peter Csaszar */
3 :
4 : /**
5 : * @file domain/write/delete.c
6 : * @brief messages.deleteMessages + channels.deleteMessages (US-P5-06).
7 : */
8 :
9 : #include "domain/write/delete.h"
10 :
11 : #include "tl_serial.h"
12 : #include "tl_registry.h"
13 : #include "mtproto_rpc.h"
14 : #include "logger.h"
15 :
16 : #include <string.h>
17 :
18 : #define CRC_messages_deleteMessages 0xe58e95d2u
19 : #define CRC_channels_deleteMessages 0x84c1fd4eu
20 : #define CRC_inputChannel 0xf35aec28u
21 :
22 5 : int domain_delete_messages(const ApiConfig *cfg,
23 : MtProtoSession *s, Transport *t,
24 : const HistoryPeer *peer,
25 : const int32_t *ids, int n_ids,
26 : int revoke,
27 : RpcError *err) {
28 5 : if (!cfg || !s || !t || !peer || !ids || n_ids <= 0 || n_ids > 100)
29 0 : return -1;
30 :
31 5 : TlWriter w; tl_writer_init(&w);
32 5 : int is_channel = (peer->kind == HISTORY_PEER_CHANNEL);
33 :
34 5 : if (is_channel) {
35 1 : tl_write_uint32(&w, CRC_channels_deleteMessages);
36 1 : tl_write_uint32(&w, CRC_inputChannel);
37 1 : tl_write_int64 (&w, peer->peer_id);
38 1 : tl_write_int64 (&w, peer->access_hash);
39 : } else {
40 4 : tl_write_uint32(&w, CRC_messages_deleteMessages);
41 4 : tl_write_uint32(&w, revoke ? 1u : 0u); /* flags */
42 : }
43 5 : tl_write_uint32(&w, TL_vector);
44 5 : tl_write_uint32(&w, (uint32_t)n_ids);
45 12 : for (int i = 0; i < n_ids; i++) tl_write_int32(&w, ids[i]);
46 :
47 : uint8_t query[1024];
48 5 : if (w.len > sizeof(query)) { tl_writer_free(&w); return -1; }
49 5 : memcpy(query, w.data, w.len);
50 5 : size_t qlen = w.len;
51 5 : tl_writer_free(&w);
52 :
53 5 : uint8_t resp[1024]; size_t resp_len = 0;
54 5 : if (api_call(cfg, s, t, query, qlen, resp, sizeof(resp), &resp_len) != 0) {
55 0 : logger_log(LOG_ERROR, "delete: api_call failed");
56 0 : return -1;
57 : }
58 5 : if (resp_len < 4) return -1;
59 :
60 : uint32_t top;
61 5 : memcpy(&top, resp, 4);
62 5 : if (top == TL_rpc_error) {
63 1 : if (err) rpc_parse_error(resp, resp_len, err);
64 1 : return -1;
65 : }
66 4 : if (top == TL_messages_affectedMessages) return 0;
67 0 : logger_log(LOG_WARN, "delete: unexpected top 0x%08x", top);
68 0 : return 0;
69 : }
|