1

ドキュメントはまったく役に立たず、OSGi in Actionには、物事を行う方法についての例がありません。たとえば、バンドルAでバンドルBからのパッケージのインポートを拒否したいなどです。簡単な例、最初から最後まで-見つかりません。

しかし、私の質問に戻ると、System.exit「独自のセキュリティマネージャーを実装しない」以外に、明らかな理由でへの呼び出しをブロックしたいのですが、Virgoフォーラムからはあまり得られなかったので、ここで質問します。

編集

私はこれを乙女座で起こさせたいので、これが私が試したことです:

 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の仕様によると、各コンテナーは、OSGi固有の一連のアクションで拡張された独自のSecurityManagerを実装する必要があります。

Virgoの場合、これはEquinoxSecurityManagerです。有効にするのは非常に簡単です。bin/dmk.shに2行追加するだけで、簡単に使用できます。

さて、ConditionalPermissionAdminがあります-いいですね!これで、たとえば、バンドルのBundlePermissionなどのセキュリティチェックを追加できます。もちろんですが、これは、開始/停止/エクスポートなどのバンドル固有のアクションで発生します。ライフサイクルアクション(私の場合はSystem.exit)でそれを行う方法がわからないようです。

ところで、私はosgi-coreのバージョン4.2.0を使用していますが、少なくとも今は4.3.0にアップグレードできません。

4

1 に答える 1

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();

この主題は、 「OSGiinAction」という本でかなりよく扱われています。仕様の主な対象者は、エンドユーザーではなく、仕様の実装者であったことを忘れないでください。メンバーはそのギャップを埋めるための教材を提供することになっていた。その後の仕様は、エンドユーザーにとってより教育的なものになろうとしました。

于 2012-09-04T06:57:27.877 に答える