当ブログに掲載しているサンプルは、すべて利用者の自己責任という形でお願いします。
ただし、明らかな不具合がある場合、ご連絡いただければ、訂正記事を出します。
また、こちらのサンプルは、別のサイト等への公開、転載は一切禁止しています。
どうしてもと言う場合は、筆者にあらかじめご連絡ください。
記事そのもののリンクについてはご自由に行っていただいてよいです。

テクてく Lotus 技術者 Slack に参加しよう!

2017年5月12日金曜日

西暦和暦変換をやってみよう

皆さん、こんにちは。
気が付いたら、黄金週間も終わって、しばらくは連休がない日が続くことになっています。
そう考えると憂鬱になりますね。5月病かな(笑)


さて、今日はしばらく記事を書いていなかったので、単なるネタ記事です。


今日も、どこぞでどなたかが呟いていましたが(スミマセン、こっからネタ拝借ですw)、今年って平成xx年だっけ?
かくいう私もよく忘れるので、Excelで変換して確認しています。


しかぁし!


Notes技術者たる者、Excelに頼ってはいかぁん!!
ということで、Notesで計算させることにしました(笑)

@関数を使って実現する方法を探したところ、西暦の年数から引き算をするという何とも原始的な方法しか見つかりませんでした。
だったら電卓使って計算するわ(<=暗算しろよ・・・とかいうツッコミは不要)!

ということで、LotusScriptを使ってできるかどうかを調査してみました。


・・・
はい、ありました。
Format関数です。
Format 関数 (LotusScript 言語)
第一引数に日付を与えたら、第二引数に日付/時刻の形式コードから「ggg」と「ee」(それぞれ元号と元号に基づいた年)をセットします。
これで日付に基づいた元号と年が表示されます。
簡単ですね。


ということで、サンプルです。
これは、フォーム内の「InputDate」というフィールドに入力された西暦の日付を和暦に変換して「OutputDate」というフィールドにセットするものです。


Sub Click(Source As Button)
    Dim uiws    As New NotesUIWorkspace
    Dim uidoc   As     NotesUIDocument
    Dim inputDT As     String
    Dim convDT  As     String
    
    Set uidoc = uiws.CurrentDocument
    
    inputDT = uidoc.FieldGetText("InputDate")
    convDT = Format( Cdat(inputDT), "gggee年mm月dd日" )
    
    Call uidoc.FieldSetText( "OutputDate", convDT )
End Sub


下図はこのプログラムを埋め込んだサンプル画面です。
西暦を和暦に変換する

画面デザインさえ凝らなければ、ものの数分で作れます。
さすがNotesですね。


このサンプルDB、ほしい人は弊社宛ににメールください(メールアドレスは探してくださいね) 。
今回は、無料で差し上げます。ただし、サポートは一切ありませんので悪しからず。

いらないよね(笑)




確かそのうち、平成の元号も変わるよね?とかなんとかで、和暦の計算がだんだん難しくなります。
Notesは元号が変わったら、Feature Packで対応してくれるのかな?とかいらぬ心配をしています(笑)



それでは今日はこの辺で・・・





Notes/Dominoで困ったことがあれば、弊社にお問い合わせください。
IBM Championの私が承ります!
お問い合わせはこちらから→Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2017年4月7日金曜日

文書サマリーデータの上限を 16 MB に増やしてみた

皆さん、こんにちは。

昨日、桜の花が見ごろ~と書いたのに、あいにくの雨です。
これで桜の花が散ってしまわなければいいのですが・・・





さて、今日は、IBM Domino 9.0.1 Feature Pack 8から実現可能になった「文書サマリーデータの上限を 16 MB に増やす」に焦点を当ててみましょう。

元の記事は、こちらです。
IBM Domino 9.0.1 Social Edition フィーチャーパック 8 の新機能
文書サマリーデータの上限を 16 MB に増やす


9.0.1 FP7までは、1文書あたりのサマリデータサイズが64KBまでとされていました。
サマリデータとは、テキストフィールド、数値フィールド、日時フィールドで設定された文書アイテムのことを指します。
リッチテキストはサマリデータに含まれないため、除外して考えます。
また、表示用の計算結果フィールドは、サマリデータとして認識されるものの、文書のアイテムとして保存されることはないため、この上限値の計算式からは除外してもよさそうです。

文書アイテムがサマリデータかそうでないかを簡単に確かめる方法として、文書のプロパティを見ることが挙げられます。
文書を開かずにビュー上で、文書のプロパティを開きます。
左から2番目のタブを見ると、文書の各アイテムの情報が表示されます。
そのうち、どれか1つのアイテムを選択します。
すると、右側にそのアイテムの情報が表示されます。
この中に、「フィールドフラグ」という項目があります。そこに、"SUMMARY"と書いてあれば、そのアイテムはサマリデータということになります。

Field1アイテムはサマリデータです

余談ですが、ここのフィールドフラグを見ると、そのアイテムがユーザ名の場合、どんな種類なのかが分かるようになっています。
読者フィールドの場合、"READ-ACCESS NAMES "
作成者フィールドの場合、"READ/WRITE-ACCESS NAMES "
名前フィールドの場合、"NAMES"
です。
読者権限を設定したはずなのに誰でも見えるな、なんでだ?
といった時に、このフィールドフラグで確認できます。


本題に戻りましょう。
このサマリデータが文書全体で64KBまでとなっていました。
さらにいうと、1アイテムあたりの上限サイズは32KBです。
ここで気を付けないといけないのは、「$Revisions」「$UpdatedBy」の存在です。
それぞれサマリデータとして定義されるので、上限サイズからこれらのデータサイズを差し引いた分が1文書あたりにセットできるサマリデータということになります。

また、IBM Notes/Dominoの場合、LMBCSで格納されているので、文字数のカウントには注意が必要です。


ここで、本当にサマリの限界は64KBなのかどうかを確認するためにサンプルDBを作成してみました。
サマリデータ確認用サンプルDB

図では「フィールド1」~「フィールド6」までしか見えていませんが、実際には「フィールド10」まで作ってあります。
フィールド1-10の各テキストフィールドに値を入力して、[計算]ボタンをクリックすると、ラジオボタンの値が"ON"の場合に限り、一番右の列の「バイト」と書かれている箇所に、そのアイテムのサイズを計算してセットするようにしています。

実際に文書を保存する場合、フラグのON/OFFを見て、各アイテムをサマリデータとするかどうかを計算しています(OFFの場合はサマリデータにしない)。
ここで注意すべき点があります。
UI上で文書を保存すると、テキスト/数値/日時フィールドはすべてサマリデータとして保存されてしまいます。
そのため、このサンプルDBでは、UI上では保存できないようにして(QuerySaveイベントで止めています)、LotusScriptを使ってバックエンドで保存するようにしています。


※作成者、作成日、最終更新者、最終更新日、タイトル、カテゴリ、フラグ、サイズフィールドもサマリデータとして計算されるので、フィールド1-10には全部で64KBも入力できません。

このDBでデータを入力してみました。
まず、1アイテムに格納できる上限サイズは32KBかどうかを確かめてみました。
入力バイト数が分かるように半角英数字だけを入力していくと、確かに32KBを超えようとするとエラーメッセージが表示されました。
32KBでエラーになった
※画面ではアイテムサイズが32,761バイトになっていますが、制御用のデータとして6バイト使われるので、実際に格納できるのが32,761バイトまでということになります。

ここで、32761バイトまで入力して、他のフィールドにも同様にデータを入力します。
エラーが出るまで入力し続けて、保存します。
文書を保存してみた
保存した文書のサイズは約62KBで、サマリが約61KBでした。
このサマリの数値はフィールド1-10のアイテムサイズを合算したものなので、 実際にはもっと多いでしょう。
それでも、64KBを超えていないことは分かっていただけたと思います。


ここまでがIBM Domino 9.0.1 FP7までの話です(長いなぁ・・・)。
今度は、このサンプルDBをコピーして、サマリサイズを16MBまで拡張できるようにしましょう。
※コピーするのは、比較のためです。


まず、ODSを52にできるようにするために、Dominoサーバのnotes.iniに
CREATE_R9_DATABASES=1
の行を追記します。
その後、Dominoサーバを再起動します。

次に、先ほどのサンプルDBをDominoサーバ上にコピーします(IBM Notesクライアントで行います)。
これで作成されたNotes DBのODSは52になります。

そして、Dominoサーバコンソール上で
load compact -LargeSummary on "データベースファイルパス名"
と入力して、サマリデータを拡張します。
compactコマンドを発行

今回は、文書はコピーしないで設計だけをコピーしたので、あっという間に終わりました。
メッセージを読むとサマリデータの拡張を有効化しました。というようなことが書いてあります。

肝心のNotes DBはどうなったかな?と思い、プロパティを見てみましたが、これといって変わった個所はありませんでした。
load catalog
を実行してカタログDBの更新を行って、コピー前のDB文書と比較もしてみましたが、何も変わってません。
Domino Administratorを使って、DB分析を行いましたが、それらしいものは出力されていません。

えーっと・・・どうしろと!?

と、とりあえず、新規に文書を作ってみましょう。
まず、1つのフィールドに入力できるサイズの上限は32KBでした。
ここは変わってないんですね。
続いて、同じサイズのデータを別のフィールドに入力します。ここは面倒なので、コピー&ペーストで行いました。
サマリデータが拡張されているなら、エラーにならないはず!

ということで、どんどんデータを入力していき、保存してみました。
64KBを超えて保存できた!

文書サイズ、サマリデータサイズともに64KBを大幅に超えた160KBになっています。
限界値の16MBまでは程遠いですが(計算したら、全部のフィールドが32KBとしても500個のフィールドが設定できます!)、それでも従来の64KBを超えて保存することができるのが分かっていただけたと思います。


いかがでしょうか?
フィールドを増やしすぎたのはいいけど(ホントは良くないと思う・・・)、文書の保存ができなくなった!というのも、この設定を適用すれば、そんな心配もなくなります。


気がかりなのは、compactを実行しても、DBのプロパティも何も変わらないこと。
これ、絶対に度のDBに対して適用したかを忘れますよね・・・
どうにかしてほしいですね。




なお、最初に紹介したIBM Knowledge Centerの記事(IBM Domino 9.0.1 Social Edition フィーチャーパック 8 の新機能)中に
「単一フィールドのサイズの上限は、引き続き 64 K です。」
という箇所がありますが、正しくは
「単一フィールドのサイズの上限は、引き続き 32 K です。」
です。
IBMさん、修正してくださいね。



それでは今日はこの辺で・・・



Notes/Dominoで困ったことがあれば、弊社にお問い合わせください。
IBM Championの私が承ります!
お問い合わせはこちらから→Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2017年4月6日木曜日

Notes クライアント 9.0.1 FP8の強化内容について

皆さん、こんにちは。
ここ数日は暖かかったので、桜の花も見ごろを迎えたようですね。
皆さんは、お花見には繰り出したのでしょうか?
残念ながら私は、行ってません。大勢の人がいるところに行くのが嫌なのです(笑)
静かに花を眺めるのが好きなのです。

閑話休題。


今日はNotesクライアントに関係する話です。
当ブログでもすでに紹介しているように9.0.1 FP8の新機能は、
IBM Notes フィーチャーパック 8 の新機能
に書いてあります。

この中の説明を少し細かく見ていきましょう。


1.インターネット形式の名前の表示

説明によると、宛先入力の時にノーツユーザ名ではなく、インターネットアドレスが表示されますよ。
とのことですが・・・
よくわかりませんでした。
宛先の設定なので、「宛先の選択」ダイアログに表示されるのがインターネットアドレスになるのかな?と思って、見たのですが、一向に変わらない。ノーツユーザ名のまま・・・
「宛先の選択」ダイアログ


どういうことだよ!と一人でイライラしていたのですが、落ち着いて説明文をよく読み返しました。
すると、「ユーザーの入力に応じた名前とアドレスのリストが表示されます。」(抜粋)と書いてあるじゃないですか。
入力に応じた」?ダイアログでは入力してないよな、確かに。

ということで、直接宛先欄に入力してみました。
すると・・・
リストが表示された!
リストが表示されるじゃないですか!
これだ!
ということで、説明にあるように、[ファイル][設定](プリファレンスじゃないよ!)メニューから「設定」ダイアログを表示して、「メール」タブの中にある「表示名にインターネットアドレスを使用する」にチェックを付けます。
「設定」ダイアログのメールタブ

ちなみに、この画面は、メールDBを開いて、アクションメニューの[オプション][プリファレンス]でも開くことができます。
ビューのアクションボタンからでも開くことはできます

改めて、メールの宛先欄に直接値を入力してみたところ・・・
見事にリストがインターネットアドレス表示になりました!
図中のアドレスはテスト用なので送っても届きませんよ

ここまで書いてなんですが、日本での需要ってあるのかな?
不思議な機能です。

なお、上記の新機能の説明サイトでは一切説明がありませんが、これにはもう一つの機能が隠されています。
この機能を使用すると、送信済み/受信メールの宛先欄がノーツユーザ名からインターネットアドレスに切り替わります。

まずは、設定変更前の画面です。
確かにノーツユーザ名が表示されています。
変更前の画面

次に設定変更後の画面です。
なるほど、インターネットアドレスが表示されていますね。
変更後の画面


ところが、こちらの隠し?機能は、利用条件がさらに追加されます。
1.ロケーション文書で「デフォルトの表示名」が"基本ユーザ名を表示"になっていること
2.表示しているメール文書に「InetFrom」や「InetSendTo」といったアイテムが存在していること
です。



2.メッセージの最初の部分の表示

まずは、ノーツクライアントでの設定方法を紹介します。
メールDBを開いて、[表示][表示][メッセージの冒頭]メニューを実行します。
メッセージの冒頭メニュー

すると、メニューにチェックが付いて、メールビューにメッセージの最初の部分が表示されるようになります。
最初の部分が表示された


ふむふむ。なるほど。
表示されるねー。でも、吹き出しの表示時間、短くないか?あまり意味ないよな。


ですが・・・

説明と合致しません。
まず、この機能を実現するためには、「この設定が管理者によって有効にされると、~」(抜粋)とあります。管理者は何をどうやって設定するのかは、
すべてのメールファイルで「メッセージの冒頭の表示」機能を有効にする
に書いてありました。

どうやら、ノーツクライアントのnotes.iniに「EnableBeginningOfMessage=1」を追加しろとあります。
各ユーザに個別で設定させるのは大変でしょうから、ポリシー機能(デスクトップポリシー)を使って
設定すればいいのでしょう。

ですが・・・
この設定を行う前に、ノーツクライアントで試してみたところ・・・
できてしまうんですよね。
え?notes.iniの設定はいらないの???

どなたか、私に正しい答えを教えてください。


3.すべてのメールファイルで「日付によるグループ化」機能を有効にする

上記のサイトには記載されていないのですが、どう考えても、「2.メッセージの最初の部分の表示」と被るので紹介しておきます。

こちらもノーツクライアントで設定します。
メールDBを開いて、[表示][表示][日付によるグループ化]メニューを実行します。
日付によるグループ化

すると、メニューにチェックが付いて、メールビューが日付ごとにグループ化して表示されるようになります。
日付がグループ化された

グループ化(カテゴリ化?)されると、それごとの件数も表示してくれるのはありがたいですね。

ところで、こちらの設定方法は
すべてのメールファイルで「日付によるグループ化」機能を有効にする
に書いてあるのですが・・・

例によって、この設定を行わなくても、実現できてしまいます。
何でしょう?
何か落とし穴でもあるのでしょうか?


どなたか、私に正しい答えを教えてください(2回目w)


4.[返信/転送] 用に読み取り専用の MIME メールコンテンツを維持する


こちらですが、インターネットメールを返信したり、他の人に転送するときに、元のMIMEメッセージを保持したまま行いますよ。ということです。
分かりやすい確認方法としては、転送したメールがどのように表示されているかを見るのがよいでしょう。

まず、下図のようなメールを受信しました。
これは、インターネットアドレスからのメールです(元のメールはOutlookで作成しました)。
インターネットアドレスからのメール

そして、このメールを同じユーザに2回転送しました。
1回目は設定を変更する前、2回目は設定を変更した後に行いました。
転送方法は、メールを開いて、[転送][転送]アクションで行います。
アクションバーから実行してみた

このメールを受け取ったユーザで確認してみました。
すると、設定変更前のメールは、Bodyがリッチテキスト形式になっていて、[表示][表示][ページソース]が選択できませんでした(グレーアウト化されている)
設定変更前に転送されたメール

一方、設定変更後のメールは、BodyがMIME形式になっていて、[表示][表示][ページソース]が選択できました。
設定変更後に転送されたメール

実際に、そのままの形で保持されたかどうかまでは確認していません(やりたくもないw)。
ですが、少なくとも設定変更の前後で格納されるデータ形式が変わっていたのは事実ですので、確かにMIME形式が保持されたと言ってよさそうです。


こちらの設定方法は、
インターネットメッセージの転送または返信時に MIME 形式を保持する
に書いてあります。

まずは、ノーツクライアントのnotes.iniに「KeepReplyForwardMime=1」を設定します。
こちらもデスクトップポリシーで設定できますね。

次に、[ファイル][設定]メニューを実行して表示される設定ダイアログの「IBM Notes クライアントの基本設定」タブにある「MIME メールに対して埋め込みブラウザを無効にする」のチェックを外します。
※この項目はデスクトップポリシーでは設定できないようなので、ユーザ個人個人で設定してもらう必要があります。
IBM Notes クライアントの基本設定

これで出来上がりです。
2段階の設定が必要で、多少面倒ではありますが、前の2つと違って、この設定ができていないと、動きません。
ちょっと安心しましたw




さて、いかがでしたか?
Notesクライアントの新機能と言いつつ、全部メールDBのものでした。
それだけメールを重要視していると捉えるべきか、それとももうNotesクライアントに強化するべき項目はない。と捉えるべきなのか。
非常に難しい問題ではありますが、一度考えてみたほうが良さそうです。




それでは今日はこの辺で・・・






Notes/Dominoで困ったことがあれば、弊社にお問い合わせください。
IBM Championの私が承ります!
お問い合わせはこちらから→Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2017年4月3日月曜日

IDボールトによる文書の暗号化(4)・・・XPagesで文書を復号化する

皆さん、こんにちは。
ついに4月です。つまり1年の四分の一が終了したことになります。
ダラダラと過ごしていると一年があっという間に終わってしまいそうなので、 気を取り直していきましょう。


さて、今日もXPagesでの文書の暗号化/復号化についてです。
まさか、3月中に終わらせることができずに4月まで引っ張ることになるとは思っていませんでした。
ですが、今回でXPagesでの暗号化/復号化については完結となります。


前回までの記事はこちらです。

IDボールトによる文書の暗号化(1)・・・LotusScriptでIDボールトの情報を取得する
IDボールトによる文書の暗号化(2)・・・XPagesで文書の暗号化/復号化を行う条件
IDボールトによる文書の暗号化(3)・・・XPagesで文書を暗号化する


第4回目となる今日は、XPagesでの文書の復号化についてです。

Notesクライアントの場合はユーザIDの利用が必須になっており、Notesクライアントが自動で処理をしてくれるので、復号化の実装を行う必要がありません。
この辺りは専用クライアントを利用するメリットになりますね。

ただ、難点としてはエラーメッセージがステータスバーにしか表示されないということです。
ステータスバーに表示される復号化エラーメッセージ

ステータスバーは簡易ログになっているので、何かイベントが発生すればその都度メッセージが表示されるため、復号化のエラーに気が付かないこともあります。
また、復号化のエラーメッセージは毎回同じであるため、どの文書を開いたときに発生したのかが分かりにくいというところもあります。
このメッセージを@関数やLotusScriptで制御できればいいのですが、できそうにないのですよね。
せっかくなので、改善してほしいものです。


では、XPagesの場合はどうでしょうか?
公式ドキュメントに
XPage を使用した Domino での文書の暗号化と暗号化解除
というものがありますが、復号化については一切書かれていません・・・

実は復元についての方法は、この連載記事の中ですでに書いてあるのです。

1つ目は、アプリケーションの設定です。
Notes DBの「Xspプロパティ」に
xsp.domino.document.encryption=true

を追記します(すでにこの行があり、値がfalseになっている場合はtrueに変更します)。


2つ目は、dominoIDVaultBeanにサーバ名、ユーザ名、パスワードをセットすることです。

dominoIDVaultBean.setServerName( "IDボールトサーバ名" );
dominoIDVaultBean.setUserName( "Notesユーザ名" );
dominoIDVaultBean.setUserPassword( "NotesユーザIDのパスワード" );


上記のように記述して、直接値をセットしてもよいですし、
あらかじめXPagesの画面でログインをしてことで、サーバ名とユーザ名は以下のコードを実行することでセットできます。
dominoIDVaultBean.setDefaultValues();


※パスワードのセットもできそうなのですが、IBM Dominoの環境設定条件が分からず実現できてません。


この2つの条件をクリアすることで、暗号化された文書をXPagesの画面で参照することができます。

なお、当然のことではありますが、ユーザが文書にセットされているシークレットキーを保有している(NotesユーザID内に格納されている)必要があります。


・・・簡単ですよね。
暗号化の複雑さに比べたら、パスワードの入力だけどうにかすれば、ほとんどコーディング不要で実現できます。

また、復号化できなかった際のエラーメッセージですが、ステータスバーに表示・・・なんてことはなく、XPagesで提供されている「複数エラーメッセージコントロール」で実現できます。
エラーメッセージも自動で設定されるので、どんなメッセージにするか悩む必要もありません。
ここについてはNotesクライアントよりもXPagesの方が親切で良いですね。
復号化エラーのメッセージはエラーメッセージコントロールで実現可能

ところで、1つ目のXspプロパティですが、
UIでは「Enable document encryption for this application」という項目名です。
翻訳すると、「このアプリケーションで文書の暗号化を有効にする」ですね。
ところが、XPagesで文書の暗号化を行うだけであれば、このチェックボックスにチェックする必要はないんですね。
あくまでも文書の復号化を行うのに必要な項目なのです。
なんだかなぁ・・・という感じですよね。



とにかく、これでXPagesアプリケーションで文書の暗号化/復号化ができるようになりました。
XPagesで作成した暗号化文書はNotesクライアントで参照もできますし、逆にNotesクライアントで作成した暗号化文書はXPagesアプリケーションでも復号化ができます。

かなり実用的になったのではないでしょうか。
是非、暗号化機能を試してみてください。




IDボールトを使ったXPagesでの暗号化/復号化については、今回でひとまず完結としますが、実はまだ課題が残っています。

それはパブリックキー/プライベートキーによる暗号化/復号化の実装です。
今回の一連の記事で行ったのはシークレットキーというもので、NotesユーザIDの中に鍵を作り、それを暗号化/復号化に利用するものです。
そのため、あらかじめ鍵を作成して、ユーザに配布するという手順が必要になります。

パブリックキー/プライベートキーの場合、ユーザごとのパブリックキーで暗号化して、復号化する際は各ユーザのプライベートキーで行うというものです。
これなら鍵をわざわざ作成することも、ユーザに配布するということも必要ありません。



実際、iNotesではメール送信時の暗号化機能が実装されています。
ですので、XPagesでもできないことはないと思うのですが、私が作成したサンプルDBでは実行エラーになってしまいます。
どなたか、パブリックキーによるXPagesでの暗号化ができたら、是非実装方法を教えてください。





それでは今日はこの辺で・・・



Notes/Dominoで困ったことがあれば、弊社にお問い合わせください。
IBM Championの私が承ります!
お問い合わせはこちらから→Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2017年3月31日金曜日

IDボールトによる文書の暗号化(3)・・・XPagesで文書を暗号化する

皆さん、こんにちは。

今日で3月も終わり。明日からは2017年度になるという企業も多いことでしょう。
私も明日から社会人28年目になります。
これだけの年数、働いてきているので、もう少し大人っぽい発言や文章の書き方はできないものかなぁ?とも思うのですが、如何せん、そういうことが嫌いなので、このままのスタイルでやっていこうという所存です。


さて、今日も前回の予告通り、IBM Notes/Domino 9.0.1 Feature Pack8 の新機能であるXPagesでの文書の暗号化について書いていきます。

前回までの記事のリンクはこちらです。
IDボールトによる文書の暗号化(1)・・・LotusScriptでIDボールトの情報を取得する
IDボールトによる文書の暗号化(2)・・・XPagesで文書の暗号化/復号化を行う条件


今日はいよいよ、XPagesで文書の暗号化を行う方法について具体的に書いていきます。
サンプルコードも出していきますので必見ですよ!


1.XPagesの暗号化の仕様

まず、XPagesでの文書暗号化の仕様について確認しましょう。

IBM Knowledge Center内にあるencrypt(NotesDocument - Javascript)のヘルプ
https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/reference/r_domino_Document_encrypt.html

によると、XPagesでの文書の暗号化の手順は以下のようになります。


  1. IDVault オブジェクトを取り出します。
  2. getUserIDFile メソッドを使用して、IDVault から特定ユーザーの UserID オブジェクトを取り出します。
  3. getEncryptionKeys メソッドを使用して、UserID とともに使用可能な秘密鍵の名前のリストを取得します。
  4. setEncryptionKeys メソッドを使用して、文書の暗号化に使用する鍵を指定します。
  5. setEncryptionKeys とともに encrypt メソッドを使用して、指定の暗号キーセットで文書を暗号化します。


2.サンプルプログラム

次に、実際のサンプルコードを見ていきましょう。

上記をコード化したものが以下のサンプルです。

// 文書にセットする暗号キー(複数セット可能なのでVector型で定義する)
var secKeys:java.util.Vector = new java.util.Vector();

// NotesXspDocumentでは動作しなかったのでNotesDocumentを利用する
var docBackend:NotesDocument = document1.getDocument( true );

var secKey = "画面上で選択した暗号キー";

// dominoIDVaultBeanからサーバ名、ユーザ名、パスワードを取得する
var svname = dominoIDVaultBean.getServerName();
var uname = dominoIDVaultBean.getUserName();
var pswd = dominoIDVaultBean.getUserPassword();

// パスワードと暗号キーが取得できた場合だけ、文書を暗号化する
if ( pswd != null && secKey != "" ) {
    // IDボールト情報を取得する
    var idvault:NotesIDVault = session.getIDVault();
    
    // IDボールトからユーザIDを取得する
    var userid:NotesUserID = idvault.getUserID( uname, pswd, svname );
    
    // 暗号キーを文書にセットする
    secKeys.addElement( secKey );
    docBackend.setEncryptionKeys( secKeys );
    
    // 文書をユーザIDで暗号化する
    docBackend.encrypt( userid );
}
docBackend.save( true, true, true );



コードの説明はコメント行で説明している通りです。
1-12行目は文書を暗号化するにあたっての準備です。

実際の暗号化処理は14行目からになります。
まず、IDVaultの情報が取得できないといけないので、パスワード情報がdominoIDVaultBeanから取得できない場合、さらには文書にセットする暗号キーの情報が取得できない場合は、暗号化を行いません。
※暗号キー情報の取得方法は後述します。

17行目でIDVaultオブジェクトを取得しています。

20行目でIDボールトからユーザID情報を取得しています。
ヘルプでは、「getUserIDFile メソッドを使用して・・・」とありますが、これでは実現できませんので注意してください。
なお、 getUserIDFilメソッドはIDボールトからNotesユーザIDファイルをダウンロードするというものです。
実際のユーザIDファイルが破損したときに利用するものでしょう。
ここは、getUserIDというメソッドを使用します。
引数はユーザ名、パスワード、サーバ名の順番です。
パスワードは、HTTPパスワードではなく、ユーザIDのパスワードになるので注意してください。

23-24行目で暗号キーを文書にセットしています。
この暗号キーはシークレットキーと呼ばれるもので、あらかじめユーザIDに格納しておく必要があります。

27行目で文書を暗号化しています。引数はユーザID情報(NotesUserIDオブジェクト)を指定します。
このユーザID情報は上記でセットしたシークレットキーを持っている必要があります。
当たり前ですね。

最後に29行目で文書を保存します。


3.暗号キーの取得

今度は暗号キーの取得方法について見てみましょう。
LotusScriptの場合、NotesUserIDクラスのgetEncryptionKeysメソッドを使って一覧を取得していました。
それをダイアログリストの選択肢として設定することで、エンドユーザが選択できるような実装をしました。
XPagesの場合はどうでしょうか?
拡張ライブラリの中に「Secret Key Picker」というコントロールが用意されていて、それを利用することで暗号キー選択用のダイアログが設定できるようになっています。
Secret Key Pickerコントロール

これをXPageにドラッグ&ドロップすればいいのですが、利用にあたって条件があります。
あらかじめ、XPageにデータソースが定義してあることです。
そのページに直接定義していなくても、上位のページで定義してあればそれでも良いです。

ドラッグ&ドロップすると下図のようなウィザード画面が表示されます。
Secret Key Picker ウィザード画面

「Data source」がデータソースを指定する個所です。
すでにページにデータソースが定義されている場合、自動で選択されます。

「Form compute option」はフォーム検証の実行を設定します。このコントロールを利用する場合、必ず設定する必要があります。

「Add label」はピッカーの横に表示するラベルを設定できます。必要に応じて設定してください。

「Display encryption keys」のチェックを外すと、ピッカーで選択した暗号キーを画面上に表示しなくなります(styleにdisplay:noneが設定されるだけなので、参照する方法はいくらでもありますが・・・)。

「Add message control」 は、複数エラーメッセージコントロールをセットしてくれます。これも必要に応じて設定してください。

「Fomat for Bootstrap」は・・・レスポンシブデザインに対応してくれるのでしょう。済みません。未確認です。

ウィザードの設定が完了すると、下図のように画面上に表示されます。
Secret Key Pickerの画面デザイン


これで使えるように・・・なっていないのです。
上記画面に見える虫メガネをクリックしてソースタブを見ると、

// Your SSJS code to populate the keys goes here, e.g.
@UserSecretKeys();


と書いてあります。
どうやら暗号キーを取得する関数は自分で記述する必要がありそうです。

https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/reference/r_wpdr_atfunctions_usersecretkeys_r.html によると、@UserSecretKeys()関数は引数なしでもよさそうですが、私の環境では動きませんでした。
※エラーにこそなりませんでしたがピッカーをクリックしても暗号キーの一覧が取得できませんでした。

ここは明示的に引数を設定しましょう。
引数の順序は、サーバ名、パスワード、ユーザ名です。
NotesIDVaultクラスのgetUserIDメソッドとは順番が異なるので注意してください。

※同じような情報を扱うんだから、引数の順序は統一してほしいなぁと思うのはわがままでしょうか・・・

私は下記のように記述しました。
var svname = dominoIDVaultBean.getServerName();
var uname = dominoIDVaultBean.getUserName();
var pswd = dominoIDVaultBean.getUserPassword();
@UserSecretKeys( svname, pswd, uname );


引数はすべてdominoIDVaultBeanから取得するようにしました。
ただし、あらかじめこの管理Beanに値をセットしておいてあります。

これでピッカーをクリックすると指定したユーザIDに格納されている暗号キーが選択できるようになります。
下図は実際にXPagesの画面でピッカーをクリックしたときのものです。
ピッカーをクリックして、暗号キーのリストを表示


4.デモ

では実際にXPagesで暗号化文書を作成したデモをお見せします。
撮影した動画をアップロードしておきます。




デモでは、XPagesの画面でのみの確認としていますが、実際にNotesクライアントで見ても暗号化されていることが分かります。


いかがでしょうか。
XPagesの暗号化の方法が分かっていただけたでしょうか?


このサンプルDBは、2年前の記事を書いた際に作成したものにXPages部分を追加したものです
XPages化するに当たっては既存の部分は手を入れていません(デモ用に見た目など、多少の改善は行っていますが・・・)。
暗号化データを取り扱っているからXPages化できなかったとか、暗号化データを取り扱うのは難しいので今までは避けていた。
というような方でも使えるようになったかと思います。


是非、挑戦してみてください。



次回は、文書の復号化はどのようにして行われたのか(動画ではさらっと流してましたが(笑))について解説しようと思います。



それでは今日はこの辺で・・・




Notes/Dominoで困ったことがあれば、弊社にお問い合わせください。
IBM Championの私が承ります!
お問い合わせはこちらから→Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2017年3月29日水曜日

IDボールトによる文書の暗号化(2)・・・XPagesで文書の暗号化/復号化を行う条件

皆さん、こんにちは。

3月も終わりだというのに東京は寒いです・・・
桜は咲いたというのになんでしょうね、この寒さは。
早く暖かくなってほしいものです。


さて、今日は前回の予告通り、「XPagesで文書を暗号化/復号化するにあたっての条件」について書いていこうと思います。



1.Notes/Dominoのバージョン

当然ではありますが、IBM Notes/Domino 9.0.1 Feature Pack 8が導入されている必要があります。
XPinC(XPagesをNotesクライアント上で動かす)を使わない場合は、IBM Dominoだけバージョンアップしておけばよいです。

ただし、Notes DBをカスタマイズする必要があるため、IBM Domino Designerは9.0.1 Feature Pack 8を導入しておく必要があります。

2.機能

IBM Domino 8.5で追加された新機能であるIDボールトを導入する必要があります。
IDボールトの設定方法は当ブログでも紹介していますので、そちらを参考にして導入してください。

IDボールトの設定方法

ユーザIDがこのIDボールトに登録されている必要があります。
したがって、Web専用ユーザという形で、ドミノディレクトリに直接ユーザ文書を作成したようなユーザでは、XPagesでの暗号化/復号化は行えないということを意味しています。

3.セキュリティ

ドミノディレクトリのサーバ文書内の「制限なしで署名または実行」にXPagesアプリを署名したユーザが含まれている必要があります。
サーバ文書のセキュリティタブ
これは、1.で説明したDomino DesignerでNotes DBをカスタマイズするユーザのことを指します。
今までXPagesアプリケーションを作成したことがある方ならば、当たり前のことではありますが、初めて作成する場合は忘れがちなので注意しましょう。

4. XPagesアプリケーションの設定

XPagesで暗号化/復号化をするにあたって、アプリケーションに設定を行う必要があります。
XSPプロパティの中に「Enable document encryption for this application」というチェックボックスがあるので、そこにチェックをつけます(もう項目が英語になっているのは気にしません・・・)。
ソースタブに直接記述する場合は
xsp.domino.document.encryption=true

と書きます。
XSPプロパティを修正

実は、この設定について、公式ドキュメントでは一切触れられていません。
そのため、なかなか暗号化/復号化が行えず、悩みまくりました。
IBM Connect 2017のセッション資料に書いてあるのを見つけてようやくできたという経緯があります。
ホント、どうにかしてください。こういうのよくないですよ!


5.暗号化/復号化に必要な関数及び変数

詳しくは次回以降の記事で触れていきますが、
XPagesで文書の暗号化/復号化をする際に必要になってくる変数として
dominoIDVaultBeanという管理Beanと呼ばれるものがあります。

この管理Beanの中にIDボールトのサーバ名、ユーザ名、パスワードをセットすることで文書の暗号化/復号化が行えるようになります。
管理Beanについては、
userBeanを使ってみよう
でも触れていますのでそちらを参考にしていただくと、少しは理解が深まると思います。

また、実際に暗号化を行うには、前回のLotusScriptでIDボールトを利用する際にも触れた
NotesIDVaultクラス及びNotesUserIDクラス(いずれもJavaScriptクラス)を利用する必要があります。
そして、最終的に暗号化するにはNotesDocumentクラスのencryptメソッドを利用します。






いかがでしょうか。
ただ単にプログラムを記述すればいいのではなく、
それなりに準備が必要であることが分かっていただければ幸いです。


次回はいよいよ、XPagesアプリケーションでの暗号化をする方法について触れてみようと思います。






それでは、今日はこの辺で・・・




Notes/Dominoで困ったことがあれば、弊社にお問い合わせください。
IBM Championの私が承ります!
お問い合わせはこちらから→Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2017年3月27日月曜日

IDボールトによる文書の暗号化(1)・・・LotusScriptでIDボールトの情報を取得する

皆さん、こんにちは。

今週で3月も終わりです。
というか、本ブログはなんとまぁ、10年目に突入してました!\(^o^)/
現時点で540本の記事(これが541本目)を書いていました。平均すると、1週間に1本程度です。
でも、最初から1週間に1本のペースで書いていたらきっと続いていないと思います。
好きな時(書ける時、書こうと思った時)に書いてきたからこそ、ここまで続いたのかな?という感じです。
これからもテキトーに書き続けようと思いますので、ご愛顧ください。


さて、今日もIBM Notes/Domino 9.0.1 Feature Pack 8のお話です。

新機能のうちの一つに「XPagesでの文書の暗号化」というものがあります。

今回のFPの中では、かなりのボリュームを占めているのではないでしょうか?
これは調べないわけにはいかないです。
と言っていますが、・・・実は、この機能は私自身は2年もの間、待ち焦がれていたものです(笑)

ですので、これから何度かに分けて、この暗号化についての記事を書いていこうと思います。

おさらいとして、以下の記事を読んでおいていただくと、わかりやすいでしょう。

フィールドの暗号化(1)・・・暗号キーを作成する
フィールドの暗号化(2)・・・暗号キーをマージする
フィールドの暗号化(3)・・・文書のフィールドを手動で暗号化する
フィールドの暗号化(4)・・・特殊フィールドを使って文書のフィールドを暗号化する
フィールドの暗号化(5)・・・LotusScriptを使って文書のフィールドを暗号化する


では、1回目の今日は、LotusScriptで文書の暗号化を実現してみようかと思います。

え?XPagesじゃないの?とお思いでしょうが、LotusScriptにも機能強化の余波が来ているので、先に紹介しておきましょうということです。

LotusScriptで文書の暗号化を行うこと自体は、上の記事でも紹介しています。
今回は、何を行うのかというと、タイトルにあるように
IDボールトの情報を取得してこようというものです。
というのも、暗号キーの一覧を取得する方法が用意されていなかったのです(少なくとも私は知らないです)。

[ファイル][セキュリティ][ユーザーセキュリティ]メニューで自分のユーザIDの情報を画面上に表示させて、さらに自分が保有する暗号キーの一覧を表示させることはできますが、その一覧をプログラムで利用することができなかったのです。
暗号キーの一覧

それを今回の新機能を利用することで取得できるようになるのです。

サンプルコードを記載します。

    Dim session As New NotesSession
    Dim idvault As     NotesIDVault
    Dim userid  As     NotesUserID
    Dim svname  As     String
    Dim uname   As     String
    
    'サーバ名とユーザ名を取得
    svname = session.CurrentDatabase.Server
    uname  = session.UserName
    
    'IDボールトからユーザ情報及び暗号キー情報を取得
    Set idvault = session.GetIdVault()
    If idvault.IsIdInVault( uname, svname ) = True Then
        Set userid = idvault.getUserID( uname, pswd, svname )
        
        'IDボールト情報が取得できたら、戻り値にセットする
        If Not( userid Is Nothing ) Then
            secUserName = userid.userName
            GetSecretKey = userid.getEncryptionKeys
        End If
    End If


1~5行目は、情報を取得するのに必要な変数です。
2行目と3行目が新しいクラスで、IDボールトとそこに格納されているユーザ情報を表すものです。

12行目で、IDボールトのオブジェクトを生成しています。
13行目で、指定したIDボールトのサーバと取得したいユーザ名(今回は自分自身)の名前を渡して、IDボールト内に情報が格納されているかどうかを判断しています。
14行目で改めて、ユーザ名、パスワード、サーバ名(引数の順序に注意!)を渡してIDボールト内の情報を取得して、NotesUserIDオブジェクト変数に格納します。

ここで重要なのがパスワード情報を渡す必要があるということです。
私の環境に問題があるのか、それとも仕様なのかは分かっていませんが、パスワードを省略することはできませんでした。
また、このパスワードは当然のことながら、ノーツユーザIDのパスワードです。

正しく情報が取得できたら、19行目の「userid.getEncryptionKeys」で暗号キーの一覧を取得できます。
前回の記事を書いたときに作成したサンプルDBにこの機能を追加してみました。
その画面ショットがこちらです。
IDボールトから暗号キーを取得

ここまで来たら、あとは選択した暗号キーを「SecretEncryptionKeys」というフィールドに格納して、文書を保存すればOKです。

文書の保存は、特に細工は必要ありません。
なんなら、@Command([FileSave])コマンド関数で保存してもいいくらいです。
私のサンプルは実際にこのコマンド関数で保存しています。


また、文書の復号化はNotesクライアントが自動で行ってくれるため、プログラムの実装は不要です。
下図は、暗号キーを持たないユーザが文書を開いたときの状態です。
ステータスバーにエラーメッセージが表示されて、暗号データの箇所は見えなくなっています。
暗号キーを持たないユーザが文書を開いた

※この暗号キーは複数選択できるようになっているので、プログラムで実装する場合は、「SecretEncryptionKeys」フィールドは複数値を許可しておく必要があります。




いかがでしょうか?
割と簡単にできましたよね。IDボールトが設定されてさえいれば、ここまでできます。
他のユーザに見せたくない情報はこのように暗号化しておけば、文書だけが漏れても安心で安全です。
非表示にしても、文書のプロパティで参照できますし、読者フィールドが設定してあっても、DBごと盗まれたら解除は可能です。
ですが、暗号キーだけは、ノーツIDがないと復号できません。
これはとても強力なセキュリティになります。

今まででもこの設定はできたのですが、暗号キーを直接入力するしかなかったので、使い勝手が悪かったですが、この機能を使えば、一覧から選択できるようになります。

人事情報(特に個人情報)を格納しているNotes DBに設定してみるのもいいのではないでしょうか。



次回はXPagesで、文書を暗号化するにあたっての条件について書いてみようかと思います。




それでは、今日はこの辺で・・・




Notes/Dominoで困ったことがあれば、弊社にお問い合わせください。
IBM Championの私が承ります!
お問い合わせはこちらから→Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ