Skip to content

feat(sync): 同期の設定をファイルとQRコードで書き出し、暗号化キーを入力して取り込めるようにする - #830

Merged
aida0710 merged 2 commits into
mainfrom
feat/sync-settings-export
Nov 11, 2026
Merged

aida0710 merged 2 commits into
mainfrom
feat/sync-settings-export

Conversation

@aida0710

Copy link
Copy Markdown
Owner

何を変えたか

同期の設定を設定済みのマシンから別のマシンへ渡せるようにしました。

  • 設定済みのマシンでは、Syncの[同期設定を管理]にある「設定を書き出す」で[書き出す]を押します。入力するものはありません。QRコードが表示され、[ファイルに保存]でファイル(sshc-sync-settings.json)にもできます。
  • 追加するマシンでは、未設定のSyncにある「書き出した設定を取り込む」で、ファイルを選ぶかQRコードを読み取ります。暗号化キーと同期の方向を入力して[取り込む]を押すと、接続の確認から設定の保存までを続けて行います。
  • Androidのアプリにカメラの権限を足しました。[QRコードを読み取る]を最初に押したときに権限を求めます。

仕組み

  • 書き出す文書には、エンドポイント、バケット、バケット内のパス、リージョン、S3のアクセスキーIDとシークレットアクセスキーが入ります。sshcエンジンがVaultにある暗号化キーで、スナップショットと同じ方式で暗号化します。暗号化キーは文書に入りません。
  • 取り込むときは、入力された暗号化キーで文書を復号し、中身を手入力の設定と同じ検証に通します。同期先に既存のスナップショットがあり、同じキーで復号できることを確かめてから、設定とキーをまとめて保存します。同期先が空のときは sync_setup_target_empty で断ります。
  • 同期の方向はマシンごとの値なので文書に入れず、取り込む画面で選びます。
  • QRコードのマス目はsshcエンジンが作ります。設定が長くてQRコードに入り切らないときは、ファイルだけを出します。
  • 暗号化キーを自分で決めているマシンでは、書き出しの画面に注意を出します。ファイルやQRコードを手に入れた人が、暗号化キーの総当たりを手元で試せるためです。
  • Androidのアプリはsshcエンジンの画面からの映像だけの要求に限ってカメラを許可します。

足した依存

  • Go: rsc.io/qr v0.2.0(QRコードの生成、BSD)
  • Web: jsqr 1.4.0(QRコードの読み取り、Apache-2.0)。読み取りを始めたときにだけ読み込みます。

ついでに直したこと

  • 設定を保存したあとも、暗号化キーの[自分で決める]にチェックが残っていた表示を直しました。

確かめたこと

  • Goの全テスト、Webの全単体テスト、型検査、lint、未使用コードの検査、生成物の検査、e2e(sync・accessibility・layout-audit)が通りました。
  • 使い捨てのS3互換サーバーとsshcエンジン4台で、画面を操作して通しました。
    • 1台目で手入力で設定して書き出し、保存したファイルとQRコードの中身が同じであること
    • 2台目がファイルから取り込み、1台目が送った設定を受信の確認で見られること
    • 3台目(スマホの幅)がカメラの映像からQRコードを読み、違う暗号化キーでは断られ、正しいキーで取り込めること
    • 暗号化キーを自分で決めたマシンで注意が出ること
  • Androidのエミュレータ(API 36)で、デバッグ版のアプリを使って確かめました。
    • カメラの権限のダイアログが出ること、断ったときの表示、許可したあとにカメラの映像が出ること
    • QRコードの読み取り、取り込み、書き出したQRコードの表示、ファイルの保存

確かめていないこと

  • Androidの実際のカメラでQRコードを読めるかは確かめていません。エミュレータの仮想の部屋ではカメラをQRコードへ向けられなかったので、読み取りは映像をQRコードの画像に差し替えて確かめました。
  • CLIには書き出しと取り込みを足していません。

https://claude.ai/code/session_014WPnWuU8Uy5fNoLiCY89Ei

設定済みのマシンは、同期先とS3の認証情報を、Vaultにある暗号化キーで封じた文書として
書き出す。入力するものは無い。別のマシンは、ファイルを選ぶかQRコードを読み取り、
暗号化キーを入力すると、接続の確認から参加までを続けて行う。

- engine: POST /api/v1/sync/setup/export と /import。文書はスナップショットと同じ envelope で封じ、
  取り込みは OpenRemote の上限で開いて ValidateTarget に通し、既存の同期先だけに参加する
- QRコードのマス目は engine が rsc.io/qr で作る。入り切らない長さのときはファイルだけにする
- Web: Sync の未設定の画面に「書き出した設定を取り込む」、[同期設定を管理]に「設定を書き出す」。
  QRコードはカメラの映像を jsqr で読む
- Android: CAMERA の権限を足し、engine の origin からの映像だけの要求に限ってカメラを許可する
- 自分で決めた暗号化キーのときは、書き出しの画面に総当たりの注意を出す
- 設定を保存したあとも[自分で決める]のチェックが残る表示を直す

Claude-Session: https://claude.ai/code/session_014WPnWuU8Uy5fNoLiCY89Ei
@aida0710
aida0710 merged commit d0d46a4 into main Nov 11, 2026
29 checks passed
@aida0710
aida0710 deleted the feat/sync-settings-export branch November 11, 2026 17:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant