| # Test routines for checking protocol disabling. | 
 |  | 
 | # Test clone/fetch/push with GIT_ALLOW_PROTOCOL whitelist | 
 | test_whitelist () { | 
 | 	desc=$1 | 
 | 	proto=$2 | 
 | 	url=$3 | 
 |  | 
 | 	test_expect_success "clone $desc (enabled)" ' | 
 | 		rm -rf tmp.git && | 
 | 		( | 
 | 			GIT_ALLOW_PROTOCOL=$proto && | 
 | 			export GIT_ALLOW_PROTOCOL && | 
 | 			git clone --bare "$url" tmp.git | 
 | 		) | 
 | 	' | 
 |  | 
 | 	test_expect_success "fetch $desc (enabled)" ' | 
 | 		( | 
 | 			cd tmp.git && | 
 | 			GIT_ALLOW_PROTOCOL=$proto && | 
 | 			export GIT_ALLOW_PROTOCOL && | 
 | 			git fetch | 
 | 		) | 
 | 	' | 
 |  | 
 | 	test_expect_success "push $desc (enabled)" ' | 
 | 		( | 
 | 			cd tmp.git && | 
 | 			GIT_ALLOW_PROTOCOL=$proto && | 
 | 			export GIT_ALLOW_PROTOCOL && | 
 | 			git push origin HEAD:pushed | 
 | 		) | 
 | 	' | 
 |  | 
 | 	test_expect_success "push $desc (disabled)" ' | 
 | 		( | 
 | 			cd tmp.git && | 
 | 			GIT_ALLOW_PROTOCOL=none && | 
 | 			export GIT_ALLOW_PROTOCOL && | 
 | 			test_must_fail git push origin HEAD:pushed | 
 | 		) | 
 | 	' | 
 |  | 
 | 	test_expect_success "fetch $desc (disabled)" ' | 
 | 		( | 
 | 			cd tmp.git && | 
 | 			GIT_ALLOW_PROTOCOL=none && | 
 | 			export GIT_ALLOW_PROTOCOL && | 
 | 			test_must_fail git fetch | 
 | 		) | 
 | 	' | 
 |  | 
 | 	test_expect_success "clone $desc (disabled)" ' | 
 | 		rm -rf tmp.git && | 
 | 		( | 
 | 			GIT_ALLOW_PROTOCOL=none && | 
 | 			export GIT_ALLOW_PROTOCOL && | 
 | 			test_must_fail git clone --bare "$url" tmp.git | 
 | 		) | 
 | 	' | 
 |  | 
 | 	test_expect_success "clone $desc (env var has precedence)" ' | 
 | 		rm -rf tmp.git && | 
 | 		( | 
 | 			GIT_ALLOW_PROTOCOL=none && | 
 | 			export GIT_ALLOW_PROTOCOL && | 
 | 			test_must_fail git -c protocol.allow=always clone --bare "$url" tmp.git && | 
 | 			test_must_fail git -c protocol.$proto.allow=always clone --bare "$url" tmp.git | 
 | 		) | 
 | 	' | 
 | } | 
 |  | 
 | test_config () { | 
 | 	desc=$1 | 
 | 	proto=$2 | 
 | 	url=$3 | 
 |  | 
 | 	# Test clone/fetch/push with protocol.<type>.allow config | 
 | 	test_expect_success "clone $desc (enabled with config)" ' | 
 | 		rm -rf tmp.git && | 
 | 		git -c protocol.$proto.allow=always clone --bare "$url" tmp.git | 
 | 	' | 
 |  | 
 | 	test_expect_success "fetch $desc (enabled)" ' | 
 | 		git -C tmp.git -c protocol.$proto.allow=always fetch | 
 | 	' | 
 |  | 
 | 	test_expect_success "push $desc (enabled)" ' | 
 | 		git -C tmp.git -c protocol.$proto.allow=always  push origin HEAD:pushed | 
 | 	' | 
 |  | 
 | 	test_expect_success "push $desc (disabled)" ' | 
 | 		test_must_fail git -C tmp.git -c protocol.$proto.allow=never push origin HEAD:pushed | 
 | 	' | 
 |  | 
 | 	test_expect_success "fetch $desc (disabled)" ' | 
 | 		test_must_fail git -C tmp.git -c protocol.$proto.allow=never fetch | 
 | 	' | 
 |  | 
 | 	test_expect_success "clone $desc (disabled)" ' | 
 | 		rm -rf tmp.git && | 
 | 		test_must_fail git -c protocol.$proto.allow=never clone --bare "$url" tmp.git | 
 | 	' | 
 |  | 
 | 	# Test clone/fetch/push with protocol.user.allow and its env var | 
 | 	test_expect_success "clone $desc (enabled)" ' | 
 | 		rm -rf tmp.git && | 
 | 		git -c protocol.$proto.allow=user clone --bare "$url" tmp.git | 
 | 	' | 
 |  | 
 | 	test_expect_success "fetch $desc (enabled)" ' | 
 | 		git -C tmp.git -c protocol.$proto.allow=user fetch | 
 | 	' | 
 |  | 
 | 	test_expect_success "push $desc (enabled)" ' | 
 | 		git -C tmp.git -c protocol.$proto.allow=user push origin HEAD:pushed | 
 | 	' | 
 |  | 
 | 	test_expect_success "push $desc (disabled)" ' | 
 | 		( | 
 | 			cd tmp.git && | 
 | 			GIT_PROTOCOL_FROM_USER=0 && | 
 | 			export GIT_PROTOCOL_FROM_USER && | 
 | 			test_must_fail git -c protocol.$proto.allow=user push origin HEAD:pushed | 
 | 		) | 
 | 	' | 
 |  | 
 | 	test_expect_success "fetch $desc (disabled)" ' | 
 | 		( | 
 | 			cd tmp.git && | 
 | 			GIT_PROTOCOL_FROM_USER=0 && | 
 | 			export GIT_PROTOCOL_FROM_USER && | 
 | 			test_must_fail git -c protocol.$proto.allow=user fetch | 
 | 		) | 
 | 	' | 
 |  | 
 | 	test_expect_success "clone $desc (disabled)" ' | 
 | 		rm -rf tmp.git && | 
 | 		( | 
 | 			GIT_PROTOCOL_FROM_USER=0 && | 
 | 			export GIT_PROTOCOL_FROM_USER && | 
 | 			test_must_fail git -c protocol.$proto.allow=user clone --bare "$url" tmp.git | 
 | 		) | 
 | 	' | 
 |  | 
 | 	# Test clone/fetch/push with protocol.allow user defined default | 
 | 	test_expect_success "clone $desc (enabled)" ' | 
 | 		rm -rf tmp.git && | 
 | 		test_config_global protocol.allow always && | 
 | 		git clone --bare "$url" tmp.git | 
 | 	' | 
 |  | 
 | 	test_expect_success "fetch $desc (enabled)" ' | 
 | 		test_config_global protocol.allow always && | 
 | 		git -C tmp.git fetch | 
 | 	' | 
 |  | 
 | 	test_expect_success "push $desc (enabled)" ' | 
 | 		test_config_global protocol.allow always && | 
 | 		git -C tmp.git push origin HEAD:pushed | 
 | 	' | 
 |  | 
 | 	test_expect_success "push $desc (disabled)" ' | 
 | 		test_config_global protocol.allow never && | 
 | 		test_must_fail git -C tmp.git push origin HEAD:pushed | 
 | 	' | 
 |  | 
 | 	test_expect_success "fetch $desc (disabled)" ' | 
 | 		test_config_global protocol.allow never && | 
 | 		test_must_fail git -C tmp.git fetch | 
 | 	' | 
 |  | 
 | 	test_expect_success "clone $desc (disabled)" ' | 
 | 		rm -rf tmp.git && | 
 | 		test_config_global protocol.allow never && | 
 | 		test_must_fail git clone --bare "$url" tmp.git | 
 | 	' | 
 | } | 
 |  | 
 | # test cloning a particular protocol | 
 | #   $1 - description of the protocol | 
 | #   $2 - machine-readable name of the protocol | 
 | #   $3 - the URL to try cloning | 
 | test_proto () { | 
 | 	test_whitelist "$@" | 
 |  | 
 | 	test_config "$@" | 
 | } | 
 |  | 
 | # set up an ssh wrapper that will access $host/$repo in the | 
 | # trash directory, and enable it for subsequent tests. | 
 | setup_ssh_wrapper () { | 
 | 	test_expect_success 'setup ssh wrapper' ' | 
 | 		write_script ssh-wrapper <<-\EOF && | 
 | 		echo >&2 "ssh: $*" | 
 | 		host=$1; shift | 
 | 		cd "$TRASH_DIRECTORY/$host" && | 
 | 		eval "$*" | 
 | 		EOF | 
 | 		GIT_SSH="$PWD/ssh-wrapper" && | 
 | 		export GIT_SSH && | 
 | 		export TRASH_DIRECTORY | 
 | 	' | 
 | } | 
 |  | 
 | # set up a wrapper that can be used with remote-ext to | 
 | # access repositories in the "remote" directory of trash-dir, | 
 | # like "ext::fake-remote %S repo.git" | 
 | setup_ext_wrapper () { | 
 | 	test_expect_success 'setup ext wrapper' ' | 
 | 		write_script fake-remote <<-\EOF && | 
 | 		echo >&2 "fake-remote: $*" | 
 | 		cd "$TRASH_DIRECTORY/remote" && | 
 | 		eval "$*" | 
 | 		EOF | 
 | 		PATH=$TRASH_DIRECTORY:$PATH && | 
 | 		export TRASH_DIRECTORY | 
 | 	' | 
 | } |