Skip to content

Commit b4a3f9c

Browse files
committed
[CPS] current thoughts on project routing resolution
1 parent 84014cd commit b4a3f9c

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/authz/AuthorizationService.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,9 @@
4949
import org.elasticsearch.indices.InvalidIndexNameException;
5050
import org.elasticsearch.license.XPackLicenseState;
5151
import org.elasticsearch.search.crossproject.CrossProjectModeDecider;
52+
import org.elasticsearch.search.crossproject.CrossProjectRoutingResolver;
5253
import org.elasticsearch.search.crossproject.NoMatchingProjectException;
54+
import org.elasticsearch.search.crossproject.ProjectRoutingInfo;
5355
import org.elasticsearch.search.crossproject.TargetProjects;
5456
import org.elasticsearch.threadpool.ThreadPool;
5557
import org.elasticsearch.transport.LinkedProjectConfigService;
@@ -106,6 +108,7 @@
106108
import java.util.Map;
107109
import java.util.Set;
108110
import java.util.function.Consumer;
111+
import java.util.function.Predicate;
109112
import java.util.function.Supplier;
110113

111114
import static org.elasticsearch.action.support.ContextPreservingActionListener.wrapPreservingContext;
@@ -504,12 +507,38 @@ private void authorizeAction(
504507
final SubscribableListener<TargetProjects> targetProjectListener;
505508
if (indicesAndAliasesResolver.resolvesCrossProject(request)) {
506509
targetProjectListener = new SubscribableListener<>();
510+
// Get list of projects from cluster state
511+
// Remove projects from list that user lacks permissions to access
507512
authorizedProjectsResolver.resolveAuthorizedProjects(targetProjectListener);
513+
514+
// project routing resolution could go here
515+
// regardless of location, it would look something like...
516+
targetProjectListener.andThenApply(targetProjects -> {
517+
// we'd inject the CrossProjectRoutingResolver
518+
// we somehow pipe project_routing through to here,
519+
// perhaps setting it in the SearchRequest so we can access it via RequestInfo.getRequest()
520+
var projectRoutingInfos = new CrossProjectRoutingResolver().resolve(
521+
"*",
522+
targetProjects.originProject(),
523+
targetProjects.linkedProjects()
524+
);
525+
var originOrNull = projectRoutingInfos.stream()
526+
.filter(targetProjects.originProject()::equals)
527+
.findAny()
528+
.orElse(null);
529+
var linkedProjects = projectRoutingInfos.stream()
530+
.filter(Predicate.not(targetProjects.originProject()::equals))
531+
.toList();
532+
// perhaps we change the CrossProjectRoutingResolver API to accept and return TargetProjects?
533+
return new TargetProjects(originOrNull, linkedProjects);
534+
});
508535
} else {
509536
targetProjectListener = SubscribableListener.newSucceeded(TargetProjects.LOCAL_ONLY_FOR_CPS_DISABLED);
510537
}
511538

512539
targetProjectListener.addListener(ActionListener.wrap(targetProjects -> {
540+
// this will eventually rewrite the index expression based on the targetProjects,
541+
// so filtering by project_routing should go before here
513542
final AsyncSupplier<ResolvedIndices> resolvedIndicesAsyncSupplier = makeResolvedIndicesAsyncSupplier(
514543
targetProjects,
515544
requestInfo,

x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/authz/IndicesAndAliasesResolver.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,7 @@ ResolvedIndices resolveIndicesAndAliases(
383383

384384
Set<String> remoteIndices = Collections.emptySet();
385385
if (crossProjectModeDecider.resolvesCrossProject(replaceable)) {
386+
// project routing resolution could go here, before the index expression is generated
386387
remoteIndices = CrossProjectIndexExpressionsRewriter.rewriteIndexExpression(
387388
indexExpression,
388389
authorizedProjects.originProjectAlias(),

0 commit comments

Comments
 (0)