2019年9月9日月曜日

閲覧制限した文書も検索にヒットするのです

Notesでは「読者フィールド」と呼ばれる特殊なフィールドを用意しておき、閲覧させたい人やグループ、あるいは特定のロール(を付与されたACLエントリ)を読者フィールドへ埋め込むことで、文書の閲覧を制御することができることはご存知のとおりです。

読者フィールドに自分のアカウントや自分が所属するグループ、あるいは自分に付与されたロールが無い場合、その文書を閲覧することができません。

しかしながら、自分が閲覧できる文書がデータベースの中に1件も無い場合でも、データベースのプロパティには、閲覧できない文書を含む文書数が表示されます。エンドユーザーは何か見えない文書があることがわかるわけです。


さて、NotesDatabase クラスの Search メソッドや FTSearch メソッドを使う場合、検索条件に一致すれば、閲覧できない文書もヒットします。

これらのメソッドでは NotesDocumentCollection クラスのインスタンスが返ります。

もし、自分が閲覧できない文書がヒットした場合、それを GetFirstDocument や GetNextDocument を使って NotesDocument クラスのインスタンスが作られるのでしょうか。

次のようなコードを書きました。
Dim ss as New NotesSession
Dim db As NotesDatabase
Dim dc As NotesDocumentCollection
Dim doc As NotesDocument
Dim Query As String

Query = |[Subject] contains "request"|
Set db = ss.CurrentDatabase
Set dc = db.FTSearch( Query, 0 )
Set doc = dc.GetFirstDocument
While not doc is Nothing
    set doc = dc.GetNextDocument( doc )
Wend

このコードを実行して閲覧できない文書が検索にヒットした場合、GetFirstDocument や GetNextDocument で取り出した NotesDocument は Nothing になりませんが、UniversalID プロパティや NoteID プロパティの値は "" となりました。また NotesDocument クラスの Items プロパティの値はヌルになるため、フィールドの値へアクセスすることもできません。

つまり、見えない文書が存在することは分かるけれども、その詳細にはアクセスできないのです。

ここで注意しなければならないのは、読者フィールドを使ったデータベースでは、閲覧できない文書がヒットすることも想定しなければならない、ということです。

実は、私が書いたコードで「結果がなんか変だよ」と指摘があり調べたら、この想定がされてなかった、ということがあったのを思い出しました。

皆様も読者フィールドによる閲覧制限機能を後から追加するような変更を行う場合は、ぜひともご注意ください。

0 件のコメント:

コメントを投稿