2025/07/30

有効期限 68 年の DJX ユーザ登録には要注意 !?

本日は、ノーツコンソーシアム の Domino Lounge(旧 研究会)でネタにしたお話です。今年 5 月に、Domino 11 から 14 にアップデートした時に発生した現象についてご紹介します。


発生した現象

DJX の管理ツールからのユーザ登録は、有効期限を設定できる最大値の 68 年で運用していました。

14.0 にアップデート後、ユーザを登録したところ、『認証の有効期限が、設定の範囲(現在時刻~68年後)を超えています』とエラーが発生しました。

アップデート前は正常に登録できていましたし、設定の変更は行っていません。そもそもエラーメッセージに表示されている日付は、ちょうど 68 年後なので、何がエラーなのかさっぱりわかりません。


エラーの発生個所

原因調査のため、DJX 管理ツールの設計をのぞいてみたところ、ExtReadLib スクリプトライブラリの CreateReqUserCSV 関数の中でエラーを出力していることがわかりました。

このエラーを出力するためには、その直前の If 文でエラーだと判定される必要があります。ということはその値を演算している TimeDifference メソッドに起因する現象ということがわかります。


エラーの原因

このままでは検証しづらいので、この部分だけを抜き出して確認します。変数 dt には 68 年後の日付、dtnow には SetNow メソッドで現在の時刻がセットされています。この部分だけのサンプルプログラムを作成します。

Sub Initialize
   Dim ns As New NotesSession
   Dim dt As New NotesDateTime("2093/05/26 12:57:54")
   Dim dtnow As New NotesDateTime("2025/05/26 12:57:54")

   diffs& = dt.TimeDifference(dtnow)

   MsgBox CStr(diffs&), 0, ns.Notesversion
End Sub

このプログラムを移行前の環境である Notes 11 と 移行後の環境である Notes 14 で実行します。すると、結果が違ってました!

誤差(?)は 1,566,847 秒でした(換算すると18 日 と 3 時間 14 分 7 秒)。68 年間にあるうるう年の回数に近いです(68 / 4 = 17)。うるう年計算を忘れているなんてバカなことはないと思いながら、おそるおそるテクニカルサポートに問い合わせてみました。


誤差の原因はバグ

返答は次の通りでした。

サンプルコードを実行すると、Notes 14 では Long 型の最大値 2,147,483,647 が戻り値となっており、オーバーフローしている。
本来、TimeDifference の値は戻り値が 68 年と 20 日程度を超えると Long 値の最大となるが、Notes 14 ではそれよりも短い期間でオーバーフローしてしまっている。
この問題は、問題報告番号 JPKRDEVSGW として報告され、Notes 14.5、14.0FP5、12.0.2FP7 にて修正が予定されている。

オーバーフローって桁あふれが原因の現象と理解しているのですが、今回の現象は、Notes 14 の方が大きな値が出力されています。どんな演算を行うと ”早く桁があふれる” のか気になりながらも、バグなら仕方がないと飲み込みました。

ちなみにこの問題、記載通り Notes 14.5 では修正されていることを確認しました。

また、サポートの方からは TimeDifferenceDouble というメソッドを使用すると改善するとの提案もいただきました。NotesDatetime クラスは使用したことがないのですが、さまざまな機能がありそうですねぇ...


DJX の対応

ユーザ登録時の意味不明のエラー原因は明確になりました。また、14.5 でも治っていることは確認したのですが、これだけを理由にバージョンアップをするわけにはいかないですね。

仕方がないので、有効期限の設定を 67 年と 11 ヶ月に変更して運用を継続しています。

Notes/Domino 11 のサポート終了に伴い、バージョンアップを実施される環境は多いかと思います。14 を選択される場合、DJX + 68 年のユーザ登録にはご注意ください。レアケースかもしれませんが...


0 件のコメント:

コメントを投稿