blob: ce57328c3db259b2d566b46ddf93f98514c99b2a [file] [log] [blame]
/*
* 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.
*/
/**
* @author Alexey V. Varlamov
* @version $Revision$
*/
package org.apache.harmony.security.tests.java.security;
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.SecurityChecker;
import org.apache.harmony.security.tests.support.TestUtils;
import tests.util.TestEnvironment;
import java.io.File;
import java.io.FilePermission;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.CodeSource;
import java.security.Permission;
import java.security.PermissionCollection;
import java.security.Permissions;
import java.security.Policy;
import java.security.ProtectionDomain;
import java.security.Security;
import java.security.SecurityPermission;
import java.security.cert.Certificate;
import java.util.Collection;
import java.util.Enumeration;
import java.util.HashSet;
@TestTargetClass(Policy.class)
/**
* Tests for <code>Policy</code>
*/
public class PolicyTest extends TestCase {
public static final String JAVA_SECURITY_POLICY = "java.security.policy";
public static void main(String[] args) {
junit.textui.TestRunner.run(PolicyTest.class);
}
@Override protected void tearDown() throws Exception {
TestEnvironment.reset();
super.tearDown();
}
/**
* @tests constructor Policy()
*/
@SuppressWarnings("cast")
@TestTargets({
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "Policy",
args = {}
),
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "getPermissions",
args = {java.security.CodeSource.class}
),
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "refresh",
args = {}
)
})
public void test_constructor() {
TestProvider tp;
CodeSource cs = new CodeSource(null, (Certificate[]) null);
try {
tp = new TestProvider();
assertTrue(tp instanceof Policy);
} catch (Exception e) {
fail("Unexpected exception " + e.getMessage());
}
try {
tp = new TestProvider();
tp.getPermissions(cs);
tp.refresh();
} catch (Exception e) {
fail("Unexpected exception was thrown for abstract methods");
}
}
/**
* @tests java.security.Policy#setPolicy(java.security.Policy)
*/
@TestTargets({
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "",
method = "setPolicy",
args = {java.security.Policy.class}
),
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "",
method = "getPolicy",
args = {}
)
})
public void test_setPolicyLjava_security_Policy() {
SecurityManager old = System.getSecurityManager();
Policy oldPolicy = Policy.getPolicy();
try {
SecurityChecker checker = new SecurityChecker(
new SecurityPermission("setPolicy"), true);
System.setSecurityManager(checker);
Policy custom = new TestProvider();
Policy.setPolicy(custom);
assertTrue(checker.checkAsserted);
assertSame(custom, Policy.getPolicy());
checker.reset();
checker.enableAccess = false;
try {
Policy.setPolicy(new TestProvider());
fail("SecurityException is intercepted");
} catch (SecurityException ok) {
}
} finally {
System.setSecurityManager(old);
Policy.setPolicy(oldPolicy);
}
}
/**
* @tests java.security.Policy#getPolicy()
*/
@TestTargets({
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "",
method = "getPolicy",
args = {}
),
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "",
method = "setPolicy",
args = {java.security.Policy.class}
)
})
public void test_getPolicy() {
SecurityManager old = System.getSecurityManager();
Policy oldPolicy = Policy.getPolicy();
try {
Policy.setPolicy(new TestProvider());
SecurityChecker checker = new SecurityChecker(
new SecurityPermission("getPolicy"), true);
System.setSecurityManager(checker);
Policy.getPolicy();
assertTrue(checker.checkAsserted);
checker.reset();
checker.enableAccess = false;
try {
Policy.getPolicy();
fail("SecurityException is intercepted");
} catch (SecurityException ok) {
}
} finally {
System.setSecurityManager(old);
Policy.setPolicy(oldPolicy);
}
}
public static class TestProvider extends Policy {
PermissionCollection pc;
public PermissionCollection getPermissions(CodeSource cs) {
return pc;
}
public void refresh() {
}
}
/**
* Tests that getPermissions() does proper permission evaluation.
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "getPermissions",
args = {java.security.ProtectionDomain.class}
)
public void testGetPermissions() {
SecurityPermission sp = new SecurityPermission("abc");
SecurityPermission sp2 = new SecurityPermission("fbdf");
PermissionCollection spc = sp.newPermissionCollection();
spc.add(sp2);
ProtectionDomain pd = new ProtectionDomain(null, null);
ProtectionDomain pd2 = new ProtectionDomain(null, spc);
TestProvider policy = new TestProvider();
policy.pc = sp.newPermissionCollection();
// case1: empty policy, no static permissions in PD
PermissionCollection pc4pd = policy.getPermissions(pd);
assertNotNull(pc4pd);
Enumeration<Permission> en = pc4pd.elements();
assertFalse(en.hasMoreElements());
// case2: empty policy, some static permissions in PD
pc4pd = policy.getPermissions(pd2);
assertNotNull(pc4pd);
// no check for static permissions
// case3: non-empty policy, no static permissions in PD
policy.pc.add(sp);
pc4pd = policy.getPermissions(pd);
assertNotNull(pc4pd);
Collection<Permission> c = new HashSet<Permission>();
for (en = pc4pd.elements(); en.hasMoreElements(); c.add(en
.nextElement())) {
}
assertTrue(c.contains(sp));
// case4: non-empty policy, some static permissions in PD
pc4pd = policy.getPermissions(pd2);
assertNotNull(pc4pd);
c = new HashSet<Permission>();
for (en = pc4pd.elements(); en.hasMoreElements(); c.add(en
.nextElement())) {
}
assertTrue(c.contains(sp));
// no check for static permissions
}
/**
* @tests java.security.Policy#getPolicy()
* @tests java.security.Policy#setPolicy()
*/
@TestTargets({
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "",
method = "setPolicy",
args = {java.security.Policy.class}
),
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "",
method = "getPolicy",
args = {}
)
})
public void testResetingPolicyToDefault() {
Policy oldPolicy = Policy.getPolicy();
assertNotNull("Got a null system security policy", oldPolicy);
try {
Policy.setPolicy(null); // passing null resets policy
Policy newPolicy = Policy.getPolicy();
assertNotNull(newPolicy);
assertNotSame(oldPolicy, newPolicy);
assertEquals("Policy class name", Security
.getProperty("policy.provider"), newPolicy.getClass()
.getName());
} finally {
Policy.setPolicy(oldPolicy);
}
}
/**
* @tests java.security.Policy#implies(ProtectionDomain, Permission)
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "implies",
args = {java.security.ProtectionDomain.class, java.security.Permission.class}
)
public void test_implies() {
Policy policy = Policy.getPolicy();
char s = File.separatorChar;
URL url = null;
try {
url = new URL("http://localhost");
} catch (MalformedURLException ex) {
throw new Error(ex);
}
CodeSource cs = new CodeSource(url,
(java.security.cert.Certificate[]) null);
FilePermission perm[] = new FilePermission[7];
perm[0] = new FilePermission("test1.file", "write");
perm[1] = new FilePermission("test1.file",
"read, write, execute,delete");
perm[2] = new FilePermission(s + "tmp" + s + "test" + s + "*",
"read,write");
perm[3] = new FilePermission(s + "tmp" + s + "test" + s
+ "collection.file", "read");
perm[4] = new FilePermission(s + "windows" + "*", "delete");
perm[5] = new FilePermission("aFile.file", "read");
perm[6] = new FilePermission("hello.file", "write");
Permissions perms = new Permissions();
for (int i = 0; i < perm.length; i++) {
perms.add(perm[i]);
}
ProtectionDomain pd = new ProtectionDomain(cs, perms);
assertTrue(policy.implies(pd, perm[0]));
assertTrue(policy.implies(pd, perm[1]));
assertTrue(policy.implies(pd, perm[2]));
assertTrue(policy.implies(pd, perm[3]));
assertTrue(policy.implies(pd, perm[4]));
assertTrue(policy.implies(pd, perm[5]));
assertTrue(policy.implies(pd, perm[6]));
assertTrue(policy.implies(pd,
new FilePermission("test1.file", "delete")));
assertTrue(policy.implies(pd,
new FilePermission(s + "tmp" + s + "test" + s + "test1.file", "read")));
assertFalse(policy.implies(pd, new FilePermission("aFile.file",
"delete")));
assertFalse(policy.implies(pd, new FilePermission("hello.file",
"delete")));
assertFalse(policy.implies(pd, new FilePermission(s + "tmp" + s
+ "test" + s + "collection.file", "delete")));
assertFalse(policy.implies(pd, new FilePermission(s + "tmp" + s
+ "test" + s + "*", "delete")));
assertFalse(policy.implies(pd, new FilePermission("hello.file",
"execute")));
try {
assertFalse(policy.implies(pd, null));
} catch (NullPointerException e) {
// expected
}
try {
assertFalse(policy.implies(null, new FilePermission("test1.file", "delete")));
} catch (NullPointerException e) {
fail("Unexpected NullPointerException");
}
try {
assertFalse(policy.implies(null, null));
} catch (NullPointerException e) {
// ok
}
}
/**
* Test property expansion in policy files
*/
@TestTargets({
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "",
method = "setPolicy",
args = {java.security.Policy.class}
),
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "",
method = "getPolicy",
args = {}
)
})
public void testPropertyExpansion() throws Exception {
// Regression for HARMONY-1963 and HARMONY-2910
String policyFile = getClass().getClassLoader().getResource(
"PolicyTest.txt").toString();
String oldJavaPolicy = System.getProperty(JAVA_SECURITY_POLICY);
Policy oldPolicy = Policy.getPolicy();
try {
System.setProperty(JAVA_SECURITY_POLICY, policyFile);
// test: absolute paths
assertCodeBasePropertyExpansion("/11111/*", "/11111/-");
assertCodeBasePropertyExpansion("/22222/../22222/*", "/22222/-");
assertCodeBasePropertyExpansion("/33333/*", "/33333/../33333/-");
assertCodeBasePropertyExpansion("/44444/../44444/-", "/44444/*");
assertCodeBasePropertyExpansion("/55555/../55555/-", "/55555/../55555/-");
assertCodeBasePropertyExpansion("/666 66 66/-", "/666 66 66/-");
// test: relative paths
assertCodeBasePropertyExpansion("11111/*", "11111/-");
assertCodeBasePropertyExpansion("22222/../22222/*", "22222/-");
assertCodeBasePropertyExpansion("33333/*", "33333/../33333/-");
assertCodeBasePropertyExpansion("44444/../44444/-", "44444/*");
assertCodeBasePropertyExpansion("55555/../55555/-", "55555/../55555/-");
assertCodeBasePropertyExpansion("666 66 66/-", "666 66 66/-");
} finally {
TestUtils.setSystemProperty(JAVA_SECURITY_POLICY, oldJavaPolicy);
Policy.setPolicy(oldPolicy);
}
}
/**
* Asserts codeBase property expansion in policy file
*
* @param codeSourceURL -
* code source for policy object
* @param codeBaseURL -
* system propery value for expansion in policy file
*/
private void assertCodeBasePropertyExpansion(String codeSourceURL,
String codeBaseURL) throws Exception {
Policy.setPolicy(null); // reset policy
System.setProperty("test.bin.dir", codeBaseURL);
Policy p = Policy.getPolicy();
CodeSource codeSource = new CodeSource(
new URL("file:" + codeSourceURL),
(java.security.cert.Certificate[]) null);
PermissionCollection pCollection = p.getPermissions(codeSource);
Enumeration<Permission> elements = pCollection.elements();
SecurityPermission perm = new SecurityPermission(
"codeBaseForPolicyTest");
while (elements.hasMoreElements()) {
if (elements.nextElement().equals(perm)) {
return; // passed
}
}
fail("Failed to find SecurityPermission for codeSource="
+ codeSourceURL + ", codeBase=" + codeBaseURL);
}
}