/* * JBoss, Home of Professional Open Source. * Copyright 2010, Red Hat, Inc., and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.as.naming; import static org.jboss.as.naming.SecurityHelper.testActionPermission; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.Serializable; import java.util.Arrays; import java.util.HashSet; import java.util.Hashtable; import java.util.Set; import javax.naming.Binding; import javax.naming.CompositeName; import javax.naming.Context; import javax.naming.LinkRef; import javax.naming.Name; import javax.naming.NameClassPair; import javax.naming.NameNotFoundException; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import javax.naming.Reference; import javax.naming.Referenceable; import javax.naming.StringRefAddr; import javax.naming.spi.ObjectFactory; import org.junit.After; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.wildfly.naming.java.permission.JndiPermission; /** * @author John E. Bailey */ public class NamingContextTestCase { private WritableNamingStore namingStore; private NamingContext namingContext; @BeforeClass public static void setupObjectFactoryBuilder() throws Exception { NamingContext.initializeNamingManager(); } @Before public void setup() throws Exception { namingStore = new InMemoryNamingStore(); NamingContext.setActiveNamingStore(namingStore); namingContext = new NamingContext(namingStore, null); } @After public void cleanup() throws Exception { namingStore.close(); NamingContext.setActiveNamingStore(new InMemoryNamingStore()); } @Test public void testLookup() throws Exception { final Name name = new CompositeName("test"); final Object object = new Object(); namingStore.bind(name, object); Object result = namingContext.lookup(name); assertEquals(object, result); //the same with security permissions result = testActionPermission(JndiPermission.ACTION_LOOKUP, namingContext, "test"); assertEquals(object, result); } @Test public void testLookupReference() throws Exception { final Name name = new CompositeName("test"); final Reference reference = new Reference(String.class.getName(), new StringRefAddr("blah", "test"), TestObjectFactory.class.getName(), null); namingStore.bind(name, reference); Object result = namingContext.lookup(name); assertEquals("test", result); //the same with security permissions result = testActionPermission(JndiPermission.ACTION_LOOKUP, namingContext, "test"); assertEquals("test", result); } @Test public void testLookupWithContinuation() throws Exception { namingStore.bind(new CompositeName("comp/nested"), "test"); final Reference reference = new Reference(String.class.getName(), new StringRefAddr("nns", "comp"), TestObjectFactoryWithNameResolution.class.getName(), null); namingStore.bind(new CompositeName("test"), reference); Object result = namingContext.lookup(new CompositeName("test/nested")); assertEquals("test", result); //the same with security permissions result = testActionPermission(JndiPermission.ACTION_LOOKUP, Arrays.asList(new JndiPermission("comp/nested", "lookup")), namingContext, "test/nested"); assertEquals("test", result); } @Test public void testLookupWitResolveResult() throws Exception { namingStore.bind(new CompositeName("test/nested"), "test"); final Reference reference = new Reference(String.class.getName(), new StringRefAddr("blahh", "test"), TestObjectFactoryWithNameResolution.class.getName(), null); namingStore.bind(new CompositeName("comp"), reference); Object result = namingContext.lookup(new CompositeName("comp/nested")); assertEquals("test", result); //the same with security permissions result = testActionPermission(JndiPermission.ACTION_LOOKUP, Arrays.asList(new JndiPermission("test/nested", "lookup")), namingContext, "comp/nested"); assertEquals("test", result); } @Test public void testLookupLink() throws Exception { final Name name = new CompositeName("test"); namingStore.bind(name, "testValue", String.class); final Name linkName = new CompositeName("link"); namingStore.bind(linkName, new LinkRef("./test")); Object result = namingContext.lookup(linkName); assertEquals("testValue", result); //the same with security permissions result = testActionPermission(JndiPermission.ACTION_LOOKUP, Arrays.asList(new JndiPermission("test", "lookup")), namingContext, "link"); assertEquals("testValue", result); System.setProperty(Context.INITIAL_CONTEXT_FACTORY, InitialContextFactory.class.getName()); namingStore.rebind(linkName, new LinkRef(name)); result = namingContext.lookup(linkName); assertEquals("testValue", result); //the same with security permissions result = testActionPermission(JndiPermission.ACTION_LOOKUP, Arrays.asList(new JndiPermission("test", "lookup")), namingContext, "link"); assertEquals("testValue", result); } @Test public void testLookupContextLink() throws Exception { final Name name = new CompositeName("test/value"); namingStore.bind(name, "testValue"); final Name linkName = new CompositeName("link"); namingStore.bind(linkName, new LinkRef("./test")); Object result = namingContext.lookup("link/value"); assertEquals("testValue", result); //the same with security permissions result = testActionPermission(JndiPermission.ACTION_LOOKUP, Arrays.asList(new JndiPermission("test", "lookup"), new JndiPermission("test/value", "lookup")), namingContext, "link/value"); assertEquals("testValue", result); } @Test public void testLookupNameNotFound() throws Exception { try { namingContext.lookup(new CompositeName("test")); fail("Should have thrown and NameNotFoundException"); } catch (NameNotFoundException expected) { } //the same with security permissions try { testActionPermission(JndiPermission.ACTION_LOOKUP, namingContext, "test"); fail("Should have thrown and NameNotFoundException with appropriate permissions"); } catch (NameNotFoundException expected) { } } @Test public void testLookupEmptyName() throws Exception { Object result = namingContext.lookup(new CompositeName()); assertTrue(result instanceof NamingContext); result = namingContext.lookup(new CompositeName("")); assertTrue(result instanceof NamingContext); //the same with security permissions result = testActionPermission(JndiPermission.ACTION_LOOKUP, namingContext, null); assertTrue(result instanceof NamingContext); result = testActionPermission(JndiPermission.ACTION_LOOKUP, namingContext, ""); assertTrue(result instanceof NamingContext); } @Test public void testBind() throws Exception { Name name = new CompositeName("test"); final Object value = new Object(); namingContext.bind(name, value); assertEquals(value, namingStore.lookup(name)); //the same with security permissions name = new CompositeName("securitytest"); testActionPermission(JndiPermission.ACTION_BIND, namingContext, "securitytest", value); assertEquals(value, namingStore.lookup(name)); } @Test public void testBindReferenceable() throws Exception { Name name = new CompositeName("test"); final TestObjectReferenceable referenceable = new TestObjectReferenceable("addr"); namingContext.bind(name, referenceable); Object result = namingContext.lookup(name); assertEquals(referenceable.addr, result); //the same with security permissions name = new CompositeName("securitytest"); testActionPermission(JndiPermission.ACTION_BIND, namingContext, "securitytest", referenceable); result = testActionPermission(JndiPermission.ACTION_LOOKUP, namingContext, "securitytest"); assertEquals(referenceable.addr, result); } @Test public void testUnbind() throws Exception { final Name name = new CompositeName("test"); final Object value = new Object(); namingStore.bind(name, value); namingContext.unbind(name); try { namingStore.lookup(name); fail("Should have thrown name not found"); } catch (NameNotFoundException expect) {} //the same with security permissions testActionPermission(JndiPermission.ACTION_BIND, namingContext, "test", value); testActionPermission(JndiPermission.ACTION_UNBIND, namingContext, "test"); try { namingStore.lookup(name); fail("Should have thrown name not found"); } catch (NameNotFoundException expect) {} } @Test public void testCreateSubcontext() throws Exception { assertTrue(namingContext.createSubcontext(new CompositeName("test")) instanceof NamingContext); //the same with security permissions assertTrue(testActionPermission(JndiPermission.ACTION_CREATE_SUBCONTEXT, namingContext, "securitytest") instanceof NamingContext); } @Test public void testRebind() throws Exception { final Name name = new CompositeName("test"); final Object value = new Object(); namingStore.bind(name, value); Object newValue = new Object(); namingContext.rebind(name, newValue); assertEquals(newValue, namingStore.lookup(name)); //the same with security permissions newValue = new Object(); testActionPermission(JndiPermission.ACTION_REBIND, namingContext, "test", newValue); assertEquals(newValue, namingStore.lookup(name)); } @Test public void testRebindReferenceable() throws Exception { final Name name = new CompositeName("test"); final TestObjectReferenceable referenceable = new TestObjectReferenceable("addr"); namingContext.bind(name, referenceable); TestObjectReferenceable newReferenceable = new TestObjectReferenceable("newAddr"); namingContext.rebind(name, newReferenceable); Object result = namingContext.lookup(name); assertEquals(newReferenceable.addr, result); //the same with security permissions newReferenceable = new TestObjectReferenceable("yetAnotherNewAddr"); testActionPermission(JndiPermission.ACTION_REBIND, namingContext, "test", newReferenceable); result = namingContext.lookup(name); assertEquals(newReferenceable.addr, result); } @Test public void testListNameNotFound() throws Exception { try { namingContext.list(new CompositeName("test")); fail("Should have thrown and NameNotFoundException"); } catch (NameNotFoundException expected) { } //the same with security permissions try { testActionPermission(JndiPermission.ACTION_LIST, namingContext, "test"); fail("Should have thrown and NameNotFoundException with appropriate permissions"); } catch (NameNotFoundException expected) { } } @Test @SuppressWarnings("unchecked") public void testList() throws Exception { bindList(); NamingEnumeration<NameClassPair> results = namingContext.list(new CompositeName()); checkListResults(results); //the same with security permissions results = (NamingEnumeration<NameClassPair>) testActionPermission(JndiPermission.ACTION_LIST, namingContext, null); checkListResults(results); } @Test @SuppressWarnings("unchecked") public void testListWithContinuation() throws Exception { bindListWithContinuations(); NamingEnumeration<NameClassPair> results = namingContext.list(new CompositeName("comp")); checkListWithContinuationsResults(results); //the same with security permissions results = (NamingEnumeration<NameClassPair>) testActionPermission(JndiPermission.ACTION_LIST, Arrays.asList( new JndiPermission("test", "list")), namingContext, "comp"); checkListWithContinuationsResults(results); } @Test public void testListBindingsNameNotFound() throws Exception { try { namingContext.listBindings(new CompositeName("test")); fail("Should have thrown and NameNotFoundException"); } catch (NameNotFoundException expected) { } //the same with security permissions try { testActionPermission(JndiPermission.ACTION_LIST_BINDINGS, namingContext, "test"); fail("Should have thrown and NameNotFoundException with appropriate permissions"); } catch (NameNotFoundException expected) { } } @Test @SuppressWarnings("unchecked") public void testListBindings() throws Exception { bindList(); NamingEnumeration<Binding> results = namingContext.listBindings(new CompositeName()); checkListResults(results); //the same with security permissions results = (NamingEnumeration<Binding>) testActionPermission(JndiPermission.ACTION_LIST_BINDINGS, namingContext, null); checkListResults(results); } @Test @SuppressWarnings("unchecked") public void testListBindingsWithContinuation() throws Exception { bindListWithContinuations(); NamingEnumeration<Binding> results = namingContext.listBindings(new CompositeName("comp")); checkListWithContinuationsResults(results); //the same with security permissions results = (NamingEnumeration<Binding>) testActionPermission(JndiPermission.ACTION_LIST_BINDINGS, Arrays.asList( new JndiPermission("test", "listBindings")), namingContext, "comp"); checkListWithContinuationsResults(results); } public static class TestObjectFactory implements ObjectFactory { @Override public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment) throws Exception { return ((Reference) obj).get(0).getContent(); } } public static class TestObjectFactoryWithNameResolution implements ObjectFactory { @Override public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment) throws Exception { final Reference reference = (Reference) obj; return new NamingContext(new CompositeName((String) reference.get(0).getContent()), null); } } public static class TestObjectReferenceable implements Referenceable, Serializable { private static final long serialVersionUID = 1L; private String addr; public TestObjectReferenceable(String addr) { this.addr = addr; } @Override public Reference getReference() throws NamingException { return new Reference(String.class.getName(), new StringRefAddr("blah", addr), TestObjectFactory.class.getName(), null); } } private void bindList() throws NamingException { final Name name = new CompositeName("test"); final Object object = new Object(); namingStore.bind(name, object); final Name nameTwo = new CompositeName("testTwo"); final Object objectTwo = new Object(); namingStore.bind(nameTwo, objectTwo); final Name nameThree = new CompositeName("testThree"); final Object objectThree = new Object(); namingStore.bind(nameThree, objectThree); namingStore.bind(new CompositeName("testContext/test"), "testNested"); } private void bindListWithContinuations() throws NamingException { final Name name = new CompositeName("test/test"); final Object object = new Object(); namingStore.bind(name, object); final Name nameTwo = new CompositeName("test/testTwo"); final Object objectTwo = new Object(); namingStore.bind(nameTwo, objectTwo); final Name nameThree = new CompositeName("test/testThree"); final Object objectThree = new Object(); namingStore.bind(nameThree, objectThree); final Reference reference = new Reference(String.class.getName(), new StringRefAddr("nns", "test"), TestObjectFactoryWithNameResolution.class.getName(), null); namingStore.bind(new CompositeName("comp"), reference); } private void checkListResults(NamingEnumeration<? extends NameClassPair> results) throws NamingException { final Set<String> expected = new HashSet<String>(Arrays.asList("test", "testTwo", "testThree", "testContext")); while (results.hasMore()) { NameClassPair result = results.next(); final String resultName = result.getName(); if ("test".equals(resultName) || "testTwo".equals(resultName) || "testThree".equals(resultName)) { assertEquals(Object.class.getName(), result.getClassName()); } else if ("testContext".equals(resultName)) { assertEquals(Context.class.getName(), result.getClassName()); } else { fail("Unknown result name: " + resultName); } expected.remove(resultName); } assertTrue("Not all expected results were returned", expected.isEmpty()); } private void checkListWithContinuationsResults(NamingEnumeration<? extends NameClassPair> results) throws NamingException { final Set<String> expected = new HashSet<String>(Arrays.asList("test", "testTwo", "testThree")); while (results.hasMore()) { NameClassPair result = results.next(); final String resultName = result.getName(); if ("test".equals(resultName) || "testTwo".equals(resultName) || "testThree".equals(resultName)) { assertEquals(Object.class.getName(), result.getClassName()); } else { fail("Unknown result name: " + resultName); } expected.remove(resultName); } assertTrue("Not all expected results were returned", expected.isEmpty()); } }