Add ignore_sensitive_content_restrictions and can_ignore_sensitive_content_restrictions options.

GitOrigin-RevId: 9a46d3eae3b8e17b51cf33b02e14aedc84261800
This commit is contained in:
levlam 2019-12-19 23:00:28 +03:00
parent 57911db0ba
commit 6d8a816a68
3 changed files with 90 additions and 2 deletions

View File

@ -6,6 +6,7 @@
//
#include "td/telegram/ConfigManager.h"
#include "td/telegram/AuthManager.h"
#include "td/telegram/ConfigShared.h"
#include "td/telegram/Global.h"
#include "td/telegram/JsonValue.h"
@ -20,6 +21,7 @@
#include "td/telegram/net/PublicRsaKeyShared.h"
#include "td/telegram/net/Session.h"
#include "td/telegram/StateManager.h"
#include "td/telegram/Td.h"
#include "td/telegram/TdDb.h"
#include "td/telegram/telegram_api.h"
@ -906,6 +908,10 @@ void ConfigManager::try_stop() {
}
void ConfigManager::request_config() {
if (G()->close_flag()) {
return;
}
if (config_sent_cnt_ != 0) {
return;
}
@ -913,6 +919,10 @@ void ConfigManager::request_config() {
}
void ConfigManager::get_app_config(Promise<td_api::object_ptr<td_api::JsonValue>> &&promise) {
if (G()->close_flag()) {
return promise.set_error(Status::Error(500, "Request aborted"));
}
get_app_config_queries_.push_back(std::move(promise));
if (get_app_config_queries_.size() == 1) {
G()->net_query_dispatcher().dispatch_with_callback(
@ -923,6 +933,24 @@ void ConfigManager::get_app_config(Promise<td_api::object_ptr<td_api::JsonValue>
}
}
void ConfigManager::get_content_settings(Promise<Unit> &&promise) {
if (G()->close_flag()) {
return promise.set_error(Status::Error(500, "Request aborted"));
}
auto auth_manager = G()->td().get_actor_unsafe()->auth_manager_.get();
if (!auth_manager->is_authorized() || auth_manager->is_bot()) {
return promise.set_value(Unit());
}
get_content_settings_queries_.push_back(std::move(promise));
if (get_content_settings_queries_.size() == 1) {
G()->net_query_dispatcher().dispatch_with_callback(
G()->net_query_creator().create(create_storer(telegram_api::account_getContentSettings())),
actor_shared(this, 2));
}
}
void ConfigManager::on_dc_options_update(DcOptions dc_options) {
save_dc_options_update(dc_options);
send_closure(config_recoverer_, &ConfigRecoverer::on_dc_options_update, std::move(dc_options));
@ -944,6 +972,28 @@ void ConfigManager::request_config_from_dc_impl(DcId dc_id) {
void ConfigManager::on_result(NetQueryPtr res) {
auto token = get_link_token();
if (token == 2) {
auto promises = std::move(get_content_settings_queries_);
get_content_settings_queries_.clear();
CHECK(!promises.empty());
auto result_ptr = fetch_result<telegram_api::account_getContentSettings>(std::move(res));
if (result_ptr.is_error()) {
for (auto &promise : promises) {
promise.set_error(result_ptr.error().clone());
}
return;
}
auto result = result_ptr.move_as_ok();
ConfigShared &shared_config = G()->shared_config();
shared_config.set_option_boolean("ignore_sensitive_content_restrictions", result->sensitive_enabled_);
shared_config.set_option_boolean("can_ignore_sensitive_content_restrictions", result->sensitive_can_change_);
for (auto &promise : promises) {
promise.set_value(Unit());
}
return;
}
if (token == 1) {
auto promises = std::move(get_app_config_queries_);
get_app_config_queries_.clear();
@ -957,6 +1007,7 @@ void ConfigManager::on_result(NetQueryPtr res) {
promise.set_error(result_ptr.error().clone());
}
}
return;
}
auto result = result_ptr.move_as_ok();
@ -1160,6 +1211,10 @@ void ConfigManager::process_config(tl_object_ptr<telegram_api::config> config) {
if (is_from_main_dc) {
get_app_config(Auto());
if (!shared_config.have_option("can_ignore_sensitive_content_restrictions") ||
!shared_config.have_option("ignore_sensitive_content_restrictions")) {
get_content_settings(Auto());
}
}
}
@ -1235,8 +1290,16 @@ void ConfigManager::process_app_config(tl_object_ptr<telegram_api::JSONValue> &c
}
if (ignored_restriction_reasons.empty()) {
shared_config.set_option_empty("ignored_restriction_reasons");
if (shared_config.get_option_boolean("ignore_sensitive_content_restrictions", true)) {
get_content_settings(Auto());
}
} else {
shared_config.set_option_string("ignored_restriction_reasons", ignored_restriction_reasons);
if (!shared_config.get_option_boolean("can_ignore_sensitive_content_restrictions")) {
get_content_settings(Auto());
}
}
}

View File

@ -85,6 +85,8 @@ class ConfigManager : public NetQueryCallback {
void get_app_config(Promise<td_api::object_ptr<td_api::JsonValue>> &&promise);
void get_content_settings(Promise<Unit> &&promise);
void on_dc_options_update(DcOptions dc_options);
private:
@ -95,6 +97,7 @@ class ConfigManager : public NetQueryCallback {
Timestamp expire_time_;
vector<Promise<td_api::object_ptr<td_api::JsonValue>>> get_app_config_queries_;
vector<Promise<Unit>> get_content_settings_queries_;
void start_up() override;
void hangup_shared() override;

View File

@ -6906,6 +6906,17 @@ void Td::on_request(uint64 id, td_api::getOption &request) {
bool is_bot = auth_manager_ != nullptr && auth_manager_->is_authorized() && auth_manager_->is_bot();
switch (request.name_[0]) {
// all these options should be added to getCurrentState
case 'c':
if (!is_bot && request.name_ == "can_ignore_sensitive_content_restrictions") {
auto promise = PromiseCreator::lambda([actor_id = actor_id(this), id](Result<Unit> &&result) {
// the option is already updated on success, ignore errors
send_closure(actor_id, &Td::send_result, id,
G()->shared_config().get_option_value("can_ignore_sensitive_content_restrictions"));
});
send_closure_later(config_manager_, &ConfigManager::get_content_settings, std::move(promise));
return;
}
break;
case 'd':
if (!is_bot && request.name_ == "disable_contact_registered_notifications") {
auto promise = PromiseCreator::lambda([actor_id = actor_id(this), id](Result<Unit> &&result) {
@ -6913,8 +6924,19 @@ void Td::on_request(uint64 id, td_api::getOption &request) {
send_closure(actor_id, &Td::send_result, id,
G()->shared_config().get_option_value("disable_contact_registered_notifications"));
});
send_closure(notification_manager_actor_, &NotificationManager::get_disable_contact_registered_notifications,
std::move(promise));
send_closure_later(notification_manager_actor_,
&NotificationManager::get_disable_contact_registered_notifications, std::move(promise));
return;
}
break;
case 'i':
if (!is_bot && request.name_ == "ignore_sensitive_content_restrictions") {
auto promise = PromiseCreator::lambda([actor_id = actor_id(this), id](Result<Unit> &&result) {
// the option is already updated on success, ignore errors
send_closure(actor_id, &Td::send_result, id,
G()->shared_config().get_option_value("ignore_sensitive_content_restrictions"));
});
send_closure_later(config_manager_, &ConfigManager::get_content_settings, std::move(promise));
return;
}
break;