/* * Copyright (C) 2007 The Android Open Source Project * * 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. */ package tests.security.permissions; import dalvik.annotation.TestLevel; import dalvik.annotation.TestTargetClass; import dalvik.annotation.TestTargetNew; import dalvik.annotation.TestTargets; import junit.framework.TestCase; //import org.apache.harmony.security.tests.support.acl.PrincipalImpl; import java.security.AccessControlContext; import java.security.KeyFactory; import java.security.NoSuchAlgorithmException; import java.security.Permission; import java.security.Principal; import java.security.PrivateKey; import java.security.PrivilegedAction; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; import java.security.ProtectionDomain; import java.security.PublicKey; import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; import java.util.HashSet; import java.util.Set; import javax.security.auth.AuthPermission; import javax.security.auth.Subject; /* * This class tests the security permissions which are documented in * http://java.sun.com/j2se/1.5.0/docs/guide/security/permissions.html#PermsAndMethods * for class javax.security.auth.Subject */ @TestTargetClass( value = javax.security.auth.Subject.class, untestedMethods = { @TestTargetNew( level = TestLevel.NOT_FEASIBLE, notes = "Spec not specific enough for black-box testing", method = "toString", args = {} ) } ) public class JavaxSecurityAuthSubject extends TestCase { SecurityManager old; @Override protected void setUp() throws Exception { old = System.getSecurityManager(); super.setUp(); } @Override protected void tearDown() throws Exception { System.setSecurityManager(old); super.tearDown(); } @TestTargetNew( level = TestLevel.PARTIAL_COMPLETE, notes = "Verifies that getSubject() method calls checkPermission method of security permissions.", method = "getSubject", args = {java.security.AccessControlContext.class} ) public void test_getSubject() { class TestSecurityManager extends SecurityManager { boolean called = false; void reset() { called = false; } @Override public void checkPermission(Permission permission) { if (permission instanceof AuthPermission && "getSubject".equals(permission.getName())) { called = true; } } } AccessControlContext acc = new AccessControlContext( new ProtectionDomain[0]); TestSecurityManager s = new TestSecurityManager(); System.setSecurityManager(s); s.reset(); Subject.getSubject(acc); assertTrue( "javax.security.auth.Subject.getSubject() must call checkPermission on security manager", s.called); } @TestTargets ({ @TestTargetNew( level = TestLevel.PARTIAL_COMPLETE, notes = "Verifies that setReadOnly() calls checkPermission on security manager.", method = "getSubject", args = {java.security.AccessControlContext.class} ), @TestTargetNew( level = TestLevel.PARTIAL_COMPLETE, notes = "Verifies that setReadOnly() calls checkPermission on security manager.", method = "setReadOnly", args ={} ) }) public void test_setReadOnly() { class TestSecurityManager extends SecurityManager { boolean called = false; void reset() { called = false; } @Override public void checkPermission(Permission permission) { if (permission instanceof AuthPermission && "setReadOnly".equals(permission.getName())) { called = true; } } } AccessControlContext acc = new AccessControlContext( new ProtectionDomain[0]); Subject subject = new Subject(); TestSecurityManager s = new TestSecurityManager(); System.setSecurityManager(s); s.reset(); subject.setReadOnly(); assertTrue( "javax.security.auth.Subject.setReadOnly() must call checkPermission on security manager", s.called); } @TestTargets({ @TestTargetNew( level = TestLevel.PARTIAL_COMPLETE, notes = "Verifies that doAs() calls checkPermission on security manager.", method = "doAs", args = {javax.security.auth.Subject.class, java.security.PrivilegedAction.class} ), @TestTargetNew( level = TestLevel.PARTIAL_COMPLETE, notes = "Verifies that doAs() calls checkPermission on security manager.", method = "doAs", args = {javax.security.auth.Subject.class, java.security.PrivilegedExceptionAction.class} ) }) public void test_doAsCheckPermission() { class TestSecurityManager extends SecurityManager { boolean called = false; void reset() { called = false; } @Override public void checkPermission(Permission permission) { if (permission instanceof AuthPermission && "doAs".equals(permission.getName())) { called = true; } } } AccessControlContext acc = new AccessControlContext( new ProtectionDomain[0]); Subject subject = new Subject(); TestSecurityManager s = new TestSecurityManager(); System.setSecurityManager(s); s.reset(); Subject.doAs(subject, new PrivilegedAction<Object>(){ public Object run() { return null; } }); assertTrue( "javax.security.auth.Subject.doAs must call checkPermission on security manager", s.called); s.reset(); try { Subject.doAs(subject, new PrivilegedExceptionAction<Object>(){ public Object run() throws Exception { return null; } }); } catch (PrivilegedActionException e) { } assertTrue( "javax.security.auth.Subject.doAs must call checkPermission on security manager", s.called); } @TestTargets({ @TestTargetNew( level = TestLevel.TODO, notes = "Exception checking missing", method = "doAs", args = {javax.security.auth.Subject.class, java.security.PrivilegedAction.class} ), @TestTargetNew( level = TestLevel.TODO, notes = "Exception checking missing", method = "doAs", args = {javax.security.auth.Subject.class, java.security.PrivilegedExceptionAction.class} ) }) public void testDoAs() { } @TestTargets({ @TestTargetNew( level = TestLevel.PARTIAL_COMPLETE, notes = "Verifies that doAsPrivileged() calls checkPermission on security manager.", method = "doAsPrivileged", args = {javax.security.auth.Subject.class, java.security.PrivilegedAction.class, java.security.AccessControlContext.class} ), @TestTargetNew( level = TestLevel.PARTIAL_COMPLETE, notes = "Verifies that doAsPrivileged() calls checkPermission on security manager.", method = "doAsPrivileged", args = {javax.security.auth.Subject.class, java.security.PrivilegedExceptionAction.class, java.security.AccessControlContext.class} ) }) public void test_doAsPrivilegedCheckPermission() { class TestSecurityManager extends SecurityManager { boolean called = false; void reset() { called = false; } @Override public void checkPermission(Permission permission) { if (permission instanceof AuthPermission && "doAsPrivileged".equals(permission.getName())) { called = true; } } } AccessControlContext acc = new AccessControlContext( new ProtectionDomain[0]); Subject subject = new Subject(); TestSecurityManager s = new TestSecurityManager(); System.setSecurityManager(s); s.reset(); Subject.doAsPrivileged(subject, new PrivilegedAction<Object>() { public Object run() { return null; } }, acc); assertTrue( "javax.security.auth.Subject.doAsPrivileged must call checkPermission on security manager", s.called); s.reset(); try { Subject.doAsPrivileged(subject, new PrivilegedExceptionAction<Object>() { public Object run() throws Exception { return null; } }, acc); } catch (PrivilegedActionException e) { } assertTrue( "javax.security.auth.Subject.doAsPrivileged must call checkPermission on security manager", s.called); } @TestTargets({ @TestTargetNew( level = TestLevel.TODO, notes = "", method = "doAsPrivileged", args = {javax.security.auth.Subject.class, java.security.PrivilegedAction.class, java.security.AccessControlContext.class} ), @TestTargetNew( level = TestLevel.TODO, notes = "", method = "doAsPrivileged", args = {javax.security.auth.Subject.class, java.security.PrivilegedExceptionAction.class, java.security.AccessControlContext.class} ) }) public void doAsPrivileged() { } @TestTargets({ @TestTargetNew( level = TestLevel.TODO, notes = "", method = "isReadOnly", args = {} ), @TestTargetNew( level = TestLevel.TODO, notes = "", method = "setReadOnly", args = {} ) }) public void testSetGetIsReadonly() { } @TestTargetNew( level = TestLevel.TODO, notes = "", method = "getPrincipals", args = {} ) public void testGetPrincipals() { } @TestTargetNew( level = TestLevel.TODO, notes = "", method = "getPrincipals", args = {java.lang.Class.class} ) public void testGetPrincipalsClass() { } @TestTargetNew( level = TestLevel.TODO, notes = "", method = "getPrivateCredentials", args = {} ) public void testgetPrivateCredentials() { } @TestTargetNew( level = TestLevel.TODO, notes = "", method = "getPrivateCredentials", args = {java.lang.Class.class} ) public void testgetPrivateCredentialsClass() { } @TestTargetNew( level = TestLevel.TODO, notes = "", method = "getPublicCredentials", args = {} ) public void testgetPublicCredentials() { } @TestTargetNew( level = TestLevel.TODO, notes = "", method = "getPublicCredentials", args = {java.lang.Class.class} ) public void testgetPublicCredentialsClass() { } @TestTargetNew( level = TestLevel.TODO, notes = "", method = "getSubject", args = {java.security.AccessControlContext.class} ) public void testgetSubject() { } @TestTargetNew( level = TestLevel.TODO, notes = "", method = "hashCode", args = {} ) public void testHashCode() { } @TestTargetNew( level = TestLevel.TODO, notes = "", method = "equals", args = {java.lang.Object.class} ) public void testEquals() { } @TestTargetNew( level = TestLevel.PARTIAL, notes = "test only started please continue", method = "Subject", args = {} ) public void testConstructorDefault() { Subject s = new Subject(); assertEquals(0,s.getPrincipals().size()); assertEquals(0,s.getPrivateCredentials().size()); assertEquals(0,s.getPublicCredentials().size()); } @TestTargetNew( level = TestLevel.TODO, notes = "test only started please continue. Throws exception InvalidKeySpecException line 455", method = "Subject", args = {boolean.class, java.util.Set.class, java.util.Set.class, java.util.Set.class} ) public void testConstructor() throws NoSuchAlgorithmException, InvalidKeySpecException { /* Principal p = new PrincipalImpl("TestUser"); PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(new byte[]{(byte) 1, (byte) 2}); KeyFactory factory = KeyFactory.getInstance("RSA"); PublicKey pubKey = factory.generatePublic(spec); PrivateKey prKey = factory.generatePrivate(spec); Set<PublicKey> pubKeySet = new HashSet<PublicKey>(); pubKeySet.add(pubKey); Set<PrivateKey> prKeySet = new HashSet<PrivateKey>(); prKeySet.add(prKey); Set<Principal> pSet = new HashSet<Principal>(); pSet.add(p); //positive test Subject s = new Subject(true,pSet,pubKeySet,prKeySet); assertTrue(s.isReadOnly()) //readonly false //TODO continue here //wrong principal */ ; } }