You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by sa...@apache.org on 2018/01/11 21:27:20 UTC

[geode] branch develop updated: GEODE-3974: Improve permissions for geode-connectors functions (#1265)

This is an automated email from the ASF dual-hosted git repository.

sai_boorlagadda pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/develop by this push:
     new 49d28f9  GEODE-3974: Improve permissions for geode-connectors functions (#1265)
49d28f9 is described below

commit 49d28f93fd2ef069693ce15d124ef3a29f22fb7d
Author: Sai Boorlagadda <sa...@gmail.com>
AuthorDate: Thu Jan 11 13:27:18 2018 -0800

    GEODE-3974: Improve permissions for geode-connectors functions (#1265)
---
 .../jdbc/internal/cli/AlterConnectionFunction.java |   9 ++
 .../jdbc/internal/cli/AlterMappingFunction.java    |   9 ++
 .../internal/cli/CreateConnectionFunction.java     |  10 ++
 .../jdbc/internal/cli/CreateMappingFunction.java   |  10 ++
 .../internal/cli/DescribeConnectionFunction.java   |  10 ++
 .../jdbc/internal/cli/DescribeMappingFunction.java |  10 ++
 .../internal/cli/DestroyConnectionFunction.java    |  10 ++
 .../jdbc/internal/cli/DestroyMappingFunction.java  |  10 ++
 .../jdbc/internal/cli/JdbcCliFunction.java         |  10 ++
 .../jdbc/internal/cli/ListConnectionFunction.java  |   9 ++
 .../jdbc/internal/cli/ListMappingFunction.java     |   9 ++
 .../cli/JDBCConnectorFunctionsSecurityTest.java    | 150 +++++++++++++++++++++
 12 files changed, 256 insertions(+)

diff --git a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/AlterConnectionFunction.java b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/AlterConnectionFunction.java
index 7ac8240..68a3cb7 100644
--- a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/AlterConnectionFunction.java
+++ b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/AlterConnectionFunction.java
@@ -14,6 +14,8 @@
  */
 package org.apache.geode.connectors.jdbc.internal.cli;
 
+import java.util.Collection;
+import java.util.Collections;
 import java.util.Map;
 
 import org.apache.geode.annotations.Experimental;
@@ -23,6 +25,8 @@ import org.apache.geode.connectors.jdbc.internal.ConnectionConfiguration;
 import org.apache.geode.connectors.jdbc.internal.JdbcConnectorService;
 import org.apache.geode.management.internal.cli.functions.CliFunctionResult;
 import org.apache.geode.management.internal.configuration.domain.XmlEntity;
+import org.apache.geode.management.internal.security.ResourcePermissions;
+import org.apache.geode.security.ResourcePermission;
 
 @Experimental
 public class AlterConnectionFunction
@@ -86,4 +90,9 @@ public class AlterConnectionFunction
     String message = "Altered JDBC connection " + connectionName + " on " + member;
     return new CliFunctionResult(member, xmlEntity, message);
   }
+
+  @Override
+  public Collection<ResourcePermission> getRequiredPermissions(String regionName) {
+    return Collections.singletonList(ResourcePermissions.CLUSTER_MANAGE);
+  }
 }
diff --git a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/AlterMappingFunction.java b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/AlterMappingFunction.java
index f7f0045..9d44c46 100644
--- a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/AlterMappingFunction.java
+++ b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/AlterMappingFunction.java
@@ -14,6 +14,8 @@
  */
 package org.apache.geode.connectors.jdbc.internal.cli;
 
+import java.util.Collection;
+import java.util.Collections;
 import java.util.Map;
 
 import org.apache.geode.annotations.Experimental;
@@ -23,6 +25,8 @@ import org.apache.geode.connectors.jdbc.internal.RegionMapping;
 import org.apache.geode.connectors.jdbc.internal.RegionMappingNotFoundException;
 import org.apache.geode.management.internal.cli.functions.CliFunctionResult;
 import org.apache.geode.management.internal.configuration.domain.XmlEntity;
+import org.apache.geode.management.internal.security.ResourcePermissions;
+import org.apache.geode.security.ResourcePermission;
 
 @Experimental
 public class AlterMappingFunction extends JdbcCliFunction<RegionMapping, CliFunctionResult> {
@@ -84,4 +88,9 @@ public class AlterMappingFunction extends JdbcCliFunction<RegionMapping, CliFunc
     String message = "Altered JDBC connection " + connectionName + " on " + member;
     return new CliFunctionResult(member, xmlEntity, message);
   }
+
+  @Override
+  public Collection<ResourcePermission> getRequiredPermissions(String regionName) {
+    return Collections.singletonList(ResourcePermissions.CLUSTER_MANAGE);
+  }
 }
diff --git a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/CreateConnectionFunction.java b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/CreateConnectionFunction.java
index 55b4358..65c5301 100644
--- a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/CreateConnectionFunction.java
+++ b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/CreateConnectionFunction.java
@@ -14,6 +14,9 @@
  */
 package org.apache.geode.connectors.jdbc.internal.cli;
 
+import java.util.Collection;
+import java.util.Collections;
+
 import org.apache.geode.annotations.Experimental;
 import org.apache.geode.cache.execute.FunctionContext;
 import org.apache.geode.connectors.jdbc.internal.ConnectionConfigExistsException;
@@ -21,6 +24,8 @@ import org.apache.geode.connectors.jdbc.internal.ConnectionConfiguration;
 import org.apache.geode.connectors.jdbc.internal.JdbcConnectorService;
 import org.apache.geode.management.internal.cli.functions.CliFunctionResult;
 import org.apache.geode.management.internal.configuration.domain.XmlEntity;
+import org.apache.geode.management.internal.security.ResourcePermissions;
+import org.apache.geode.security.ResourcePermission;
 
 @Experimental
 public class CreateConnectionFunction
@@ -53,4 +58,9 @@ public class CreateConnectionFunction
     String message = "Created JDBC connection " + connectionName + " on " + member;
     return new CliFunctionResult(member, xmlEntity, message);
   }
+
+  @Override
+  public Collection<ResourcePermission> getRequiredPermissions(String regionName) {
+    return Collections.singletonList(ResourcePermissions.CLUSTER_MANAGE);
+  }
 }
diff --git a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingFunction.java b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingFunction.java
index a7fb1a5..2b5f046 100644
--- a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingFunction.java
+++ b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingFunction.java
@@ -14,6 +14,9 @@
  */
 package org.apache.geode.connectors.jdbc.internal.cli;
 
+import java.util.Collection;
+import java.util.Collections;
+
 import org.apache.geode.annotations.Experimental;
 import org.apache.geode.cache.execute.FunctionContext;
 import org.apache.geode.connectors.jdbc.internal.JdbcConnectorService;
@@ -21,6 +24,8 @@ import org.apache.geode.connectors.jdbc.internal.RegionMapping;
 import org.apache.geode.connectors.jdbc.internal.RegionMappingExistsException;
 import org.apache.geode.management.internal.cli.functions.CliFunctionResult;
 import org.apache.geode.management.internal.configuration.domain.XmlEntity;
+import org.apache.geode.management.internal.security.ResourcePermissions;
+import org.apache.geode.security.ResourcePermission;
 
 @Experimental
 public class CreateMappingFunction extends JdbcCliFunction<RegionMapping, CliFunctionResult> {
@@ -57,4 +62,9 @@ public class CreateMappingFunction extends JdbcCliFunction<RegionMapping, CliFun
     String message = "Created JDBC mapping for region " + regionName + " on " + member;
     return new CliFunctionResult(member, xmlEntity, message);
   }
+
+  @Override
+  public Collection<ResourcePermission> getRequiredPermissions(String regionName) {
+    return Collections.singletonList(ResourcePermissions.CLUSTER_MANAGE);
+  }
 }
diff --git a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/DescribeConnectionFunction.java b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/DescribeConnectionFunction.java
index 73c1cb8..9f3feca 100644
--- a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/DescribeConnectionFunction.java
+++ b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/DescribeConnectionFunction.java
@@ -14,10 +14,15 @@
  */
 package org.apache.geode.connectors.jdbc.internal.cli;
 
+import java.util.Collection;
+import java.util.Collections;
+
 import org.apache.geode.annotations.Experimental;
 import org.apache.geode.cache.execute.FunctionContext;
 import org.apache.geode.connectors.jdbc.internal.ConnectionConfiguration;
 import org.apache.geode.connectors.jdbc.internal.JdbcConnectorService;
+import org.apache.geode.management.internal.security.ResourcePermissions;
+import org.apache.geode.security.ResourcePermission;
 
 @Experimental
 public class DescribeConnectionFunction extends JdbcCliFunction<String, ConnectionConfiguration> {
@@ -31,4 +36,9 @@ public class DescribeConnectionFunction extends JdbcCliFunction<String, Connecti
       FunctionContext<String> context) {
     return service.getConnectionConfig(context.getArguments());
   }
+
+  @Override
+  public Collection<ResourcePermission> getRequiredPermissions(String regionName) {
+    return Collections.singletonList(ResourcePermissions.CLUSTER_READ);
+  }
 }
diff --git a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/DescribeMappingFunction.java b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/DescribeMappingFunction.java
index 49c56a3..d8b54a0 100644
--- a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/DescribeMappingFunction.java
+++ b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/DescribeMappingFunction.java
@@ -14,10 +14,15 @@
  */
 package org.apache.geode.connectors.jdbc.internal.cli;
 
+import java.util.Collection;
+import java.util.Collections;
+
 import org.apache.geode.annotations.Experimental;
 import org.apache.geode.cache.execute.FunctionContext;
 import org.apache.geode.connectors.jdbc.internal.JdbcConnectorService;
 import org.apache.geode.connectors.jdbc.internal.RegionMapping;
+import org.apache.geode.management.internal.security.ResourcePermissions;
+import org.apache.geode.security.ResourcePermission;
 
 @Experimental
 public class DescribeMappingFunction extends JdbcCliFunction<String, RegionMapping> {
@@ -30,4 +35,9 @@ public class DescribeMappingFunction extends JdbcCliFunction<String, RegionMappi
   RegionMapping getFunctionResult(JdbcConnectorService service, FunctionContext<String> context) {
     return service.getMappingForRegion(context.getArguments());
   }
+
+  @Override
+  public Collection<ResourcePermission> getRequiredPermissions(String regionName) {
+    return Collections.singletonList(ResourcePermissions.CLUSTER_READ);
+  }
 }
diff --git a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/DestroyConnectionFunction.java b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/DestroyConnectionFunction.java
index e69710d..de81353 100644
--- a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/DestroyConnectionFunction.java
+++ b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/DestroyConnectionFunction.java
@@ -14,12 +14,17 @@
  */
 package org.apache.geode.connectors.jdbc.internal.cli;
 
+import java.util.Collection;
+import java.util.Collections;
+
 import org.apache.geode.annotations.Experimental;
 import org.apache.geode.cache.execute.FunctionContext;
 import org.apache.geode.connectors.jdbc.internal.ConnectionConfiguration;
 import org.apache.geode.connectors.jdbc.internal.JdbcConnectorService;
 import org.apache.geode.management.internal.cli.functions.CliFunctionResult;
 import org.apache.geode.management.internal.configuration.domain.XmlEntity;
+import org.apache.geode.management.internal.security.ResourcePermissions;
+import org.apache.geode.security.ResourcePermission;
 
 @Experimental
 public class DestroyConnectionFunction extends JdbcCliFunction<String, CliFunctionResult> {
@@ -76,4 +81,9 @@ public class DestroyConnectionFunction extends JdbcCliFunction<String, CliFuncti
     String message = "Connection named \"" + connectionName + "\" not found";
     return new CliFunctionResult(member, false, message);
   }
+
+  @Override
+  public Collection<ResourcePermission> getRequiredPermissions(String regionName) {
+    return Collections.singletonList(ResourcePermissions.CLUSTER_MANAGE);
+  }
 }
diff --git a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/DestroyMappingFunction.java b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/DestroyMappingFunction.java
index 643aea6..9f739ed 100644
--- a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/DestroyMappingFunction.java
+++ b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/DestroyMappingFunction.java
@@ -14,12 +14,17 @@
  */
 package org.apache.geode.connectors.jdbc.internal.cli;
 
+import java.util.Collection;
+import java.util.Collections;
+
 import org.apache.geode.annotations.Experimental;
 import org.apache.geode.cache.execute.FunctionContext;
 import org.apache.geode.connectors.jdbc.internal.JdbcConnectorService;
 import org.apache.geode.connectors.jdbc.internal.RegionMapping;
 import org.apache.geode.management.internal.cli.functions.CliFunctionResult;
 import org.apache.geode.management.internal.configuration.domain.XmlEntity;
+import org.apache.geode.management.internal.security.ResourcePermissions;
+import org.apache.geode.security.ResourcePermission;
 
 @Experimental
 public class DestroyMappingFunction extends JdbcCliFunction<String, CliFunctionResult> {
@@ -76,4 +81,9 @@ public class DestroyMappingFunction extends JdbcCliFunction<String, CliFunctionR
     String message = "Region mapping for region \"" + regionName + "\" not found";
     return new CliFunctionResult(member, false, message);
   }
+
+  @Override
+  public Collection<ResourcePermission> getRequiredPermissions(String regionName) {
+    return Collections.singletonList(ResourcePermissions.CLUSTER_MANAGE);
+  }
 }
diff --git a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/JdbcCliFunction.java b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/JdbcCliFunction.java
index 3cc583d..fc39da0 100644
--- a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/JdbcCliFunction.java
+++ b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/JdbcCliFunction.java
@@ -14,12 +14,17 @@
  */
 package org.apache.geode.connectors.jdbc.internal.cli;
 
+import java.util.Collection;
+import java.util.Collections;
+
 import org.apache.geode.annotations.Experimental;
 import org.apache.geode.cache.execute.Function;
 import org.apache.geode.cache.execute.FunctionContext;
 import org.apache.geode.connectors.jdbc.internal.JdbcConnectorService;
 import org.apache.geode.internal.InternalEntity;
 import org.apache.geode.management.internal.configuration.domain.XmlEntity;
+import org.apache.geode.management.internal.security.ResourcePermissions;
+import org.apache.geode.security.ResourcePermission;
 
 @Experimental
 public abstract class JdbcCliFunction<T1, T2> implements Function<T1>, InternalEntity {
@@ -54,6 +59,11 @@ public abstract class JdbcCliFunction<T1, T2> implements Function<T1>, InternalE
     }
   }
 
+  @Override
+  public Collection<ResourcePermission> getRequiredPermissions(String regionName) {
+    return Collections.singletonList(ResourcePermissions.CLUSTER_READ);
+  }
+
   String getMember(FunctionContext<T1> context) {
     return argumentProvider.getMember(context);
   }
diff --git a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/ListConnectionFunction.java b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/ListConnectionFunction.java
index 58866a6..23926bc 100644
--- a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/ListConnectionFunction.java
+++ b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/ListConnectionFunction.java
@@ -14,12 +14,16 @@
  */
 package org.apache.geode.connectors.jdbc.internal.cli;
 
+import java.util.Collection;
+import java.util.Collections;
 import java.util.Set;
 
 import org.apache.geode.annotations.Experimental;
 import org.apache.geode.cache.execute.FunctionContext;
 import org.apache.geode.connectors.jdbc.internal.ConnectionConfiguration;
 import org.apache.geode.connectors.jdbc.internal.JdbcConnectorService;
+import org.apache.geode.management.internal.security.ResourcePermissions;
+import org.apache.geode.security.ResourcePermission;
 
 @Experimental
 public class ListConnectionFunction extends JdbcCliFunction<Void, ConnectionConfiguration[]> {
@@ -42,4 +46,9 @@ public class ListConnectionFunction extends JdbcCliFunction<Void, ConnectionConf
   private Set<ConnectionConfiguration> getConnectionConfigs(JdbcConnectorService service) {
     return service.getConnectionConfigs();
   }
+
+  @Override
+  public Collection<ResourcePermission> getRequiredPermissions(String regionName) {
+    return Collections.singletonList(ResourcePermissions.CLUSTER_READ);
+  }
 }
diff --git a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/ListMappingFunction.java b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/ListMappingFunction.java
index 7b472e1..15497a0 100644
--- a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/ListMappingFunction.java
+++ b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/ListMappingFunction.java
@@ -14,12 +14,16 @@
  */
 package org.apache.geode.connectors.jdbc.internal.cli;
 
+import java.util.Collection;
+import java.util.Collections;
 import java.util.Set;
 
 import org.apache.geode.annotations.Experimental;
 import org.apache.geode.cache.execute.FunctionContext;
 import org.apache.geode.connectors.jdbc.internal.JdbcConnectorService;
 import org.apache.geode.connectors.jdbc.internal.RegionMapping;
+import org.apache.geode.management.internal.security.ResourcePermissions;
+import org.apache.geode.security.ResourcePermission;
 
 @Experimental
 public class ListMappingFunction extends JdbcCliFunction<Void, RegionMapping[]> {
@@ -41,4 +45,9 @@ public class ListMappingFunction extends JdbcCliFunction<Void, RegionMapping[]>
   private Set<RegionMapping> getRegionMappings(JdbcConnectorService service) {
     return service.getRegionMappings();
   }
+
+  @Override
+  public Collection<ResourcePermission> getRequiredPermissions(String regionName) {
+    return Collections.singletonList(ResourcePermissions.CLUSTER_READ);
+  }
 }
diff --git a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/cli/JDBCConnectorFunctionsSecurityTest.java b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/cli/JDBCConnectorFunctionsSecurityTest.java
new file mode 100644
index 0000000..050bfc8
--- /dev/null
+++ b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/cli/JDBCConnectorFunctionsSecurityTest.java
@@ -0,0 +1,150 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package org.apache.geode.connectors.jdbc.internal.cli;
+
+import org.junit.BeforeClass;
+import org.junit.ClassRule;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+import org.apache.geode.cache.execute.Function;
+import org.apache.geode.cache.execute.FunctionContext;
+import org.apache.geode.cache.execute.FunctionService;
+import org.apache.geode.connectors.jdbc.internal.JdbcConnectorService;
+import org.apache.geode.examples.SimpleSecurityManager;
+import org.apache.geode.management.internal.cli.functions.CliFunctionResult;
+import org.apache.geode.test.junit.categories.IntegrationTest;
+import org.apache.geode.test.junit.rules.ConnectionConfiguration;
+import org.apache.geode.test.junit.rules.GfshCommandRule;
+import org.apache.geode.test.junit.rules.ServerStarterRule;
+
+class InheritsDefaultPermissionsJDBCFunction extends JdbcCliFunction<String, CliFunctionResult> {
+
+  InheritsDefaultPermissionsJDBCFunction() {
+    super(new FunctionContextArgumentProvider(), new ExceptionHandler());
+  }
+
+  @Override
+  CliFunctionResult getFunctionResult(JdbcConnectorService service,
+      FunctionContext<String> context) {
+    return new CliFunctionResult();
+  }
+}
+
+
+@Category({IntegrationTest.class, SecurityException.class})
+public class JDBCConnectorFunctionsSecurityTest {
+
+  private static Function alterConnectionFunction = new AlterConnectionFunction();
+  private static Function alterMappingFunction = new AlterMappingFunction();
+  private static Function createConnectionFunction = new CreateConnectionFunction();
+  private static Function createMappingFunction = new CreateMappingFunction();
+  private static Function describeConnectionFunction = new DescribeConnectionFunction();
+  private static Function describeMappingFunction = new DescribeMappingFunction();
+  private static Function destroyConnectionFunction = new DestroyConnectionFunction();
+  private static Function destroyMappingFunction = new DestroyMappingFunction();
+  private static Function listConnectionFunction = new ListConnectionFunction();
+  private static Function listMappingFunction = new ListMappingFunction();
+  private static Function inheritsDefaultPermissionsFunction =
+      new InheritsDefaultPermissionsJDBCFunction();
+
+  @ClassRule
+  public static ServerStarterRule server = new ServerStarterRule().withJMXManager()
+      .withSecurityManager(SimpleSecurityManager.class).withAutoStart();
+
+  @Rule
+  public GfshCommandRule gfsh =
+      new GfshCommandRule(server::getJmxPort, GfshCommandRule.PortType.jmxManager);
+
+  @BeforeClass
+  public static void setupClass() {
+    FunctionService.registerFunction(alterConnectionFunction);
+    FunctionService.registerFunction(alterMappingFunction);
+    FunctionService.registerFunction(createConnectionFunction);
+    FunctionService.registerFunction(createMappingFunction);
+    FunctionService.registerFunction(describeConnectionFunction);
+    FunctionService.registerFunction(describeMappingFunction);
+    FunctionService.registerFunction(destroyConnectionFunction);
+    FunctionService.registerFunction(destroyMappingFunction);
+    FunctionService.registerFunction(listConnectionFunction);
+    FunctionService.registerFunction(listMappingFunction);
+    FunctionService.registerFunction(inheritsDefaultPermissionsFunction);
+  }
+
+  @Test
+  @ConnectionConfiguration(user = "dataWrite", password = "dataWrite")
+  public void testInvalidPermissionsForAlterConnectionFunction() throws Exception {
+    gfsh.executeAndAssertThat("execute function --id=" + alterConnectionFunction.getId())
+        .containsOutput("not authorized for CLUSTER:MANAGE").statusIsSuccess();
+  }
+
+  @Test
+  @ConnectionConfiguration(user = "dataWrite", password = "dataWrite")
+  public void testInvalidPermissionsForAlterMappingFunction() throws Exception {
+    gfsh.executeAndAssertThat("execute function --id=" + alterMappingFunction.getId())
+        .containsOutput("not authorized for CLUSTER:MANAGE").statusIsSuccess();
+  }
+
+  @Test
+  @ConnectionConfiguration(user = "dataWrite", password = "dataWrite")
+  public void testInvalidPermissionsForCreateConnectionFunction() throws Exception {
+    gfsh.executeAndAssertThat("execute function --id=" + createConnectionFunction.getId())
+        .containsOutput("not authorized for CLUSTER:MANAGE").statusIsSuccess();
+  }
+
+  @Test
+  @ConnectionConfiguration(user = "dataWrite", password = "dataWrite")
+  public void testInvalidPermissionsForCreateMappingFunction() throws Exception {
+    gfsh.executeAndAssertThat("execute function --id=" + createMappingFunction.getId())
+        .containsOutput("not authorized for CLUSTER:MANAGE").statusIsSuccess();
+  }
+
+  @Test
+  @ConnectionConfiguration(user = "dataWrite", password = "dataWrite")
+  public void testInvalidPermissionsForDescribeConnectionFunction() throws Exception {
+    gfsh.executeAndAssertThat("execute function --id=" + describeConnectionFunction.getId())
+        .containsOutput("not authorized for CLUSTER:READ").statusIsSuccess();
+  }
+
+  @Test
+  @ConnectionConfiguration(user = "dataWrite", password = "dataWrite")
+  public void testInvalidPermissionsForDescribeMappingFunction() throws Exception {
+    gfsh.executeAndAssertThat("execute function --id=" + describeMappingFunction.getId())
+        .containsOutput("not authorized for CLUSTER:READ").statusIsSuccess();
+  }
+
+  @Test
+  @ConnectionConfiguration(user = "dataWrite", password = "dataWrite")
+  public void testInvalidPermissionsForDestroyConnectionFunction() throws Exception {
+    gfsh.executeAndAssertThat("execute function --id=" + destroyConnectionFunction.getId())
+        .containsOutput("not authorized for CLUSTER:MANAGE").statusIsSuccess();
+  }
+
+  @Test
+  @ConnectionConfiguration(user = "dataWrite", password = "dataWrite")
+  public void testInvalidPermissionsForDestroyMappingFunction() throws Exception {
+    gfsh.executeAndAssertThat("execute function --id=" + destroyMappingFunction.getId())
+        .containsOutput("not authorized for CLUSTER:MANAGE").statusIsSuccess();
+  }
+
+  @Test
+  @ConnectionConfiguration(user = "dataWrite", password = "dataWrite")
+  public void testInvalidPermissionsForFunctionInheritingDefaultPermissions() throws Exception {
+    gfsh.executeAndAssertThat("execute function --id=" + inheritsDefaultPermissionsFunction.getId())
+        .containsOutput("not authorized for CLUSTER:READ").statusIsSuccess();
+  }
+}

-- 
To stop receiving notification emails like this one, please contact
['"commits@geode.apache.org" <co...@geode.apache.org>'].