/4d-tips-entitlements-for-autoupdate-client

クライアント自動アップデートのコード署名をカスタマイズするには

Primary LanguageShell

4d-tips-entitlements-for-autoupdate-client

クライアント自動アップデートのコード署名をカスタマイズするには

概要

デザインモードのアプリケーションビルドは,アプリのコード署名をサポートしています。署名には,4D.app アプリケーションのResources フォルダーの中にあるシェルスクリプトSignApp.sh が使用されます。

特定のリソースに対するアクセスを求めるための--entitlementsには,同じく4D.app アプリケーションのResources フォルダーの中にある4D.entitlements ファイルが渡されます。

trueに設定されているのは,下記のエンタイトルメントです。

com.apple.security.automation.apple-events
com.apple.security.cs.allow-dyld-environment-variables
com.apple.security.cs.allow-jit
com.apple.security.cs.allow-unsigned-executable-memory
com.apple.security.cs.debugger
com.apple.security.cs.disable-executable-page-protection
com.apple.security.cs.disable-library-validation
com.apple.security.device.audio-input
com.apple.security.device.camera
com.apple.security.personal-information.addressbook
com.apple.security.personal-information.calendars
com.apple.security.personal-information.location
com.apple.security.personal-information.photos-library

コード署名は,デスクトップ・サーバー・クライアントのそれぞれに付与されます。

自動アップデート用のクライアントは,コード署名され,圧縮されてサーバーのUpgrade4DClient フォルダーに組み込まれます(update.mac.4darchive)。その後,サーバーが署名されます。

注記: 4darchive は4Dのクライアント/サーバーが使用する独自の圧縮形式ですが,v19 R2以降,標準的なzip 形式を選択することもできるようになりました。

問題

通常のビルドであれば,署名をカスタマイズしたり,上書きする機会があります。

  • ビルド
  • ビルド〜署名

しかし,自動アップデートのクライアントは一気にアーカイブまで進むため,ビルドアプリの署名をカスタマイズする機会がありません。

  • ビルド〜署名〜アーカイブ

不完全な回避策

  • 4D.app アプリケーションのResources フォルダーの中にある4D.entitlements ファイルを書き換える

アプリケーションの中にあるファイルを書き換えると,コード署名が無効になります。また,アップデートの度に同じことを繰り返さなければなりません。

  • 4D Volume Desktopを署名する

ビルド前に署名すれば,エンタイトルメントをカスタマイズすることができますが,4D Volume Desktop を書き換えてしまうことになり,以後のビルドプロセスに影響が及ぶ恐れがあります。

  • 自動アップデート用のクライアントを単独でビルド〜署名し,zip形式でアーカイブする

ClientMacFolderToWinとは違い,ClientMacFolderToMacには4darchive 形式のクライアントを渡すことができません。

回避策

下記の要領で自動アップデート用のクライアント/サーバーアプリケーションを署名することができます。

  1. 4D Volume Desktop を作業フォルダーにコピーします。マスターを書き換えないで済ませるためです。

  2. 必要なエンタイトルメントで4D Volume Desktop を署名します。アプリケーションビルドのコード署名は,すでに署名されているモジュールの署名を上書きするオプション(--force --deep)になっていないことを利用します。Info.plist をカスタマイズすることもできますが,CFBundleVersion4D Volume Desktop のバージョンチェックに使用されているため,変更するとビルドが中止されてしまうので注意が必要です。

  3. コピーした4D Volume Desktop のパスを指定してクライアント/サーバー版アプリケーションをビルドします。自動アップデート用のクライアントはすでに署名されているため,カスタマイズされたエンタイトルメントが上書きされずに残されます。

  4. 公証をパスするためには,framework bundle plugin app dylib kext といったバンドルに加えて,UNIX実行ファイル,html js json so といったファイルもコード署名する必要があります。これには,ビルド版サーバーアプリケーションの中にあるUpgrade4DClient フォルダーのinfo.json も含まれます。署名する代わりに,実行権限を取り除くこともできます。

chmod 666
  1. 必要に応じ,サーバーとクライアントをそれぞれコード署名し,アーカイブして公証します。

例題

下記の要領でクライアント自動アップデートに対応したサーバーをビルド〜署名〜アーカイブ〜公証することができます。

$build:=cs.Build.new()

$status:=$build.buildAutoUpdateClientServer()

ビルド版サーバーおよびクライアントはTemporary folderに作られます。

詳細はメソッドのコメントを参照してください。

注記: サンプルはDefault Data を使用しているため,サーバーを起動するとデータファイルがリードオンリーで開かれます。