[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[upki-fed:53] Re: [upki-fed:52] RE: [upki-fed:51] Re: [upki-fed:50] 【質問】Shibboleth IdP 2.1.2にしたらeduPersonTargetedIDのフォーマットが変わりますか?



京産大の秋山です.

ComputedID からの移行部分については全然テストできていなかったのですが,
開発者の意図した動作は以下のページによると,

https://spaces.internet2.edu/display/SHIB2/ResolverStoredIDDataConnector

The first ID created for a given requester is always the same as those
created by the computed ID data connector in order to provide a
migration path from that data connector. Every subsequently generated
ID for a given user/IdP/SP triple, if the first one is revoked, is a
Type 4 UUID.

ということで,最初は computed ID data connector と同じ方法で eduPersonTargetedID
を生成し,それ移行は UUID Type4(- で区切られたもの)を生成するらしいです.
最初は Computed ID data connector で,次から UUID って,どういうことだ?と思ってた
のですが,伊藤先生が指摘されているところを見ると,どうもちゃんと実装できてない
ですね.初回は当然 numberOfExistingEntries は 0 になるので ComputedID のロジックで
persistentID が生成されるのですが,do - while のループで上書きされていました.
# Eclipse の JPDA デバッグモードで確認しました.

もしこの方法を使うのであれば,本家にバグ報告した方がよさそうですね.

おそらく,正しい使い方としては,最初 ComputedID で登録しておいて,特定の SP に
ついて UUID に移行することを決定した時点で ComputedID のエントリの deactivationDate
を NOT NULL にすれば,新しく UUID のエントリが成功されて,そちらが使われるという
ロジックなんだと思います.
# つまりすべての SP について,1つは無効なエントリを作成する必要がある?

2009年8月20日10:53 に Tomohiro Ito<xxxxxxxx@xxxxxxxxxxxxxxxxxxx> さんは書きました:
> 山地先生
>
> 山形大学の伊藤です。
> ご返事、ありがとうございます。
>
> こんなところにコードがあったのですね。
>
> なんとなーく、問題点がわかってきました。間違っているかも
> しれませんので、詳しい方フォローしていただけると幸いです。
> Javaは、勉強不足なものですから、間違っている可能性があります。
>
> edu.internet2.middleware.shibboleth.common.attribute.resolver.provider.dataC
> onnector.StoredIDDataConnector.PersistentIdEntry
>
> のメソッドが変更されたようです。
>
> Version 1.1.2には、新たに、
>
>        do {
>            log.debug("Generated persistent ID was already assigned to
> another user, regenerating");
>            persistentId = UUID.randomUUID().toString();
>        } while (pidStore.getPersistentIdEntry(persistentId, false) !=
> null);
>
> が追加されたようです。
> 開発者の意図としては、既に同じ、persistent IDがデータベースにあるときには、
> 新しいUUIDをランダムに生成するようにコーディングをしたのではないでしょうか?
>
> ここからは、Javaのことが詳しくないので推測ですが、
> JavaでDo { } while (式) 分を使うときは、
> 最初の1ループは実行するという構文ではないでしょうか?
>
> ただ、この動作がShibboleth IdP 2.1.2の仕様で、全て、UUID.randowmUUIDを使用す
> るということで
> あれば、正常動作と判断します。LocalEntityId、PeerEntityId、LocalId, saltが同
> 一条件下で
> 生成してみると同じIDが生成されないようで、ちょっと、気になっていました。
>
> 以上。よろしくお願いします。
>
> 〇Version 1.0.0
>
> protected PersistentIdEntry createPersistentId(ShibbolethResolutionContext
> resolutionContext, String localId,
>            byte[] salt) throws SQLException {
>        PersistentIdEntry entry = pidStore.new PersistentIdEntry();
>
> entry.setLocalEntityId(resolutionContext.getAttributeRequestContext().getLoc
> alEntityId());
>
> entry.setPeerEntityId(resolutionContext.getAttributeRequestContext().getInbo
> undMessageIssuer());
>
> entry.setPrincipalName(resolutionContext.getAttributeRequestContext().getPri
> ncipalName());
>        entry.setLocalId(localId);
>
>        String persisentId;
>        int numberOfExistingEntries =
> pidStore.getNumberOfPersistentIdEntries(entry.getLocalEntityId(), entry
>                .getPeerEntityId(), entry.getLocalId());
>        if (numberOfExistingEntries == 0) {
>            try {
>                MessageDigest md = MessageDigest.getInstance("SHA");
>                md.update(entry.getPeerEntityId().getBytes());
>                md.update((byte) '!');
>                md.update(localId.getBytes());
>                md.update((byte) '!');
>                persisentId = Base64.encodeBytes(md.digest(salt));
>            } catch (NoSuchAlgorithmException e) {
>                log.error("JVM error, SHA-1 is not supported, unable to
> compute ID");
>                throw new SQLException("SHA-1 is not supported, unable to
> compute ID");
>            }
>        } else {
>            persisentId = UUID.randomUUID().toString();
>        }
>        entry.setPersistentId(persisentId);
>
>        entry.setCreationTime(new Timestamp(System.currentTimeMillis()));
>
>        return entry;
>    }
>
> 〇Version 1.1.2
> protected PersistentIdEntry createPersistentId(ShibbolethResolutionContext
> resolutionContext, String localId,
>            byte[] salt) throws SQLException {
>        PersistentIdEntry entry = pidStore.new PersistentIdEntry();
>
> entry.setLocalEntityId(resolutionContext.getAttributeRequestContext().getLoc
> alEntityId());
>
> entry.setPeerEntityId(resolutionContext.getAttributeRequestContext().getInbo
> undMessageIssuer());
>
> entry.setPrincipalName(resolutionContext.getAttributeRequestContext().getPri
> ncipalName());
>        entry.setLocalId(localId);
>
>        String persistentId;
>        int numberOfExistingEntries =
> pidStore.getNumberOfPersistentIdEntries(entry.getLocalEntityId(), entry
>                .getPeerEntityId(), entry.getLocalId());
>        if (numberOfExistingEntries == 0) {
>            try {
>                MessageDigest md = MessageDigest.getInstance("SHA");
>                md.update(entry.getPeerEntityId().getBytes());
>                md.update((byte) '!');
>                md.update(localId.getBytes());
>                md.update((byte) '!');
>                persistentId = Base64.encodeBytes(md.digest(salt));
>            } catch (NoSuchAlgorithmException e) {
>                log.error("JVM error, SHA-1 is not supported, unable to
> compute ID");
>                throw new SQLException("SHA-1 is not supported, unable to
> compute ID");
>            }
>        } else {
>            persistentId = UUID.randomUUID().toString();
>        }
>
>        do {
>            log.debug("Generated persistent ID was already assigned to
> another user, regenerating");
>            persistentId = UUID.randomUUID().toString();
>        } while (pidStore.getPersistentIdEntry(persistentId, false) !=
> null);
>
>        entry.setPersistentId(persistentId);
>
>        entry.setCreationTime(new Timestamp(System.currentTimeMillis()));
>
>        return entry;
>    }
>
>> -----Original Message-----
>> From: xxxxxxxxxxxxxx@xxxxxxxxx [mailto:xxxxxxxxxxxxxx@xxxxxxxxx] On
>> Behalf Of xxxxxx@xxxxxxxxx
>> Sent: Thursday, August 20, 2009 12:16 AM
>> To: xxxxxxxx@xxxxxxxxx
>> Subject: [upki-fed:51] Re: [upki-fed:50] 【質問】Shibboleth IdP 2.1.2
>> にしたらeduPersonTargetedIDのフォーマットが変わりますか?
>>
>> ** On Wed, 19 Aug 2009 19:44:09 +0900
>> ** Tomohiro Ito <xxxxxxxx@xxxxxxxxxxxxxxxxxxx> writes:
>>
>> > Shibboleth IdP 2.1.2にしたら、eduPersonTargetedIDのフォーマットが、
>> >
>> > 0b000ab7-2fa7-4ebf-b387-fdd63dc15cf6
>>
>> StoreするIDのフォーマット自体が違ったということですか?
>> ということであれば,
>>
>> http://svn.middleware.georgetown.edu/view/java-shib-common/tags/1.0.0/
>> src/edu/internet2/middleware/shibboleth/common/attribute/resolver/prov
>> ider/dataConnector/StoredIDStore.java?view=log
>> と
>> http://svn.middleware.georgetown.edu/view/java-shib-common/tags/1.1.2/
>> src/main/java/edu/internet2/middleware/shibboleth/common/attribute/res
>> olver/provider/dataConnector/StoredIDStore.java?view=log
>>
>> あたりを比較したら違いがありますか?
>> --
>> Kazu
>



-- 
Toyokazu AKIYAMA
Faculty of Computer Science and Engineering,
Kyoto Sangyo University
TEL/FAX: +81-75-705-1531