#!/usr/bin/env bash

# bin_path is joined onto the install directory and the result goes on PATH.
# An absolute or parent-escaping value would put any directory there, which
# safe mode lets project config set on a tool that is already installed.

mkdir -p safe-bin/bin evil
printf '#!/bin/sh\necho tool\n' >safe-bin/bin/safe-bin
chmod +x safe-bin/bin/safe-bin
tar -czf safe-bin.tar.gz safe-bin
rm -rf safe-bin
url="file://$PWD/safe-bin.tar.gz"

cat <<EOF >"$MISE_CONFIG_DIR/config.toml"
[tools]
"http:safe-bin" = { version = "1.0.0", url = "$url" }
EOF
mise install
assert_contains "mise env" "installs/http-safe-bin/1.0.0/bin"

for bin_path in "$PWD/evil" "../../../../../../../../../../..$PWD/evil" "{{ '..' }}/evil"; do
  cat <<EOF >mise.toml
[tools]
"http:safe-bin" = { version = "1.0.0", url = "$url", bin_path = "$bin_path" }
EOF
  assert_not_contains "MISE_SAFE=1 mise env 2>/dev/null" "evil"
  assert_contains "MISE_SAFE=1 mise env 2>&1" "must be a directory inside the install directory"
done

# An install checks bin_path before it downloads, extracts or keys a shared
# extraction on it, with or without rename_exe.
for extra in "" ', rename_exe = "renamed", shared_extraction = true'; do
  cat <<EOF >mise.toml
[tools]
"http:bad-bin" = { version = "1.0.0", url = "$url", bin_path = "../../../escaped"$extra }
EOF
  assert_fail "mise install http:bad-bin" "must be a directory inside the install directory"
done

# A shared extraction is keyed on the rendered bin_path: the same archive
# installed for two versions renames in two different directories.
mkdir -p shared/1.0.0/bin shared/2.0.0/bin
printf '#!/bin/sh\necho shared\n' >shared/1.0.0/bin/tool
cp shared/1.0.0/bin/tool shared/2.0.0/bin/tool
chmod +x shared/1.0.0/bin/tool shared/2.0.0/bin/tool
tar -czf shared.tar.gz -C shared 1.0.0 2.0.0
rm -rf shared
for version in 1.0.0 2.0.0; do
  cat <<EOF >mise.toml
[tools]
"http:shared-bin" = { version = "$version", url = "file://$PWD/shared.tar.gz", bin_path = "{{ version }}/bin", rename_exe = "renamed", shared_extraction = true }
EOF
  assert_succeed "mise install http:shared-bin"
  assert_contains "mise which renamed" "$version/bin/renamed"
done
