4D-jp 4D Japan Technical Support Team

サーバーに接続するための設定ファイル


ビルドされていない4Dから4D Serverにクライアントとして接続する場合,「サーバーに接続」画面を起動し,サーバー公開名を選択するか,サーバーIPアドレスまたはDNSホスト名を入力してサーバーにアクセスするのが標準的な手順ですが .4DLink ファイルをストラクチャ/プロジェクトファイルの代わりに開くことにより「サーバーに接続」画面をスキップして直接サーバーに接続することもできます。 .4DLink ファイルはOPEN DATABASEで開くこともできます。

.4DLink ファイルは,XML形式の標準テキストファイルです。XML構造のスキーマは,アプリケーションパッケージ内のdatabase_link.dtd ファイルに記述されています。具体的には,下記の接続オプションを指定することができます。

  • is_remote: true: クライアント接続
  • user_name: ログインユーザー名
  • password: パスワード
  • md5_password: ハッシュされたパスワード
  • structure_opening_mode: 0: 前回と同じ1: インタープリター2: コンパイル済
  • server_database_name: サーバー公開名
  • server_path: サーバーIPアドレスまたはDNSホスト名
  • open_login_dialog: true: ログイン画面を表示する
  • data_opening_mode: 1: 前回と同じ2: データファイルを選択する3: データファイルを作成する。
  • data_conversion_mode: 0: 確認する1: アップグレードしない2: アップグレードする。
  • structure_conversion_mode: 0: 確認する1: アップグレードしない2: アップグレードする。
  • open_tools: MSCを起動する。
  • open_in_custom_mode: true: カスタムメニューモードで起動する
  • create_structure_file: true: 起動時に新規ストラクチャ/プロジェクトファイルを作成する
  • structure_file: ストラクチャ/プロジェクトファイルのパス
  • create_data_file: true: 起動時に新規データファイルを作成する
  • data_file: データファイルのパス。
  • skip_onstartup_method: true: 起動時にOn Startup を実行しない
  • startup_method: On Startup の代わりに実行するメソッド
  • definition_import_file: カタログ定義ファイルのパス(内部仕様)
  • resources_import_file: リソース定義ファイルのパス(内部仕様)
  • reopen_design_windows: false: デザインモード開始時にウィンドウを開かない
  • explorer_groups_file: エクスプローラーの初期状態を記述したJSONファイルのパス(内部仕様)
  • use_journal_file: false: ジャーナルファイルを使用しない
  • user_param: コマンドラインパラメーター(CLIの--user-paramおよびデータベースパラメーターUser param valueと同じ)
  • remote_shared_resources: ビルド版クライアントでローカルキャッシュを共有する(ビルドキーのShareLocalResourcesOnWindowsClientと同じ)

.4DLink ファイルは,XML形式の標準テキストファイルなので,文字列コマンド・XMLコマンド・PROCESS 4D TAGSなどを活用して動的に生成することができます。以前に接続したことのあるサーバーであれば,Alt(Macはoption)キーを押しながら「最近使用したプロジェクト」を選択することにより「サーバーに接続」画面で使用した直近15回の .4DLink ファイルをみつけることができます。

さまざまなオプションが用意されていますが,使用する頻度が高いのは以下の項目でしょう。

  1. サーバーIPアドレスまたはDNSホスト名
  2. サーバー公開名
  3. ログインユーザー名
  4. パスワード

注記: サーバーがサブネット上にUDPプロトコルで公開されていれば,サーバーIPアドレスまたはDNSホスト名は任意ですが,たとえ非公開サーバーであっても,サーバー公開名は必須です。サーバーIPアドレスまたはDNSホスト名だけで接続することはできません。

パスワードハッシュですが,19r3bcrypt$2y$10モードが使用されており,20r3以降,bcrypt$2b$10モードが使用されています。過去のバージョンでは,MD5をアレンジした独自のハッシュ(Generate digest_o_4D REST digest モード)が使用されていました。

19r3以降

$md5_password:=Generate digest($password; _o_4D REST digest)

で生成したパスワードをmd5_passwordに渡すことはできません。

bcrypt アルゴリズムでは,入力値が同じであっても,違うハッシュが生成されますが,.4DLink ファイルでログインするためには,directory.json ファイルに記録されているハッシュ値をそのまま渡す必要があり,それ以外のハッシュ値は,たとえVerify password hashで合致する正しいハッシュ値であっても,ログインできません。

つまり

$md5_password:=Generate password hash($password; {algorithm: "bcrypt"; cost: 10})

で動的に生成したパスワードをmd5_passwordに渡すことはできません。

CHANGE PASSWORDSet user propertiesツールボックスで パスワードを保存するたびに更新されるSettingsdirectory.jsonからハッシュをコピーするか,平文のpasswordを使用する必要があります。

以下は .4DLink ファイルを動的に生成してサーバーに接続する例です。

var $is_remote; $open_login_dialog : Boolean
var $server_database_name; $server_path; $user_name; $password; $md5_password; $link : Text

$is_remote:=True
$user_name:="User"
$password:="password"
$server_database_name:="server"
$server_path:="172.16.197.1:19813"

$version:=Application version

$database_shortcut:=DOM Create XML Ref("database_shortcut")
DOM SET XML ATTRIBUTE($database_shortcut; "server_database_name"; $server_database_name)
DOM SET XML ATTRIBUTE($database_shortcut; "server_path"; $server_path)
DOM SET XML ATTRIBUTE($database_shortcut; "is_remote"; $is_remote)
DOM SET XML ATTRIBUTE($database_shortcut; "user_name"; $user_name)

//$md5_password:="$2b$10$tgBupl1q.qWkB52M92fGzeseedHNuGtFLwdXs2iMZ5LpxZSoLRKNm"  //from directory.json

If ($password#"")
	Case of 
		: ($version>="1930") & ($md5_password="")
			DOM SET XML ATTRIBUTE($database_shortcut; "password"; $password)
		: ($version>="1930")
			DOM SET XML ATTRIBUTE($database_shortcut; "md5_password"; $md5_password)
		Else 
			$md5_password:=Generate digest($password; 2) // _o_4D REST digest
			DOM SET XML ATTRIBUTE($database_shortcut; "md5_password"; $md5_password)
	End case 
End if 

DOM EXPORT TO VAR($database_shortcut; $link)
DOM CLOSE XML($database_shortcut)

var $linkFile : 4D.File
$linkFile:=Folder(Temporary folder; fk platform path).file(Generate UUID+".4DLink")
$linkFile.setText($link)
OPEN DATABASE($linkFile.platformPath)
$linkFile.delete()

関連記事

リンク