Skip to content

Commit bd090ef

Browse files
dwelch2344narfdre
authored andcommitted
[New] Add support for NVM_AUTH_HEADER env var
Closes #3366 Co-authored-by: David Welch <[email protected]> Co-authored-by: Andre Kradolfer <[email protected]>
1 parent 4c7d899 commit bd090ef

File tree

3 files changed

+38
-4
lines changed

3 files changed

+38
-4
lines changed

README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
- [Restoring PATH](#restoring-path)
4040
- [Set default node version](#set-default-node-version)
4141
- [Use a mirror of node binaries](#use-a-mirror-of-node-binaries)
42+
- [Pass Authorization header to mirror](#pass-authorization-header-to-mirror)
4243
- [.nvmrc](#nvmrc)
4344
- [Deeper Shell Integration](#deeper-shell-integration)
4445
- [Calling `nvm use` automatically in a directory with a `.nvmrc` file](#calling-nvm-use-automatically-in-a-directory-with-a-nvmrc-file)
@@ -530,6 +531,13 @@ NVM_IOJS_ORG_MIRROR=https://iojs.org/dist nvm install iojs-v1.0.3
530531

531532
`nvm use` will not, by default, create a "current" symlink. Set `$NVM_SYMLINK_CURRENT` to "true" to enable this behavior, which is sometimes useful for IDEs. Note that using `nvm` in multiple shell tabs with this environment variable enabled can cause race conditions.
532533

534+
#### Pass Authorization header to mirror
535+
To pass an Authorization header through to the mirror url, set `$NVM_AUTH_HEADER`
536+
537+
```sh
538+
NVM_AUTH_HEADER="Bearer secret-token" nvm install node
539+
```
540+
533541
### .nvmrc
534542

535543
You can create a `.nvmrc` file containing a node version number (or any other string that `nvm` understands; see `nvm --help` for details) in the project root directory (or any parent directory).

nvm.sh

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,12 +116,19 @@ nvm_get_latest() {
116116
}
117117

118118
nvm_download() {
119-
local CURL_COMPRESSED_FLAG
120119
if nvm_has "curl"; then
120+
local CURL_COMPRESSED_FLAG=""
121+
local CURL_HEADER_FLAG=""
122+
123+
if [ -n "${NVM_AUTH_HEADER:-}" ]; then
124+
sanitized_header=$(nvm_sanitize_auth_header "${NVM_AUTH_HEADER}")
125+
CURL_HEADER_FLAG="--header \"Authorization: ${sanitized_header}\""
126+
fi
127+
121128
if nvm_curl_use_compression; then
122129
CURL_COMPRESSED_FLAG="--compressed"
123130
fi
124-
curl --fail ${CURL_COMPRESSED_FLAG:-} -q "$@"
131+
eval "curl -q --fail ${CURL_COMPRESSED_FLAG:-} ${CURL_HEADER_FLAG:-} $*"
125132
elif nvm_has "wget"; then
126133
# Emulate curl with wget
127134
ARGS=$(nvm_echo "$@" | command sed -e 's/--progress-bar /--progress=bar /' \
@@ -133,11 +140,20 @@ nvm_download() {
133140
-e 's/-sS /-nv /' \
134141
-e 's/-o /-O /' \
135142
-e 's/-C - /-c /')
143+
144+
if [ -n "${NVM_AUTH_HEADER:-}" ]; then
145+
ARGS="${ARGS} --header \"${NVM_AUTH_HEADER}\""
146+
fi
136147
# shellcheck disable=SC2086
137148
eval wget $ARGS
138149
fi
139150
}
140151

152+
nvm_sanitize_auth_header() {
153+
# Remove potentially dangerous characters
154+
nvm_echo "$1" | command sed 's/[^a-zA-Z0-9:;_. -]//g'
155+
}
156+
141157
nvm_has_system_node() {
142158
[ "$(nvm deactivate >/dev/null 2>&1 && command -v node)" != '' ]
143159
}
@@ -4358,7 +4374,7 @@ nvm() {
43584374
nvm_sanitize_path nvm_has_colors nvm_process_parameters \
43594375
nvm_node_version_has_solaris_binary nvm_iojs_version_has_solaris_binary \
43604376
nvm_curl_libz_support nvm_command_info nvm_is_zsh nvm_stdout_is_terminal \
4361-
nvm_npmrc_bad_news_bears \
4377+
nvm_npmrc_bad_news_bears nvm_sanitize_auth_header \
43624378
nvm_get_colors nvm_set_colors nvm_print_color_code nvm_wrap_with_color_code nvm_format_help_message_colors \
43634379
nvm_echo_with_colors nvm_err_with_colors \
43644380
nvm_get_artifact_compression nvm_install_binary_extract nvm_extract_tarball \

test/fast/Unit tests/nvm_download

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
#!/bin/sh
22

33
cleanup () {
4-
unset -f die cleanup
4+
unset -f die cleanup NVM_AUTH_HEADER
5+
docker stop httpbin && docker rm httpbin
56
}
67
die () { echo "$@" ; cleanup ; exit 1; }
78

@@ -15,4 +16,13 @@ nvm_download "https://raw.githubusercontent.com/nvm-sh/nvm/HEAD/install.sh" >/de
1516
# nvm_download should fail to download wrong_install.sh
1617
! nvm_download "https://raw.githubusercontent.com/nvm-sh/nvm/HEAD/wrong_install.sh" >/dev/null || die "nvm_download should fail to download no existing file"
1718

19+
# nvm_download should pass when calling with auth header
20+
docker pull kennethreitz/httpbin && docker run --shell=bash -d --name httpbin -p 80:80 kennethreitz/httpbin
21+
sleep 1 # wait for httpbin to start
22+
NVM_AUTH_HEADER="Bearer test-token" nvm_download "http://127.0.0.1/bearer" > /dev/null || die 'nvm_download with auth header should send correctly'
23+
24+
# nvm_download should fail when calling without auth header
25+
nvm_download "http://127.0.0.1/bearer" > /dev/null && die 'nvm_download with no auth header should not send the header and should fail'
26+
docker stop httpbin && docker rm httpbin
27+
1828
cleanup

0 commit comments

Comments
 (0)