| 986 | |
| 987 | |
| 988 | void LocalServer::setupUsers() |
| 989 | { |
| 990 | static const char * minimal_default_user_xml = |
| 991 | "<clickhouse>" |
| 992 | " <profiles>" |
| 993 | " <default></default>" |
| 994 | " </profiles>" |
| 995 | " <users>" |
| 996 | " <default>" |
| 997 | " <password></password>" |
| 998 | " <networks>" |
| 999 | " <ip>::/0</ip>" |
| 1000 | " </networks>" |
| 1001 | " <profile>default</profile>" |
| 1002 | " <quota>default</quota>" |
| 1003 | " <access_management>1</access_management>" |
| 1004 | " <named_collection_control>1</named_collection_control>" |
| 1005 | " </default>" |
| 1006 | " </users>" |
| 1007 | " <quotas>" |
| 1008 | " <default></default>" |
| 1009 | " </quotas>" |
| 1010 | "</clickhouse>"; |
| 1011 | |
| 1012 | ConfigurationPtr users_config; |
| 1013 | auto & access_control = global_context->getAccessControl(); |
| 1014 | access_control.setNoPasswordAllowed(getClientConfiguration().getBool("allow_no_password", true)); |
| 1015 | access_control.setPlaintextPasswordAllowed(getClientConfiguration().getBool("allow_plaintext_password", true)); |
| 1016 | |
| 1017 | /// Enable all access control improvements by default; can be overridden via config. |
| 1018 | auto & config = getClientConfiguration(); |
| 1019 | access_control.setEnabledUsersWithoutRowPoliciesCanReadRows(config.getBool("access_control_improvements.users_without_row_policies_can_read_rows", true)); |
| 1020 | access_control.setOnClusterQueriesRequireClusterGrant(config.getBool("access_control_improvements.on_cluster_queries_require_cluster_grant", true)); |
| 1021 | access_control.setSelectFromSystemDatabaseRequiresGrant(config.getBool("access_control_improvements.select_from_system_db_requires_grant", true)); |
| 1022 | access_control.setSelectFromInformationSchemaRequiresGrant(config.getBool("access_control_improvements.select_from_information_schema_requires_grant", true)); |
| 1023 | access_control.setSettingsConstraintsReplacePrevious(config.getBool("access_control_improvements.settings_constraints_replace_previous", true)); |
| 1024 | access_control.setTableEnginesRequireGrant(config.getBool("access_control_improvements.table_engines_require_grant", true)); |
| 1025 | access_control.setEnableReadWriteGrants(config.getBool("access_control_improvements.enable_read_write_grants", true)); |
| 1026 | access_control.setEnableUserNameAccessType(config.getBool("access_control_improvements.enable_user_name_access_type", true)); |
| 1027 | access_control.setThrowOnInvalidReplicatedAccessEntities(config.getBool("access_control_improvements.throw_on_invalid_replicated_access_entities", true)); |
| 1028 | |
| 1029 | /// Apply user-level configuration from a loaded config file (including those |
| 1030 | /// auto-discovered via `getLocalConfigPath`, e.g. `~/.clickhouse-local/config.xml`). |
| 1031 | if (!loaded_config_path.empty()) |
| 1032 | { |
| 1033 | const auto config_dir = fs::path{loaded_config_path}.remove_filename().string(); |
| 1034 | bool has_user_directories = getClientConfiguration().has("user_directories"); |
| 1035 | String users_config_path = getClientConfiguration().getString("users_config", ""); |
| 1036 | |
| 1037 | if (users_config_path.empty() && has_user_directories) |
| 1038 | users_config_path = getClientConfiguration().getString("user_directories.users_xml.path"); |
| 1039 | |
| 1040 | /// Anchor relative paths to the config's directory, not the cwd. |
| 1041 | /// Otherwise a missing `users.xml` silently falls back to `./users.xml`, |
| 1042 | /// which could grant `access_management` to the default user. |
| 1043 | if (!users_config_path.empty() && fs::path(users_config_path).is_relative()) |
| 1044 | users_config_path = fs::path(config_dir) / users_config_path; |
| 1045 |
nothing calls this directly
no test coverage detected