Skip to content

Commit da43e54

Browse files
committed
Union
1 parent d0e61c1 commit da43e54

File tree

5 files changed

+40
-16
lines changed

5 files changed

+40
-16
lines changed

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/security/authz/privilege/ConfigurableClusterPrivileges.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,7 @@ public ManageRolesPrivilege(List<ManageRolesIndexPermissionGroup> manageRolesInd
414414
this.requestPredicateSupplier = (restrictedIndices) -> {
415415
IndicesPermission.Builder indicesPermissionBuilder = new IndicesPermission.Builder(restrictedIndices);
416416
for (ManageRolesIndexPermissionGroup indexPatternPrivilege : manageRolesIndexPermissionGroups) {
417+
// TODO handle selectors
417418
indicesPermissionBuilder.addGroup(
418419
IndexPrivilege.get(Set.of(indexPatternPrivilege.privileges())),
419420
FieldPermissions.DEFAULT,

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/security/authz/privilege/IndexComponentSelectorPrivilege.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
package org.elasticsearch.xpack.core.security.authz.privilege;
99

1010
import org.elasticsearch.action.support.IndexComponentSelector;
11+
import org.elasticsearch.common.util.set.Sets;
1112
import org.elasticsearch.core.Predicates;
1213

1314
import java.util.HashSet;
@@ -18,7 +19,11 @@
1819

1920
import static org.elasticsearch.common.util.set.Sets.newHashSet;
2021

21-
public record IndexComponentSelectorPrivilege(String name, Predicate<IndexComponentSelector> predicate) {
22+
public record IndexComponentSelectorPrivilege(Set<String> names, Predicate<IndexComponentSelector> predicate) {
23+
IndexComponentSelectorPrivilege(String name, Predicate<IndexComponentSelector> predicate) {
24+
this(Set.of(name), predicate);
25+
}
26+
2227
public static final IndexComponentSelectorPrivilege ALL = new IndexComponentSelectorPrivilege("all", Predicates.always());
2328
public static final IndexComponentSelectorPrivilege DATA = new IndexComponentSelectorPrivilege(
2429
"data",
@@ -37,6 +42,13 @@ public boolean isTotal() {
3742
return this == ALL;
3843
}
3944

45+
public IndexComponentSelectorPrivilege or(IndexComponentSelectorPrivilege other) {
46+
if (this == ALL || other == ALL) {
47+
return ALL;
48+
}
49+
return new IndexComponentSelectorPrivilege(Sets.union(names, other.names), predicate.or(other.predicate));
50+
}
51+
4052
public static Set<IndexComponentSelectorPrivilege> get(Set<String> indexPrivileges) {
4153
return indexPrivileges.stream().map(IndexComponentSelectorPrivilege::get).collect(Collectors.toSet());
4254
}

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/security/authz/privilege/IndexPrivilege.java

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import java.util.Collection;
4949
import java.util.Collections;
5050
import java.util.HashSet;
51+
import java.util.Iterator;
5152
import java.util.Locale;
5253
import java.util.Map;
5354
import java.util.Objects;
@@ -185,11 +186,6 @@ public final class IndexPrivilege extends Privilege {
185186
READ_AUTOMATON,
186187
IndexComponentSelectorPrivilege.FAILURES
187188
);
188-
public static final IndexPrivilege MANAGE_FAILURE_STORE_INTERNAL = new IndexPrivilege(
189-
"manage_failure_store_internal",
190-
MANAGE_AUTOMATON,
191-
IndexComponentSelectorPrivilege.FAILURES
192-
);
193189
public static final IndexPrivilege READ = new IndexPrivilege("read", READ_AUTOMATON);
194190
public static final IndexPrivilege READ_CROSS_CLUSTER = new IndexPrivilege("read_cross_cluster", READ_CROSS_CLUSTER_AUTOMATON);
195191
public static final IndexPrivilege CREATE = new IndexPrivilege("create", CREATE_AUTOMATON);
@@ -199,6 +195,11 @@ public final class IndexPrivilege extends Privilege {
199195
public static final IndexPrivilege CREATE_DOC = new IndexPrivilege("create_doc", CREATE_DOC_AUTOMATON);
200196
public static final IndexPrivilege MONITOR = new IndexPrivilege("monitor", MONITOR_AUTOMATON);
201197
public static final IndexPrivilege MANAGE = new IndexPrivilege("manage", MANAGE_AUTOMATON);
198+
public static final IndexPrivilege MANAGE_FAILURE_STORE_INTERNAL = new IndexPrivilege(
199+
"manage_failure_store_internal",
200+
MANAGE_AUTOMATON,
201+
IndexComponentSelectorPrivilege.FAILURES
202+
);
202203
public static final IndexPrivilege DELETE_INDEX = new IndexPrivilege("delete_index", DELETE_INDEX_AUTOMATON);
203204
public static final IndexPrivilege CREATE_INDEX = new IndexPrivilege("create_index", CREATE_INDEX_AUTOMATON);
204205
public static final IndexPrivilege VIEW_METADATA = new IndexPrivilege("view_index_metadata", VIEW_METADATA_AUTOMATON);
@@ -342,17 +343,22 @@ private static IndexPrivilege resolve(Set<String> name) {
342343
selectorPrivileges.add(IndexComponentSelectorPrivilege.DATA);
343344
}
344345

345-
for (IndexComponentSelectorPrivilege selectorPrivilege : selectorPrivileges) {
346-
if (selectorPrivilege == IndexComponentSelectorPrivilege.ALL) {
347-
return new IndexPrivilege(name, unionAndMinimize(automata), IndexComponentSelectorPrivilege.ALL);
348-
}
346+
return new IndexPrivilege(name, unionAndMinimize(automata), union(selectorPrivileges));
347+
}
348+
349+
private static IndexComponentSelectorPrivilege union(Set<IndexComponentSelectorPrivilege> selectorPrivileges) {
350+
assert selectorPrivileges.isEmpty() == false;
351+
if (selectorPrivileges.contains(IndexComponentSelectorPrivilege.ALL)) {
352+
return IndexComponentSelectorPrivilege.ALL;
353+
} else if (selectorPrivileges.size() == 1) {
354+
return selectorPrivileges.iterator().next();
349355
}
350-
if (selectorPrivileges.size() != 1) {
351-
// TODO assertion and make this clearer
352-
throw new IllegalArgumentException("Cannot mix different selector privileges in a single index privilege for [" + name + "]");
356+
Iterator<IndexComponentSelectorPrivilege> iterator = selectorPrivileges.iterator();
357+
IndexComponentSelectorPrivilege result = iterator.next();
358+
while (iterator.hasNext()) {
359+
result = result.or(iterator.next());
353360
}
354-
355-
return new IndexPrivilege(name, unionAndMinimize(automata), selectorPrivileges.iterator().next());
361+
return result;
356362
}
357363

358364
static Map<String, IndexPrivilege> values() {

x-pack/plugin/security/src/test/java/org/elasticsearch/xpack/security/authz/RBACEngineTests.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1754,6 +1754,11 @@ public void testGetRoleDescriptorsForRemoteClusterForReservedRoles() {
17541754
.indices("*")
17551755
.privileges("monitor", "read", "read_cross_cluster", "view_index_metadata")
17561756
.allowRestrictedIndices(true)
1757+
.build(),
1758+
IndicesPrivileges.builder()
1759+
.indices("*")
1760+
.privileges("read_failure_store")
1761+
.allowRestrictedIndices(true)
17571762
.build() },
17581763
null,
17591764
null,

x-pack/plugin/security/src/test/java/org/elasticsearch/xpack/security/support/QueryableBuiltInRolesUtilsTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public void testCalculateHash() {
4343
QueryableBuiltInRolesUtils.calculateHash(ReservedRolesStore.SUPERUSER_ROLE_DESCRIPTOR),
4444
equalTo(
4545
DataStream.isFailureStoreFeatureFlagEnabled()
46-
? "3na054vyhPlUqSeq8cim+JwuBc+81r7JViA27peTAGc="
46+
? "qgdWamvjudRKGezTGfjoSCr230sFDdh2t6xFUPYiW2Q="
4747
: "bWEFdFo4WX229wdhdecfiz5QHMYEssh3ex8hizRgg+Q="
4848
)
4949
);

0 commit comments

Comments
 (0)