fix(scripts): جلوگیری از خرابی Basic Auth با کوتیشنکردن مقدارهای دارای $
docker compose مقادیر .env را خودش تفسیر میکند؛ هش htpasswd شامل $apr1$... است و بدون کوتیشن، $apr1 و بخشهای بعدی بهعنوان متغیر خالی جایگزین میشدند (برچسب تبدیل به preview:/OBoRS/... میشد) و پیشنمایش خصوصی هرگز رمز را نمیپذیرفت. حالا env_set مقدارهای دارای $ را تککوتیشن میگذارد و env_get کوتیشن را برمیدارد.
This commit is contained in:
@@ -21,25 +21,31 @@ cd "$(dirname "$0")/.."
|
|||||||
ENV_FILE=.env
|
ENV_FILE=.env
|
||||||
[ -f "$ENV_FILE" ] || { echo "فایل .env پیدا نشد — اول bash scripts/gen-env.sh" >&2; exit 1; }
|
[ -f "$ENV_FILE" ] || { echo "فایل .env پیدا نشد — اول bash scripts/gen-env.sh" >&2; exit 1; }
|
||||||
|
|
||||||
# مقدار فعلی یک کلید در .env (یا خالی)
|
# مقدار فعلی یک کلید در .env (یا خالی) — کوتیشن تکنویسهای هم برداشته میشود
|
||||||
env_get() {
|
env_get() {
|
||||||
local key="$1"
|
local key="$1"
|
||||||
sed -n "s/^${key}=//p" "$ENV_FILE" | tail -1
|
sed -n "s/^${key}=//p" "$ENV_FILE" | tail -1 | sed -e "s/^'//" -e "s/'\$//"
|
||||||
}
|
}
|
||||||
|
|
||||||
# تنظیم/جایگزینی یک کلید در .env (بدون آسیب به بقیه خطوط)
|
# تنظیم/جایگزینی یک کلید در .env (بدون آسیب به بقیه خطوط)
|
||||||
|
# نکتهٔ مهم: docker compose مقادیر .env را خودش تفسیر میکند؛ هش htpasswd شامل
|
||||||
|
# $apr1$... است و اگر کوتیشن نخورد، $apr1 و بخشهای بعدی بهعنوان متغیر خالی
|
||||||
|
# جایگزین میشوند و Basic Auth هرگز رمز را نمیپذیرد. پس هر مقدار دارای $ را
|
||||||
|
# تککوتیشن میگذاریم (compose کوتیشن را برمیدارد و مقدار را عیناً میخواند).
|
||||||
env_set() {
|
env_set() {
|
||||||
local key="$1" value="$2"
|
local key="$1" value="$2"
|
||||||
if grep -q "^${key}=" "$ENV_FILE"; then
|
if grep -q "^${key}=" "$ENV_FILE"; then
|
||||||
# جداکننده | تا کاراکترهای ویژه مقدار (مثل / و $) مشکلی نسازند
|
|
||||||
python3 - "$ENV_FILE" "$key" "$value" <<'PY'
|
python3 - "$ENV_FILE" "$key" "$value" <<'PY'
|
||||||
import io, sys
|
import io, sys
|
||||||
path, key, value = sys.argv[1], sys.argv[2], sys.argv[3]
|
path, key, value = sys.argv[1], sys.argv[2], sys.argv[3]
|
||||||
|
if "$" in value:
|
||||||
|
value = "'" + value + "'"
|
||||||
lines = io.open(path, encoding="utf-8").read().split("\n")
|
lines = io.open(path, encoding="utf-8").read().split("\n")
|
||||||
out = [f"{key}={value}" if line.startswith(f"{key}=") else line for line in lines]
|
out = [f"{key}={value}" if line.startswith(f"{key}=") else line for line in lines]
|
||||||
io.open(path, "w", encoding="utf-8", newline="\n").write("\n".join(out))
|
io.open(path, "w", encoding="utf-8", newline="\n").write("\n".join(out))
|
||||||
PY
|
PY
|
||||||
else
|
else
|
||||||
|
if [ "${value#*\$}" != "$value" ]; then value="'$value'"; fi
|
||||||
printf '\n%s=%s\n' "$key" "$value" >> "$ENV_FILE"
|
printf '\n%s=%s\n' "$key" "$value" >> "$ENV_FILE"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user