Throw exception when xml user profile does not exist

Closes #26086
This commit is contained in:
Nicolae Vartolomei 2022-06-13 13:29:08 +00:00
parent 06d94a4dde
commit 9555153f95
3 changed files with 15 additions and 2 deletions

View File

@ -19,6 +19,10 @@ class AccessControl;
struct SettingsProfileElement struct SettingsProfileElement
{ {
std::optional<UUID> parent_profile; std::optional<UUID> parent_profile;
/// parent_profile_xml_name is set only when users are configured via XML
/// and is used for user-friendly error messages.
std::optional<String> parent_profile_xml_name;
String setting_name; String setting_name;
Field value; Field value;
Field min_value; Field min_value;

View File

@ -170,8 +170,15 @@ void SettingsProfilesCache::substituteProfiles(
continue; continue;
auto profile_it = all_profiles.find(profile_id); auto profile_it = all_profiles.find(profile_id);
if (profile_it == all_profiles.end()) if (profile_it == all_profiles.end()) {
continue; /// If the textual profile name is set, then users are configured via XML.
/// For these users we want to throw an exception when their profile can't
/// be found. Otherwise, these users are super admins.
if (element.parent_profile_xml_name)
throw Exception(ErrorCodes::THERE_IS_NO_PROFILE, "There is no profile '{}' in configuration file", *element.parent_profile_xml_name);
else
continue;
}
const auto & profile = profile_it->second; const auto & profile = profile_it->second;
const auto & profile_elements = profile->elements; const auto & profile_elements = profile->elements;

View File

@ -142,6 +142,7 @@ namespace
auto profile_name = config.getString(profile_name_config); auto profile_name = config.getString(profile_name_config);
SettingsProfileElement profile_element; SettingsProfileElement profile_element;
profile_element.parent_profile = generateID(AccessEntityType::SETTINGS_PROFILE, profile_name); profile_element.parent_profile = generateID(AccessEntityType::SETTINGS_PROFILE, profile_name);
profile_element.parent_profile_xml_name = profile_name;
user->settings.push_back(std::move(profile_element)); user->settings.push_back(std::move(profile_element));
} }
@ -473,6 +474,7 @@ namespace
String parent_profile_name = config.getString(profile_config + "." + key); String parent_profile_name = config.getString(profile_config + "." + key);
SettingsProfileElement profile_element; SettingsProfileElement profile_element;
profile_element.parent_profile = generateID(AccessEntityType::SETTINGS_PROFILE, parent_profile_name); profile_element.parent_profile = generateID(AccessEntityType::SETTINGS_PROFILE, parent_profile_name);
profile_element.parent_profile_xml_name = parent_profile_name;
profile->elements.emplace_back(std::move(profile_element)); profile->elements.emplace_back(std::move(profile_element));
continue; continue;
} }