diff --git a/td/telegram/LinkManager.cpp b/td/telegram/LinkManager.cpp index b07470aae..98b443e3b 100644 --- a/td/telegram/LinkManager.cpp +++ b/td/telegram/LinkManager.cpp @@ -773,8 +773,8 @@ class LinkManager::InternalLinkUserPhoneNumber final : public InternalLink { } public: - InternalLinkUserPhoneNumber(string phone_number, string draft_text) - : phone_number_(std::move(phone_number)), draft_text_(std::move(draft_text)) { + InternalLinkUserPhoneNumber(Slice phone_number, string draft_text) + : phone_number_(PSTRING() << '+' << phone_number), draft_text_(std::move(draft_text)) { } }; @@ -1347,16 +1347,20 @@ unique_ptr LinkManager::parse_tg_link_query(Slice que } // resolve?domain= return td::make_unique(std::move(username), get_url_query_draft_text(url_query)); - } else if (is_valid_phone_number(get_arg("phone"))) { - if (!url_query.get_arg("attach").empty()) { - // resolve?phone=&attach= - // resolve?phone=&attach=&startattach= - return td::make_unique( - nullptr, td::make_unique(get_arg("phone"), string()), - url_query.get_arg("attach").str(), url_query.get_arg("startattach")); + } else { + string phone_number_str = get_arg("phone"); + auto phone_number = phone_number_str[0] == ' ' ? Slice(phone_number_str).substr(1) : Slice(phone_number_str); + if (is_valid_phone_number(phone_number)) { + if (!url_query.get_arg("attach").empty()) { + // resolve?phone=&attach= + // resolve?phone=&attach=&startattach= + return td::make_unique( + nullptr, td::make_unique(phone_number, string()), + url_query.get_arg("attach").str(), url_query.get_arg("startattach")); + } + // resolve?phone=12345 + return td::make_unique(phone_number, get_url_query_draft_text(url_query)); } - // resolve?phone=12345 - return td::make_unique(get_arg("phone"), get_url_query_draft_text(url_query)); } } else if (path.size() == 1 && path[0] == "contact") { // contact?token= @@ -1938,15 +1942,21 @@ Result LinkManager::get_internal_link_impl(const td_api::InternalLinkTyp if (target->link_->get_id() == td_api::internalLinkTypeUserPhoneNumber::ID) { auto user_phone_number_link = static_cast(target->link_.get()); - if (!is_valid_phone_number(user_phone_number_link->phone_number_)) { + string phone_number; + if (user_phone_number_link->phone_number_[0] == '+') { + phone_number = user_phone_number_link->phone_number_.substr(1); + } else { + phone_number = user_phone_number_link->phone_number_; + } + if (!is_valid_phone_number(phone_number)) { return Status::Error(400, "Invalid target phone number specified"); } if (is_internal) { - return PSTRING() << "tg://resolve?phone=" << user_phone_number_link->phone_number_ - << "&attach=" << link->bot_username_ << start_parameter; + return PSTRING() << "tg://resolve?phone=+" << phone_number << "&attach=" << link->bot_username_ + << start_parameter; } else { - return PSTRING() << get_t_me_url() << '+' << user_phone_number_link->phone_number_ - << "?attach=" << link->bot_username_ << start_parameter; + return PSTRING() << get_t_me_url() << '+' << phone_number << "?attach=" << link->bot_username_ + << start_parameter; } } return Status::Error(400, "Unsupported target link specified"); @@ -2373,17 +2383,23 @@ Result LinkManager::get_internal_link_impl(const td_api::InternalLinkTyp } case td_api::internalLinkTypeUserPhoneNumber::ID: { auto link = static_cast(type_ptr); - if (!is_valid_phone_number(link->phone_number_)) { + string phone_number; + if (link->phone_number_[0] == '+') { + phone_number = link->phone_number_.substr(1); + } else { + phone_number = link->phone_number_; + } + if (!is_valid_phone_number(phone_number)) { return Status::Error(400, "Invalid phone number specified"); } if (!check_utf8(link->draft_text_)) { return Status::Error(400, "Draft text must be encoded in UTF-8"); } if (is_internal) { - return PSTRING() << "tg://resolve?phone=" << link->phone_number_ << (link->draft_text_.empty() ? "" : "&text=") + return PSTRING() << "tg://resolve?phone=+" << phone_number << (link->draft_text_.empty() ? "" : "&text=") << url_encode(link->draft_text_); } else { - return PSTRING() << get_t_me_url() << '+' << link->phone_number_ << (link->draft_text_.empty() ? "" : "?text=") + return PSTRING() << get_t_me_url() << '+' << phone_number << (link->draft_text_.empty() ? "" : "?text=") << url_encode(link->draft_text_); } } diff --git a/test/link.cpp b/test/link.cpp index 45217026e..fe975a428 100644 --- a/test/link.cpp +++ b/test/link.cpp @@ -364,7 +364,7 @@ static auto unsupported_proxy() { } static auto user_phone_number(const td::string &phone_number, const td::string &draft_text = td::string()) { - return td::td_api::make_object(phone_number, draft_text); + return td::td_api::make_object('+' + phone_number, draft_text); } static auto user_token(const td::string &token) { @@ -467,6 +467,7 @@ TEST(Link, parse_internal_link_part1) { attachment_menu_bot(nullptr, public_chat("telegram"), "test", "1")); parse_internal_link("tg:resolve?phone=1", user_phone_number("1")); + parse_internal_link("tg:resolve?phone=+1", user_phone_number("1")); parse_internal_link("tg:resolve?phone=123456", user_phone_number("123456")); parse_internal_link("tg:resolve?phone=123456&startattach", user_phone_number("123456")); parse_internal_link("tg:resolve?phone=123456&startattach=123", user_phone_number("123456")); @@ -475,6 +476,10 @@ TEST(Link, parse_internal_link_part1) { parse_internal_link("tg:resolve?phone=123456&attach=&startattach=123", user_phone_number("123456")); parse_internal_link("tg:resolve?phone=123456&attach=test", attachment_menu_bot(nullptr, user_phone_number("123456"), "test", "")); + parse_internal_link("tg:resolve?phone=+123456&attach=test", + attachment_menu_bot(nullptr, user_phone_number("123456"), "test", "")); + parse_internal_link("tg:resolve?phone=++123456&attach=test", + unknown_deep_link("tg://resolve?phone=++123456&attach=test")); parse_internal_link("tg:resolve?phone=123456&attach=test&startattach&choose=users", attachment_menu_bot(nullptr, user_phone_number("123456"), "test", "")); parse_internal_link("tg:resolve?phone=123456&attach=test&startattach=123", @@ -484,7 +489,7 @@ TEST(Link, parse_internal_link_part1) { parse_internal_link("tg:resolve?phone=012345678901234567890123456789123", unknown_deep_link("tg://resolve?phone=012345678901234567890123456789123")); parse_internal_link("tg:resolve?phone=", unknown_deep_link("tg://resolve?phone=")); - parse_internal_link("tg:resolve?phone=+123", unknown_deep_link("tg://resolve?phone=+123")); + parse_internal_link("tg:resolve?phone=+123", user_phone_number("123")); parse_internal_link("tg:resolve?phone=123456 ", unknown_deep_link("tg://resolve?phone=123456 ")); parse_internal_link("tg:resolve?domain=telegram&text=asd", public_chat("telegram", "asd")); parse_internal_link("tg:resolve?phone=12345678901&text=asd", user_phone_number("12345678901", "asd"));