#!/bin/bash
# Invoked only after the desktop's standard polkit authorization prompt.
set -euo pipefail
export PATH=/usr/sbin:/usr/bin:/sbin:/bin
[[ $EUID == 0 && ( $# == 2 || $# == 3 ) && $2 =~ ^[a-f0-9]{64}$ ]] || exit 64
kind=${3:-mihomo}
case "$kind" in
 mihomo) binary=mihomo; capabilities=cap_net_admin,cap_net_raw,cap_net_bind_service=ep ;;
 sharing) binary=wisp-share; capabilities=cap_net_raw=ep ;;
 *) exit 64 ;;
esac
source_file=$(readlink -f -- "$1")
[[ -f "$source_file" ]] || exit 66
expected=$2
[[ $(sha256sum -- "$source_file" | cut -d' ' -f1) == "$expected" ]] || exit 65
# Every privileged destination is fixed, root-owned and not writable by users.
for directory in /usr/local/lib/wisp /usr/local/lib/wisp/cores "/usr/local/lib/wisp/cores/$expected"; do
 if [[ -e "$directory" || -L "$directory" ]]; then
  [[ -d "$directory" && ! -L "$directory" && $(stat -c %u "$directory") == 0 ]] || exit 73
  [[ $(stat -c %a "$directory") == 755 ]] || exit 73
 else
  install -d -o root -g root -m 0755 -- "$directory"
 fi
done
destination="/usr/local/lib/wisp/cores/$expected/$binary"
staged=$(mktemp "/usr/local/lib/wisp/cores/$expected/.$binary.XXXXXX")
trap 'rm -f -- "$staged"' EXIT
install -o root -g root -m 0755 -- "$source_file" "$staged"
[[ $(sha256sum -- "$staged" | cut -d' ' -f1) == "$expected" ]] || exit 65
setcap "$capabilities" "$staged"
mv -fT -- "$staged" "$destination"
printf '%s\n' "$destination"
