/** * * 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.openejb.client; import junit.framework.TestCase; import javax.naming.Binding; import javax.naming.Context; import javax.naming.Name; import javax.naming.NameClassPair; import javax.naming.NameNotFoundException; import javax.naming.NameParser; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import javax.naming.spi.InitialContextFactory; import javax.naming.spi.InitialContextFactoryBuilder; import javax.naming.spi.NamingManager; import javax.security.auth.Subject; import javax.security.auth.login.FailedLoginException; import java.security.AccessController; import java.util.Hashtable; import java.util.Map; import java.util.TreeMap; public class MainTest extends TestCase { private static void initialize() { try { NamingManager.setInitialContextFactoryBuilder(new MockContextFactoryBuilder()); } catch (Exception e) { } } public static Map<String, Object> jndi = new TreeMap<String, Object>(); protected void setUp() throws Exception { super.setUp(); initialize(); LoginTestUtil.initialize(); jndi.clear(); jndi.put("java:info/path", "fake.jar"); jndi.put("java:info/injections", new InjectionMetaData()); } public void testSecureMain() throws Exception { jndi.put("java:info/callbackHandler", StaticUsernamePasswordCallbackHandler.class.getName()); StaticUsernamePasswordCallbackHandler.setUsername("victoria"); StaticUsernamePasswordCallbackHandler.setPassword("secret"); LoginTestUtil.setAuthGranted(); jndi.put("java:info/mainClass", SecureMain.class.getName()); Main.main(new String[0]); } public void testSecureMainFailed() throws Exception { jndi.put("java:info/callbackHandler", StaticUsernamePasswordCallbackHandler.class.getName()); StaticUsernamePasswordCallbackHandler.setUsername("victoria"); StaticUsernamePasswordCallbackHandler.setPassword("secret"); LoginTestUtil.setAuthDenied(); jndi.put("java:info/mainClass", SecureMain.class.getName()); try { Main.main(new String[0]); fail("Expected main method to throw FailedLoginException"); } catch (FailedLoginException expected) { } } public static class SecureMain { public static void main(String[] args) { Subject subject = Subject.getSubject(AccessController.getContext()); // verify subject assertEquals("Should have one principal", 1, subject.getPrincipals().size()); assertEquals("Should have one user principal", 1, subject.getPrincipals(ClientIdentityPrincipal.class).size()); ClientIdentityPrincipal principal = subject.getPrincipals(ClientIdentityPrincipal.class).iterator().next(); assertEquals("victoria", principal.getName()); assertEquals("SecretIdentity", principal.getClientIdentity()); // verify identity assertEquals("SecretIdentity", ClientSecurity.getIdentity()); } } public void testNormalMain() throws Exception { jndi.put("java:info/mainClass", NormalMain.class.getName()); Main.main(new String[0]); } public static class NormalMain { public static void main(String[] args) { Subject subject = Subject.getSubject(AccessController.getContext()); assertNull("subject is not null", subject); // verify we are not logged in assertNull("ClientSecurity.getIdentity() is not null", ClientSecurity.getIdentity()); } } // // Ignore these // public static class MockContextFactoryBuilder implements InitialContextFactoryBuilder { public InitialContextFactory createInitialContextFactory(Hashtable<?, ?> environment) throws NamingException { return new MockContextFactory(); } } public static class MockContextFactory implements InitialContextFactory { public Context getInitialContext(Hashtable<?, ?> environment) throws NamingException { return new MockContext(); } } public static class MockContext implements Context { public Object lookup(String name) throws NamingException { Object value = jndi.get(name); if (value == null) { throw new NameNotFoundException(name); } return value; } public Object lookup(Name name) throws NamingException { return null; } public void bind(Name name, Object obj) throws NamingException { } public void bind(String name, Object obj) throws NamingException { } public void rebind(Name name, Object obj) throws NamingException { } public void rebind(String name, Object obj) throws NamingException { } public void unbind(Name name) throws NamingException { } public void unbind(String name) throws NamingException { } public void rename(Name oldName, Name newName) throws NamingException { } public void rename(String oldName, String newName) throws NamingException { } public NamingEnumeration<NameClassPair> list(Name name) throws NamingException { return null; } public NamingEnumeration<NameClassPair> list(String name) throws NamingException { return null; } public NamingEnumeration<Binding> listBindings(Name name) throws NamingException { return null; } public NamingEnumeration<Binding> listBindings(String name) throws NamingException { return null; } public void destroySubcontext(Name name) throws NamingException { } public void destroySubcontext(String name) throws NamingException { } public Context createSubcontext(Name name) throws NamingException { return null; } public Context createSubcontext(String name) throws NamingException { return null; } public Object lookupLink(Name name) throws NamingException { return null; } public Object lookupLink(String name) throws NamingException { return null; } public NameParser getNameParser(Name name) throws NamingException { return null; } public NameParser getNameParser(String name) throws NamingException { return null; } public Name composeName(Name name, Name prefix) throws NamingException { return null; } public String composeName(String name, String prefix) throws NamingException { return null; } public Object addToEnvironment(String propName, Object propVal) throws NamingException { return null; } public Object removeFromEnvironment(String propName) throws NamingException { return null; } public Hashtable<?, ?> getEnvironment() throws NamingException { return null; } public void close() throws NamingException { } public String getNameInNamespace() throws NamingException { return null; } } }