既存の VPN をつなぐ小さなプログラムに必要なのは新しい VPN の実装ではなく、コントローラーです。対応するエンジンがネゴシエーションとトンネルの通信を担い、あなたのプログラムはユーザーの要求を表現し、結果を正直に説明すべきです。Linux では NetworkManager の D-Bus インターフェースが、そのコントローラーに従うべき具体的なモデルを与えます。

四つの確認により、コントローラーが保存済みプロファイル、有効化要求、動作中のセッションを取り違えるのを防ぎます。

確認その一:どの識別子を選ぶのか

プロファイルの UUID を永続的な識別子として保ち、オブジェクトのパスが必要なときはマネージャーを通して解決します。表示名は二つのプロファイルで共有され得ますし、実行時のバスパスは保存すべき妥当なユーザー設定ではありません。選択は自分の設定に書き留め、一覧の二番目がどの項目だったかというコメントに残さないでください。

それを一致と呼ぶ前に、マネージャーが何を返すかを検証してください。存在しなくなった UUID は検索の失敗を生み、それは存在していて有効化を拒むプロファイルとは別のコード経路です。

確認その二:有効化の呼び出しが返すもの

文書化された有効化の呼び出しは、既存の接続のオブジェクトパス、デバイスのパス、特定のオブジェクトを受け取ります。返るのはアクティブな接続のパスであり、その応答は準備完了の結果ではなくハンドルです。戻り値からアプリケーションの準備完了フラグを立てず、代わりにアクティブな接続の状態と理由を購読してください。

VPN の場合、特定のオブジェクトがアクティブな基盤の接続を選びます。ルートのパスを渡すとデバイスの選択は NetworkManager に委ねられ、その時点で既定のものが選ばれます。これはパスワードの欄ではなくルーティング文脈の判断であり、トンネルをどのデバイスに重ねるかが変わります。

汎用的な追加と有効化の例を持ち込んで、VPN プロファイルが作られると期待しないでください。文書化された補助関数は VPN の接続を除外するため、プロファイルの用意や取り込みは別個の、レビューされた手順です。これは、用意には接続ボタンにはない承認とレビューが必要だから重要です。取り込みは独自のログ行と独自の承認者を持つ管理操作として扱ってください。

確認その三:状態をどう表すか

アクティブな接続は有効化、アクティブ、無効化、無効という段階を移り、理由の欄がその理由を語ります。それをすべて loggedIn という真偽値に押し込めると、ユーザーが必要とする情報とサポートが尋ねる情報が失われます。少なくとも接続が保留中か、確立済みか、失われたかを示し、失敗の場合のために理由の文字列を保ってください。

非同期の応答を、それを生んだ要求と結び付けます。古い試行の遅れた完了が新しいユーザー操作を上書きしてはならず、Connect の二重押しは無視するか、見える方針を伴う取り消しと再試行として扱うべきです。

確認その四:再起動のあとに何が起きるか

マネージャーが再起動したとき、あるいはコントローラーがバスに再接続したときは、観測した状態を所有者から組み直します。古いオブジェクトパスがまだメモリにあるからといって、キャッシュしたセッションをアクティブとして表示し続けないでください。状態変化のシグナルは、コントローラーが推測ではなく再同期できるようにするためにこそ存在します。

コントローラーを閉じることの意味を選びます。マシンが所有する既存の接続をそのままにしておくのが正しいこともあり、意図的に短命なセッションを畳むのが正しいこともあります。マシンが所有する既存の接続をそのままにしておくのが正しいこともあり、意図的に短命なセッションを畳むのが正しいこともあります。その所有の取り決めは、プロセスの終了がネットワークの操作を行うと仮定するのではなく、インターフェースに書き込みます。ウィンドウを閉じるとトンネルが切れるのかをユーザーに推測させてはいけません。答えはコードのコメントだけでなく、インターフェースの文言に置いてください。

権限と秘密は持ち主のそばに置く

権限は「はい」「auth」「いいえ」として返り、インターフェースは許可、認証後の許可、拒否の違いを映すべきです。コントローラーを root で動かすことは権限の方針を実装しておらず、問いを消しているだけです。

資格情報は、設定された認証方式に対応するシークレットエージェントかクライアント連携に属します。ソースコードや引数、ログにあるパスワードは指摘対象であり、ローカルの管理承認はゲートウェイでの認証と同じ出来事ではありません。

最後に、接続の状態は、ユーザーが行いたい作業とは別に報告します。プライベートな名前やアプリケーションが利用できないまま、トンネルだけがアクティブなこともあり、その二つ目の失敗には独自のメッセージと独自の状態が必要です。どの層が失敗したかを正確に語るコントローラーは、VPN が落ちているとだけ言うものより有用です。

関連記事