Add various sanity checks to language packs manager.

GitOrigin-RevId: c7fa6f88415bdefe4da589a33d28429f824d551c
This commit is contained in:
levlam 2018-08-24 05:26:19 +03:00
parent a1436a11f2
commit 3c34179234

View File

@ -169,10 +169,15 @@ void LanguagePackManager::start_up() {
CHECK(check_language_code_name(language_code_)); CHECK(check_language_code_name(language_code_));
database_ = add_language_database(G()->shared_config().get_option_string("language_database_path")); database_ = add_language_database(G()->shared_config().get_option_string("language_database_path"));
auto language = add_language(database_, language_pack_, language_code_); if (!language_pack_.empty() && !language_code_.empty()) {
auto language = add_language(database_, language_pack_, language_code_);
if (!is_custom_language_code(language_code_) && language->version_ == -1) {
get_language_pack_strings(language_code_, vector<string>(), Auto());
}
LOG(INFO) << "Use language pack \"" << language_pack_ << "\" with language \"" << language_code_ << "\" of version " LOG(INFO) << "Use language pack \"" << language_pack_ << "\" with language \"" << language_code_ << "\" of version "
<< language->version_.load() << " with database \"" << database_->path_ << '"'; << language->version_.load() << " with database \"" << database_->path_ << '"';
}
} }
void LanguagePackManager::tear_down() { void LanguagePackManager::tear_down() {
@ -208,7 +213,7 @@ void LanguagePackManager::on_language_code_changed() {
} }
void LanguagePackManager::on_language_pack_version_changed(int32 new_version) { void LanguagePackManager::on_language_pack_version_changed(int32 new_version) {
if (is_custom_language_code(language_code_)) { if (is_custom_language_code(language_code_) || language_pack_.empty() || language_code_.empty()) {
return; return;
} }
@ -261,10 +266,18 @@ void LanguagePackManager::on_update_language_pack(tl_object_ptr<telegram_api::la
LOG(INFO) << "Receive update language pack difference for language " << difference->lang_code_ << " from version " LOG(INFO) << "Receive update language pack difference for language " << difference->lang_code_ << " from version "
<< difference->from_version_ << " with version " << difference->version_ << " of size " << difference->from_version_ << " with version " << difference->version_ << " of size "
<< difference->strings_.size(); << difference->strings_.size();
if (language_pack_.empty()) {
LOG(WARNING) << "Ignore difference for language " << difference->lang_code_ << ", because language pack was unset";
return;
}
if (difference->lang_code_ != language_code_) { if (difference->lang_code_ != language_code_) {
LOG(WARNING) << "Ignore difference for language " << difference->lang_code_; LOG(WARNING) << "Ignore difference for language " << difference->lang_code_;
return; return;
} }
if (is_custom_language_code(difference->lang_code_) || difference->lang_code_.empty()) {
LOG(ERROR) << "Ignore difference for language " << difference->lang_code_;
return;
}
Language *language = get_language(database_, language_pack_, language_code_); Language *language = get_language(database_, language_pack_, language_code_);
int32 version = language == nullptr ? static_cast<int32>(-1) : language->version_.load(); int32 version = language == nullptr ? static_cast<int32>(-1) : language->version_.load();
@ -535,6 +548,10 @@ td_api::object_ptr<td_api::languagePackStrings> LanguagePackManager::get_languag
} }
void LanguagePackManager::get_languages(Promise<td_api::object_ptr<td_api::languagePack>> promise) { void LanguagePackManager::get_languages(Promise<td_api::object_ptr<td_api::languagePack>> promise) {
if (language_pack_.empty()) {
return promise.set_error(Status::Error(400, "Option \"language_pack\" needs to be set first"));
}
auto request_promise = PromiseCreator::lambda([actor_id = actor_id(this), language_pack = language_pack_, auto request_promise = PromiseCreator::lambda([actor_id = actor_id(this), language_pack = language_pack_,
promise = std::move(promise)](Result<NetQueryPtr> r_query) mutable { promise = std::move(promise)](Result<NetQueryPtr> r_query) mutable {
auto r_result = fetch_result<telegram_api::langpack_getLanguages>(std::move(r_query)); auto r_result = fetch_result<telegram_api::langpack_getLanguages>(std::move(r_query));
@ -572,6 +589,11 @@ void LanguagePackManager::on_get_languages(vector<tl_object_ptr<telegram_api::la
} }
for (auto &language_info : results->languages_) { for (auto &language_info : results->languages_) {
if (!check_language_code_name(language_info->code_)) {
LOG(ERROR) << "Receive unsupported language code " << language_info->code_ << " from server";
continue;
}
auto language = add_language(database_, language_pack, language_info->code_); auto language = add_language(database_, language_pack, language_info->code_);
language_info->local_string_count_ = language->key_count_; language_info->local_string_count_ = language->key_count_;
} }
@ -581,6 +603,12 @@ void LanguagePackManager::on_get_languages(vector<tl_object_ptr<telegram_api::la
void LanguagePackManager::get_language_pack_strings(string language_code, vector<string> keys, void LanguagePackManager::get_language_pack_strings(string language_code, vector<string> keys,
Promise<td_api::object_ptr<td_api::languagePackStrings>> promise) { Promise<td_api::object_ptr<td_api::languagePackStrings>> promise) {
if (!check_language_code_name(language_code) || language_code.empty()) {
return promise.set_error(Status::Error(400, "Language code is invalid"));
}
if (language_pack_.empty()) {
return promise.set_error(Status::Error(400, "Option \"language_pack\" needs to be set first"));
}
for (auto &key : keys) { for (auto &key : keys) {
if (!is_valid_key(key)) { if (!is_valid_key(key)) {
return promise.set_error(Status::Error(400, "Invalid key name")); return promise.set_error(Status::Error(400, "Invalid key name"));
@ -595,6 +623,10 @@ void LanguagePackManager::get_language_pack_strings(string language_code, vector
return promise.set_value(get_language_pack_strings_object(language, keys)); return promise.set_value(get_language_pack_strings_object(language, keys));
} }
if (is_custom_language_code(language_code)) {
return promise.set_error(Status::Error(400, "Custom language pack not found"));
}
if (keys.empty()) { if (keys.empty()) {
auto &queries = get_all_language_pack_strings_queries_[language_pack_][language_code].queries_; auto &queries = get_all_language_pack_strings_queries_[language_pack_][language_code].queries_;
queries.push_back(std::move(promise)); queries.push_back(std::move(promise));
@ -1005,6 +1037,9 @@ Result<tl_object_ptr<telegram_api::LangPackString>> LanguagePackManager::convert
void LanguagePackManager::set_custom_language(string language_code, string language_name, string language_native_name, void LanguagePackManager::set_custom_language(string language_code, string language_name, string language_native_name,
vector<tl_object_ptr<td_api::languagePackString>> strings, vector<tl_object_ptr<td_api::languagePackString>> strings,
Promise<Unit> &&promise) { Promise<Unit> &&promise) {
if (language_pack_.empty()) {
return promise.set_error(Status::Error(400, "Option \"language_pack\" needs to be set first"));
}
if (!check_language_code_name(language_code)) { if (!check_language_code_name(language_code)) {
return promise.set_error(Status::Error(400, "Language code name must contain only letters and hyphen")); return promise.set_error(Status::Error(400, "Language code name must contain only letters and hyphen"));
} }
@ -1042,6 +1077,9 @@ void LanguagePackManager::set_custom_language(string language_code, string langu
void LanguagePackManager::set_custom_language_string(string language_code, void LanguagePackManager::set_custom_language_string(string language_code,
tl_object_ptr<td_api::languagePackString> str, tl_object_ptr<td_api::languagePackString> str,
Promise<Unit> &&promise) { Promise<Unit> &&promise) {
if (language_pack_.empty()) {
return promise.set_error(Status::Error(400, "Option \"language_pack\" needs to be set first"));
}
if (!check_language_code_name(language_code)) { if (!check_language_code_name(language_code)) {
return promise.set_error(Status::Error(400, "Language code name must contain only letters and hyphen")); return promise.set_error(Status::Error(400, "Language code name must contain only letters and hyphen"));
} }
@ -1072,6 +1110,9 @@ void LanguagePackManager::set_custom_language_string(string language_code,
} }
void LanguagePackManager::delete_language(string language_code, Promise<Unit> &&promise) { void LanguagePackManager::delete_language(string language_code, Promise<Unit> &&promise) {
if (language_pack_.empty()) {
return promise.set_error(Status::Error(400, "Option \"language_pack\" needs to be set first"));
}
if (!check_language_code_name(language_code)) { if (!check_language_code_name(language_code)) {
return promise.set_error(Status::Error(400, "Language code name is invalid")); return promise.set_error(Status::Error(400, "Language code name is invalid"));
} }