Skip to content

Commit 90a8ea7

Browse files
authored
Remove doPrivileged from plugins (#127996) (#128261)
This commit continues the work of removing SecurityManager related code by removing doPrivileged calls from Elasticsearch plugins.
1 parent 6030456 commit 90a8ea7

File tree

17 files changed

+49
-373
lines changed

17 files changed

+49
-373
lines changed

plugins/discovery-azure-classic/src/main/java/org/elasticsearch/cloud/azure/classic/management/AzureComputeServiceImpl.java

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,6 @@
2929
import org.elasticsearch.logging.Logger;
3030

3131
import java.io.IOException;
32-
import java.security.AccessController;
33-
import java.security.PrivilegedActionException;
34-
import java.security.PrivilegedExceptionAction;
3532
import java.util.ServiceLoader;
3633

3734
public class AzureComputeServiceImpl extends AbstractLifecycleComponent implements AzureComputeService {
@@ -94,11 +91,8 @@ private static String getRequiredSetting(Settings settings, Setting<String> sett
9491
public HostedServiceGetDetailedResponse getServiceDetails() {
9592
SpecialPermission.check();
9693
try {
97-
return AccessController.doPrivileged(
98-
(PrivilegedExceptionAction<HostedServiceGetDetailedResponse>) () -> client.getHostedServicesOperations()
99-
.getDetailed(serviceName)
100-
);
101-
} catch (PrivilegedActionException e) {
94+
return client.getHostedServicesOperations().getDetailed(serviceName);
95+
} catch (Exception e) {
10296
throw new AzureServiceRemoteException("can not get list of azure nodes", e.getCause());
10397
}
10498
}

plugins/discovery-ec2/src/main/java/org/elasticsearch/discovery/ec2/AwsEc2SeedHostsProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ protected List<TransportAddress> fetchDynamicNodes() {
107107
// NOTE: we don't filter by security group during the describe instances request for two reasons:
108108
// 1. differences in VPCs require different parameters during query (ID vs Name)
109109
// 2. We want to use two different strategies: (all security groups vs. any security groups)
110-
descInstances = SocketAccess.doPrivileged(() -> clientReference.client().describeInstances(buildDescribeInstancesRequest()));
110+
descInstances = clientReference.client().describeInstances(buildDescribeInstancesRequest());
111111
} catch (final Exception e) {
112112
logger.info("Exception while retrieving instance list from AWS API: {}", e.getMessage());
113113
logger.debug("Full exception:", e);

plugins/discovery-ec2/src/main/java/org/elasticsearch/discovery/ec2/AwsEc2ServiceImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ private Ec2Client buildClient(Ec2ClientSettings clientSettings) {
6666
final var endpoint = Endpoint.builder().url(URI.create(clientSettings.endpoint)).build();
6767
ec2ClientBuilder.endpointProvider(endpointParams -> CompletableFuture.completedFuture(endpoint));
6868
}
69-
return SocketAccess.doPrivileged(ec2ClientBuilder::build);
69+
return ec2ClientBuilder.build();
7070
}
7171

7272
private static void applyProxyConfiguration(Ec2ClientSettings clientSettings, ApacheHttpClient.Builder httpClientBuilder) {

plugins/discovery-ec2/src/main/java/org/elasticsearch/discovery/ec2/AwsEc2Utils.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ class AwsEc2Utils {
2222
static String getInstanceMetadata(String metadataPath) {
2323
final var httpClientBuilder = ApacheHttpClient.builder();
2424
httpClientBuilder.connectionTimeout(IMDS_CONNECTION_TIMEOUT);
25-
try (var ec2Client = SocketAccess.doPrivileged(Ec2MetadataClient.builder().httpClient(httpClientBuilder)::build)) {
26-
final var metadataValue = SocketAccess.doPrivileged(() -> ec2Client.get(metadataPath)).asString();
25+
try (var ec2Client = Ec2MetadataClient.builder().httpClient(httpClientBuilder).build()) {
26+
final var metadataValue = ec2Client.get(metadataPath).asString();
2727
if (Strings.hasText(metadataValue) == false) {
2828
throw new IllegalStateException("no ec2 metadata returned from " + metadataPath);
2929
}

plugins/discovery-ec2/src/main/java/org/elasticsearch/discovery/ec2/SocketAccess.java

Lines changed: 0 additions & 44 deletions
This file was deleted.

plugins/discovery-gce/src/internalClusterTest/java/org/elasticsearch/discovery/gce/GceDiscoverTests.java

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414

1515
import org.elasticsearch.action.admin.cluster.state.ClusterStateResponse;
1616
import org.elasticsearch.cloud.gce.GceInstancesService;
17-
import org.elasticsearch.cloud.gce.util.Access;
1817
import org.elasticsearch.cluster.node.DiscoveryNode;
1918
import org.elasticsearch.common.settings.Settings;
2019
import org.elasticsearch.core.TimeValue;
@@ -138,23 +137,21 @@ protected GceInstancesService createGceInstancesService() {
138137
return new GceInstancesService() {
139138
@Override
140139
public Collection<Instance> instances() {
141-
return Access.doPrivileged(() -> {
142-
final List<Instance> instances = new ArrayList<>();
140+
final List<Instance> instances = new ArrayList<>();
143141

144-
for (DiscoveryNode discoveryNode : nodes.values()) {
145-
Instance instance = new Instance();
146-
instance.setName(discoveryNode.getName());
147-
instance.setStatus("STARTED");
142+
for (DiscoveryNode discoveryNode : nodes.values()) {
143+
Instance instance = new Instance();
144+
instance.setName(discoveryNode.getName());
145+
instance.setStatus("STARTED");
148146

149-
NetworkInterface networkInterface = new NetworkInterface();
150-
networkInterface.setNetworkIP(discoveryNode.getAddress().toString());
151-
instance.setNetworkInterfaces(singletonList(networkInterface));
147+
NetworkInterface networkInterface = new NetworkInterface();
148+
networkInterface.setNetworkIP(discoveryNode.getAddress().toString());
149+
instance.setNetworkInterfaces(singletonList(networkInterface));
152150

153-
instances.add(instance);
154-
}
151+
instances.add(instance);
152+
}
155153

156-
return instances;
157-
});
154+
return instances;
158155
}
159156

160157
@Override

plugins/discovery-gce/src/main/java/org/elasticsearch/cloud/gce/GceInstancesServiceImpl.java

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import com.google.api.services.compute.model.Instance;
2626
import com.google.api.services.compute.model.InstanceList;
2727

28-
import org.elasticsearch.cloud.gce.util.Access;
2928
import org.elasticsearch.common.settings.Setting;
3029
import org.elasticsearch.common.settings.Setting.Property;
3130
import org.elasticsearch.common.settings.Settings;
@@ -70,19 +69,17 @@ public Collection<Instance> instances() {
7069
try {
7170
// hack around code messiness in GCE code
7271
// TODO: get this fixed
73-
return Access.doPrivilegedIOException(() -> {
74-
String nextPageToken = null;
75-
List<Instance> zoneInstances = new ArrayList<>();
76-
do {
77-
Compute.Instances.List list = client().instances().list(project, zoneId).setPageToken(nextPageToken);
78-
InstanceList instanceList = list.execute();
79-
nextPageToken = instanceList.getNextPageToken();
80-
if (instanceList.isEmpty() == false && instanceList.getItems() != null) {
81-
zoneInstances.addAll(instanceList.getItems());
82-
}
83-
} while (nextPageToken != null);
84-
return zoneInstances;
85-
});
72+
String nextPageToken = null;
73+
List<Instance> zoneInstances = new ArrayList<>();
74+
do {
75+
Compute.Instances.List list = client().instances().list(project, zoneId).setPageToken(nextPageToken);
76+
InstanceList instanceList = list.execute();
77+
nextPageToken = instanceList.getNextPageToken();
78+
if (instanceList.isEmpty() == false && instanceList.getItems() != null) {
79+
zoneInstances.addAll(instanceList.getItems());
80+
}
81+
} while (nextPageToken != null);
82+
return zoneInstances;
8683
} catch (IOException e) {
8784
logger.warn(() -> "Problem fetching instance list for zone " + zoneId, e);
8885
logger.debug("Full exception:", e);
@@ -154,15 +151,15 @@ private List<String> resolveZones() {
154151

155152
String getAppEngineValueFromMetadataServer(String serviceURL) throws GeneralSecurityException, IOException {
156153
String metadata = GceMetadataService.GCE_HOST.get(settings);
157-
GenericUrl url = Access.doPrivileged(() -> new GenericUrl(metadata + serviceURL));
154+
GenericUrl url = new GenericUrl(metadata + serviceURL);
158155

159156
HttpTransport httpTransport = getGceHttpTransport();
160157
HttpRequestFactory requestFactory = httpTransport.createRequestFactory();
161158
HttpRequest request = requestFactory.buildGetRequest(url)
162159
.setConnectTimeout(500)
163160
.setReadTimeout(500)
164161
.setHeaders(new HttpHeaders().set("Metadata-Flavor", "Google"));
165-
HttpResponse response = Access.doPrivilegedIOException(() -> request.execute());
162+
HttpResponse response = request.execute();
166163
return headerContainsMetadataFlavor(response) ? response.parseAsString() : null;
167164
}
168165

@@ -213,7 +210,7 @@ public synchronized Compute client() {
213210

214211
// hack around code messiness in GCE code
215212
// TODO: get this fixed
216-
Access.doPrivilegedIOException(credential::refreshToken);
213+
credential.refreshToken();
217214

218215
logger.debug("token [{}] will expire in [{}] s", credential.getAccessToken(), credential.getExpiresInSeconds());
219216
if (credential.getExpiresInSeconds() != null) {

plugins/discovery-gce/src/main/java/org/elasticsearch/cloud/gce/GceMetadataService.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import com.google.api.client.http.HttpResponse;
1616
import com.google.api.client.http.HttpTransport;
1717

18-
import org.elasticsearch.cloud.gce.util.Access;
1918
import org.elasticsearch.common.component.AbstractLifecycleComponent;
2019
import org.elasticsearch.common.settings.Setting;
2120
import org.elasticsearch.common.settings.Settings;
@@ -68,14 +67,12 @@ public String metadata(String metadataPath) throws IOException, URISyntaxExcepti
6867
try {
6968
// hack around code messiness in GCE code
7069
// TODO: get this fixed
71-
headers = Access.doPrivileged(HttpHeaders::new);
72-
GenericUrl genericUrl = Access.doPrivileged(() -> new GenericUrl(urlMetadataNetwork));
70+
headers = new HttpHeaders();
71+
GenericUrl genericUrl = new GenericUrl(urlMetadataNetwork);
7372

7473
// This is needed to query meta data: https://cloud.google.com/compute/docs/metadata
7574
headers.put("Metadata-Flavor", "Google");
76-
HttpResponse response = Access.doPrivilegedIOException(
77-
() -> getGceHttpTransport().createRequestFactory().buildGetRequest(genericUrl).setHeaders(headers).execute()
78-
);
75+
HttpResponse response = getGceHttpTransport().createRequestFactory().buildGetRequest(genericUrl).setHeaders(headers).execute();
7976
String metadata = response.parseAsString();
8077
logger.debug("metadata found [{}]", metadata);
8178
return metadata;

plugins/discovery-gce/src/main/java/org/elasticsearch/cloud/gce/network/GceNameResolver.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@
1010
package org.elasticsearch.cloud.gce.network;
1111

1212
import org.elasticsearch.cloud.gce.GceMetadataService;
13-
import org.elasticsearch.cloud.gce.util.Access;
1413
import org.elasticsearch.common.Strings;
1514
import org.elasticsearch.common.network.NetworkService.CustomNameResolver;
1615

1716
import java.io.IOException;
1817
import java.net.InetAddress;
18+
import java.net.URISyntaxException;
1919

2020
/**
2121
* <p>Resolves certain GCE related 'meta' hostnames into an actual hostname
@@ -97,13 +97,13 @@ private InetAddress[] resolve(String value) throws IOException {
9797
}
9898

9999
try {
100-
String metadataResult = Access.doPrivilegedIOException(() -> gceMetadataService.metadata(gceMetadataPath));
100+
String metadataResult = gceMetadataService.metadata(gceMetadataPath);
101101
if (metadataResult == null || metadataResult.length() == 0) {
102102
throw new IOException("no gce metadata returned from [" + gceMetadataPath + "] for [" + value + "]");
103103
}
104104
// only one address: because we explicitly ask for only one via the GceHostnameType
105105
return new InetAddress[] { InetAddress.getByName(metadataResult) };
106-
} catch (IOException e) {
106+
} catch (URISyntaxException | IOException e) {
107107
throw new IOException("IOException caught when fetching InetAddress from [" + gceMetadataPath + "]", e);
108108
}
109109
}

plugins/discovery-gce/src/main/java/org/elasticsearch/cloud/gce/util/Access.java

Lines changed: 0 additions & 54 deletions
This file was deleted.

plugins/discovery-gce/src/main/java/org/elasticsearch/discovery/gce/RetryHttpInitializerWrapper.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import com.google.api.client.util.ExponentialBackOff;
2121
import com.google.api.client.util.Sleeper;
2222

23-
import org.elasticsearch.cloud.gce.util.Access;
2423
import org.elasticsearch.core.TimeValue;
2524
import org.elasticsearch.logging.LogManager;
2625
import org.elasticsearch.logging.Logger;
@@ -60,7 +59,7 @@ public RetryHttpInitializerWrapper(Credential wrappedCredential, TimeValue maxWa
6059
// Use only for testing
6160
static MockGoogleCredential.Builder newMockCredentialBuilder() {
6261
// TODO: figure out why GCE is so bad like this
63-
return Access.doPrivileged(MockGoogleCredential.Builder::new);
62+
return new MockGoogleCredential.Builder();
6463
}
6564

6665
@Override

plugins/discovery-gce/src/main/java/org/elasticsearch/plugin/discovery/gce/GceDiscoveryPlugin.java

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,11 @@
99

1010
package org.elasticsearch.plugin.discovery.gce;
1111

12-
import com.google.api.client.http.HttpHeaders;
13-
import com.google.api.client.util.ClassInfo;
14-
1512
import org.apache.lucene.util.SetOnce;
1613
import org.elasticsearch.cloud.gce.GceInstancesService;
1714
import org.elasticsearch.cloud.gce.GceInstancesServiceImpl;
1815
import org.elasticsearch.cloud.gce.GceMetadataService;
1916
import org.elasticsearch.cloud.gce.network.GceNameResolver;
20-
import org.elasticsearch.cloud.gce.util.Access;
2117
import org.elasticsearch.common.network.NetworkService;
2218
import org.elasticsearch.common.settings.Setting;
2319
import org.elasticsearch.common.settings.Settings;
@@ -53,18 +49,6 @@ public class GceDiscoveryPlugin extends Plugin implements DiscoveryPlugin, Close
5349
// stashed when created in order to properly close
5450
private final SetOnce<GceInstancesService> gceInstancesService = new SetOnce<>();
5551

56-
static {
57-
/*
58-
* GCE's http client changes access levels because its silly and we
59-
* can't allow that on any old stack so we pull it here, up front,
60-
* so we can cleanly check the permissions for it. Without this changing
61-
* the permission can fail if any part of core is on the stack because
62-
* our plugin permissions don't allow core to "reach through" plugins to
63-
* change the permission. Because that'd be silly.
64-
*/
65-
Access.doPrivilegedVoid(() -> ClassInfo.of(HttpHeaders.class, true));
66-
}
67-
6852
public GceDiscoveryPlugin(Settings settings) {
6953
this.settings = settings;
7054
logger.trace("starting gce discovery plugin...");

0 commit comments

Comments
 (0)