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

alexpl 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 84edb3d  IGNITE-12343 Remote filter and transformer of 
ContinuousQueries have to run inside the Ignite Sandbox - Fixes #7677.
84edb3d is described below

commit 84edb3dd3b7140ab1d8bcb6a47456f632aafdd6d
Author: sbt-garus-dg <[email protected]>
AuthorDate: Thu May 28 10:46:33 2020 +0300

    IGNITE-12343 Remote filter and transformer of ContinuousQueries have to run 
inside the Ignite Sandbox - Fixes #7677.
    
    Signed-off-by: Aleksey Plekhanov <[email protected]>
---
 .../ignite/internal/SecurityAwareBiPredicate.java  |   8 +-
 .../query/continuous/SecurityAwareFilter.java      |  22 ++--
 .../SecurityAwareTransformerFactory.java           |  22 ++--
 .../AbstractSecurityAwareExternalizable.java       |  17 +++
 .../processors/security/SecurityUtils.java         |  11 +-
 .../main/resources/META-INF/classnames.properties  |   4 +
 .../AbstractContinuousQuerySandboxTest.java        | 132 +++++++++++++++++++++
 .../sandbox/ContinuousQuerySandboxTest.java        |  64 ++++++++++
 .../ContinuousQueryWithTransformerSandboxTest.java |  73 ++++++++++++
 .../ignite/testsuites/SecurityTestSuite.java       |   4 +
 10 files changed, 333 insertions(+), 24 deletions(-)

diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/SecurityAwareBiPredicate.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/SecurityAwareBiPredicate.java
index 5d87d59..5ae1ee1 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/SecurityAwareBiPredicate.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/SecurityAwareBiPredicate.java
@@ -24,7 +24,6 @@ import 
org.apache.ignite.internal.processors.security.IgniteSecurity;
 import org.apache.ignite.internal.processors.security.OperationSecurityContext;
 import org.apache.ignite.internal.processors.security.sandbox.IgniteSandbox;
 import org.apache.ignite.lang.IgniteBiPredicate;
-import org.apache.ignite.resources.IgniteInstanceResource;
 
 /**
  * Security aware IgniteBiPredicate.
@@ -34,10 +33,6 @@ public class SecurityAwareBiPredicate<E1, E2> extends 
AbstractSecurityAwareExter
     /** */
     private static final long serialVersionUID = 0L;
 
-    /** Ignite. */
-    @IgniteInstanceResource
-    private transient IgniteEx ignite;
-
     /**
      * Default constructor.
      */
@@ -63,8 +58,7 @@ public class SecurityAwareBiPredicate<E1, E2> extends 
AbstractSecurityAwareExter
             return sandbox.enabled() ? sandbox.execute(() -> 
original.apply(e1, e2)) : original.apply(e1, e2);
         }
         catch (AccessControlException e) {
-            ignite.context().log(getClass()).error("The operation can't be 
executed because the current subject " +
-                "doesn't have appropriate permission [subjectId=" + subjectId 
+ "].", e);
+            logAccessDeniedMessage(e);
 
             throw e;
         }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/SecurityAwareFilter.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/SecurityAwareFilter.java
index d87b226..481e1bf 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/SecurityAwareFilter.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/SecurityAwareFilter.java
@@ -17,15 +17,16 @@
 
 package org.apache.ignite.internal.processors.cache.query.continuous;
 
+import java.security.AccessControlException;
 import java.util.UUID;
 import javax.cache.event.CacheEntryEvent;
 import javax.cache.event.CacheEntryEventFilter;
 import javax.cache.event.CacheEntryListenerException;
 import org.apache.ignite.cache.CacheEntryEventSerializableFilter;
-import org.apache.ignite.internal.IgniteEx;
 import 
org.apache.ignite.internal.processors.security.AbstractSecurityAwareExternalizable;
+import org.apache.ignite.internal.processors.security.IgniteSecurity;
 import org.apache.ignite.internal.processors.security.OperationSecurityContext;
-import org.apache.ignite.resources.IgniteInstanceResource;
+import org.apache.ignite.internal.processors.security.sandbox.IgniteSandbox;
 
 /**
  * Security aware remote filter.
@@ -35,10 +36,6 @@ public class SecurityAwareFilter<K, V> extends 
AbstractSecurityAwareExternalizab
     /** */
     private static final long serialVersionUID = 0L;
 
-    /** Ignite. */
-    @IgniteInstanceResource
-    private transient IgniteEx ignite;
-
     /**
      * Default constructor.
      */
@@ -56,8 +53,17 @@ public class SecurityAwareFilter<K, V> extends 
AbstractSecurityAwareExternalizab
 
     /** {@inheritDoc} */
     @Override public boolean evaluate(CacheEntryEvent<? extends K, ? extends 
V> evt) throws CacheEntryListenerException {
-        try (OperationSecurityContext c = 
ignite.context().security().withContext(subjectId)) {
-            return original.evaluate(evt);
+        IgniteSecurity security = ignite.context().security();
+
+        try (OperationSecurityContext c = security.withContext(subjectId)) {
+            IgniteSandbox sandbox = security.sandbox();
+
+            return sandbox.enabled() ? sandbox.execute(() -> 
original.evaluate(evt)) : original.evaluate(evt);
+        }
+        catch (AccessControlException e) {
+            logAccessDeniedMessage(e);
+
+            throw e;
         }
     }
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/SecurityAwareTransformerFactory.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/SecurityAwareTransformerFactory.java
index c51a4e8..8e4e858 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/SecurityAwareTransformerFactory.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/SecurityAwareTransformerFactory.java
@@ -17,13 +17,14 @@
 
 package org.apache.ignite.internal.processors.cache.query.continuous;
 
+import java.security.AccessControlException;
 import java.util.UUID;
 import javax.cache.configuration.Factory;
-import org.apache.ignite.internal.IgniteEx;
 import 
org.apache.ignite.internal.processors.security.AbstractSecurityAwareExternalizable;
+import org.apache.ignite.internal.processors.security.IgniteSecurity;
 import org.apache.ignite.internal.processors.security.OperationSecurityContext;
+import org.apache.ignite.internal.processors.security.sandbox.IgniteSandbox;
 import org.apache.ignite.lang.IgniteClosure;
-import org.apache.ignite.resources.IgniteInstanceResource;
 
 /**
  *  Security aware transformer factory.
@@ -53,14 +54,19 @@ public class SecurityAwareTransformerFactory<E, R> extends
         final IgniteClosure<E, R> cl = original.create();
 
         return new IgniteClosure<E, R>() {
-            /** Ignite. */
-            @IgniteInstanceResource
-            private IgniteEx ignite;
-
             /** {@inheritDoc} */
             @Override public R apply(E e) {
-                try (OperationSecurityContext c = 
ignite.context().security().withContext(subjectId)) {
-                    return cl.apply(e);
+                IgniteSecurity security = ignite.context().security();
+
+                try (OperationSecurityContext c = 
security.withContext(subjectId)) {
+                    IgniteSandbox sandbox = security.sandbox();
+
+                    return sandbox.enabled() ? sandbox.execute(() -> 
cl.apply(e)) : cl.apply(e);
+                }
+                catch (AccessControlException ace) {
+                    logAccessDeniedMessage(ace);
+
+                    throw ace;
                 }
             }
         };
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/AbstractSecurityAwareExternalizable.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/AbstractSecurityAwareExternalizable.java
index 18224d1..0963a04 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/AbstractSecurityAwareExternalizable.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/AbstractSecurityAwareExternalizable.java
@@ -21,8 +21,11 @@ import java.io.Externalizable;
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
+import java.security.AccessControlException;
 import java.util.UUID;
+import org.apache.ignite.internal.IgniteEx;
 import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.resources.IgniteInstanceResource;
 
 import static java.util.Objects.requireNonNull;
 
@@ -36,6 +39,10 @@ public abstract class AbstractSecurityAwareExternalizable<T> 
implements External
     /** Original component. */
     protected T original;
 
+    /** Ignite. */
+    @IgniteInstanceResource
+    protected transient IgniteEx ignite;
+
     /**
      * Default constructor.
      */
@@ -52,6 +59,16 @@ public abstract class AbstractSecurityAwareExternalizable<T> 
implements External
         this.original = requireNonNull(original, "Parameter 'original' cannot 
be null.");
     }
 
+    /**
+     * Writes access denied message.
+     *
+     * @param e Exception to log.
+     */
+    protected void logAccessDeniedMessage(AccessControlException e) {
+        ignite.context().log(getClass()).error("The operation can't be 
executed because the current subject " +
+            "doesn't have appropriate permission [subjectId=" + subjectId + 
"].", e);
+    }
+
     /** {@inheritDoc} */
     @Override public void writeExternal(ObjectOutput out) throws IOException {
         U.writeUuid(out, subjectId);
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 4f3302d..9daab4a 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
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.processors.security;
 
 import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
 import java.security.AccessControlContext;
@@ -34,6 +35,7 @@ import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.Callable;
 import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.IgniteException;
 import org.apache.ignite.IgniteSystemProperties;
 import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.internal.GridInternalWrapper;
@@ -255,7 +257,14 @@ public class SecurityUtils {
                 // Ignore.
             }
 
-            return sandbox.execute(() -> (T)mtd.invoke(original, args));
+            return sandbox.execute(() -> {
+                try {
+                    return (T)mtd.invoke(original, args);
+                }
+                catch (InvocationTargetException e) {
+                    throw new IgniteException(e.getTargetException());
+                }
+            });
         }
     }
 }
diff --git a/modules/core/src/main/resources/META-INF/classnames.properties 
b/modules/core/src/main/resources/META-INF/classnames.properties
index 486b660..55b277c 100644
--- a/modules/core/src/main/resources/META-INF/classnames.properties
+++ b/modules/core/src/main/resources/META-INF/classnames.properties
@@ -1174,6 +1174,10 @@ 
org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQuer
 
org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQueryManager$CacheEntryEventImpl
 
org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQueryManager$JCacheQuery$1
 
org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQueryManager$JCacheQueryRemoteFilter
+org.apache.ignite.internal.processors.cache.query.continuous.SecurityAwareFilter
+org.apache.ignite.internal.processors.cache.query.continuous.SecurityAwareFilterFactory
+org.apache.ignite.internal.processors.cache.query.continuous.SecurityAwareTransformerFactory
+org.apache.ignite.internal.processors.cache.query.continuous.SecurityAwareTransformerFactory$1
 
org.apache.ignite.internal.processors.cache.query.jdbc.GridCacheQueryJdbcMetadataTask
 
org.apache.ignite.internal.processors.cache.query.jdbc.GridCacheQueryJdbcMetadataTask$JdbcDriverMetadataJob
 org.apache.ignite.internal.processors.cache.query.jdbc.GridCacheQueryJdbcTask
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/security/sandbox/AbstractContinuousQuerySandboxTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/security/sandbox/AbstractContinuousQuerySandboxTest.java
new file mode 100644
index 0000000..cd5b037
--- /dev/null
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/security/sandbox/AbstractContinuousQuerySandboxTest.java
@@ -0,0 +1,132 @@
+/*
+ * 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.sandbox;
+
+import java.security.AccessControlException;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Supplier;
+import javax.cache.Cache;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.cache.CacheEntryEventSerializableFilter;
+import org.apache.ignite.cache.CacheMode;
+import org.apache.ignite.cache.query.Query;
+import org.apache.ignite.cache.query.QueryCursor;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.lang.IgniteBiPredicate;
+import org.apache.ignite.testframework.GridTestUtils;
+
+/**
+ * Abstract class to test that a remote filter and transformer of 
ContinuousQueries run on a remote node inside the
+ * Ignite Sandbox.
+ */
+public class AbstractContinuousQuerySandboxTest extends AbstractSandboxTest {
+    /** Cache name for tests. */
+    protected static final String CACHE_NAME = "TEST_CACHE";
+
+    /** Cache index. */
+    private static final AtomicInteger CACHE_INDEX = new AtomicInteger();
+
+    /** Error. */
+    private static volatile AccessControlException error;
+
+    /** Runs control action for CQ tests. */
+    protected static final Runnable CONTROL_ACTION_RUNNER = new Runnable() {
+        @Override public void run() {
+            try {
+                controlAction();
+            }
+            catch (AccessControlException e) {
+                error = e;
+
+                throw e;
+            }
+        }
+    };
+
+    /** Preidacte for inital query tests. */
+    protected static final IgniteBiPredicate<Integer, Integer> INIT_QRY_FILTER 
= (k, v) -> {
+        CONTROL_ACTION_RUNNER.run();
+
+        return true;
+    };
+
+    /** Remote filter. */
+    protected static final CacheEntryEventSerializableFilter<Integer, Integer> 
RMT_FILTER = ent -> {
+        CONTROL_ACTION_RUNNER.run();
+
+        return true;
+    };
+
+    /** */
+    protected void checkContinuousQuery(Supplier<Query<Cache.Entry<Integer, 
Integer>>> s, boolean init) {
+        runOperation(operation(CLNT_ALLOWED_WRITE_PROP, s, init));
+        runForbiddenOperation(operation(CLNT_FORBIDDEN_WRITE_PROP, s, init), 
AccessControlException.class);
+    }
+
+    /** */
+    private GridTestUtils.RunnableX operation(String nodeName,
+        Supplier<Query<Cache.Entry<Integer, Integer>>> s, boolean init) {
+        return () -> {
+            error = null;
+
+            executeQuery(grid(nodeName), s.get(), init);
+
+            if (error != null)
+                throw error;
+        };
+    }
+
+    /**
+     * Opens query cursor.
+     *
+     * @param ignite Node.
+     * @param q {@link Query}.
+     * @param init True if needing put data to a cache before openning a 
cursor.
+     */
+    private void executeQuery(Ignite ignite, Query<Cache.Entry<Integer, 
Integer>> q, boolean init)
+        throws IgniteCheckedException {
+        IgniteCache<Integer, Integer> cache = ignite.getOrCreateCache(
+            new CacheConfiguration<Integer, Integer>()
+                .setName(CACHE_NAME + CACHE_INDEX.incrementAndGet())
+                .setCacheMode(CacheMode.PARTITIONED)
+        );
+
+        Integer key = primaryKey(grid(SRV).cache(cache.getName()));
+
+        if (init)
+            cache.put(key, 100);
+
+        try (QueryCursor<Cache.Entry<Integer, Integer>> cur = cache.query(q)) {
+            if (!init) {
+                try {
+                    cache.put(key, 100);
+                }
+                catch (Exception e) {
+                    fail(e.getMessage());
+                }
+            }
+
+            cur.getAll();
+        }
+
+        // Put operation should be successful regardless of exceptions inside 
a remote filter or transformer.
+        assertEquals(Integer.valueOf(100), cache.get(key));
+    }
+}
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/security/sandbox/ContinuousQuerySandboxTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/security/sandbox/ContinuousQuerySandboxTest.java
new file mode 100644
index 0000000..34da323
--- /dev/null
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/security/sandbox/ContinuousQuerySandboxTest.java
@@ -0,0 +1,64 @@
+/*
+ * 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.sandbox;
+
+import org.apache.ignite.cache.query.ContinuousQuery;
+import org.apache.ignite.cache.query.ScanQuery;
+import org.junit.Test;
+
+/**
+ * Checks that a remote filter of {@code ContinuousQueries} runs on a remote 
node inside the Ignite Sandbox.
+ */
+public class ContinuousQuerySandboxTest extends 
AbstractContinuousQuerySandboxTest {
+    /** */
+    @Test
+    public void testInitialQueryFilter() {
+        checkContinuousQuery(() -> {
+            ContinuousQuery<Integer, Integer> cq = new ContinuousQuery<>();
+
+            cq.setInitialQuery(new ScanQuery<>(INIT_QRY_FILTER));
+            cq.setLocalListener(e -> {/* No-op. */});
+
+            return cq;
+        }, true);
+    }
+
+    /** */
+    @Test
+    public void testRemoteFilterFactory() {
+        checkContinuousQuery(() -> {
+            ContinuousQuery<Integer, Integer> cq = new ContinuousQuery<>();
+
+            cq.setRemoteFilterFactory(() -> RMT_FILTER);
+
+            return cq;
+        }, false);
+    }
+
+    /** */
+    @Test
+    public void testRemoteFilter() {
+        checkContinuousQuery(() -> {
+            ContinuousQuery<Integer, Integer> cq = new ContinuousQuery<>();
+
+            cq.setRemoteFilter(RMT_FILTER);
+
+            return cq;
+        }, false);
+    }
+}
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/security/sandbox/ContinuousQueryWithTransformerSandboxTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/security/sandbox/ContinuousQueryWithTransformerSandboxTest.java
new file mode 100644
index 0000000..1c38333
--- /dev/null
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/security/sandbox/ContinuousQueryWithTransformerSandboxTest.java
@@ -0,0 +1,73 @@
+/*
+ * 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.sandbox;
+
+import javax.cache.Cache;
+import org.apache.ignite.cache.query.ContinuousQueryWithTransformer;
+import org.apache.ignite.cache.query.ScanQuery;
+import org.junit.Test;
+
+/**
+ * Checks that a remote filter and transformer of {@code 
ContinuousQueryWithTransformer} run on a remote node inside the
+ * Ignite Sandbox.
+ */
+public class ContinuousQueryWithTransformerSandboxTest extends 
AbstractContinuousQuerySandboxTest {
+    /** */
+    @Test
+    public void testInitialQuery() {
+        checkContinuousQuery(() -> {
+            ContinuousQueryWithTransformer<Integer, Integer, Integer> q = new 
ContinuousQueryWithTransformer<>();
+
+            q.setInitialQuery(new ScanQuery<>(INIT_QRY_FILTER));
+            q.setRemoteTransformerFactory(() -> Cache.Entry::getValue);
+            q.setLocalListener(e -> {/* No-op. */});
+
+            return q;
+        }, true);
+    }
+
+    /** */
+    @Test
+    public void testRemoteFilterFactory() {
+        checkContinuousQuery(() -> {
+            ContinuousQueryWithTransformer<Integer, Integer, Integer> q = new 
ContinuousQueryWithTransformer<>();
+
+            q.setRemoteFilterFactory(() -> RMT_FILTER);
+            q.setRemoteTransformerFactory(() -> Cache.Entry::getValue);
+
+            return q;
+        }, false);
+    }
+
+    /** */
+    @Test
+    public void testTransformerFactory() {
+        checkContinuousQuery(() -> {
+            ContinuousQueryWithTransformer<Integer, Integer, Integer> q = new 
ContinuousQueryWithTransformer<>();
+
+            q.setRemoteTransformerFactory(() -> e -> {
+                CONTROL_ACTION_RUNNER.run();
+
+                return e.getValue();
+            });
+            q.setLocalListener(e -> {/* No-op. */});
+
+            return q;
+        }, false);
+    }
+}
diff --git 
a/modules/core/src/test/java/org/apache/ignite/testsuites/SecurityTestSuite.java
 
b/modules/core/src/test/java/org/apache/ignite/testsuites/SecurityTestSuite.java
index 551114b..faeba43 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/testsuites/SecurityTestSuite.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/testsuites/SecurityTestSuite.java
@@ -48,6 +48,8 @@ import 
org.apache.ignite.internal.processors.security.messaging.MessagingRemoteS
 import 
org.apache.ignite.internal.processors.security.sandbox.AccessToClassesInsideInternalPackageTest;
 import org.apache.ignite.internal.processors.security.sandbox.CacheSandboxTest;
 import 
org.apache.ignite.internal.processors.security.sandbox.ComputeSandboxTest;
+import 
org.apache.ignite.internal.processors.security.sandbox.ContinuousQuerySandboxTest;
+import 
org.apache.ignite.internal.processors.security.sandbox.ContinuousQueryWithTransformerSandboxTest;
 import 
org.apache.ignite.internal.processors.security.sandbox.DataStreamerSandboxTest;
 import 
org.apache.ignite.internal.processors.security.sandbox.DoPrivilegedOnRemoteNodeTest;
 import 
org.apache.ignite.internal.processors.security.sandbox.IgniteOperationsInsideSandboxTest;
@@ -101,6 +103,8 @@ import org.junit.runners.Suite;
     SecuritySubjectPermissionsTest.class,
     IgnitionComponentProxyTest.class,
     MessagingSandboxTest.class,
+    ContinuousQuerySandboxTest.class,
+    ContinuousQueryWithTransformerSandboxTest.class,
 
     IgniteSecurityProcessorTest.class,
     GridCommandHandlerSslWithSecurityTest.class,

Reply via email to