Skip to content

Commit 5d4a121

Browse files
authored
Add SHA256 checksum support (#62)
2 parents 4ad0e1f + 5edf1d0 commit 5d4a121

File tree

5 files changed

+81
-29
lines changed

5 files changed

+81
-29
lines changed

README-CN.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ DVM支持的命令包括有:
196196
| | `dvm install <version> --skip-validation` | 下载deno前不对版本进行校验 |
197197
| | `dvm install <version> --from-source` | 编译源码并安装Deno |
198198
| | `dvm install <version> --skip-download-cache` | 不使用已下载的文件,重新下载并安装 |
199+
| | `dvm install <version> --sha256sum` | 下载安装Deno,并进行sha256校验 |
199200
| `uninstall` | `dvm uninstall <version>` | 卸载指定的版本 |
200201
| `use` | `dvm use` | 将指定的版本设置为当前使用的版本,未指定版本将从当前目录下的`.dvmrc`文件中读取 |
201202
| | `dvm use <version>` | 将指定的版本设置为当前使用的版本 |

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@ DVM supported the following commands:
236236
| | `dvm install <version> --skip-validation` | Do not validate deno version before trying to download it. |
237237
| | `dvm install <version> --from-source` | Build and install Deno from source code. |
238238
| | `dvm install <version> --skip-download-cache` | Download and install Deno without using downloaded cache. |
239+
| | `dvm install <version> --sha256sum` | Download and install Deno with sha256sum check. |
239240
| `uninstall` | `dvm uninstall <version>` | Uninstall the specified version. |
240241
| `use` | `dvm use` | Use the specified version read from .dvmrc. |
241242
| | `dvm use <version>` | Use the specified version that passed by argument. |

bash_completion

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ _dvm_add_exclusive_option() {
5353
# Add options for command install.
5454
_dvm_add_install_option() {
5555
_dvm_add_exclusive_option "--from-binary" "--from-source"
56-
_dvm_add_options "--registry=" "--skip-validation" "--skip-download-cache"
56+
_dvm_add_options "--registry=" "--skip-validation" "--skip-download-cache" "--sha256sum"
5757
}
5858

5959
# Add the specified option to the options list.

dvm.sh

Lines changed: 75 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,11 @@ export DVM_VERSION="v0.9.1"
6060

6161
# Set global variables to default values
6262
DVM_DENO_VERSION=""
63-
DVM_FILE_TYPE=""
6463
DVM_INSTALL_MODE="binary"
6564
DVM_INSTALL_REGISTRY=""
6665
DVM_INSTALL_SKIP_VALIDATION=false
6766
DVM_INSTALL_SKIP_CACHE=false
67+
DVM_INSTALL_SHA256SUM=false
6868
DVM_LATEST_VERSION=""
6969
DVM_PROFILE_FILE=""
7070
DVM_REMOTE_VERSIONS=""
@@ -165,16 +165,18 @@ export DVM_VERSION="v0.9.1"
165165
local url
166166
local file
167167
local cmd
168+
local downloading_file
168169

169170
url="$1"
170171
file="$2"
172+
downloading_file="$file.downloading"
171173

172174
dvm_debug "downloading url: $url"
173175
dvm_debug "download destination file: $file"
174176

175177
if dvm_has curl
176178
then
177-
cmd="curl -LJ $url -o $file"
179+
cmd="curl -LJ $url -o $downloading_file"
178180
if [ "$DVM_QUIET_MODE" = true ]
179181
then
180182
cmd="$cmd -s"
@@ -192,8 +194,14 @@ export DVM_VERSION="v0.9.1"
192194

193195
if ! eval "$cmd"
194196
then
197+
# remove failed download file
198+
rm -f "$downloading_file"
195199
dvm_failure
200+
return
196201
fi
202+
203+
# rename the downloading file to the target file
204+
mv "$downloading_file" "$file"
197205
}
198206

199207
# Send a GET request to the specific url, and save response to the
@@ -368,7 +376,7 @@ export DVM_VERSION="v0.9.1"
368376
then
369377
return
370378
fi
371-
379+
372380
if [[ "$DVM_TARGET_VERSION" != "v"* ]]
373381
then
374382
DVM_TARGET_VERSION="v$DVM_TARGET_VERSION"
@@ -574,15 +582,7 @@ export DVM_VERSION="v0.9.1"
574582
continue
575583
fi
576584

577-
[ -f "$cache_path/deno-downloading.zip" ] && rm "$cache_path/deno-downloading.zip"
578-
579-
[ -f "$cache_path/deno-downloading.gz" ] && rm "$cache_path/deno-downloading.gz"
580-
581-
[ -f "$cache_path/deno.zip" ] && rm "$cache_path/deno.zip"
582-
583-
[ -f "$cache_path/deno.gz" ] && rm "$cache_path/deno.gz"
584-
585-
rmdir "$cache_path"
585+
rm -rf "$cache_path"
586586
done
587587
}
588588
}
@@ -974,16 +974,12 @@ export DVM_VERSION="v0.9.1"
974974
dvm_debug "registry url: $registry"
975975

976976
url="$registry/$version/$DVM_TARGET_NAME"
977-
temp_file="$DVM_DIR/download/$version/deno-downloading.$DVM_TARGET_TYPE"
977+
temp_file="$DVM_DIR/download/$version/$DVM_TARGET_NAME"
978978

979979
if dvm_download_file "$url" "$temp_file"
980980
then
981-
local file_type
982-
file_type=$(file "$temp_file")
983-
984-
if [[ $file_type == *"$DVM_FILE_TYPE"* ]]
981+
if dvm_validate_download_file "$version" "$url"
985982
then
986-
mv "$temp_file" "$DVM_DIR/download/$version/deno.$DVM_TARGET_TYPE"
987983
return
988984
fi
989985
fi
@@ -1109,10 +1105,8 @@ export DVM_VERSION="v0.9.1"
11091105
if dvm_compare_version "$target_version" "v0.36.0"
11101106
then
11111107
DVM_TARGET_TYPE="gz"
1112-
DVM_FILE_TYPE="gzip compressed data"
11131108
else
11141109
DVM_TARGET_TYPE="zip"
1115-
DVM_FILE_TYPE="Zip archive data"
11161110
fi
11171111

11181112
dvm_debug "target file type: $DVM_TARGET_TYPE"
@@ -1400,6 +1394,58 @@ export DVM_VERSION="v0.9.1"
14001394
fi
14011395
}
14021396

1397+
# Validate the downloaded file, and move it to the versions directory if the
1398+
# file is valid.
1399+
# Parameters:
1400+
# - $1: The Deno version to install.
1401+
dvm_validate_download_file() {
1402+
local version
1403+
local download_url
1404+
local download_file
1405+
local sha256sum_url
1406+
local sha256sum_file
1407+
local checksum
1408+
local checksum_expected
1409+
1410+
version="$1"
1411+
download_url="$2"
1412+
1413+
download_file="$DVM_DIR/download/$version/$DVM_TARGET_NAME"
1414+
sha256sum_url="$download_url.sha256sum"
1415+
sha256sum_file="$download_file.sha256sum"
1416+
1417+
if [ "$DVM_INSTALL_SHA256SUM" = true ] &&
1418+
dvm_has shasum &&
1419+
! dvm_compare_version "$version" "v2.0.1"
1420+
then
1421+
dvm_debug "downloading sha256sum file: $sha256sum_url"
1422+
1423+
if ! dvm_download_file "$sha256sum_url" "$sha256sum_file"
1424+
then
1425+
dvm_print_error "failed to download sha256 file."
1426+
dvm_failure
1427+
return
1428+
fi
1429+
1430+
dvm_print "Computing checksum with sha256sum..."
1431+
checksum=$(shasum -a 256 "$download_file" | cut -d " " -f 1)
1432+
checksum_expected=$(cut -d " " -f 1 < "$sha256sum_file" )
1433+
dvm_debug "checksum: $checksum, expected checksum: $checksum_expected"
1434+
1435+
if [ "$checksum" != "$checksum_expected" ]
1436+
then
1437+
dvm_print_error "Checksums failed."
1438+
dvm_failure
1439+
return
1440+
fi
1441+
1442+
dvm_print "Checksums matched!"
1443+
rm "$sha256sum_file"
1444+
fi
1445+
1446+
mv "$download_file" "$DVM_DIR/download/$version/deno.$DVM_TARGET_TYPE"
1447+
}
1448+
14031449
# Get remote data by GitHub api (Get a release by tag name) to validate the
14041450
# version from the parameter.
14051451
# Parameters:
@@ -1702,10 +1748,11 @@ export DVM_VERSION="v0.9.1"
17021748
echo "$content" > "$DVM_PROFILE_FILE"
17031749

17041750
# unset global variables
1705-
unset -v DVM_COLOR_MODE DVM_DENO_VERSION DVM_DIR DVM_FILE_TYPE DVM_INSTALL_MODE \
1706-
DVM_INSTALL_REGISTRY DVM_INSTALL_SKIP_CACHE DVM_INSTALL_SKIP_VALIDATION DVM_LATEST_VERSION \
1707-
DVM_PROFILE_FILE DVM_QUIET_MODE DVM_REMOTE_VERSIONS DVM_REQUEST_RESPONSE DVM_SOURCE \
1708-
DVM_TARGET_ARCH DVM_TARGET_NAME DVM_TARGET_OS DVM_TARGET_TYPE DVM_TARGET_VERSION \
1751+
unset -v DVM_COLOR_MODE DVM_DENO_VERSION DVM_DIR DVM_INSTALL_MODE \
1752+
DVM_INSTALL_REGISTRY DVM_INSTALL_SHA256SUM DVM_INSTALL_SKIP_CACHE \
1753+
DVM_INSTALL_SKIP_VALIDATION DVM_LATEST_VERSION DVM_PROFILE_FILE DVM_QUIET_MODE \
1754+
DVM_REMOTE_VERSIONS DVM_REQUEST_RESPONSE DVM_SOURCE DVM_TARGET_ARCH \
1755+
DVM_TARGET_NAME DVM_TARGET_OS DVM_TARGET_TYPE DVM_TARGET_VERSION \
17091756
DVM_VERBOSE_MODE DVM_VERSION
17101757
# unset dvm itself
17111758
unset -f dvm
@@ -1729,7 +1776,7 @@ export DVM_VERSION="v0.9.1"
17291776
dvm_scan_and_fix_versions dvm_set_alias \
17301777
dvm_set_default_alias_after_install dvm_set_default_env dvm_strip_path \
17311778
dvm_success dvm_uninstall_version dvm_update_dvm dvm_use_version \
1732-
dvm_validate_build_target dvm_validate_remote_version
1779+
dvm_validate_build_target dvm_validate_download_file dvm_validate_remote_version
17331780
# unset dvm shell completion functions
17341781
unset -f _dvm_add_aliases_to_opts _dvm_add_versions_to_opts \
17351782
_dvm_has_active_version _dvm_add_options_to_opts _dvm_completion
@@ -2074,6 +2121,9 @@ dvm() {
20742121
"--from-source")
20752122
DVM_INSTALL_MODE="source"
20762123
;;
2124+
"--sha256sum")
2125+
DVM_INSTALL_SHA256SUM=true
2126+
;;
20772127
"-"*)
20782128
;;
20792129
*)

test/test_install_version.sh

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ dvm_test_error() {
88
# shellcheck disable=SC1091
99
\. ./dvm.sh || dvm_test_error "failed to install dvm"
1010

11-
# Install deno v1.0.0
12-
TARGET_VERSION="1.45.0"
13-
dvm install "v$TARGET_VERSION" --skip-validation || dvm_test_error "run 'dvm install v$TARGET_VERSION' failed"
11+
# Install deno v2.2.0
12+
TARGET_VERSION="2.2.0"
13+
dvm install "v$TARGET_VERSION" --skip-validation --sha256sum || dvm_test_error "run 'dvm install v$TARGET_VERSION' failed"
1414

1515
# Check installed version directory
1616
[ -d "$DVM_DIR/versions/v$TARGET_VERSION" ] || dvm_test_error "'$DVM_DIR/versions/v$TARGET_VERSION' is not a directory"

0 commit comments

Comments
 (0)