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

mpetrov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new a8ec750c4dd IGNITE-18910 Added ability for Security Plugin to extend 
pool of Ignite trusted types. (#10565)
a8ec750c4dd is described below

commit a8ec750c4dd059a47112ed8f4d105c1f71e7e412
Author: Mikhail Petrov <[email protected]>
AuthorDate: Tue Mar 14 15:26:21 2023 +0300

    IGNITE-18910 Added ability for Security Plugin to extend pool of Ignite 
trusted types. (#10565)
---
 .../ignite/common/ComputeTaskPermissionsTest.java  | 19 +++-----
 .../GridResourceProxiedIgniteInjector.java         |  8 +++-
 .../processors/security/GridSecurityProcessor.java | 12 +++++
 .../processors/security/IgniteSecurity.java        | 11 +++++
 .../processors/security/IgniteSecurityAdapter.java | 54 ++++++++++++++++++++++
 .../security/IgniteSecurityProcessor.java          | 17 ++++---
 .../security/NoOpIgniteSecurityProcessor.java      |  3 +-
 .../processors/security/SecurityUtils.java         | 25 +---------
 .../processors/task/GridTaskProcessor.java         |  3 +-
 .../internal/processors/task/GridTaskWorker.java   |  9 ++--
 .../security/impl/TestSecurityProcessor.java       | 14 ++++++
 11 files changed, 120 insertions(+), 55 deletions(-)

diff --git 
a/modules/clients/src/test/java/org/apache/ignite/common/ComputeTaskPermissionsTest.java
 
b/modules/clients/src/test/java/org/apache/ignite/common/ComputeTaskPermissionsTest.java
index d10b78862b0..f130913f2d7 100644
--- 
a/modules/clients/src/test/java/org/apache/ignite/common/ComputeTaskPermissionsTest.java
+++ 
b/modules/clients/src/test/java/org/apache/ignite/common/ComputeTaskPermissionsTest.java
@@ -22,7 +22,6 @@ import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
-import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Future;
@@ -57,7 +56,6 @@ import 
org.apache.ignite.internal.processors.security.AbstractSecurityTest;
 import org.apache.ignite.internal.processors.security.OperationSecurityContext;
 import org.apache.ignite.internal.processors.security.PublicAccessJob;
 import org.apache.ignite.internal.processors.security.SecurityContext;
-import org.apache.ignite.internal.processors.security.SecurityUtils;
 import 
org.apache.ignite.internal.processors.security.compute.ComputePermissionCheckTest;
 import org.apache.ignite.internal.processors.security.impl.TestSecurityData;
 import 
org.apache.ignite.internal.processors.security.impl.TestSecurityPluginProvider;
@@ -66,7 +64,6 @@ import 
org.apache.ignite.internal.util.lang.gridfunc.AtomicIntegerFactoryCallabl
 import org.apache.ignite.internal.util.lang.gridfunc.RunnableWrapperClosure;
 import org.apache.ignite.internal.util.lang.gridfunc.ToStringClosure;
 import org.apache.ignite.internal.util.typedef.X;
-import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgniteCallable;
 import org.apache.ignite.lang.IgniteClosure;
 import org.apache.ignite.lang.IgniteReducer;
@@ -87,6 +84,7 @@ import static 
org.apache.ignite.common.AbstractEventSecurityContextTest.sendRest
 import static org.apache.ignite.internal.GridClosureCallMode.BROADCAST;
 import static 
org.apache.ignite.internal.processors.job.GridJobProcessor.COMPUTE_JOB_WORKER_INTERRUPT_TIMEOUT;
 import static org.apache.ignite.internal.processors.rest.GridRestCommand.EXE;
+import static 
org.apache.ignite.internal.processors.security.impl.TestSecurityProcessor.registerExternalSystemTypes;
 import static 
org.apache.ignite.internal.processors.task.TaskExecutionOptions.options;
 import static org.apache.ignite.plugin.security.SecurityPermission.ADMIN_KILL;
 import static org.apache.ignite.plugin.security.SecurityPermission.ADMIN_OPS;
@@ -137,9 +135,11 @@ public class ComputeTaskPermissionsTest extends 
AbstractSecurityTest {
     @Override protected void beforeTestsStarted() throws Exception {
         super.beforeTestsStarted();
 
-        registerSystemType(SystemRunnable.class);
-        registerSystemType(PublicAccessSystemTask.class);
-        registerSystemType(PublicAccessSystemJob.class);
+        registerExternalSystemTypes(
+            SystemRunnable.class,
+            PublicAccessSystemTask.class,
+            PublicAccessSystemJob.class
+        );
 
         for (int idx = 0; idx < SRV_NODES_CNT; idx++)
             startGrid(idx, false);
@@ -792,13 +792,6 @@ public class ComputeTaskPermissionsTest extends 
AbstractSecurityTest {
         return grid(0).context().security().authenticate(authCtx);
     }
 
-    /** */
-    private void registerSystemType(Class<?> cls) throws Exception {
-        ConcurrentMap<Class<?>, Boolean> sysTypes = 
U.field(SecurityUtils.class, "SYSTEM_TYPES");
-
-        sysTypes.put(cls, true);
-    }
-
     /** */
     private IgniteClient startClient(String login) {
         return Ignition.startClient(new ClientConfiguration()
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/resource/GridResourceProxiedIgniteInjector.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/resource/GridResourceProxiedIgniteInjector.java
index 9d7a3787d0b..b3be3e6ec07 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/resource/GridResourceProxiedIgniteInjector.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/resource/GridResourceProxiedIgniteInjector.java
@@ -19,6 +19,7 @@ package org.apache.ignite.internal.processors.resource;
 
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.internal.GridKernalContext;
 import org.apache.ignite.internal.IgniteEx;
 import org.apache.ignite.internal.managers.deployment.GridDeployment;
 
@@ -36,8 +37,11 @@ public class GridResourceProxiedIgniteInjector extends 
GridResourceBasicInjector
 
     /** */
     private Ignite ignite(Object target) {
-        return isSystemType(((IgniteEx)getResource()).context(), target, false)
-            ? getResource() : igniteProxy(getResource());
+        GridKernalContext ctx = ((IgniteEx)getResource()).context();
+
+        return ctx.security().sandbox().enabled() && !isSystemType(ctx, 
target, false)
+            ? igniteProxy(getResource())
+            : getResource();
     }
 
     /** {@inheritDoc} */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/GridSecurityProcessor.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/GridSecurityProcessor.java
index 2a46b304628..f329ba2a850 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/GridSecurityProcessor.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/GridSecurityProcessor.java
@@ -165,4 +165,16 @@ public interface GridSecurityProcessor extends 
GridProcessor {
     public default void dropUser(String login) throws IgniteCheckedException {
         throw new UnsupportedOperationException();
     }
+
+    /**
+     * @param cls The class for which the check is to be performed.
+     * @return Whether the specified class can be considered system. System 
classes are classes whose source code
+     * can be considered controlled by the Ignite administrator and to which 
less stringent security checks can be
+     * applied. This method will be called on classes that are not part of the 
Ignite codebase. This allows the
+     * Security Plugin to extend the pool of system classes with user-defined 
ones
+     * (e.g. classes that belongs to custom Ignite Plugins).
+     */
+    public default boolean isSystemType(Class<?> cls) {
+        return false;
+    }
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurity.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurity.java
index 3cecd8a2687..bdcaa966de1 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurity.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurity.java
@@ -162,4 +162,15 @@ public interface IgniteSecurity {
      * Local join event is expected in cases of joining to topology or client 
reconnect.
      */
     public void onLocalJoin();
+
+    /**
+     * @param cls The class for which the check is to be performed.
+     * @return Whether the specified class can be considered system. System 
classes are classes whose source code
+     * can be considered controlled by the Ignite administrator and to which 
less stringent security checks can be
+     * applied. By default, Ignite considers only classes from its own 
codebase as system but their pool can be extended
+     * by custom Security Plugin.
+     *
+     * @see GridSecurityProcessor#isSystemType(Class)
+     */
+    public boolean isSystemType(Class<?> cls);
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurityAdapter.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurityAdapter.java
new file mode 100644
index 00000000000..be874b469cc
--- /dev/null
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurityAdapter.java
@@ -0,0 +1,54 @@
+/*
+ * 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.ignite.internal.processors.security;
+
+import java.security.CodeSource;
+import java.security.ProtectionDomain;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import org.apache.ignite.internal.GridKernalContext;
+import org.apache.ignite.internal.processors.GridProcessorAdapter;
+import org.apache.ignite.internal.util.typedef.F;
+
+import static 
org.apache.ignite.internal.processors.security.SecurityUtils.doPrivileged;
+
+/** */
+public abstract class IgniteSecurityAdapter extends GridProcessorAdapter 
implements IgniteSecurity {
+    /** Code source for ignite-core module. */
+    private static final CodeSource CORE_CODE_SOURCE = 
SecurityUtils.class.getProtectionDomain().getCodeSource();
+
+    /** System types cache. */
+    private static final ConcurrentMap<Class<?>, Boolean> SYSTEM_TYPES = new 
ConcurrentHashMap<>();
+
+    /** @param ctx Kernal context. */
+    protected IgniteSecurityAdapter(GridKernalContext ctx) {
+        super(ctx);
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean isSystemType(Class<?> cls) {
+        return SYSTEM_TYPES.computeIfAbsent(
+            cls,
+            c -> {
+                ProtectionDomain pd = doPrivileged(c::getProtectionDomain);
+
+                return pd != null && F.eq(CORE_CODE_SOURCE, 
pd.getCodeSource());
+            }
+        );
+    }
+}
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurityProcessor.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurityProcessor.java
index 793cad12b00..11cd00b8cdf 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurityProcessor.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurityProcessor.java
@@ -29,7 +29,6 @@ import org.apache.ignite.IgniteLogger;
 import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.internal.GridKernalContext;
 import org.apache.ignite.internal.IgniteInternalFuture;
-import org.apache.ignite.internal.processors.GridProcessor;
 import 
org.apache.ignite.internal.processors.security.sandbox.AccessControllerSandbox;
 import org.apache.ignite.internal.processors.security.sandbox.IgniteSandbox;
 import org.apache.ignite.internal.processors.security.sandbox.NoOpSandbox;
@@ -68,7 +67,7 @@ import static 
org.apache.ignite.plugin.security.SecurityPermission.ADMIN_USER_AC
  *     <li>Managing sandbox and proving point of entry to the internal sandbox 
API.</li>
  * </ul>
  */
-public class IgniteSecurityProcessor implements IgniteSecurity, GridProcessor {
+public class IgniteSecurityProcessor extends IgniteSecurityAdapter {
     /**  */
     private static final String FAILED_OBTAIN_SEC_CTX_MSG = "Failed to obtain 
a security context.";
 
@@ -88,9 +87,6 @@ public class IgniteSecurityProcessor implements 
IgniteSecurity, GridProcessor {
     /** Current security context if differs from {@link #dfltSecCtx}. */
     private final ThreadLocal<SecurityContext> curSecCtx = new ThreadLocal<>();
 
-    /** Grid kernal context. */
-    private final GridKernalContext ctx;
-
     /** Security processor. */
     private final GridSecurityProcessor secPrc;
 
@@ -121,10 +117,10 @@ public class IgniteSecurityProcessor implements 
IgniteSecurity, GridProcessor {
      * @param secPrc Security processor.
      */
     public IgniteSecurityProcessor(GridKernalContext ctx, 
GridSecurityProcessor secPrc) {
-        assert ctx != null;
+        super(ctx);
+
         assert secPrc != null;
 
-        this.ctx = ctx;
         this.secPrc = secPrc;
 
         marsh = MarshallerUtils.jdkMarshaller(ctx.igniteInstanceName());
@@ -247,6 +243,8 @@ public class IgniteSecurityProcessor implements 
IgniteSecurity, GridProcessor {
 
     /** {@inheritDoc} */
     @Override public void start() throws IgniteCheckedException {
+        super.start();
+
         ctx.addNodeAttribute(ATTR_GRID_SEC_PROC_CLASS, 
secPrc.getClass().getName());
 
         secPrc.start();
@@ -409,6 +407,11 @@ public class IgniteSecurityProcessor implements 
IgniteSecurity, GridProcessor {
             ctx.discovery().localNode());
     }
 
+    /** {@inheritDoc} */
+    @Override public boolean isSystemType(Class<?> cls) {
+        return super.isSystemType(cls) || secPrc.isSystemType(cls);
+    }
+
     /**
      * Validates that remote node's grid security processor class is the same 
as local one.
      *
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/NoOpIgniteSecurityProcessor.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/NoOpIgniteSecurityProcessor.java
index bb079dc75fb..0dc6151cf6c 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/NoOpIgniteSecurityProcessor.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/NoOpIgniteSecurityProcessor.java
@@ -23,7 +23,6 @@ import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.IgniteException;
 import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.internal.GridKernalContext;
-import org.apache.ignite.internal.processors.GridProcessorAdapter;
 import org.apache.ignite.internal.processors.security.sandbox.IgniteSandbox;
 import org.apache.ignite.internal.processors.security.sandbox.NoOpSandbox;
 import org.apache.ignite.plugin.security.AuthenticationContext;
@@ -41,7 +40,7 @@ import static 
org.apache.ignite.internal.processors.security.SecurityUtils.MSG_S
 /**
  * No operation IgniteSecurity.
  */
-public class NoOpIgniteSecurityProcessor extends GridProcessorAdapter 
implements IgniteSecurity {
+public class NoOpIgniteSecurityProcessor extends IgniteSecurityAdapter {
     /** Error message that occurs when trying to perform security operations 
if security disabled. */
     public static final String SECURITY_DISABLED_ERROR_MSG = "Operation cannot 
be performed: Ignite security disabled.";
 
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/SecurityUtils.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/SecurityUtils.java
index 8aca68ea20a..384a5153dbf 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/SecurityUtils.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/SecurityUtils.java
@@ -25,12 +25,10 @@ import java.lang.reflect.Proxy;
 import java.security.AccessControlContext;
 import java.security.AccessController;
 import java.security.AllPermission;
-import java.security.CodeSource;
 import java.security.Permissions;
 import java.security.PrivilegedAction;
 import java.security.PrivilegedActionException;
 import java.security.PrivilegedExceptionAction;
-import java.security.ProtectionDomain;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
@@ -38,8 +36,6 @@ import java.util.Map;
 import java.util.Objects;
 import java.util.UUID;
 import java.util.concurrent.Callable;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.IgniteException;
 import org.apache.ignite.IgniteSystemProperties;
@@ -87,12 +83,6 @@ public class SecurityUtils {
     /** Permissions that contain {@code AllPermission}. */
     public static final Permissions ALL_PERMISSIONS;
 
-    /** Code source for ignite-core module. */
-    private static final CodeSource CORE_CODE_SOURCE = 
SecurityUtils.class.getProtectionDomain().getCodeSource();
-
-    /** System types cache. */
-    private static final ConcurrentMap<Class<?>, Boolean> SYSTEM_TYPES = new 
ConcurrentHashMap<>();
-
     static {
         ALL_PERMISSIONS = new Permissions();
 
@@ -247,20 +237,7 @@ public class SecurityUtils {
         if (considerWrapperCls)
             target = unwrap(target);
 
-        return isSystemType(ctx, target.getClass());
-    }
-
-    /** @return Whether specified class is a system type. */
-    public static boolean isSystemType(GridKernalContext ctx, Class<?> cls) {
-        Boolean isSysType = SYSTEM_TYPES.get(cls);
-
-        if (isSysType == null) {
-            ProtectionDomain pd = doPrivileged(cls::getProtectionDomain);
-
-            SYSTEM_TYPES.put(cls, isSysType = (pd == null) || 
F.eq(CORE_CODE_SOURCE, pd.getCodeSource()));
-        }
-
-        return isSysType;
+        return ctx.security().isSystemType(target.getClass());
     }
 
     /** */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/task/GridTaskProcessor.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/task/GridTaskProcessor.java
index 9ee434fb111..9e51179cc22 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/task/GridTaskProcessor.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/task/GridTaskProcessor.java
@@ -70,7 +70,6 @@ import 
org.apache.ignite.internal.processors.cluster.IgniteChangeGlobalStateSupp
 import org.apache.ignite.internal.processors.job.ComputeJobStatusEnum;
 import org.apache.ignite.internal.processors.metric.MetricRegistry;
 import org.apache.ignite.internal.processors.metric.impl.LongAdderMetric;
-import org.apache.ignite.internal.processors.security.SecurityUtils;
 import org.apache.ignite.internal.processors.task.monitor.ComputeGridMonitor;
 import org.apache.ignite.internal.processors.task.monitor.ComputeTaskStatus;
 import 
org.apache.ignite.internal.processors.task.monitor.ComputeTaskStatusSnapshot;
@@ -1589,7 +1588,7 @@ public class GridTaskProcessor extends 
GridProcessorAdapter implements IgniteCha
     ) {
         taskCls = resolveTaskClass(taskName, taskCls, task);
 
-        if (taskCls == null || !SecurityUtils.isSystemType(ctx, taskCls)) {
+        if (taskCls == null || !ctx.security().isSystemType(taskCls)) {
             assert opts.isPublicRequest();
 
             ctx.security().authorize(taskCls == null ? taskName : 
taskCls.getName(), TASK_EXECUTE);
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/task/GridTaskWorker.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/task/GridTaskWorker.java
index bdff41be3d4..5c5f71889a3 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/task/GridTaskWorker.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/task/GridTaskWorker.java
@@ -112,7 +112,6 @@ import static 
org.apache.ignite.internal.processors.job.ComputeJobStatusEnum.CAN
 import static 
org.apache.ignite.internal.processors.job.ComputeJobStatusEnum.FAILED;
 import static 
org.apache.ignite.internal.processors.job.ComputeJobStatusEnum.FINISHED;
 import static 
org.apache.ignite.internal.processors.security.SecurityUtils.authorizeAll;
-import static 
org.apache.ignite.internal.processors.security.SecurityUtils.isSystemType;
 import static 
org.apache.ignite.internal.processors.security.SecurityUtils.unwrap;
 import static org.apache.ignite.plugin.security.SecurityPermission.ADMIN_KILL;
 import static org.apache.ignite.plugin.security.SecurityPermission.TASK_CANCEL;
@@ -1765,12 +1764,12 @@ public class GridTaskWorker<T, R> extends GridWorker 
implements GridTimeoutObjec
 
     /** */
     private void authorizeSystemTaskJob(ComputeJob job) {
-        if (!isSystemType(ctx, task.getClass()))
+        if (!ctx.security().isSystemType(task.getClass()))
             return;
 
         Object executable = unwrap(job);
 
-        if (!isSystemType(ctx, executable.getClass())) {
+        if (!ctx.security().isSystemType(executable.getClass())) {
             assert opts.isPublicRequest();
 
             ctx.security().authorize(executable.getClass().getName(), 
TASK_EXECUTE);
@@ -1789,7 +1788,7 @@ public class GridTaskWorker<T, R> extends GridWorker 
implements GridTimeoutObjec
         if (!ctx.security().enabled())
             return;
 
-        if (!isSystemType(ctx, task.getClass()))
+        if (!ctx.security().isSystemType(task.getClass()))
             ctx.security().authorize(task.getClass().getName(), TASK_CANCEL);
         else {
             boolean isClosedByInitiator = Objects.equals(
@@ -1799,7 +1798,7 @@ public class GridTaskWorker<T, R> extends GridWorker 
implements GridTimeoutObjec
             for (GridJobResultImpl jobRes : jobRes.values()) {
                 Object executable = unwrap(jobRes.getJob());
 
-                if (!isSystemType(ctx, executable.getClass()))
+                if (!ctx.security().isSystemType(executable.getClass()))
                     ctx.security().authorize(executable.getClass().getName(), 
TASK_CANCEL);
                 else if (!isClosedByInitiator)
                     ctx.security().authorize(ADMIN_KILL);
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/security/impl/TestSecurityProcessor.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/security/impl/TestSecurityProcessor.java
index 1774044aa1d..e0b2ce60b89 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/security/impl/TestSecurityProcessor.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/security/impl/TestSecurityProcessor.java
@@ -20,6 +20,7 @@ package org.apache.ignite.internal.processors.security.impl;
 import java.net.InetSocketAddress;
 import java.security.Permissions;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Map;
@@ -54,6 +55,9 @@ public class TestSecurityProcessor extends 
GridProcessorAdapter implements GridS
     /** */
     private static final Map<UUID, SecurityContext> SECURITY_CONTEXTS = new 
ConcurrentHashMap<>();
 
+    /** */
+    private static final Collection<Class<?>> EXT_SYS_CLASSES = 
ConcurrentHashMap.newKeySet();
+
     /** Node security data. */
     private final TestSecurityData nodeSecData;
 
@@ -105,6 +109,11 @@ public class TestSecurityProcessor extends 
GridProcessorAdapter implements GridS
         return globalAuth;
     }
 
+    /** {@inheritDoc} */
+    @Override public boolean isSystemType(Class<?> cls) {
+        return EXT_SYS_CLASSES.contains(cls);
+    }
+
     /** {@inheritDoc} */
     @Override public SecurityContext authenticate(AuthenticationContext ctx) 
throws IgniteCheckedException {
         TestSecurityData data = USERS.get(ctx.credentials().getLogin());
@@ -205,4 +214,9 @@ public class TestSecurityProcessor extends 
GridProcessorAdapter implements GridS
     @Override public void dropUser(String login) {
         USERS.remove(login);
     }
+
+    /** */
+    public static void registerExternalSystemTypes(Class<?>... cls) {
+        EXT_SYS_CLASSES.addAll(Arrays.asList(cls));
+    }
 }

Reply via email to