S_a_k_Uの日記みたいなDB

~サクゥーと呼ばないで~

H2DBでWebコンソールの管理者パスワードの設定

これの続き。
saku-jp.hatenablog.com

Webコンソールの設定とツールのページを開くための管理者パスワードは何を入力すればいいの???
 

いろいろ検索して以下のページにたどり着き、.h2.server.propertiesにパラメータwebAdminPasswordを追加する必要があることが判った。
.h2.server.properties - yuu_nkjm's Scrapbox
scrapbox.io

.h2.server.propertiesが保存されている場所

と思って、.h2.server.propertiesを探しても見つからない。
コマンドプロンプトからコンソール(org.h2.tools.Console)の起動すると、Windowsのユーザーディレクトリ(%UserProfile%)の直下に.h2.server.propertiesが作成されれおり、これを参照してるっぽい。
しかし、サービスから起動した場合、このファイルを参照していないゾ?といろいろ探ってると、以下のパスにあった。

C:\Windows\System32\config\systemprofile\.h2.server.properties

.h2.server.propertiesの保存場所に関する設定を調べてみたけど判らない…
%H2DB_HOME%\service\wrapper.confにあるかな?と パラメータwrapper.app.parameter.*に-baseDirでベースディレクトリのパスを設定してみたけど、h2.server.propertiesの場所は変わらなかった🤔

設定すべきパスワード

そこで、パラメータwebAdminPassword=passwordを追記し、サービスを再起動すると開始時にエラーとなってしまった。
パラメータwebAdminPasswordを削除すると正常に開始される。
はてはて?と調べてみると、公式のチュートリアルに正解が書いてあった。
H2 > Tutorial > Settings of the H2 Console
www.h2database.com
で、org.h2.server.web.WebServer#encodeAdminPassword(String)で得られたハッシュ値を記述しろとな。
encodeAdminPasswordはStaticなメソッドで、それを呼び出して戻り値が取得できればいいだけなので、初めてJShell使ってみた💦
ひとまずパスワードは12文字以上でないとダメらしい。

>jshell
|  JShellへようこそ -- バージョン20.0.2
|  概要については、次を入力してください: /help intro

jshell> /env -class-path %H2DB_HOME%\bin\h2-2.2.220.jar
|  新しいオプションの設定と状態の復元。

jshell> org.h2.server.web.WebServer.encodeAdminPassword("password")
|  例外java.lang.IllegalArgumentException: Min length: 12
|        at WebServer.encodeAdminPassword (WebServer.java:948)
|        at (#1:1)

jshell> org.h2.server.web.WebServer.encodeAdminPassword("password1234")
$2 ==> "d540bcaf2cd4a78fa2329984b155ebe422463dd7a2fcf862be4f66be7601a06cbcb67c53c9c0077c102b529531a0af48603d750af6abf11d83441bd1a1a3bbfd"

jshell>

パスワードが平文でなくなったタイミング

ちょっと前の環境で、H2DBのバージョンが2.1.214 (2022-06-13)があったので中身を覗いてみたら、パスワードのハッシュ値を取得するメソッドorg.h2.server.web.WebServer#encodeAdminPassword(String)が実装されていなかったため、それ以降にパスワードをハッシュ値で設定する仕様に変わったものと思われる。
(org.h2.server.web.WebServer#encodeAdminPassword(String)のJavadocにsinceの記載がない)