mirror of
https://github.com/okxlin/appstore.git
synced 2026-09-23 08:01:00 +00:00
67 lines
2.2 KiB
Bash
Executable File
67 lines
2.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P)"
|
|
ENV_FILE="${ENV_FILE:-${ROOT_DIR}/.env}"
|
|
|
|
fail() {
|
|
printf '%s\n' "$1" >&2
|
|
exit 1
|
|
}
|
|
|
|
read_env_value() {
|
|
local key="$1"
|
|
local value=""
|
|
value="$(sed -n "s/^${key}=//p" "$ENV_FILE" | tail -n 1)"
|
|
case "$value" in
|
|
\"*\") value="${value#\"}"; value="${value%\"}" ;;
|
|
\'*\') value="${value#\'}"; value="${value%\'}" ;;
|
|
esac
|
|
printf '%s\n' "$value"
|
|
}
|
|
|
|
validate_ipv4() {
|
|
local value="$1"
|
|
local part
|
|
local -a parts
|
|
IFS='.' read -r -a parts <<< "$value"
|
|
[[ ${#parts[@]} -eq 4 ]] || return 1
|
|
for part in "${parts[@]}"; do
|
|
[[ "$part" =~ ^[0-9]{1,3}$ ]] || return 1
|
|
(( 10#$part <= 255 )) || return 1
|
|
done
|
|
}
|
|
|
|
[[ -f "$ENV_FILE" ]] || fail "$ENV_FILE not found"
|
|
[[ ! -L "$ENV_FILE" ]] || fail "$ENV_FILE must not be a symbolic link"
|
|
|
|
bind_address="$(read_env_value PANEL_APP_BIND_ADDRESS)"
|
|
validate_ipv4 "$bind_address" || fail "PANEL_APP_BIND_ADDRESS must be an IPv4 address"
|
|
|
|
pooling_size="$(read_env_value WAYBACK_POOLING_SIZE)"
|
|
[[ "$pooling_size" =~ ^[0-9]+$ ]] || fail "WAYBACK_POOLING_SIZE must be an integer"
|
|
(( pooling_size >= 1 && pooling_size <= 32 )) || fail "WAYBACK_POOLING_SIZE must be between 1 and 32"
|
|
|
|
timeout="$(read_env_value WAYBACK_TIMEOUT)"
|
|
[[ "$timeout" =~ ^[0-9]+$ ]] || fail "WAYBACK_TIMEOUT must be an integer"
|
|
(( timeout >= 10 && timeout <= 3600 )) || fail "WAYBACK_TIMEOUT must be between 10 and 3600"
|
|
|
|
media_size="$(read_env_value WAYBACK_MAX_MEDIA_SIZE)"
|
|
[[ "$media_size" =~ ^[1-9][0-9]{0,4}(MB|GB)$ ]] || fail "WAYBACK_MAX_MEDIA_SIZE must use MB or GB, for example 512MB"
|
|
|
|
data_path="$(read_env_value DATA_PATH)"
|
|
[[ "$data_path" =~ ^\./[A-Za-z0-9._-]+(/[A-Za-z0-9._-]+)*$ ]] || fail "DATA_PATH must be a relative path inside the app directory"
|
|
[[ "/$data_path/" != *"/../"* ]] || fail "DATA_PATH must not contain parent traversal"
|
|
|
|
data_dir="${ROOT_DIR}/${data_path#./}"
|
|
canonical_root="$(realpath -m -- "$ROOT_DIR")"
|
|
canonical_data="$(realpath -m -- "$data_dir")"
|
|
[[ "$canonical_data" == "$canonical_root"/* ]] || fail "DATA_PATH resolves outside the app directory"
|
|
[[ ! -L "$data_dir" ]] || fail "DATA_PATH must not be a symbolic link"
|
|
|
|
umask 077
|
|
mkdir -p "$data_dir"
|
|
chown -R 100:101 "$data_dir"
|
|
chmod 750 "$data_dir"
|
|
chmod 600 "$ENV_FILE"
|