From 342b4e45ca622c327519ace63490510e06c0d5b7 Mon Sep 17 00:00:00 2001 From: levlam Date: Fri, 5 Feb 2021 02:17:12 +0300 Subject: [PATCH] Support deletion of all revoked invite links created by other administrator. --- td/generate/scheme/td_api.tl | 6 ++++-- td/generate/scheme/td_api.tlo | Bin 196076 -> 196124 bytes td/telegram/ContactsManager.cpp | 21 +++++++++++++++------ td/telegram/ContactsManager.h | 3 ++- td/telegram/Td.cpp | 3 ++- td/telegram/cli.cpp | 6 ++++-- 6 files changed, 27 insertions(+), 12 deletions(-) diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index 522eaaf5f..6cbb99155 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -4465,8 +4465,10 @@ revokeChatInviteLink chat_id:int53 invite_link:string = ChatInviteLink; //@description Deletes revoked chat invite links. Requires administrator privileges and can_invite_users right in the chat for own links and owner privileges for other links @chat_id Chat identifier @invite_link Invite link to revoke deleteRevokedChatInviteLink chat_id:int53 invite_link:string = Ok; -//@description Deletes all revoked chat invite links. Requires administrator privileges and can_invite_users right in the chat for own links and owner privileges for other links @chat_id Chat identifier -deleteAllRevokedChatInviteLinks chat_id:int53 = Ok; +//@description Deletes all revoked chat invite links created by a given chat administrator. Requires administrator privileges and can_invite_users right in the chat for own links and owner privileges for other links +//@chat_id Chat identifier +//@administrator_user_id User identifier of a chat administrator, which links will be deleted. Must be an identifier of the current user for non-owner +deleteAllRevokedChatInviteLinks chat_id:int53 administrator_user_id:int32 = Ok; //@description Checks the validity of an invite link for a chat and returns information about the corresponding chat @invite_link Invite link to be checked; must have URL "t.me", "telegram.me", or "telegram.dog" and query beginning with "/joinchat/" or "/+" checkChatInviteLink invite_link:string = ChatInviteLinkInfo; diff --git a/td/generate/scheme/td_api.tlo b/td/generate/scheme/td_api.tlo index 5f4ea7f796701079b0fa4d3f4937ff3a61f3cddb..bd45e47f1f1ce93ccb32ce57e48e8f5323f45c6f 100644 GIT binary patch delta 43 zcmV+`0M!5N`wN`>3xI?Hv;w?M1YvO?`j@~>0w|a0)B-4zh+3xI?Hv;w?M1ZN?R$(O)Q0w|ZbqXIm)R89iOuM*u44FCWD diff --git a/td/telegram/ContactsManager.cpp b/td/telegram/ContactsManager.cpp index 0f46266ca..ba8b0bb93 100644 --- a/td/telegram/ContactsManager.cpp +++ b/td/telegram/ContactsManager.cpp @@ -1895,15 +1895,18 @@ class DeleteRevokedExportedChatInvitesQuery : public Td::ResultHandler { explicit DeleteRevokedExportedChatInvitesQuery(Promise &&promise) : promise_(std::move(promise)) { } - void send(DialogId dialog_id) { + void send(DialogId dialog_id, UserId administrator_user_id) { dialog_id_ = dialog_id; auto input_peer = td->messages_manager_->get_input_peer(dialog_id, AccessRights::Write); if (input_peer == nullptr) { return on_error(0, Status::Error(400, "Can't access the chat")); } - send_query(G()->net_query_creator().create(telegram_api::messages_deleteRevokedExportedChatInvites( - std::move(input_peer), make_tl_object()))); + auto input_user = td->contacts_manager_->get_input_user(administrator_user_id); + CHECK(input_user != nullptr); + + send_query(G()->net_query_creator().create( + telegram_api::messages_deleteRevokedExportedChatInvites(std::move(input_peer), std::move(input_user)))); } void on_result(uint64 id, BufferSlice packet) override { @@ -6993,10 +6996,16 @@ void ContactsManager::delete_revoked_dialog_invite_link(DialogId dialog_id, cons td_->create_handler(std::move(promise))->send(dialog_id, invite_link); } -void ContactsManager::delete_all_revoked_dialog_invite_links(DialogId dialog_id, Promise &&promise) { - TRY_STATUS_PROMISE(promise, can_manage_dialog_invite_links(dialog_id)); +void ContactsManager::delete_all_revoked_dialog_invite_links(DialogId dialog_id, UserId administrator_user_id, + Promise &&promise) { + TRY_STATUS_PROMISE(promise, can_manage_dialog_invite_links(dialog_id, administrator_user_id != get_my_id())); - td_->create_handler(std::move(promise))->send(dialog_id); + if (!have_input_user(administrator_user_id)) { + return promise.set_error(Status::Error(400, "Administrator user not found")); + } + + td_->create_handler(std::move(promise)) + ->send(dialog_id, administrator_user_id); } void ContactsManager::check_dialog_invite_link(const string &invite_link, Promise &&promise) const { diff --git a/td/telegram/ContactsManager.h b/td/telegram/ContactsManager.h index 4ce253294..24837bf68 100644 --- a/td/telegram/ContactsManager.h +++ b/td/telegram/ContactsManager.h @@ -402,7 +402,8 @@ class ContactsManager : public Actor { void delete_revoked_dialog_invite_link(DialogId dialog_id, const string &invite_link, Promise &&promise); - void delete_all_revoked_dialog_invite_links(DialogId dialog_id, Promise &&promise); + void delete_all_revoked_dialog_invite_links(DialogId dialog_id, UserId administrator_user_id, + Promise &&promise); void check_dialog_invite_link(const string &invite_link, Promise &&promise) const; diff --git a/td/telegram/Td.cpp b/td/telegram/Td.cpp index dd605b014..47bda0907 100644 --- a/td/telegram/Td.cpp +++ b/td/telegram/Td.cpp @@ -6377,7 +6377,8 @@ void Td::on_request(uint64 id, td_api::deleteRevokedChatInviteLink &request) { void Td::on_request(uint64 id, const td_api::deleteAllRevokedChatInviteLinks &request) { CREATE_OK_REQUEST_PROMISE(); - contacts_manager_->delete_all_revoked_dialog_invite_links(DialogId(request.chat_id_), std::move(promise)); + contacts_manager_->delete_all_revoked_dialog_invite_links(DialogId(request.chat_id_), + UserId(request.administrator_user_id_), std::move(promise)); } void Td::on_request(uint64 id, td_api::checkChatInviteLink &request) { diff --git a/td/telegram/cli.cpp b/td/telegram/cli.cpp index 4cf673229..1d5bdcbab 100644 --- a/td/telegram/cli.cpp +++ b/td/telegram/cli.cpp @@ -2744,8 +2744,10 @@ class CliClient final : public Actor { get_args(args, chat_id, invite_link); send_request(td_api::make_object(as_chat_id(chat_id), invite_link)); } else if (op == "darcil") { - string chat_id = args; - send_request(td_api::make_object(as_chat_id(chat_id))); + string chat_id; + string administrator_user_id; + get_args(args, chat_id, administrator_user_id); + send_request(td_api::make_object(as_chat_id(chat_id), as_user_id(administrator_user_id))); } else if (op == "ccil") { send_request(td_api::make_object(args)); } else if (op == "jcbil") {