blob: 2602ce762044a0b747a3cbf4de200c8c7cc0776a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2021 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.osgi.tests.securityadmin;
import java.io.File;
import java.security.AllPermission;
import java.security.CodeSource;
import java.security.Permission;
import java.security.PermissionCollection;
import java.security.Policy;
import java.util.Collection;
import java.util.Collections;
import java.util.Dictionary;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.osgi.launch.Equinox;
import org.eclipse.osgi.tests.OSGiTestsActivator;
import org.eclipse.osgi.tests.bundles.AbstractBundleTests;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;
import org.osgi.framework.BundlePermission;
import org.osgi.framework.Constants;
import org.osgi.framework.PackagePermission;
import org.osgi.framework.hooks.resolver.ResolverHook;
import org.osgi.framework.hooks.resolver.ResolverHookFactory;
import org.osgi.framework.namespace.ExecutionEnvironmentNamespace;
import org.osgi.framework.namespace.PackageNamespace;
import org.osgi.framework.wiring.BundleCapability;
import org.osgi.framework.wiring.BundleRequirement;
import org.osgi.framework.wiring.BundleRevision;
import org.osgi.framework.wiring.FrameworkWiring;
import org.osgi.resource.Namespace;
import org.osgi.resource.Requirement;
import org.osgi.resource.Resource;
import org.osgi.service.condpermadmin.BundleLocationCondition;
import org.osgi.service.condpermadmin.ConditionInfo;
import org.osgi.service.condpermadmin.ConditionalPermissionAdmin;
import org.osgi.service.condpermadmin.ConditionalPermissionInfo;
import org.osgi.service.condpermadmin.ConditionalPermissionUpdate;
import org.osgi.service.packageadmin.ExportedPackage;
import org.osgi.service.packageadmin.PackageAdmin;
import org.osgi.service.packageadmin.RequiredBundle;
import org.osgi.service.permissionadmin.PermissionInfo;
import org.osgi.service.startlevel.StartLevel;
public class SecurityManagerTests extends AbstractBundleTests {
private static final PermissionInfo hostFragmentPermission = new PermissionInfo(BundlePermission.class.getName(), "*", "host,fragment"); //$NON-NLS-1$ //$NON-NLS-2$
private static final PermissionInfo hostFragmentProvidePermission = new PermissionInfo(BundlePermission.class.getName(), "*", "host,fragment,provide"); //$NON-NLS-1$ //$NON-NLS-2$
private static final PermissionInfo allPackagePermission = new PermissionInfo(PackagePermission.class.getName(), "*", "import,export"); //$NON-NLS-1$ //$NON-NLS-2$
private static final PermissionInfo importPackagePermission = new PermissionInfo(PackagePermission.class.getName(), "*", "import"); //$NON-NLS-1$ //$NON-NLS-2$
private static final PermissionInfo importFrameworkPackagePermission = new PermissionInfo(PackagePermission.class.getName(), "org.osgi.framework", "import"); //$NON-NLS-1$ //$NON-NLS-2$
private Policy previousPolicy;
public static Test suite() {
return new TestSuite(SecurityManagerTests.class);
}
@Override
protected void setUp() throws Exception {
if (System.getSecurityManager() != null)
fail("Cannot test with security manager set"); //$NON-NLS-1$
previousPolicy = Policy.getPolicy();
final Permission allPermission = new AllPermission();
final PermissionCollection allPermissions = new PermissionCollection() {
private static final long serialVersionUID = 3258131349494708277L;
// A simple PermissionCollection that only has AllPermission
@Override
public void add(Permission permission) {
//no adding to this policy
}
@Override
public boolean implies(Permission permission) {
return true;
}
@Override
public Enumeration elements() {
return new Enumeration() {
int cur = 0;
@Override
public boolean hasMoreElements() {
return cur < 1;
}
@Override
public Object nextElement() {
if (cur == 0) {
cur = 1;
return allPermission;
}
throw new NoSuchElementException();
}
};
}
};
Policy.setPolicy(new Policy() {
@Override
public PermissionCollection getPermissions(CodeSource codesource) {
return allPermissions;
}
@Override
public void refresh() {
// nothing
}
});
super.setUp();
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
if (System.getSecurityManager() != null)
System.setSecurityManager(null);
Policy.setPolicy(previousPolicy);
}
public void testEnableSecurityManager01() {
File config = OSGiTestsActivator.getContext().getDataFile("testEnableSecurityManager01"); //$NON-NLS-1$
Map<String, Object> configuration = new HashMap<>();
configuration.put(Constants.FRAMEWORK_STORAGE, config.getAbsolutePath());
configuration.put(Constants.FRAMEWORK_SECURITY, Constants.FRAMEWORK_SECURITY_OSGI);
Equinox equinox = new Equinox(configuration);
try {
equinox.init();
} catch (BundleException e) {
fail("Unexpected exception on init()", e); //$NON-NLS-1$
}
assertNotNull("SecurityManager is null", System.getSecurityManager()); //$NON-NLS-1$
// should be in the STARTING state
assertEquals("Wrong state for SystemBundle", Bundle.STARTING, equinox.getState()); //$NON-NLS-1$
try {
equinox.start();
} catch (BundleException e) {
fail("Failed to start the framework", e); //$NON-NLS-1$
}
assertEquals("Wrong state for SystemBundle", Bundle.ACTIVE, equinox.getState()); //$NON-NLS-1$
// put the framework back to the RESOLVED state
stop(equinox);
assertEquals("Wrong state for SystemBundle", Bundle.RESOLVED, equinox.getState()); //$NON-NLS-1$
assertNull("SecurityManager is not null", System.getSecurityManager()); //$NON-NLS-1$
}
public void testEnableSecurityManager02() throws BundleException {
// create/start/stop/start/stop test
File config = OSGiTestsActivator.getContext().getDataFile("testEnableSecurityManager02"); //$NON-NLS-1$
Map<String, Object> configuration = new HashMap<>();
configuration.put(Constants.FRAMEWORK_STORAGE, config.getAbsolutePath());
configuration.put(Constants.FRAMEWORK_SECURITY, Constants.FRAMEWORK_SECURITY_OSGI);
Equinox equinox = new Equinox(configuration);
try {
equinox.init();
} catch (BundleException e) {
fail("Unexpected exception on init()", e); //$NON-NLS-1$
}
assertNotNull("SecurityManager is null", System.getSecurityManager()); //$NON-NLS-1$
// should be in the STARTING state
assertEquals("Wrong state for SystemBundle", Bundle.STARTING, equinox.getState()); //$NON-NLS-1$
BundleContext systemContext = equinox.getBundleContext();
assertNotNull("System context is null", systemContext); //$NON-NLS-1$
// try installing host and fragment to test bug 245678
String locationSecurityA = installer.getBundleLocation("security.a"); //$NON-NLS-1$
String locationSecurityAFragA = installer.getBundleLocation("security.a.frag.a"); //$NON-NLS-1$
// set the security for the host and fragment
ConditionalPermissionAdmin ca = (ConditionalPermissionAdmin) systemContext.getService(systemContext.getServiceReference(ConditionalPermissionAdmin.class.getName()));
ConditionalPermissionUpdate update = ca.newConditionalPermissionUpdate();
List rows = update.getConditionalPermissionInfos();
rows.add(ca.newConditionalPermissionInfo(null, null, new PermissionInfo[] {hostFragmentPermission, allPackagePermission}, ConditionalPermissionInfo.ALLOW));
assertTrue("Cannot commit rows", update.commit()); //$NON-NLS-1$
Bundle securityA = systemContext.installBundle(locationSecurityA);
systemContext.installBundle(locationSecurityAFragA);
equinox.start();
try {
securityA.start();
} catch (BundleException e) {
fail("Failed to start securityA", e); //$NON-NLS-1$
} finally {
// put the framework back to the RESOLVED state
stop(equinox);
}
assertEquals("Wrong state for SystemBundle", Bundle.RESOLVED, equinox.getState()); //$NON-NLS-1$
assertNull("SecurityManager is not null", System.getSecurityManager()); //$NON-NLS-1$
}
public void testEnableSecurityManager03() throws BundleException {
File config = OSGiTestsActivator.getContext().getDataFile("testEnableSecurityManager03"); //$NON-NLS-1$
Map<String, Object> configuration = new HashMap<>();
configuration.put(Constants.FRAMEWORK_STORAGE, config.getAbsolutePath());
configuration.put(Constants.FRAMEWORK_SECURITY, Constants.FRAMEWORK_SECURITY_OSGI);
Equinox equinox = new Equinox(configuration);
try {
equinox.init();
} catch (BundleException e) {
fail("Unexpected exception on init()", e); //$NON-NLS-1$
}
assertNotNull("SecurityManager is null", System.getSecurityManager()); //$NON-NLS-1$
// should be in the STARTING state
assertEquals("Wrong state for SystemBundle", Bundle.STARTING, equinox.getState()); //$NON-NLS-1$
BundleContext systemContext = equinox.getBundleContext();
assertNotNull("System context is null", systemContext); //$NON-NLS-1$
// try installing a bundle to tests bug
String locationSecurityA = installer.getBundleLocation("security.a"); //$NON-NLS-1$
// set the security for the bundle
ConditionalPermissionAdmin ca = (ConditionalPermissionAdmin) systemContext.getService(systemContext.getServiceReference(ConditionalPermissionAdmin.class.getName()));
ConditionalPermissionUpdate update = ca.newConditionalPermissionUpdate();
List rows = update.getConditionalPermissionInfos();
rows.add(ca.newConditionalPermissionInfo(null, null, new PermissionInfo[] {hostFragmentPermission, importPackagePermission}, ConditionalPermissionInfo.ALLOW));
assertTrue("Cannot commit rows", update.commit()); //$NON-NLS-1$
Bundle securityA = systemContext.installBundle(locationSecurityA);
equinox.start();
PackageAdmin pa = (PackageAdmin) systemContext.getService(systemContext.getServiceReference(PackageAdmin.class.getName()));
try {
assertTrue(pa.resolveBundles(new Bundle[] {securityA}));
ExportedPackage[] eps = pa.getExportedPackages(securityA);
assertNull("Found unexpected exports", eps); //$NON-NLS-1$
RequiredBundle[] rbs = pa.getRequiredBundles(securityA.getSymbolicName());
assertNull("Found unexpected required bundle", rbs); //$NON-NLS-1$
// grant export permission
update = ca.newConditionalPermissionUpdate();
rows = update.getConditionalPermissionInfos();
rows.clear();
rows.add(ca.newConditionalPermissionInfo(null, null, new PermissionInfo[] {hostFragmentProvidePermission, allPackagePermission}, ConditionalPermissionInfo.ALLOW));
assertTrue("Cannot commit rows", update.commit()); //$NON-NLS-1$
securityA.uninstall();
securityA = systemContext.installBundle(locationSecurityA);
assertTrue(pa.resolveBundles(new Bundle[] {securityA}));
eps = pa.getExportedPackages(securityA);
assertNotNull("Did not find expected exports", eps); //$NON-NLS-1$
assertEquals("Wrong number of exports found", 1, eps.length); //$NON-NLS-1$
rbs = pa.getRequiredBundles(securityA.getSymbolicName());
assertNotNull("Did not find required bundle", eps); //$NON-NLS-1$
assertEquals("Wrong number of required bundles found", 1, rbs.length); //$NON-NLS-1$
} finally {
// put the framework back to the RESOLVED state
stop(equinox);
}
assertEquals("Wrong state for SystemBundle", Bundle.RESOLVED, equinox.getState()); //$NON-NLS-1$
assertNull("SecurityManager is not null", System.getSecurityManager()); //$NON-NLS-1$
}
public void testEnableSecurityManager04() throws BundleException {
File config = OSGiTestsActivator.getContext().getDataFile("testEnableSecurityManager04"); //$NON-NLS-1$
Map<String, Object> configuration = new HashMap<>();
configuration.put(Constants.FRAMEWORK_STORAGE, config.getAbsolutePath());
configuration.put(Constants.FRAMEWORK_SECURITY, Constants.FRAMEWORK_SECURITY_OSGI);
Equinox equinox = new Equinox(configuration);
try {
equinox.init();
} catch (BundleException e) {
fail("Unexpected exception on init()", e); //$NON-NLS-1$
}
assertNotNull("SecurityManager is null", System.getSecurityManager()); //$NON-NLS-1$
// should be in the STARTING state
assertEquals("Wrong state for SystemBundle", Bundle.STARTING, equinox.getState()); //$NON-NLS-1$
BundleContext systemContext = equinox.getBundleContext();
assertNotNull("System context is null", systemContext); //$NON-NLS-1$
// try installing a bundle to tests bug
String locationLinkA = installer.getBundleLocation("test.link.a"); //$NON-NLS-1$
String locationLinkAClient = installer.getBundleLocation("test.link.a.client"); //$NON-NLS-1$
// set the security for the bundles
ConditionInfo linkACondition = new ConditionInfo(BundleLocationCondition.class.getName(), new String[] {locationLinkA});
ConditionInfo linkAClientCondition = new ConditionInfo(BundleLocationCondition.class.getName(), new String[] {locationLinkAClient});
PermissionInfo filterPermission = new PermissionInfo(PackagePermission.class.getName(), "(&(name=test.link.a)(package.name=test.link.*))", "import"); //$NON-NLS-1$ //$NON-NLS-2$
ConditionalPermissionAdmin ca = (ConditionalPermissionAdmin) systemContext.getService(systemContext.getServiceReference(ConditionalPermissionAdmin.class.getName()));
ConditionalPermissionUpdate update = ca.newConditionalPermissionUpdate();
List rows = update.getConditionalPermissionInfos();
rows.add(ca.newConditionalPermissionInfo(null, new ConditionInfo[] {linkACondition}, new PermissionInfo[] {hostFragmentProvidePermission, allPackagePermission}, ConditionalPermissionInfo.ALLOW));
rows.add(ca.newConditionalPermissionInfo(null, new ConditionInfo[] {linkAClientCondition}, new PermissionInfo[] {importFrameworkPackagePermission, filterPermission}, ConditionalPermissionInfo.ALLOW));
assertTrue("Cannot commit rows", update.commit()); //$NON-NLS-1$
Bundle linkA = systemContext.installBundle(locationLinkA);
Bundle linkAClient = systemContext.installBundle(locationLinkAClient);
equinox.start();
PackageAdmin pa = (PackageAdmin) systemContext.getService(systemContext.getServiceReference(PackageAdmin.class.getName()));
try {
assertTrue(pa.resolveBundles(new Bundle[] {linkA, linkAClient}));
// change import permission to fail filter match
filterPermission = new PermissionInfo(PackagePermission.class.getName(), "(&(name=fail.match)(package.name=test.link.*))", "import"); //$NON-NLS-1$ //$NON-NLS-2$
update = ca.newConditionalPermissionUpdate();
rows = update.getConditionalPermissionInfos();
rows.clear();
rows.add(ca.newConditionalPermissionInfo(null, new ConditionInfo[] {linkACondition}, new PermissionInfo[] {hostFragmentProvidePermission, allPackagePermission}, ConditionalPermissionInfo.ALLOW));
rows.add(ca.newConditionalPermissionInfo(null, new ConditionInfo[] {linkAClientCondition}, new PermissionInfo[] {importFrameworkPackagePermission, filterPermission}, ConditionalPermissionInfo.ALLOW));
assertTrue("Cannot commit rows", update.commit()); //$NON-NLS-1$
pa.refreshPackages(new Bundle[] {linkA, linkAClient});
// hack to wait for refresh to end
Thread.sleep(2000);
assertEquals("linkA has wrong state", Bundle.RESOLVED, linkA.getState()); //$NON-NLS-1$
assertEquals("linkAClient has wrong state", Bundle.INSTALLED, linkAClient.getState()); //$NON-NLS-1$
} catch (InterruptedException e) {
// fail
fail("interrupted", e); //$NON-NLS-1$
} finally {
// put the framework back to the RESOLVED state
stop(equinox);
}
assertEquals("Wrong state for SystemBundle", Bundle.RESOLVED, equinox.getState()); //$NON-NLS-1$
assertNull("SecurityManager is not null", System.getSecurityManager()); //$NON-NLS-1$
}
public void testEnableSecurityManager05() throws BundleException {
File config = OSGiTestsActivator.getContext().getDataFile(getName()); //$NON-NLS-1$
Map<String, Object> configuration = new HashMap<>();
configuration.put(Constants.FRAMEWORK_STORAGE, config.getAbsolutePath());
configuration.put(Constants.FRAMEWORK_SECURITY, Constants.FRAMEWORK_SECURITY_OSGI);
Equinox equinox = new Equinox(configuration);
try {
equinox.init();
} catch (BundleException e) {
fail("Unexpected exception on init()", e); //$NON-NLS-1$
}
assertNotNull("SecurityManager is null", System.getSecurityManager()); //$NON-NLS-1$
// should be in the STARTING state
assertEquals("Wrong state for SystemBundle", Bundle.STARTING, equinox.getState()); //$NON-NLS-1$
BundleContext systemContext = equinox.getBundleContext();
assertNotNull("System context is null", systemContext); //$NON-NLS-1$
// try installing a bundle to tests bug
String locationLinkA = installer.getBundleLocation("test.link.a"); //$NON-NLS-1$
String locationLinkAClient = installer.getBundleLocation("test.link.a.client"); //$NON-NLS-1$
Bundle linkA = systemContext.installBundle(locationLinkA);
Bundle linkAClient = systemContext.installBundle(locationLinkAClient);
equinox.start();
try {
PackageAdmin pa = (PackageAdmin) systemContext.getService(systemContext.getServiceReference(PackageAdmin.class.getName()));
assertTrue(pa.resolveBundles(new Bundle[] {linkA, linkAClient}));
linkA.uninstall();
linkAClient.uninstall();
linkA = systemContext.installBundle(locationLinkA);
linkAClient = systemContext.installBundle(locationLinkAClient);
assertTrue(pa.resolveBundles(new Bundle[] {linkA, linkAClient}));
} finally {
// put the framework back to the RESOLVED state
stop(equinox);
}
assertEquals("Wrong state for SystemBundle", Bundle.RESOLVED, equinox.getState()); //$NON-NLS-1$
assertNull("SecurityManager is not null", System.getSecurityManager()); //$NON-NLS-1$
}
public void testLocalization01() throws BundleException {
// create/start/stop/start/stop test
File config = OSGiTestsActivator.getContext().getDataFile("testLocalization01"); //$NON-NLS-1$
Map<String, Object> configuration = new HashMap<>();
configuration.put(Constants.FRAMEWORK_STORAGE, config.getAbsolutePath());
configuration.put(Constants.FRAMEWORK_SECURITY, Constants.FRAMEWORK_SECURITY_OSGI);
Equinox equinox = new Equinox(configuration);
try {
equinox.init();
} catch (BundleException e) {
fail("Unexpected exception on init()", e); //$NON-NLS-1$
}
assertNotNull("SecurityManager is null", System.getSecurityManager()); //$NON-NLS-1$
// should be in the STARTING state
assertEquals("Wrong state for SystemBundle", Bundle.STARTING, equinox.getState()); //$NON-NLS-1$
BundleContext systemContext = equinox.getBundleContext();
assertNotNull("System context is null", systemContext); //$NON-NLS-1$
// try installing host and fragment to test bug 245678
String locationSecurityA = installer.getBundleLocation("security.a"); //$NON-NLS-1$
String locationSecurityAFragA = installer.getBundleLocation("security.a.frag.a"); //$NON-NLS-1$
// set the security for the host and fragment
ConditionalPermissionAdmin ca = (ConditionalPermissionAdmin) systemContext.getService(systemContext.getServiceReference(ConditionalPermissionAdmin.class.getName()));
ConditionalPermissionUpdate update = ca.newConditionalPermissionUpdate();
List rows = update.getConditionalPermissionInfos();
rows.add(ca.newConditionalPermissionInfo(null, null, new PermissionInfo[] {hostFragmentPermission, allPackagePermission}, ConditionalPermissionInfo.ALLOW));
assertTrue("Cannot commit rows", update.commit()); //$NON-NLS-1$
Bundle securityA = systemContext.installBundle(locationSecurityA);
systemContext.installBundle(locationSecurityAFragA);
equinox.start();
try {
securityA.start();
Dictionary headers = securityA.getHeaders("en_US"); //$NON-NLS-1$
String name = (String) headers.get(Constants.BUNDLE_NAME);
assertEquals("Wrong Bundle-Name", "en_US", name); //$NON-NLS-1$ //$NON-NLS-2$
headers = securityA.getHeaders("en"); //$NON-NLS-1$
name = (String) headers.get(Constants.BUNDLE_NAME);
assertEquals("Wrong Bundle-Name", "default", name); //$NON-NLS-1$ //$NON-NLS-2$
} catch (BundleException e) {
fail("Failed to start securityA", e); //$NON-NLS-1$
} finally {
// put the framework back to the RESOLVED state
stop(equinox);
}
assertEquals("Wrong state for SystemBundle", Bundle.RESOLVED, equinox.getState()); //$NON-NLS-1$
assertNull("SecurityManager is not null", System.getSecurityManager()); //$NON-NLS-1$
}
public void testBug254600() {
File config = OSGiTestsActivator.getContext().getDataFile("testBug254600"); //$NON-NLS-1$
Map<String, Object> configuration = new HashMap<>();
configuration.put(Constants.FRAMEWORK_STORAGE, config.getAbsolutePath());
configuration.put(Constants.FRAMEWORK_SECURITY, Constants.FRAMEWORK_SECURITY_OSGI);
Equinox equinox = new Equinox(configuration);
try {
equinox.init();
} catch (BundleException e) {
fail("Unexpected exception on init()", e); //$NON-NLS-1$
}
assertNotNull("SecurityManager is null", System.getSecurityManager()); //$NON-NLS-1$
// should be in the STARTING state
assertEquals("Wrong state for SystemBundle", Bundle.STARTING, equinox.getState()); //$NON-NLS-1$
try {
equinox.start();
} catch (BundleException e) {
fail("Failed to start the framework", e); //$NON-NLS-1$
}
assertEquals("Wrong state for SystemBundle", Bundle.ACTIVE, equinox.getState()); //$NON-NLS-1$
BundleContext systemContext = equinox.getBundleContext();
assertNotNull("System context is null", systemContext); //$NON-NLS-1$
Bundle securityB = null;
long idB = -1;
try {
String locationSecurityA = installer.getBundleLocation("security.a"); //$NON-NLS-1$
String locationSecurityB = installer.getBundleLocation("security.b"); //$NON-NLS-1$
systemContext.installBundle(locationSecurityA);
securityB = systemContext.installBundle(locationSecurityB);
idB = securityB.getBundleId();
} catch (BundleException e) {
fail("Failed to install security test bundles", e); //$NON-NLS-1$
}
try {
securityB.start();
securityB.stop();
} catch (BundleException e) {
fail("Failed to start security.b bundle", e); //$NON-NLS-1$
}
// put the framework back to the RESOLVED state
stop(equinox);
try {
equinox.start();
} catch (BundleException e) {
fail("Failed to start the framework", e); //$NON-NLS-1$
}
assertEquals("Wrong state for SystemBundle", Bundle.ACTIVE, equinox.getState()); //$NON-NLS-1$
systemContext = equinox.getBundleContext();
assertNotNull("System context is null", systemContext); //$NON-NLS-1$
securityB = systemContext.getBundle(idB);
try {
securityB.start();
securityB.stop();
} catch (BundleException e) {
fail("Failed to start security.b bundle", e); //$NON-NLS-1$
}
stop(equinox);
assertEquals("Wrong state for SystemBundle", Bundle.RESOLVED, equinox.getState()); //$NON-NLS-1$
assertNull("SecurityManager is not null", System.getSecurityManager()); //$NON-NLS-1$
}
public void testBug287750() {
File config = OSGiTestsActivator.getContext().getDataFile(getName());
Map<String, Object> configuration = new HashMap<>();
configuration.put(Constants.FRAMEWORK_STORAGE, config.getAbsolutePath());
configuration.put(Constants.FRAMEWORK_SECURITY, Constants.FRAMEWORK_SECURITY_OSGI);
Equinox equinox = new Equinox(configuration);
try {
equinox.init();
} catch (BundleException e) {
fail("Unexpected exception on init()", e); //$NON-NLS-1$
}
assertNotNull("SecurityManager is null", System.getSecurityManager()); //$NON-NLS-1$
// should be in the STARTING state
assertEquals("Wrong state for SystemBundle", Bundle.STARTING, equinox.getState()); //$NON-NLS-1$
try {
equinox.start();
} catch (BundleException e) {
fail("Failed to start the framework", e); //$NON-NLS-1$
}
assertEquals("Wrong state for SystemBundle", Bundle.ACTIVE, equinox.getState()); //$NON-NLS-1$
BundleContext systemContext = equinox.getBundleContext();
assertNotNull("System context is null", systemContext); //$NON-NLS-1$
Bundle testBundle = null;
try {
String locationTestBundle = installer.getBundleLocation("test.bug287750"); //$NON-NLS-1$
testBundle = systemContext.installBundle(locationTestBundle);
} catch (BundleException e) {
fail("Failed to install security test bundles", e); //$NON-NLS-1$
}
try {
testBundle.start();
} catch (BundleException e) {
fail("Failed to start security.b bundle", e); //$NON-NLS-1$
}
StartLevel sl = (StartLevel) systemContext.getService(systemContext.getServiceReference(StartLevel.class.getName()));
if (sl.getStartLevel() != 10)
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
// nothing
}
assertEquals("Wrong startlevel", 10, sl.getStartLevel()); //$NON-NLS-1$
stop(equinox);
assertEquals("Wrong state for SystemBundle", Bundle.RESOLVED, equinox.getState()); //$NON-NLS-1$
assertNull("SecurityManager is not null", System.getSecurityManager()); //$NON-NLS-1$
}
public void testBug367614() {
File config = OSGiTestsActivator.getContext().getDataFile(getName()); //$NON-NLS-1$
Map<String, Object> configuration = new HashMap<>();
configuration.put(Constants.FRAMEWORK_STORAGE, config.getAbsolutePath());
configuration.put(Constants.FRAMEWORK_SECURITY, Constants.FRAMEWORK_SECURITY_OSGI);
Equinox equinox = new Equinox(configuration);
try {
equinox.init();
} catch (BundleException e) {
fail("Unexpected exception on init()", e); //$NON-NLS-1$
}
assertNotNull("SecurityManager is null", System.getSecurityManager()); //$NON-NLS-1$
// should be in the STARTING state
assertEquals("Wrong state for SystemBundle", Bundle.STARTING, equinox.getState()); //$NON-NLS-1$
try {
equinox.start();
} catch (BundleException e) {
fail("Failed to start the framework", e); //$NON-NLS-1$
}
assertEquals("Wrong state for SystemBundle", Bundle.ACTIVE, equinox.getState()); //$NON-NLS-1$
BundleContext systemContext = equinox.getBundleContext();
ConditionalPermissionAdmin ca = (ConditionalPermissionAdmin) systemContext.getService(systemContext.getServiceReference(ConditionalPermissionAdmin.class.getName()));
ConditionalPermissionUpdate update = ca.newConditionalPermissionUpdate();
List rows = update.getConditionalPermissionInfos();
rows.add(ca.newConditionalPermissionInfo("test", null, new PermissionInfo[] {allPackagePermission}, ConditionalPermissionInfo.ALLOW));
assertTrue("Cannot commit rows", update.commit()); //$NON-NLS-1$
update = ca.newConditionalPermissionUpdate();
rows = update.getConditionalPermissionInfos();
rows.add(ca.newConditionalPermissionInfo("test", null, new PermissionInfo[] {allPackagePermission}, ConditionalPermissionInfo.ALLOW));
try {
update.commit();
fail("Expected failure to commit duplicate named rows");
} catch (Throwable t) {
assertTrue("Wrong exception: " + t, t instanceof IllegalStateException);
// expected failure
}
// put the framework back to the RESOLVED state
stop(equinox);
// try again from a cached state
try {
equinox.start();
} catch (BundleException e) {
fail("Failed to start the framework", e); //$NON-NLS-1$
}
systemContext = equinox.getBundleContext();
ca = (ConditionalPermissionAdmin) systemContext.getService(systemContext.getServiceReference(ConditionalPermissionAdmin.class.getName()));
update = ca.newConditionalPermissionUpdate();
rows = update.getConditionalPermissionInfos();
rows.add(ca.newConditionalPermissionInfo("test", null, new PermissionInfo[] {allPackagePermission}, ConditionalPermissionInfo.ALLOW));
try {
update.commit();
fail("Expected failure to commit duplicate named rows");
} catch (Throwable t) {
assertTrue("Wrong exception: " + t, t instanceof IllegalStateException);
// expected failure
}
// put the framework back to the RESOLVED state
stop(equinox);
assertEquals("Wrong state for SystemBundle", Bundle.RESOLVED, equinox.getState()); //$NON-NLS-1$
assertNull("SecurityManager is not null", System.getSecurityManager()); //$NON-NLS-1$
}
public void testDynamicImportWithSecurity() throws BundleException {
File config = OSGiTestsActivator.getContext().getDataFile(getName());
Map<String, Object> configuration = new HashMap<>();
configuration.put(Constants.FRAMEWORK_STORAGE, config.getAbsolutePath());
configuration.put(Constants.FRAMEWORK_SECURITY, Constants.FRAMEWORK_SECURITY_OSGI);
Equinox equinox = new Equinox(configuration);
try {
equinox.start();
} catch (BundleException e) {
fail("Failed to start the framework", e); //$NON-NLS-1$
}
BundleContext systemContext = equinox.getBundleContext();
// register a no-op resolver hook to test security
ResolverHookFactory dummyHook = triggers -> new ResolverHook() {
@Override
public void filterResolvable(Collection<BundleRevision> candidates) {
// nothing
}
@Override
public void filterSingletonCollisions(BundleCapability singleton, Collection<BundleCapability> collisionCandidates) {
// nothing
}
@Override
public void filterMatches(BundleRequirement requirement, Collection<BundleCapability> candidates) {
// always remove candidates for dynamic import
if (PackageNamespace.RESOLUTION_DYNAMIC.equals(requirement.getDirectives().get(Namespace.REQUIREMENT_RESOLUTION_DIRECTIVE))) {
candidates.clear();
}
}
@Override
public void end() {
// nothing
}
};
systemContext.registerService(ResolverHookFactory.class, dummyHook, null);
assertNotNull("System context is null", systemContext); //$NON-NLS-1$
// try installing host and fragment to test bug 245678
String testDynamicImportLocation = installer.getBundleLocation("test.dynamicimport"); //$NON-NLS-1$
// set the security for the bundle
ConditionalPermissionAdmin ca = (ConditionalPermissionAdmin) systemContext.getService(systemContext.getServiceReference(ConditionalPermissionAdmin.class.getName()));
ConditionalPermissionUpdate update = ca.newConditionalPermissionUpdate();
List rows = update.getConditionalPermissionInfos();
rows.add(ca.newConditionalPermissionInfo(null, null, new PermissionInfo[] {allPackagePermission}, ConditionalPermissionInfo.ALLOW));
assertTrue("Cannot commit rows", update.commit()); //$NON-NLS-1$
Bundle testDynamicImport = systemContext.installBundle(testDynamicImportLocation);
try {
testDynamicImport.start();
} catch (BundleException e) {
fail("Did not start test bundle successfully.", e);
}
// put the framework back to the RESOLVED state
stop(equinox);
assertEquals("Wrong state for SystemBundle", Bundle.RESOLVED, equinox.getState()); //$NON-NLS-1$
assertNull("SecurityManager is not null", System.getSecurityManager()); //$NON-NLS-1$
}
public void testJava12SecurityManagerAllow() {
doJava12SecurityManagerSetting("allow", false);
}
public void testJava12SecurityManagerDisallow() {
doJava12SecurityManagerSetting("disallow", false);
}
public void testJava12SecurityManagerDefault() {
doJava12SecurityManagerSetting("default", true);
}
public void testJava12SecurityManagerEmpty() {
doJava12SecurityManagerSetting("", true);
}
public void doJava12SecurityManagerSetting(String managerValue, boolean isSecurityManager) {
final String MANAGER_PROP = "java.security.manager";
String previous = System.getProperty(MANAGER_PROP);
try {
File config = OSGiTestsActivator.getContext().getDataFile(getName());
Map<String, Object> configuration = new HashMap<>();
configuration.put(Constants.FRAMEWORK_STORAGE, config.getAbsolutePath());
configuration.put(MANAGER_PROP, managerValue);
Equinox equinox = new Equinox(configuration);
try {
equinox.init();
if (isSecurityManager) {
assertNotNull("SecurityManager is null", System.getSecurityManager()); //$NON-NLS-1$
} else {
assertNull("SecurityManager is not null", System.getSecurityManager()); //$NON-NLS-1$
}
} catch (BundleException e) {
if (isSecurityManager && e.getCause() instanceof UnsupportedOperationException) {
FrameworkWiring wiring = getContext().getBundle(Constants.SYSTEM_BUNDLE_LOCATION).adapt(FrameworkWiring.class);
Collection<BundleCapability> java12 = wiring.findProviders(new Requirement() {
@Override
public Resource getResource() {
return null;
}
@Override
public String getNamespace() {
return ExecutionEnvironmentNamespace.EXECUTION_ENVIRONMENT_NAMESPACE;
}
@Override
public Map<String, String> getDirectives() {
return Collections.singletonMap(Namespace.REQUIREMENT_FILTER_DIRECTIVE, "(version=12)");
}
@Override
public Map<String, Object> getAttributes() {
return Collections.emptyMap();
}
});
assertFalse("Only allowed UnsupportedOperationException on Java 12.", java12.isEmpty());
} else {
fail("Unexpected exception on init()", e); //$NON-NLS-1$
}
} finally {
stopQuietly(equinox);
}
} finally {
if (previous == null) {
System.getProperties().remove(MANAGER_PROP);
} else {
System.setProperty(MANAGER_PROP, previous);
}
}
}
}