diff --git a/td/telegram/ContactsManager.cpp b/td/telegram/ContactsManager.cpp index cd9e839b5..4eb4993c5 100644 --- a/td/telegram/ContactsManager.cpp +++ b/td/telegram/ContactsManager.cpp @@ -1655,7 +1655,7 @@ class CheckDialogInviteLinkQuery : public Td::ResultHandler { void send(const string &invite_link) { invite_link_ = invite_link; send_query(G()->net_query_creator().create( - telegram_api::messages_checkChatInvite(ContactsManager::get_dialog_invite_link_hash(invite_link_).str()))); + telegram_api::messages_checkChatInvite(DialogInviteLink::get_dialog_invite_link_hash(invite_link_).str()))); } void on_result(uint64 id, BufferSlice packet) override { @@ -1687,7 +1687,7 @@ class ImportDialogInviteLinkQuery : public Td::ResultHandler { void send(const string &invite_link) { invite_link_ = invite_link; send_query(G()->net_query_creator().create( - telegram_api::messages_importChatInvite(ContactsManager::get_dialog_invite_link_hash(invite_link).str()))); + telegram_api::messages_importChatInvite(DialogInviteLink::get_dialog_invite_link_hash(invite_link).str()))); } void on_result(uint64 id, BufferSlice packet) override { @@ -2906,9 +2906,6 @@ class ContactsManager::UploadProfilePhotoCallback : public FileManager::UploadCa } }; -const CSlice ContactsManager::INVITE_LINK_URLS[3] = {"t.me/joinchat/", "telegram.me/joinchat/", - "telegram.dog/joinchat/"}; - ContactsManager::ContactsManager(Td *td, ActorShared<> parent) : td_(td), parent_(std::move(parent)) { upload_profile_photo_callback_ = std::make_shared(); @@ -6606,7 +6603,7 @@ void ContactsManager::edit_dialog_invite_link(DialogId dialog_id, const string & TRY_STATUS_PROMISE(promise, can_manage_dialog_invite_links(dialog_id)); - // if (!is_valid_invite_link(invite_link)) { + // if (!DialogInviteLink::is_valid_invite_link(invite_link)) { // return promise.set_error(Status::Error(400, "Wrong invite link")); // } @@ -6619,7 +6616,7 @@ void ContactsManager::check_dialog_invite_link(const string &invite_link, Promis return promise.set_value(Unit()); } - if (!is_valid_invite_link(invite_link)) { + if (!DialogInviteLink::is_valid_invite_link(invite_link)) { return promise.set_error(Status::Error(400, "Wrong invite link")); } @@ -6627,7 +6624,7 @@ void ContactsManager::check_dialog_invite_link(const string &invite_link, Promis } void ContactsManager::import_dialog_invite_link(const string &invite_link, Promise &&promise) { - if (!is_valid_invite_link(invite_link)) { + if (!DialogInviteLink::is_valid_invite_link(invite_link)) { return promise.set_error(Status::Error(400, "Wrong invite link")); } @@ -11485,32 +11482,6 @@ void ContactsManager::remove_dialog_access_by_invite_link(DialogId dialog_id) { invite_link_info_expire_timeout_.cancel_timeout(dialog_id.get()); } -bool ContactsManager::is_valid_invite_link(const string &invite_link) { - return !get_dialog_invite_link_hash(invite_link).empty(); -} - -Slice ContactsManager::get_dialog_invite_link_hash(const string &invite_link) { - auto lower_cased_invite_link_str = to_lower(invite_link); - Slice lower_cased_invite_link = lower_cased_invite_link_str; - size_t offset = 0; - if (begins_with(lower_cased_invite_link, "https://")) { - offset = 8; - } else if (begins_with(lower_cased_invite_link, "http://")) { - offset = 7; - } - lower_cased_invite_link.remove_prefix(offset); - - for (auto &url : INVITE_LINK_URLS) { - if (begins_with(lower_cased_invite_link, url)) { - Slice hash = Slice(invite_link).substr(url.size() + offset); - hash.truncate(hash.find('#')); - hash.truncate(hash.find('?')); - return hash; - } - } - return Slice(); -} - bool ContactsManager::update_invite_link(string &invite_link, tl_object_ptr &&exported_chat_invite) { string new_invite_link; @@ -11522,7 +11493,7 @@ bool ContactsManager::update_invite_link(string &invite_link, if (!invite_link.empty()) { invite_link_infos_.erase(invite_link); } - LOG_IF(ERROR, !new_invite_link.empty() && !is_valid_invite_link(new_invite_link)) + LOG_IF(ERROR, !new_invite_link.empty() && !DialogInviteLink::is_valid_invite_link(new_invite_link)) << "Unsupported invite link " << new_invite_link; invite_link = std::move(new_invite_link); diff --git a/td/telegram/ContactsManager.h b/td/telegram/ContactsManager.h index 3f7d57b85..e350966c4 100644 --- a/td/telegram/ContactsManager.h +++ b/td/telegram/ContactsManager.h @@ -221,8 +221,6 @@ class ContactsManager : public Actor { bool on_get_channel_error(ChannelId channel_id, const Status &status, const string &source); - static Slice get_dialog_invite_link_hash(const string &invite_link); - void on_get_dialog_invite_link_info(const string &invite_link, tl_object_ptr &&chat_invite_ptr, Promise &&promise); @@ -1044,8 +1042,6 @@ class ContactsManager : public Actor { static constexpr int32 ACCOUNT_UPDATE_LAST_NAME = 1 << 1; static constexpr int32 ACCOUNT_UPDATE_ABOUT = 1 << 2; - static const CSlice INVITE_LINK_URLS[3]; - static bool have_input_peer_user(const User *u, AccessRights access_rights); static bool have_input_peer_chat(const Chat *c, AccessRights access_rights); bool have_input_peer_channel(const Channel *c, ChannelId channel_id, AccessRights access_rights, @@ -1352,8 +1348,6 @@ class ContactsManager : public Actor { Status can_manage_dialog_invite_links(DialogId dialog_id); - static bool is_valid_invite_link(const string &invite_link); - bool update_invite_link(string &invite_link, tl_object_ptr &&exported_chat_invite); const DialogParticipant *get_chat_participant(ChatId chat_id, UserId user_id) const; diff --git a/td/telegram/DialogInviteLink.cpp b/td/telegram/DialogInviteLink.cpp index eace42662..51e5a3dec 100644 --- a/td/telegram/DialogInviteLink.cpp +++ b/td/telegram/DialogInviteLink.cpp @@ -9,8 +9,13 @@ #include "td/telegram/ContactsManager.h" #include "td/telegram/Global.h" +#include "td/utils/misc.h" + namespace td { +const CSlice DialogInviteLink::INVITE_LINK_URLS[3] = {"t.me/joinchat/", "telegram.me/joinchat/", + "telegram.dog/joinchat/"}; + DialogInviteLink::DialogInviteLink(tl_object_ptr exported_invite) { if (exported_invite == nullptr) { return; @@ -58,6 +63,32 @@ DialogInviteLink::DialogInviteLink(tl_object_ptrunix_time() >= expire_date_) || (usage_limit_ != 0 && usage_count_ >= usage_limit_); } diff --git a/td/telegram/DialogInviteLink.h b/td/telegram/DialogInviteLink.h index b87d713dc..5440598d6 100644 --- a/td/telegram/DialogInviteLink.h +++ b/td/telegram/DialogInviteLink.h @@ -11,6 +11,7 @@ #include "td/telegram/UserId.h" #include "td/utils/common.h" +#include "td/utils/Slice.h" #include "td/utils/StringBuilder.h" #include "td/utils/tl_helpers.h" @@ -32,11 +33,17 @@ class DialogInviteLink { friend StringBuilder &operator<<(StringBuilder &string_builder, const DialogInviteLink &invite_link); + static const CSlice INVITE_LINK_URLS[3]; + public: DialogInviteLink() = default; DialogInviteLink(tl_object_ptr exported_invite); + static bool is_valid_invite_link(Slice invite_link); + + static Slice get_dialog_invite_link_hash(Slice invite_link); + td_api::object_ptr get_chat_invite_link_object(const ContactsManager *contacts_manager) const; bool is_valid() const {