| 73 | |
| 74 | |
| 75 | BlockIO InterpreterCreateUserQuery::execute() |
| 76 | { |
| 77 | const auto & query = query_ptr->as<const ASTCreateUserQuery &>(); |
| 78 | auto & access_control = getContext()->getAccessControlManager(); |
| 79 | auto access = getContext()->getAccess(); |
| 80 | access->checkAccess(query.alter ? AccessType::ALTER_USER : AccessType::CREATE_USER); |
| 81 | |
| 82 | std::optional<RolesOrUsersSet> default_roles_from_query; |
| 83 | if (query.default_roles) |
| 84 | { |
| 85 | default_roles_from_query = RolesOrUsersSet{*query.default_roles, access_control}; |
| 86 | if (!query.alter && !default_roles_from_query->all) |
| 87 | { |
| 88 | for (const UUID & role : default_roles_from_query->getMatchingIDs()) |
| 89 | access->checkAdminOption(role); |
| 90 | } |
| 91 | } |
| 92 | |
| 93 | // if (!query.cluster.empty()) |
| 94 | // return executeDDLQueryOnCluster(query_ptr, getContext()); |
| 95 | |
| 96 | std::optional<SettingsProfileElements> settings_from_query; |
| 97 | if (query.settings) |
| 98 | settings_from_query = SettingsProfileElements{*query.settings, access_control}; |
| 99 | |
| 100 | if (query.alter) |
| 101 | { |
| 102 | std::optional<RolesOrUsersSet> grantees_from_query; |
| 103 | if (query.grantees) |
| 104 | grantees_from_query = RolesOrUsersSet{*query.grantees, access_control}; |
| 105 | |
| 106 | auto update_func = [&](const AccessEntityPtr & entity) -> AccessEntityPtr |
| 107 | { |
| 108 | auto updated_user = typeid_cast<std::shared_ptr<User>>(entity->clone()); |
| 109 | updateUserFromQueryImpl(*updated_user, query, {}, default_roles_from_query, settings_from_query, grantees_from_query); |
| 110 | return updated_user; |
| 111 | }; |
| 112 | |
| 113 | Strings names = query.names->toStrings(); |
| 114 | if (query.if_exists) |
| 115 | { |
| 116 | auto ids = access_control.find<User>(names); |
| 117 | access_control.tryUpdate(ids, update_func); |
| 118 | } |
| 119 | else |
| 120 | access_control.update(access_control.getIDs<User>(names), update_func); |
| 121 | } |
| 122 | else |
| 123 | { |
| 124 | std::vector<AccessEntityPtr> new_users; |
| 125 | for (const auto & name : *query.names) |
| 126 | { |
| 127 | auto new_user = std::make_shared<User>(); |
| 128 | updateUserFromQueryImpl(*new_user, query, name, default_roles_from_query, settings_from_query, RolesOrUsersSet::AllTag{}); |
| 129 | new_users.emplace_back(std::move(new_user)); |
| 130 | } |
| 131 | |
| 132 | std::vector<UUID> ids; |
nothing calls this directly
no test coverage detected