是否可以通过ConditionalPermissionAdmin阻止对System.exit的调用?

时间:2012-09-03 18:09:32

标签: java osgi eclipse-virgo

文档根本没有帮助,OSGi in Action没有关于如何做事的例子。例如,我想要捆绑A来拒绝从Bundle B等中导入包。简单的例子,从头到尾 - 我找不到它们。

但回到我的问题,我想阻止对System.exit的调用,原因显而易见,除了“不要实现自己的安全管理器”,我没有从处女座论坛得到太多,因此我的问题在这里。

修改

因为我希望在处女座发生这种情况,所以我试过这个:

 public void start(BundleContext context) throws Exception {
     System.out.println("===== Starting Bundle PermissionsTest =====");
     SecurityManager securityManager = System.getSecurityManager();
     if(securityManager == null) throw new IllegalArgumentException("Security Manager is not defined!");

     ServiceReference serviceReference = 
            (ServiceReference) context.getServiceReference(ConditionalPermissionAdmin.class.getName());
     if(serviceReference == null) throw new IllegalArgumentException(ConditionalPermissionAdmin.class.getName() + " IS NULL");
    else System.out.println("===== Good so far 1 =====");

     ConditionalPermissionAdmin conditionalPermissionAdmin = 
            (ConditionalPermissionAdmin)context.getService(serviceReference);
     if(conditionalPermissionAdmin == null) throw new IllegalArgumentException("ConditionalPermissionAdmin can not be found");
    else System.out.println("===== Good so far 2 =====");

我在处女座中首先做的是启用Equinox安全管理器(因为这是处女座使用的那个)。 OSGi的规范说每个容器必须实现它自己的Security Manager,扩展了一堆OSGi特定的操作。

在处女座的情况下,这是Equinox安全管理器。启用它非常简单 - 只需在bin / dmk.sh中添加两行,就可以了。

好的,所以我确实有ConditionalPermissionAdmin - 好!现在,我可以添加一个安全检查,比如BundlePermission对Bundle说。当然,但这发生在捆绑特定行动,如启动/停止/导出等等。我似乎无法弄清楚如何为LifeCycle动作做到这一点 - 在我的案例中是System.exit

顺便说一句,我使用osgi-core的4.2.0版本,而nope我无法升级到4.3.0,至少现在不行。

1 个答案:

答案 0 :(得分:4)

System.exit由RuntimePermission(“exitVm”,“<>”)管理,因此规范中的示例语法提供

DENY {
   ( java.lang.RuntimePermission "exitVm" "*" )
}

在Java代码中(尚未测试,所以要小心):

ConditionalPermissionInfo info = admin.newConditionalPermissionInfo(
    "name", 
    null, 
    new PermissionInfo[] { new PermissionInfo(
       "java.lang.RuntimePermission", "exitVm", "*") },
    ConditionalPermissionInfo.DENY
);

ConditionalPermissionUpdate update = admin
   .newConditionalPermissionUpdate();
update.getConditionalPermissionInfos().add(0, info);
update.commit();

"OSGi in Action"一书中,主题得到了很好的对待。请记住,规范的主要受众是规范的实现者,而不是最终用户。成员应该提供教育材料来弥补这一差距。后来的规范试图让最终用户更有教育意义。