From a97880132a5f5975a828cc428179aca53fd79816 Mon Sep 17 00:00:00 2001
From: John Preston <johnprestonmail@gmail.com>
Date: Fri, 29 Nov 2024 17:35:46 +0400
Subject: [PATCH] Respect appconfig starref restrictions.

---
 .../boxes/peers/edit_peer_info_box.cpp        |  8 +++++++-
 .../info/bot/earn/info_bot_earn_list.cpp      |  2 +-
 .../starref/info_bot_starref_join_widget.cpp  | 14 +++++++++++++
 .../starref/info_bot_starref_join_widget.h    |  1 +
 .../starref/info_bot_starref_setup_widget.cpp |  7 +++++++
 .../starref/info_bot_starref_setup_widget.h   |  1 +
 .../earn/info_channel_earn_list.cpp           | 20 ++++++++++---------
 Telegram/SourceFiles/main/main_app_config.cpp |  8 ++++++++
 Telegram/SourceFiles/main/main_app_config.h   |  2 ++
 .../SourceFiles/settings/settings_credits.cpp |  5 ++++-
 10 files changed, 56 insertions(+), 12 deletions(-)

diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp b/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp
index b33b92af9..dfe78d20a 100644
--- a/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp
+++ b/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp
@@ -1242,7 +1242,9 @@ void Controller::fillManageSection() {
 		&& (channel->isBroadcast() || channel->isGigagroup());
 	const auto hasRecentActions = isChannel
 		&& (channel->hasAdminRights() || channel->amCreator());
-	const auto hasStarRef = isChannel && channel->canPostMessages();
+	const auto hasStarRef = Info::BotStarRef::Join::Allowed(_peer)
+		&& isChannel
+		&& channel->canPostMessages();
 	const auto canEditStickers = isChannel && channel->canEditStickers();
 	const auto canDeleteChannel = isChannel && channel->canDelete();
 	const auto canEditColorIndex = isChannel && channel->canEditEmoji();
@@ -1730,6 +1732,10 @@ void Controller::fillBotCreditsButton() {
 void Controller::fillBotAffiliateProgram() {
 	Expects(_isBot);
 
+	if (!Info::BotStarRef::Setup::Allowed(_peer)) {
+		return;
+	}
+
 	const auto user = _peer->asUser();
 	auto label = user->session().changes().peerFlagsValue(
 		user,
diff --git a/Telegram/SourceFiles/info/bot/earn/info_bot_earn_list.cpp b/Telegram/SourceFiles/info/bot/earn/info_bot_earn_list.cpp
index 64b734fe6..ac9bfb055 100644
--- a/Telegram/SourceFiles/info/bot/earn/info_bot_earn_list.cpp
+++ b/Telegram/SourceFiles/info/bot/earn/info_bot_earn_list.cpp
@@ -253,7 +253,7 @@ void InnerWidget::fill() {
 				return v ? ToUsd(v, multiplier, kMinorLength) : QString();
 			}));
 	}
-	{
+	if (BotStarRef::Join::Allowed(peer())) {
 		const auto button = BotStarRef::AddViewListButton(
 			container,
 			tr::lng_credits_summary_earn_title(),
diff --git a/Telegram/SourceFiles/info/bot/starref/info_bot_starref_join_widget.cpp b/Telegram/SourceFiles/info/bot/starref/info_bot_starref_join_widget.cpp
index 200fbcb73..5b36457b1 100644
--- a/Telegram/SourceFiles/info/bot/starref/info_bot_starref_join_widget.cpp
+++ b/Telegram/SourceFiles/info/bot/starref/info_bot_starref_join_widget.cpp
@@ -13,6 +13,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 #include "base/weak_ptr.h"
 #include "boxes/peer_list_box.h"
 #include "core/click_handler_types.h"
+#include "data/data_channel.h"
 #include "data/data_session.h"
 #include "data/data_user.h"
 #include "info/bot/starref/info_bot_starref_common.h"
@@ -20,6 +21,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 #include "info/info_controller.h"
 #include "info/info_memento.h"
 #include "lang/lang_keys.h"
+#include "main/main_app_config.h"
 #include "main/main_session.h"
 #include "settings/settings_common.h"
 #include "ui/boxes/confirm_box.h"
@@ -680,6 +682,18 @@ std::unique_ptr<Ui::Premium::TopBarAbstract> Widget::setupTop() {
 	return result;
 }
 
+bool Allowed(not_null<PeerData*> peer) {
+	if (!peer->session().appConfig().starrefJoinAllowed()) {
+		return false;
+	} else if (const auto user = peer->asUser()) {
+		return user->isSelf()
+			|| (user->isBot() && user->botInfo->canEditInformation);
+	} else if (const auto channel = peer->asChannel()) {
+		return channel->isBroadcast() && channel->canPostMessages();
+	}
+	return false;
+}
+
 std::shared_ptr<Info::Memento> Make(not_null<PeerData*> peer) {
 	return std::make_shared<Info::Memento>(
 		std::vector<std::shared_ptr<ContentMemento>>(
diff --git a/Telegram/SourceFiles/info/bot/starref/info_bot_starref_join_widget.h b/Telegram/SourceFiles/info/bot/starref/info_bot_starref_join_widget.h
index 6f5ff630f..e3b9c868e 100644
--- a/Telegram/SourceFiles/info/bot/starref/info_bot_starref_join_widget.h
+++ b/Telegram/SourceFiles/info/bot/starref/info_bot_starref_join_widget.h
@@ -79,6 +79,7 @@ private:
 
 };
 
+[[nodiscard]] bool Allowed(not_null<PeerData*> peer);
 [[nodiscard]] std::shared_ptr<Info::Memento> Make(not_null<PeerData*> peer);
 
 [[nodiscard]] object_ptr<Ui::BoxContent> ProgramsListBox(
diff --git a/Telegram/SourceFiles/info/bot/starref/info_bot_starref_setup_widget.cpp b/Telegram/SourceFiles/info/bot/starref/info_bot_starref_setup_widget.cpp
index c589520f2..01cee27ae 100644
--- a/Telegram/SourceFiles/info/bot/starref/info_bot_starref_setup_widget.cpp
+++ b/Telegram/SourceFiles/info/bot/starref/info_bot_starref_setup_widget.cpp
@@ -18,6 +18,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 #include "info/info_controller.h"
 #include "info/info_memento.h"
 #include "lang/lang_keys.h"
+#include "main/main_app_config.h"
 #include "main/main_session.h"
 #include "settings/settings_common.h"
 #include "ui/effects/premium_top_bar.h"
@@ -903,6 +904,12 @@ std::unique_ptr<Ui::RpWidget> Widget::setupBottom() {
 	return result;
 }
 
+bool Allowed(not_null<PeerData*> peer) {
+	return peer->isUser()
+		&& peer->asUser()->isBot()
+		&& peer->session().appConfig().starrefSetupAllowed();
+}
+
 std::shared_ptr<Info::Memento> Make(not_null<PeerData*> peer) {
 	return std::make_shared<Info::Memento>(
 		std::vector<std::shared_ptr<ContentMemento>>(
diff --git a/Telegram/SourceFiles/info/bot/starref/info_bot_starref_setup_widget.h b/Telegram/SourceFiles/info/bot/starref/info_bot_starref_setup_widget.h
index ebc2be754..6fd66c8ca 100644
--- a/Telegram/SourceFiles/info/bot/starref/info_bot_starref_setup_widget.h
+++ b/Telegram/SourceFiles/info/bot/starref/info_bot_starref_setup_widget.h
@@ -80,6 +80,7 @@ private:
 
 };
 
+[[nodiscard]] bool Allowed(not_null<PeerData*> peer);
 [[nodiscard]] std::shared_ptr<Info::Memento> Make(not_null<PeerData*> peer);
 
 } // namespace Info::BotStarRef::Setup
diff --git a/Telegram/SourceFiles/info/channel_statistics/earn/info_channel_earn_list.cpp b/Telegram/SourceFiles/info/channel_statistics/earn/info_channel_earn_list.cpp
index 3b578f56e..21e896bcc 100644
--- a/Telegram/SourceFiles/info/channel_statistics/earn/info_channel_earn_list.cpp
+++ b/Telegram/SourceFiles/info/channel_statistics/earn/info_channel_earn_list.cpp
@@ -963,15 +963,17 @@ void InnerWidget::fill() {
 			) | rpl::map(creditsToUsdMap));
 	}
 
-	const auto button = Info::BotStarRef::AddViewListButton(
-		container,
-		tr::lng_credits_summary_earn_title(),
-		tr::lng_credits_summary_earn_about());
-	button->setClickedCallback([=] {
-		_controller->showSection(Info::BotStarRef::Join::Make(_peer));
-	});
-	Ui::AddSkip(container);
-	Ui::AddDivider(container);
+	if (Info::BotStarRef::Join::Allowed(_peer)) {
+		const auto button = Info::BotStarRef::AddViewListButton(
+			container,
+			tr::lng_credits_summary_earn_title(),
+			tr::lng_credits_summary_earn_about());
+		button->setClickedCallback([=] {
+			_controller->showSection(Info::BotStarRef::Join::Make(_peer));
+		});
+		Ui::AddSkip(container);
+		Ui::AddDivider(container);
+	}
 	Ui::AddSkip(container);
 
 	const auto sectionIndex = container->lifetime().make_state<int>(0);
diff --git a/Telegram/SourceFiles/main/main_app_config.cpp b/Telegram/SourceFiles/main/main_app_config.cpp
index 424e8e0bf..8d9797a32 100644
--- a/Telegram/SourceFiles/main/main_app_config.cpp
+++ b/Telegram/SourceFiles/main/main_app_config.cpp
@@ -57,6 +57,14 @@ const std::vector<QString> &AppConfig::startRefPrefixes() {
 	return _startRefPrefixes;
 }
 
+bool AppConfig::starrefSetupAllowed() const {
+	return get<bool>(u"starref_program_allowed"_q, false);
+}
+
+bool AppConfig::starrefJoinAllowed() const {
+	return get<bool>(u"starref_connect_allowed"_q, false);
+}
+
 void AppConfig::refresh(bool force) {
 	if (_requestId || !_api) {
 		if (force) {
diff --git a/Telegram/SourceFiles/main/main_app_config.h b/Telegram/SourceFiles/main/main_app_config.h
index cd0c5ae6a..55817f26e 100644
--- a/Telegram/SourceFiles/main/main_app_config.h
+++ b/Telegram/SourceFiles/main/main_app_config.h
@@ -67,6 +67,8 @@ public:
 	[[nodiscard]] int stargiftConvertPeriodMax() const;
 
 	[[nodiscard]] const std::vector<QString> &startRefPrefixes();
+	[[nodiscard]] bool starrefSetupAllowed() const;
+	[[nodiscard]] bool starrefJoinAllowed() const;
 
 	void refresh(bool force = false);
 
diff --git a/Telegram/SourceFiles/settings/settings_credits.cpp b/Telegram/SourceFiles/settings/settings_credits.cpp
index eb4a2435f..50f1301e4 100644
--- a/Telegram/SourceFiles/settings/settings_credits.cpp
+++ b/Telegram/SourceFiles/settings/settings_credits.cpp
@@ -210,13 +210,16 @@ void Credits::setupSubscriptions(not_null<Ui::VerticalLayout*> container) {
 }
 
 void Credits::setupStarRefPromo(not_null<Ui::VerticalLayout*> container) {
+	const auto self = _controller->session().user();
+	if (!Info::BotStarRef::Join::Allowed(self)) {
+		return;
+	}
 	Ui::AddSkip(container);
 	const auto button = Info::BotStarRef::AddViewListButton(
 		container,
 		tr::lng_credits_summary_earn_title(),
 		tr::lng_credits_summary_earn_about());
 	button->setClickedCallback([=] {
-		const auto self = _controller->session().user();
 		_controller->showSection(Info::BotStarRef::Join::Make(self));
 	});
 	Ui::AddSkip(container);