Skip to content

test(main): ダウンロード側の関門にテストを足す - #2468

Merged
hal-shu-sato merged 1 commit into
mainfrom
test/download-guards
Aug 29, 2026
Merged

test(main): ダウンロード側の関門にテストを足す#2468
hal-shu-sato merged 1 commit into
mainfrom
test/download-guards

Conversation

@hal-shu-sato

Copy link
Copy Markdown
Member

内容

install 側の同型の関門(resolveInside / safeRemove)は install.test.tsapmPath.test.ts で覆われているのに、ダウンロード側は 1 件も覆われていませんでした

download.ts が守っているのは 2 つです。

// subDir 経由でデータフォルダ外に書き込ませない
if (!isParent(dataDir, retFilePath)) {  return undefined; }

// 現状ファイル名を decode する箇所は無いが、将来どこかで decode されると
// パス区切りに化ける値(%2f・%5c)は入口で拒否しておく
if (/%2f|%5c/i.test(opt.filename)) {  return undefined; }

tempFile.tsexistsTempFile も同じ基点で守っています。

テストの作り

実際のダウンロードは行いません。url にローカルパスを渡してコピー経路(urlhttp で始まらない側)だけを通します。electron-dldownload呼ばれたら例外を投げるモックにしてあるので、「ネットワーク経路へ入っていないこと」も同時に保証されます。

8 件:

  • データフォルダの中へ保存する
  • subDir でデータフォルダの外へ出る指定を拒む
  • ファイル名にエンコードされたパス区切りがあれば拒む(%2f / %5c / 大文字 %2F)
  • アーカイブ拡張子は archive サブディレクトリへ分ける
  • keyText を渡すとハッシュを前置した名前になる
  • loadCache は既存ファイルがあればコピーせずそのパスを返す(中身を見ないことも明示)
  • existsTempFile がデータフォルダの中を解決する / 外へ出るパスを拒む

効いていることの確認

関門を実際に外して、対応するテストが落ちることを確認しました。

脱出先は userData の親を掃除対象の root に含める形にしてあります。os.tmpdir() 直下に置くと、関門が壊れたときに実ファイルが残り、次回以降のテストがそれを拾って誤って落ちます(実際に一度踏みました)。

挙動は変えていません。


調査と文面の作成に Claude Code を使用しています。

install 側の同型の関門(resolveInside / safeRemove)は install.test.ts と
apmPath.test.ts で覆われているのに、ダウンロード側は 1 件も無かった。

download.ts が守っているのは 2 つ。subDir 経由でデータフォルダの外へ
書き込ませないこと(isParent)と、将来どこかで decode されるとパス区切りに
化ける値(%2f / %5c)をファイル名として受け付けないこと。tempFile.ts の
existsTempFile も同じ基点で守っている。

実際のダウンロードは行わず、url にローカルパスを渡してコピー経路
(url が http で始まらない側)だけを通す。electron-dl の download は
呼ばれたら例外を投げるモックにして、ネットワーク経路へ入らないことも
同時に保証する。

関門を外すとテストが落ちることを確認済み。脱出先は userData の親を
掃除対象の root に含める形にした — os.tmpdir() 直下に置くと、関門が
壊れたときに実ファイルが残り、次回以降のテストがそれを拾って誤って落ちる。
@hal-shu-sato
hal-shu-sato merged commit 0903a19 into main Aug 29, 2026
9 checks passed
@hal-shu-sato
hal-shu-sato deleted the test/download-guards branch August 29, 2026 18:47
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