#gg-9809: add temp class SecurityContextImpl in GridOsSecurityProcessor instead of using GridSecurityContext.
Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/17fa00b2 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/17fa00b2 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/17fa00b2 Branch: refs/heads/sprint-2 Commit: 17fa00b21822c704a843f0dfd99e03d297c442f0 Parents: c507676 Author: ivasilinets <ivasilin...@gridgain.com> Authored: Wed Feb 18 14:42:48 2015 +0300 Committer: ivasilinets <ivasilin...@gridgain.com> Committed: Wed Feb 18 14:42:48 2015 +0300 ---------------------------------------------------------------------- .../security/os/GridOsSecurityProcessor.java | 262 ++++++++++++++++++- .../discovery/AbstractDiscoverySelfTest.java | 3 +- .../tcp/TcpDiscoverySpiStartStopSelfTest.java | 3 +- .../junits/spi/GridSpiAbstractTest.java | 2 +- 4 files changed, 264 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/17fa00b2/modules/core/src/main/java/org/apache/ignite/internal/processors/security/os/GridOsSecurityProcessor.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/os/GridOsSecurityProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/os/GridOsSecurityProcessor.java index 54bf946..b83935e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/os/GridOsSecurityProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/os/GridOsSecurityProcessor.java @@ -28,6 +28,7 @@ import org.apache.ignite.internal.util.typedef.internal.*; import org.apache.ignite.plugin.security.*; import org.jetbrains.annotations.*; +import java.io.*; import java.net.*; import java.util.*; @@ -77,7 +78,7 @@ public class GridOsSecurityProcessor extends GridProcessorAdapter implements Gri s.permissions(ALLOW_ALL); - return new GridSecurityContext(s); + return new SecurityContextImpl(s); } /** {@inheritDoc} */ @@ -95,7 +96,7 @@ public class GridOsSecurityProcessor extends GridProcessorAdapter implements Gri if (authCtx.credentials() != null) s.login(authCtx.credentials().getLogin()); - return new GridSecurityContext(s); + return new SecurityContextImpl(s); } /** {@inheritDoc} */ @@ -116,7 +117,7 @@ public class GridOsSecurityProcessor extends GridProcessorAdapter implements Gri /** {@inheritDoc} */ @Override public SecurityContext createSecurityContext(GridSecuritySubject subj) { - return new GridSecurityContext(subj); + return new SecurityContextImpl(subj); } /** {@inheritDoc} */ @@ -220,4 +221,259 @@ public class GridOsSecurityProcessor extends GridProcessorAdapter implements Gri return S.toString(GridSecuritySubjectAdapter.class, this); } } + + /** + * TODO: remove + */ + private class SecurityContextImpl implements SecurityContext, Externalizable { + /** */ + private static final long serialVersionUID = 0L; + + /** + * Visor ignite tasks prefix. + */ + private static final String VISOR_IGNITE_TASK_PREFIX = "org.apache.ignite.internal.visor."; + + /** + * Visor gridgain tasks prefix. + */ + private static final String VISOR_GRIDGAIN_TASK_PREFIX = "org.gridgain.grid.internal.visor."; + + /** + * Cache query task name. + */ + public static final String VISOR_CACHE_QUERY_TASK_NAME = + "org.apache.ignite.internal.visor.query.VisorQueryTask"; + + /** + * Cache load task name. + */ + public static final String VISOR_CACHE_LOAD_TASK_NAME = + "org.apache.ignite.internal.visor.cache.VisorCacheLoadTask"; + + /** + * Cache clear task name. + */ + public static final String VISOR_CACHE_CLEAR_TASK_NAME = + "org.apache.ignite.internal.visor.query.VisorQueryCleanupTask"; + + /** + * Security subject. + */ + private GridSecuritySubject subj; + + /** + * String task permissions. + */ + private Map<String, Collection<GridSecurityPermission>> strictTaskPermissions = new LinkedHashMap<>(); + + /** + * String task permissions. + */ + private Map<String, Collection<GridSecurityPermission>> wildcardTaskPermissions = new LinkedHashMap<>(); + + /** + * String task permissions. + */ + private Map<String, Collection<GridSecurityPermission>> strictCachePermissions = new LinkedHashMap<>(); + + /** + * String task permissions. + */ + private Map<String, Collection<GridSecurityPermission>> wildcardCachePermissions = new LinkedHashMap<>(); + + /** + * System-wide permissions. + */ + private Collection<GridSecurityPermission> sysPermissions; + + /** + * Empty constructor required by {@link Externalizable}. + */ + public SecurityContextImpl() { + // No-op. + } + + /** + * @param subj Subject. + */ + public SecurityContextImpl(GridSecuritySubject subj) { + this.subj = subj; + + initRules(); + } + + /** + * @return Security subject. + */ + public GridSecuritySubject subject() { + return subj; + } + + /** + * Checks whether task operation is allowed. + * + * @param taskClsName Task class name. + * @param perm Permission to check. + * @return {@code True} if task operation is allowed. + */ + public boolean taskOperationAllowed(String taskClsName, GridSecurityPermission perm) { + assert perm == GridSecurityPermission.TASK_EXECUTE || perm == GridSecurityPermission.TASK_CANCEL; + + if (visorTask(taskClsName)) + return visorTaskAllowed(taskClsName); + + Collection<GridSecurityPermission> p = strictTaskPermissions.get(taskClsName); + + if (p != null) + return p.contains(perm); + + for (Map.Entry<String, Collection<GridSecurityPermission>> entry : wildcardTaskPermissions.entrySet()) { + if (taskClsName.startsWith(entry.getKey())) + return entry.getValue().contains(perm); + } + + return subj.permissions().defaultAllowAll(); + } + + /** + * Checks whether cache operation is allowed. + * + * @param cacheName Cache name. + * @param perm Permission to check. + * @return {@code True} if cache operation is allowed. + */ + public boolean cacheOperationAllowed(String cacheName, GridSecurityPermission perm) { + assert perm == GridSecurityPermission.CACHE_PUT || perm == GridSecurityPermission.CACHE_READ || + perm == GridSecurityPermission.CACHE_REMOVE; + + Collection<GridSecurityPermission> p = strictCachePermissions.get(cacheName); + + if (p != null) + return p.contains(perm); + + for (Map.Entry<String, Collection<GridSecurityPermission>> entry : wildcardCachePermissions.entrySet()) { + if (cacheName != null) { + if (cacheName.startsWith(entry.getKey())) + return entry.getValue().contains(perm); + } else { + // Match null cache to '*' + if (entry.getKey().isEmpty()) + return entry.getValue().contains(perm); + } + } + + return subj.permissions().defaultAllowAll(); + } + + /** + * Checks whether system-wide permission is allowed (excluding Visor task operations). + * + * @param perm Permission to check. + * @return {@code True} if system operation is allowed. + */ + public boolean systemOperationAllowed(GridSecurityPermission perm) { + if (sysPermissions == null) + return subj.permissions().defaultAllowAll(); + + boolean ret = sysPermissions.contains(perm); + + if (!ret && (perm == GridSecurityPermission.EVENTS_ENABLE || perm == GridSecurityPermission.EVENTS_DISABLE)) + ret = sysPermissions.contains(GridSecurityPermission.ADMIN_VIEW); + + return ret; + } + + /** + * Checks if task is Visor task. + * + * @param taskCls Task class name. + * @return {@code True} if task is Visor task. + */ + private boolean visorTask(String taskCls) { + return taskCls.startsWith(VISOR_IGNITE_TASK_PREFIX) || taskCls.startsWith(VISOR_GRIDGAIN_TASK_PREFIX); + } + + /** + * Checks if Visor task is allowed for execution. + * + * @param taskName Task name. + * @return {@code True} if execution is allowed. + */ + private boolean visorTaskAllowed(String taskName) { + if (sysPermissions == null) + return subj.permissions().defaultAllowAll(); + + switch (taskName) { + case VISOR_CACHE_QUERY_TASK_NAME: + return sysPermissions.contains(GridSecurityPermission.ADMIN_QUERY); + case VISOR_CACHE_LOAD_TASK_NAME: + case VISOR_CACHE_CLEAR_TASK_NAME: + return sysPermissions.contains(GridSecurityPermission.ADMIN_CACHE); + default: + return sysPermissions.contains(GridSecurityPermission.ADMIN_VIEW); + } + } + + /** + * Init rules. + */ + private void initRules() { + GridSecurityPermissionSet permSet = subj.permissions(); + + for (Map.Entry<String, Collection<GridSecurityPermission>> entry : permSet.taskPermissions().entrySet()) { + String ptrn = entry.getKey(); + + Collection<GridSecurityPermission> vals = Collections.unmodifiableCollection(entry.getValue()); + + if (ptrn.endsWith("*")) { + String noWildcard = ptrn.substring(0, ptrn.length() - 1); + + wildcardTaskPermissions.put(noWildcard, vals); + } else + strictTaskPermissions.put(ptrn, vals); + } + + for (Map.Entry<String, Collection<GridSecurityPermission>> entry : permSet.cachePermissions().entrySet()) { + String ptrn = entry.getKey(); + + Collection<GridSecurityPermission> vals = Collections.unmodifiableCollection(entry.getValue()); + + if (ptrn != null && ptrn.endsWith("*")) { + String noWildcard = ptrn.substring(0, ptrn.length() - 1); + + wildcardCachePermissions.put(noWildcard, vals); + } else + strictCachePermissions.put(ptrn, vals); + } + + sysPermissions = permSet.systemPermissions(); + } + + /** + * {@inheritDoc} + */ + @Override + public void writeExternal(ObjectOutput out) throws IOException { + out.writeObject(subj); + } + + /** + * {@inheritDoc} + */ + @Override + public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { + subj = (GridSecuritySubject) in.readObject(); + + initRules(); + } + + /** + * {@inheritDoc} + */ + @Override + public String toString() { + return S.toString(SecurityContextImpl.class, this); + } + } } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/17fa00b2/modules/core/src/test/java/org/apache/ignite/spi/discovery/AbstractDiscoverySelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/AbstractDiscoverySelfTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/AbstractDiscoverySelfTest.java index 00423dd..e0717f4 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/AbstractDiscoverySelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/AbstractDiscoverySelfTest.java @@ -19,6 +19,7 @@ package org.apache.ignite.spi.discovery; import mx4j.tools.adaptor.http.*; import org.apache.ignite.cluster.*; +import org.apache.ignite.internal.*; import org.apache.ignite.internal.processors.security.*; import org.apache.ignite.internal.util.typedef.internal.*; import org.apache.ignite.marshaller.*; @@ -393,7 +394,7 @@ public abstract class AbstractDiscoverySelfTest<T extends IgniteSpi> extends Gri @Override public SecurityContext authenticateNode(ClusterNode n, GridSecurityCredentials cred) { GridSecuritySubject subj = getGridSecuritySubject(GridSecuritySubjectType.REMOTE_NODE, n.id()); - return new GridSecurityContext(subj); + return ((IgniteKernal) grid()).context().security().createSecurityContext(subj); } @Override public boolean isGlobalNodeAuthentication() { http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/17fa00b2/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpiStartStopSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpiStartStopSelfTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpiStartStopSelfTest.java index 089da9d..2b6bcdd 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpiStartStopSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpiStartStopSelfTest.java @@ -18,6 +18,7 @@ package org.apache.ignite.spi.discovery.tcp; import org.apache.ignite.cluster.*; +import org.apache.ignite.internal.*; import org.apache.ignite.internal.processors.security.*; import org.apache.ignite.plugin.security.*; import org.apache.ignite.spi.*; @@ -68,7 +69,7 @@ public class TcpDiscoverySpiStartStopSelfTest extends GridSpiStartStopAbstractTe @Override public SecurityContext authenticateNode(ClusterNode n, GridSecurityCredentials cred) { GridSecuritySubject subj = getGridSecuritySubject(GridSecuritySubjectType.REMOTE_NODE, n.id()); - return new GridSecurityContext(subj); + return ((IgniteKernal) grid()).context().security().createSecurityContext(subj); } @Override public boolean isGlobalNodeAuthentication() { http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/17fa00b2/modules/core/src/test/java/org/apache/ignite/testframework/junits/spi/GridSpiAbstractTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/junits/spi/GridSpiAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/testframework/junits/spi/GridSpiAbstractTest.java index b7c197a..c524398 100644 --- a/modules/core/src/test/java/org/apache/ignite/testframework/junits/spi/GridSpiAbstractTest.java +++ b/modules/core/src/test/java/org/apache/ignite/testframework/junits/spi/GridSpiAbstractTest.java @@ -336,7 +336,7 @@ public abstract class GridSpiAbstractTest<T extends IgniteSpi> extends GridAbstr @Override public SecurityContext authenticateNode(ClusterNode n, GridSecurityCredentials cred) { GridSecuritySubject subj = getGridSecuritySubject(GridSecuritySubjectType.REMOTE_NODE, n.id()); - return new GridSecurityContext(subj); + return ((IgniteKernal) grid()).context().security().createSecurityContext(subj); } @Override public boolean isGlobalNodeAuthentication() {