Skip to content

Commit 90f8f62

Browse files
GEODE-3974: Improve permissions for geode-modules functions (#1258)
1 parent 15ae789 commit 90f8f62

File tree

7 files changed

+145
-4
lines changed

7 files changed

+145
-4
lines changed

extensions/geode-modules/src/main/java/org/apache/geode/modules/util/BootstrappingFunction.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
import java.io.DataInput;
1818
import java.io.DataOutput;
1919
import java.io.IOException;
20+
import java.util.Collection;
21+
import java.util.Collections;
2022
import java.util.List;
2123
import java.util.Set;
2224

@@ -32,6 +34,8 @@
3234
import org.apache.geode.distributed.internal.InternalDistributedSystem;
3335
import org.apache.geode.distributed.internal.MembershipListener;
3436
import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
37+
import org.apache.geode.management.internal.security.ResourcePermissions;
38+
import org.apache.geode.security.ResourcePermission;
3539

3640
public class BootstrappingFunction implements Function, MembershipListener, DataSerializable {
3741

@@ -87,6 +91,11 @@ private Cache verifyCacheExists() {
8791
return cache;
8892
}
8993

94+
@Override
95+
public Collection<ResourcePermission> getRequiredPermissions(String regionName) {
96+
return Collections.singletonList(ResourcePermissions.CLUSTER_MANAGE);
97+
}
98+
9099
private void registerAsMembershipListener(Cache cache) {
91100
DistributionManager dm =
92101
((InternalDistributedSystem) cache.getDistributedSystem()).getDistributionManager();

extensions/geode-modules/src/main/java/org/apache/geode/modules/util/CreateRegionFunction.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@
2020
import java.io.FileWriter;
2121
import java.io.IOException;
2222
import java.io.PrintWriter;
23+
import java.util.Collection;
24+
import java.util.Collections;
2325
import java.util.Properties;
2426

25-
import javax.xml.crypto.Data;
26-
2727
import org.apache.geode.DataSerializable;
2828
import org.apache.geode.InternalGemFireError;
2929
import org.apache.geode.cache.AttributesFactory;
@@ -32,8 +32,6 @@
3232
import org.apache.geode.cache.Declarable;
3333
import org.apache.geode.cache.Region;
3434
import org.apache.geode.cache.RegionAttributes;
35-
import org.apache.geode.cache.RegionFactory;
36-
import org.apache.geode.cache.RegionShortcut;
3735
import org.apache.geode.cache.Scope;
3836
import org.apache.geode.cache.client.ClientCache;
3937
import org.apache.geode.cache.execute.Function;
@@ -46,6 +44,8 @@
4644
import org.apache.geode.internal.cache.PartitionedRegion;
4745
import org.apache.geode.internal.cache.xmlcache.CacheXmlGenerator;
4846
import org.apache.geode.internal.i18n.LocalizedStrings;
47+
import org.apache.geode.management.internal.security.ResourcePermissions;
48+
import org.apache.geode.security.ResourcePermission;
4949

5050
public class CreateRegionFunction implements Function, Declarable, DataSerializable {
5151

@@ -96,6 +96,11 @@ public void execute(FunctionContext context) {
9696
context.getResultSender().lastResult(status);
9797
}
9898

99+
@Override
100+
public Collection<ResourcePermission> getRequiredPermissions(String regionName) {
101+
return Collections.singletonList(ResourcePermissions.DATA_MANAGE);
102+
}
103+
99104
private RegionStatus createOrRetrieveRegion(RegionConfiguration configuration) {
100105
RegionStatus status = null;
101106
String regionName = configuration.getRegionName();

extensions/geode-modules/src/main/java/org/apache/geode/modules/util/RegionSizeFunction.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,16 @@
1717
import java.io.DataInput;
1818
import java.io.DataOutput;
1919
import java.io.IOException;
20+
import java.util.Collection;
21+
import java.util.Collections;
2022
import java.util.Properties;
2123

2224
import org.apache.geode.DataSerializable;
2325
import org.apache.geode.cache.Declarable;
2426
import org.apache.geode.cache.execute.Function;
2527
import org.apache.geode.cache.execute.FunctionContext;
2628
import org.apache.geode.cache.execute.RegionFunctionContext;
29+
import org.apache.geode.security.ResourcePermission;
2730

2831
public class RegionSizeFunction implements Function, Declarable, DataSerializable {
2932

@@ -38,6 +41,12 @@ public void execute(FunctionContext context) {
3841
context.getResultSender().lastResult(rfc.getDataSet().size());
3942
}
4043

44+
@Override
45+
public Collection<ResourcePermission> getRequiredPermissions(String regionName) {
46+
return Collections.singletonList(new ResourcePermission(ResourcePermission.Resource.DATA,
47+
ResourcePermission.Operation.READ, regionName));
48+
}
49+
4150
public String getId() {
4251
return ID;
4352
}

extensions/geode-modules/src/main/java/org/apache/geode/modules/util/TouchPartitionedRegionEntriesFunction.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
import java.io.DataInput;
1818
import java.io.DataOutput;
1919
import java.io.IOException;
20+
import java.util.Collection;
21+
import java.util.Collections;
2022
import java.util.Properties;
2123
import java.util.Set;
2224

@@ -29,6 +31,7 @@
2931
import org.apache.geode.cache.execute.FunctionContext;
3032
import org.apache.geode.cache.execute.RegionFunctionContext;
3133
import org.apache.geode.cache.partition.PartitionRegionHelper;
34+
import org.apache.geode.security.ResourcePermission;
3235

3336
/**
3437
* Touches the keys contained in the set of keys by performing a get on the partitioned region.
@@ -76,6 +79,12 @@ public void execute(FunctionContext context) {
7679
context.getResultSender().lastResult(true);
7780
}
7881

82+
@Override
83+
public Collection<ResourcePermission> getRequiredPermissions(String regionName) {
84+
return Collections.singletonList(new ResourcePermission(ResourcePermission.Resource.DATA,
85+
ResourcePermission.Operation.READ, regionName));
86+
}
87+
7988
public String getId() {
8089
return ID;
8190
}

extensions/geode-modules/src/main/java/org/apache/geode/modules/util/TouchReplicatedRegionEntriesFunction.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
import java.io.DataInput;
1818
import java.io.DataOutput;
1919
import java.io.IOException;
20+
import java.util.Collection;
21+
import java.util.Collections;
2022
import java.util.Properties;
2123
import java.util.Set;
2224

@@ -27,6 +29,7 @@
2729
import org.apache.geode.cache.Region;
2830
import org.apache.geode.cache.execute.Function;
2931
import org.apache.geode.cache.execute.FunctionContext;
32+
import org.apache.geode.security.ResourcePermission;
3033

3134
/**
3235
* Touches the keys contained in the set of keys by performing a get on the replicated region. This
@@ -71,6 +74,12 @@ public void execute(FunctionContext context) {
7174
context.getResultSender().lastResult(true);
7275
}
7376

77+
@Override
78+
public Collection<ResourcePermission> getRequiredPermissions(String regionName) {
79+
return Collections.singletonList(new ResourcePermission(ResourcePermission.Resource.DATA,
80+
ResourcePermission.Operation.READ, regionName));
81+
}
82+
7483
public String getId() {
7584
return ID;
7685
}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
3+
* agreements. See the NOTICE file distributed with this work for additional information regarding
4+
* copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
5+
* "License"); you may not use this file except in compliance with the License. You may obtain a
6+
* copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software distributed under the License
11+
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
12+
* or implied. See the License for the specific language governing permissions and limitations under
13+
* the License.
14+
*/
15+
16+
package org.apache.geode.modules.util;
17+
18+
import org.junit.BeforeClass;
19+
import org.junit.ClassRule;
20+
import org.junit.Rule;
21+
import org.junit.Test;
22+
import org.junit.experimental.categories.Category;
23+
24+
import org.apache.geode.cache.RegionShortcut;
25+
import org.apache.geode.cache.execute.FunctionService;
26+
import org.apache.geode.examples.SimpleSecurityManager;
27+
import org.apache.geode.test.junit.categories.IntegrationTest;
28+
import org.apache.geode.test.junit.categories.SecurityTest;
29+
import org.apache.geode.test.junit.rules.ConnectionConfiguration;
30+
import org.apache.geode.test.junit.rules.GfshCommandRule;
31+
import org.apache.geode.test.junit.rules.ServerStarterRule;
32+
33+
@Category({IntegrationTest.class, SecurityTest.class})
34+
public class ModuleFunctionsSecurityTest {
35+
36+
@ClassRule
37+
public static ServerStarterRule server =
38+
new ServerStarterRule().withJMXManager().withSecurityManager(SimpleSecurityManager.class)
39+
.withRegion(RegionShortcut.REPLICATE, "REPLICATE_1")
40+
.withRegion(RegionShortcut.PARTITION, "PARTITION_1").withAutoStart();
41+
42+
@Rule
43+
public GfshCommandRule gfsh =
44+
new GfshCommandRule(server::getJmxPort, GfshCommandRule.PortType.jmxManager);
45+
46+
@BeforeClass
47+
public static void setupClass() {
48+
FunctionService.registerFunction(new BootstrappingFunction());
49+
FunctionService.registerFunction(new CreateRegionFunction());
50+
FunctionService.registerFunction(new RegionSizeFunction());
51+
FunctionService.registerFunction(new TouchPartitionedRegionEntriesFunction());
52+
FunctionService.registerFunction(new TouchReplicatedRegionEntriesFunction());
53+
}
54+
55+
@Test
56+
@ConnectionConfiguration(user = "dataWrite", password = "dataWrite")
57+
public void testInvalidPermissionsForBootstrappingFunction() throws Exception {
58+
gfsh.executeAndAssertThat("execute function --id=" + BootstrappingFunction.ID)
59+
.containsOutput("not authorized for CLUSTER:MANAGE").statusIsSuccess();
60+
}
61+
62+
@Test
63+
@ConnectionConfiguration(user = "dataWrite", password = "dataWrite")
64+
public void testInvalidPermissionsForCreateRegionFunction() throws Exception {
65+
gfsh.executeAndAssertThat("execute function --id=" + CreateRegionFunction.ID)
66+
.containsOutput("not authorized for DATA:MANAGE").statusIsSuccess();
67+
}
68+
69+
@Test
70+
@ConnectionConfiguration(user = "dataWrite", password = "dataWrite")
71+
public void testInvalidPermissionsForRegionSizeFunction() throws Exception {
72+
gfsh.executeAndAssertThat("execute function --region=REPLICATE_1 --id=" + RegionSizeFunction.ID)
73+
.containsOutput("not authorized for DATA:READ:REPLICATE_1").statusIsSuccess();
74+
}
75+
76+
@Test
77+
@ConnectionConfiguration(user = "dataWrite", password = "dataWrite")
78+
public void testInvalidPermissionsForTouchPartitionedRegionEntriesFunction() throws Exception {
79+
gfsh.executeAndAssertThat(
80+
"execute function --region=PARTITION_1 --id=" + TouchPartitionedRegionEntriesFunction.ID)
81+
.containsOutput("not authorized for DATA:READ:PARTITION_1").statusIsSuccess();
82+
}
83+
84+
@Test
85+
@ConnectionConfiguration(user = "dataWrite", password = "dataWrite")
86+
public void testInvalidPermissionsForTouchReplicatedRegionEntriesFunction() throws Exception {
87+
gfsh.executeAndAssertThat(
88+
"execute function --region=REPLICATE_1 --id=" + TouchReplicatedRegionEntriesFunction.ID)
89+
.containsOutput("not authorized for DATA:READ:REPLICATE_1").statusIsSuccess();
90+
}
91+
}

geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/RegionCreateFunction.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
*/
1515
package org.apache.geode.management.internal.cli.functions;
1616

17+
import java.util.Collection;
18+
import java.util.Collections;
1719
import java.util.Set;
1820

1921
import org.apache.commons.lang.StringUtils;
@@ -49,6 +51,8 @@
4951
import org.apache.geode.management.internal.cli.i18n.CliStrings;
5052
import org.apache.geode.management.internal.cli.util.RegionPath;
5153
import org.apache.geode.management.internal.configuration.domain.XmlEntity;
54+
import org.apache.geode.management.internal.security.ResourcePermissions;
55+
import org.apache.geode.security.ResourcePermission;
5256

5357
/**
5458
*
@@ -121,6 +125,11 @@ public void execute(FunctionContext context) {
121125
}
122126
}
123127

128+
@Override
129+
public Collection<ResourcePermission> getRequiredPermissions(String regionName) {
130+
return Collections.singletonList(ResourcePermissions.DATA_MANAGE);
131+
}
132+
124133
private CliFunctionResult handleException(final String memberNameOrId, final String exceptionMsg,
125134
final Exception e) {
126135
if (e != null && logger.isDebugEnabled()) {

0 commit comments

Comments
 (0)