Closed KEINOS closed 3 years ago
全体的に入力チェックを厳しくするという話なのかもしれませんが、とりあえず curl
のエラーが取得できていないのも1つの原因だと思うので、それについて調査しました。
現在の curl
で公開鍵を取得する処理は以下のような感じになっています。
if ! curl -s "https://github.com/${USERNAME}.keys" | head -n 1 >"$PATHPUBKEY"; then
echo "NG:公開鍵を取得・保存できませんでした。"
exit 1
fi
上記処理の curl で 404 not found
が起きても、どうやら続行してしまうようです(Ubuntu で確認)。
問題は2つありそう。
1つ目は、curl
が 404 not found
の場合にエラーメッセージを標準出力に出力して、正常終了をしていることです。
(以下の例では、エラーメッセージとして "Not Found" (改行無し)を出力している)
$ curl -s https://github.com/hello.txt.keys
Not Found$ echo $?
0
対策としては curl
に --fail
を指定して、エラーメッセージを出力せず、終了コードを 0 以外にすることだと思います。
$ curl --fail -s https://github.com/hello.txt.keys
$ echo $?
22
2つ目は、curl
の終了コードが、パイプのため握りつぶされていることです。
$ exit 1 | exit 0
$ echo $?
0
対策はパイプをやめてファイル経由で処理するか、出力した公開キーが空でないことをチェックするかでしょうか。 (以下は、公開キーが空の場合にエラーとしている例)
curl --fail -s "https://github.com/${USERNAME}.keys" | head -n 1 >"$PATHPUBKEY"
if [ ! -s "$PATHPUBKEY" ]; then
echo "NG:公開鍵を取得・保存できませんでした。"
exit 1
fi
curl
で公開鍵を取得しているのは以下の4本
(今回の物も含めて、同様の処理をしているコマンド)
checkkeylength
enc
sign
verify
また、パイプでつないで終了コードを判定しているものは上記以外では、以下があります。
archive
if ! (tar cz "$INPUTFILE" | openssl enc -e -aes-256-cbc -salt -k "$PASSWORD" -out "${TEMPDIR}${OUTPUTFILE}"); then
echo "NG:ファイルを圧縮・暗号化できませんでした。"
exit 1
fi
確かに POSIX 対応を考えた場合 -o pipefail
も使えないので、パイプ渡しのネストは気をつけないといけないですね。
以下のように愚直に 1 ステップずつ確認していった方がいいかもしれませんね。(テストも作りやすくなるし)
list_keys="$(curl --fail -s "https://github.com/${USERNAME}.keys")" || {
echo "NG:公開鍵を取得できませんでした。"
exit 1
}
# 公開鍵の保存
echo "$list_keys" | head -n 1 >"$PATHPUBKEY" || {
echo "NG:公開鍵を保存できませんでした。"
exit 1
}
下記は引数の順番を間違えているのに、公開鍵のアクセス権に問題があるように見えます。
(Issue #31 より)
引数の順番の検知、もしくはエラー内容に引数の順番に間違いがないかなど、もう少しユーザに優しくてもいいと思います。