mirror of
https://github.com/okxlin/appstore.git
synced 2026-09-23 16:01:01 +00:00
124 lines
3.0 KiB
Bash
Executable File
124 lines
3.0 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
ENV_FILE="${ENV_FILE:-./.env}"
|
|
LEGACY_SPEEDTEST_APP_KEY="base64:dGVzdGluZy1saW51eHNlcnZlci1hcHBzLTEyMzQ1Njc="
|
|
|
|
read_env_value() {
|
|
local key="$1"
|
|
|
|
if [[ ! -f "$ENV_FILE" ]] || ! grep -qE "^${key}=" "$ENV_FILE"; then
|
|
return
|
|
fi
|
|
|
|
local current
|
|
current="$(sed -n -E "s/^${key}=//p" "$ENV_FILE" | tail -n 1)"
|
|
current="${current%\"}"
|
|
current="${current#\"}"
|
|
current="${current%\'}"
|
|
current="${current#\'}"
|
|
printf '%s\n' "$current"
|
|
}
|
|
|
|
read_cache_value() {
|
|
local cache_file="$1"
|
|
if [[ ! -s "$cache_file" ]]; then
|
|
return
|
|
fi
|
|
sed -n '1p' "$cache_file" | tr -d '\r\n'
|
|
}
|
|
|
|
write_cache_value() {
|
|
local cache_file="$1"
|
|
local value="$2"
|
|
|
|
mkdir -p "$(dirname "$cache_file")"
|
|
printf '%s\n' "$value" > "$cache_file"
|
|
chmod 600 "$cache_file" 2>/dev/null || true
|
|
}
|
|
|
|
escape_sed_replacement() {
|
|
printf '%s' "$1" | sed -e 's/[\/&|]/\\&/g'
|
|
}
|
|
|
|
set_env_value() {
|
|
local key="$1"
|
|
local value="$2"
|
|
|
|
if [[ ! -f "$ENV_FILE" ]]; then
|
|
echo "$ENV_FILE not found; skipped $key generation"
|
|
return
|
|
fi
|
|
|
|
local replacement
|
|
replacement="$(escape_sed_replacement "$value")"
|
|
if grep -qE "^${key}=" "$ENV_FILE"; then
|
|
sed -i -E "s|^${key}=.*|${key}=${replacement}|" "$ENV_FILE"
|
|
echo "Updated $key"
|
|
return
|
|
fi
|
|
|
|
printf '%s=%s\n' "$key" "$value" >> "$ENV_FILE"
|
|
echo "Added $key"
|
|
}
|
|
|
|
generate_alnum_secret() {
|
|
local secret=""
|
|
local chunk=""
|
|
while [[ ${#secret} -lt 32 ]]; do
|
|
chunk="$(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c $((32 - ${#secret})) || true)"
|
|
secret="${secret}${chunk}"
|
|
done
|
|
printf '%s\n' "$secret"
|
|
}
|
|
|
|
generate_laravel_app_key() {
|
|
if command -v openssl >/dev/null 2>&1; then
|
|
printf 'base64:%s\n' "$(openssl rand -base64 32 | tr -d '\r\n')"
|
|
return
|
|
fi
|
|
|
|
if command -v base64 >/dev/null 2>&1; then
|
|
printf 'base64:%s\n' "$(head -c 32 /dev/urandom | base64 | tr -d '\r\n')"
|
|
return
|
|
fi
|
|
|
|
generate_alnum_secret
|
|
}
|
|
|
|
laravel_app_key_is_valid() {
|
|
local value="$1"
|
|
[[ "$value" =~ ^base64:[A-Za-z0-9+/=]{43,}$ ]] && return 0
|
|
[[ "$value" =~ ^[A-Za-z0-9]{32,}$ ]] && return 0
|
|
return 1
|
|
}
|
|
|
|
CONFIG_PATH_VALUE="${CONFIG_PATH:-$(read_env_value CONFIG_PATH || true)}"
|
|
CONFIG_PATH_VALUE="${CONFIG_PATH_VALUE:-./data/config}"
|
|
APP_KEY_CACHE="${APP_KEY_CACHE:-${CONFIG_PATH_VALUE}/.speedtest_tracker_app_key}"
|
|
|
|
if [[ -f "$ENV_FILE" ]]; then
|
|
app_key="$(read_env_value APP_KEY || true)"
|
|
cached_app_key="$(read_cache_value "$APP_KEY_CACHE" || true)"
|
|
if laravel_app_key_is_valid "$app_key" && [[ "$app_key" != "$LEGACY_SPEEDTEST_APP_KEY" ]]; then
|
|
write_cache_value "$APP_KEY_CACHE" "$app_key"
|
|
elif laravel_app_key_is_valid "$cached_app_key"; then
|
|
set_env_value "APP_KEY" "$cached_app_key"
|
|
else
|
|
app_key="$(generate_laravel_app_key)"
|
|
set_env_value "APP_KEY" "$app_key"
|
|
write_cache_value "$APP_KEY_CACHE" "$app_key"
|
|
fi
|
|
fi
|
|
|
|
paths=(
|
|
"${CONFIG_PATH:-./data/config}"
|
|
)
|
|
|
|
mkdir -p "${paths[@]}"
|
|
for path in "${paths[@]}"; do
|
|
case "$path" in
|
|
./*|../*) chown -R 1000:1000 "$path" 2>/dev/null || true ;;
|
|
esac
|
|
done
|