diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 2eca1fc8e9..e92802de88 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -1603,6 +1603,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_profile_saved_messages#other" = "{count} saved messages"; "lng_profile_peer_gifts#one" = "{count} gift"; "lng_profile_peer_gifts#other" = "{count} gifts"; +"lng_profile_unofficial_warning" = "{icon} {name} uses an unofficial Telegram client — messages to this user may be less secure."; "lng_profile_participants_section" = "Members"; "lng_profile_subscribers_section" = "Subscribers"; "lng_profile_add_contact" = "Add Contact"; diff --git a/Telegram/SourceFiles/data/data_user.cpp b/Telegram/SourceFiles/data/data_user.cpp index be07c2d980..2a5c93abdb 100644 --- a/Telegram/SourceFiles/data/data_user.cpp +++ b/Telegram/SourceFiles/data/data_user.cpp @@ -892,7 +892,8 @@ void ApplyUserUpdate(not_null user, const MTPDuserFull &update) { : Flag()) | (user->starsPerMessage() ? Flag::HasStarsPerMessage : Flag()) | Flag::MessageMoneyRestrictionsKnown - | Flag::RequiresPremiumToWrite; + | Flag::RequiresPremiumToWrite + | Flag::UnofficialSecurityRisk; user->setFlags((user->flags() & ~mask) | (update.is_phone_calls_private() ? Flag::PhoneCallsPrivate @@ -908,6 +909,9 @@ void ApplyUserUpdate(not_null user, const MTPDuserFull &update) { | Flag::MessageMoneyRestrictionsKnown | (update.is_contact_require_premium() ? (Flag::RequiresPremiumToWrite | Flag::HasRequirePremiumToWrite) + : Flag()) + | (update.is_unofficial_security_risk() + ? Flag::UnofficialSecurityRisk : Flag())); user->setIsBlocked(update.is_blocked()); user->setCallsStatus(update.is_phone_calls_private() diff --git a/Telegram/SourceFiles/data/data_user.h b/Telegram/SourceFiles/data/data_user.h index 4f4d097065..e1894fcd26 100644 --- a/Telegram/SourceFiles/data/data_user.h +++ b/Telegram/SourceFiles/data/data_user.h @@ -130,7 +130,7 @@ enum class UserDataFlag : uint32 { DiscardMinPhoto = (1 << 12), Self = (1 << 13), Premium = (1 << 14), - //CanReceiveGifts = (1 << 15), + UnofficialSecurityRisk = (1 << 15), VoiceMessagesForbidden = (1 << 16), PersonalPhoto = (1 << 17), StoriesHidden = (1 << 18), @@ -303,6 +303,10 @@ public: [[nodiscard]] UserId botManagerId() const; void setBotManagerId(UserId managerId); + [[nodiscard]] bool unofficialSecurityRisk() const { + return flags() & Flag::UnofficialSecurityRisk; + } + [[nodiscard]] MTPInputUser inputUser() const; QString firstName; diff --git a/Telegram/SourceFiles/info/info.style b/Telegram/SourceFiles/info/info.style index 837637739c..f3d0b09f01 100644 --- a/Telegram/SourceFiles/info/info.style +++ b/Telegram/SourceFiles/info/info.style @@ -1463,3 +1463,6 @@ infoMusicButtonRipple: universalRippleAnimation; infoMusicButtonPadding: margins(16px, 6px, 13px, 6px); memberTagPillPadding: margins(5px, -1px, 5px, 0px); + +infoSecurityRiskIconSize: 16px; +infoSecurityRiskIconMargin: margins(0px, 2px, 0px, 0px); diff --git a/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp b/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp index 6929a246e9..f0ed4a46dd 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp @@ -33,14 +33,17 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "apiwrap.h" #include "api/api_peer_photo.h" #include "lang/lang_keys.h" +#include "ui/text/custom_emoji_helper.h" #include "ui/text/format_song_document_name.h" #include "ui/widgets/buttons.h" #include "ui/widgets/checkbox.h" +#include "ui/widgets/labels.h" #include "ui/widgets/scroll_area.h" #include "ui/widgets/shadow.h" #include "ui/wrap/fade_wrap.h" #include "ui/wrap/vertical_layout.h" #include "ui/wrap/slide_wrap.h" +#include "ui/painter.h" #include "ui/vertical_list.h" #include "ui/ui_utility.h" #include "styles/style_info.h" @@ -79,6 +82,68 @@ void AddAboutVerification( }, inner->lifetime()); } +void AddUnofficialSecurityRiskWarning( + not_null container, + not_null user) { + const auto content = container->add( + object_ptr(container)); + user->session().changes().peerFlagsValue( + user, + Data::PeerUpdate::Flag::FullInfo + ) | rpl::on_next([=] { + while (content->count()) { + delete content->widgetAt(0); + } + if (user->unofficialSecurityRisk()) { + auto helper = Ui::Text::CustomEmojiHelper(); + auto icon = helper.paletteDependent({ + .factory = [] { + const auto s = st::infoSecurityRiskIconSize; + const auto ratio = style::DevicePixelRatio(); + const auto rect = QRect(0, 0, s, s); + auto result = QImage( + rect.size() * ratio, + QImage::Format_ARGB32_Premultiplied); + result.setDevicePixelRatio(ratio); + result.fill(Qt::transparent); + + auto p = QPainter(&result); + auto hq = PainterHighQualityEnabler(p); + p.setPen(Qt::NoPen); + p.setBrush(st::attentionButtonFg); + p.drawEllipse(rect); + + p.setPen(st::windowFgActive); + p.setFont(st::semiboldFont); + p.drawText(rect, u"!"_q, style::al_center); + + p.end(); + return result; + }, + .margin = st::infoSecurityRiskIconMargin, + }); + auto label = object_ptr( + content, + tr::lng_profile_unofficial_warning( + lt_icon, + rpl::single(std::move(icon)), + lt_name, + rpl::single(TextWithEntities{ user->firstName }), + tr::marked), + st::defaultDividerLabel.label, + st::defaultPopupMenu, + helper.context([=] { content->update(); })); + content->add(object_ptr( + content, + std::move(label), + st::defaultBoxDividerLabelPadding, + st::defaultDividerLabel.bar, + RectPart::Top | RectPart::Bottom)); + } + content->resizeToWidth(content->width()); + }, content->lifetime()); +} + } // namespace InnerWidget::InnerWidget( @@ -125,6 +190,9 @@ object_ptr InnerWidget::setupContent( auto result = object_ptr(parent); setupSavedMusic(result); + if (const auto user = _peer->asUser()) { + AddUnofficialSecurityRiskWarning(result.data(), user); + } if (_topic && _topic->creating()) { return result; }