package org.jolokia.osgi.security; /* * Copyright 2009-2011 Roland Huss * * Licensed 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. */ import javax.management.MalformedObjectNameException; import javax.management.ObjectName; import org.jolokia.restrictor.Restrictor; import org.jolokia.util.HttpMethod; import org.jolokia.util.RequestType; import org.osgi.framework.*; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import static org.easymock.EasyMock.*; import static org.testng.Assert.*; /** * @author roland * @since 12.09.11 */ public class DelegatingRestrictorTest { private DelegatingRestrictor restrictor; private BundleContext context; @BeforeMethod public void setup() throws InvalidSyntaxException { context = createMock(BundleContext.class); restrictor = new DelegatingRestrictor(context); } private void setupRestrictor(Restrictor pRestrictor) throws InvalidSyntaxException { ServiceReference[] refs; if (pRestrictor != null) { ServiceReference ref = createMock(ServiceReference.class); refs = new ServiceReference[] { ref }; expect(context.getService(ref)).andReturn(pRestrictor).anyTimes(); replay(refs); } else { refs = null; } expect(context.getServiceReferences("org.jolokia.restrictor.Restrictor", null)).andReturn(refs).anyTimes(); replay(context); } @Test public void nullRestrictor() throws InvalidSyntaxException, MalformedObjectNameException { setupRestrictor(null); for (HttpMethod method : HttpMethod.values()) { assertFalse(restrictor.isHttpMethodAllowed(method)); } for (RequestType type : RequestType.values()) { assertFalse(restrictor.isTypeAllowed(type)); } assertFalse(restrictor.isAttributeReadAllowed(new ObjectName("java.lang:type=Memory"), "HeapMemoryUsage")); assertFalse(restrictor.isAttributeWriteAllowed(new ObjectName("java.lang:type=Memory"), "HeapMemoryUsage")); assertFalse(restrictor.isOperationAllowed(new ObjectName("java.lang:type=Memory"), "gc")); assertFalse(restrictor.isRemoteAccessAllowed("localhost", "127.0.0.1")); } @Test public void withRestrictor() throws InvalidSyntaxException, MalformedObjectNameException { setupRestrictor(new InnerRestrictor(true,false,true,false,true,false,true)); assertTrue(restrictor.isHttpMethodAllowed(HttpMethod.GET)); assertFalse(restrictor.isTypeAllowed(RequestType.EXEC)); assertTrue(restrictor.isAttributeReadAllowed(new ObjectName("java.lang:type=Memory"), "HeapMemoryUsage")); assertFalse(restrictor.isAttributeWriteAllowed(new ObjectName("java.lang:type=Memory"), "HeapMemoryUsage")); assertTrue(restrictor.isOperationAllowed(new ObjectName("java.lang:type=Memory"), "gc")); assertFalse(restrictor.isRemoteAccessAllowed("localhost", "127.0.0.1")); assertTrue(restrictor.isOriginAllowed("http://bla.com", false)); } @Test(expectedExceptions = IllegalArgumentException.class,expectedExceptionsMessageRegExp = ".*Impossible.*") public void invalidSyntax() throws InvalidSyntaxException { expect(context.getServiceReferences("org.jolokia.restrictor.Restrictor", null)).andThrow(new InvalidSyntaxException("", null)); replay(context); restrictor.isHttpMethodAllowed(HttpMethod.GET); } private static class InnerRestrictor implements Restrictor { boolean httpMethod,type,read,write,operation,remote,cors; private InnerRestrictor(boolean pHttpMethod, boolean pType, boolean pRead, boolean pWrite, boolean pOperation, boolean pRemote,boolean pCors) { httpMethod = pHttpMethod; type = pType; read = pRead; write = pWrite; operation = pOperation; remote = pRemote; cors = pCors; } public boolean isHttpMethodAllowed(HttpMethod pMethod) { return httpMethod; } public boolean isTypeAllowed(RequestType pType) { return type; } public boolean isAttributeReadAllowed(ObjectName pName, String pAttribute) { return read; } public boolean isAttributeWriteAllowed(ObjectName pName, String pAttribute) { return write; } public boolean isOperationAllowed(ObjectName pName, String pOperation) { return operation; } public boolean isRemoteAccessAllowed(String... pHostOrAddress) { return remote; } public boolean isOriginAllowed(String pOrigin, boolean pIsStrictCheck) { return cors; } } }