можно ли заблокировать вызовы System.exit через ConditionalPermissionAdmin?

Документация совсем не помогает, в OSGi in Action нет примера того, как что-то делать. Например, я хочу, чтобы пакет A запрещал импорт пакетов из пакета B и т. д. Простые примеры, от начала до конца — не могу их найти.

Но вернемся к моему вопросу, я хочу заблокировать звонки на System.exit по понятным причинам, кроме того, что "не реализовывать свой собственный Security Manager", я мало что получил от форума Девы, поэтому мой вопрос здесь.

ИЗМЕНИТЬ

Поскольку я хочу, чтобы это произошло в Деве, вот что я пробовал:

 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 =====");

Первое, что я сделал в Virgo, т.е. включил Equinox Security Manager (потому что именно его использует Virgo). Спецификация OSGi говорит, что каждый контейнер должен реализовать свой собственный Security Manager, расширенный набором специфичных для OSGi действий.

В случае Девы это Equinox Security Manager. Включить его очень просто - просто добавьте две строчки в bin/dmk.sh и все готово.

Итак, у меня есть ConditionalPermissionAdmin — хорошо! Теперь я могу, например, добавить проверку безопасности, например, BundlePermission для Bundle. Конечно, но это происходит для сочетания определенных действий, таких как запуск/остановка/экспорт и т. д. Я не могу понять, как это сделать для действия LifeCycle — System.exit в моем случае .

кстати, я использую версию 4.2.0 osgi-core, и нет, я не могу обновиться до 4.3.0, по крайней мере, не сейчас.


person Eugene    schedule 03.09.2012    source источник
comment
Можете ли вы предоставить более подробную информацию о том, где именно вы застряли? Вы пробовали что-нибудь? В какой части OSGi в действии и спецификация неясны?   -  person Björn Pollex    schedule 04.09.2012
comment
@BjörnPollex, конечно, я не публиковал вопрос, не проделав никакой работы, на самом деле это не мой тип. Тем не менее вот некоторый код в файле Edit. Спасибо!   -  person Eugene    schedule 04.09.2012


Ответы (1)


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 в действии"< /а>. Пожалуйста, помните, что основной аудиторией спецификации был разработчик спецификации, а не конечный пользователь. Члены должны были предоставить образовательный материал, чтобы заполнить этот пробел. Более поздние спецификации пытались сделать более информативными для конечных пользователей.

person Peter Kriens    schedule 04.09.2012
comment
Мне очень нравится этот ответ! Не могу поверить, что я пропустил это. Дело в том, что это не работает в Деве. Сразу после развертывания журналы заполняются ошибками, и он ломается. Я поднял вопрос на форуме Virgo, но полагаю, что не получу оттуда ничего полезного, так как это либо не задокументировано, либо слишком много говорят с их стороны. :( Тем не менее, спасибо за ваше время. - person Eugene; 04.09.2012