From 4b3a90ad7f340f20d831af320c56483763b5e468 Mon Sep 17 00:00:00 2001 From: grendervill Date: Sat, 19 Sep 2026 20:30:23 +0300 Subject: [PATCH] =?UTF-8?q?fix(deploy):=20age-=D0=BA=D0=BB=D1=8E=D1=87=20?= =?UTF-8?q?=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B8=D1=80=D1=83=D0=B5=D1=82?= =?UTF-8?q?=D1=81=D1=8F=20=D0=B1=D0=B5=D0=B7=20age-keygen=20-o=20(=D0=BE?= =?UTF-8?q?=D0=BD=20=D1=87=D0=B8=D1=82=D0=B0=D0=B5=D1=82=20stdin=20=D0=B8?= =?UTF-8?q?=20=D0=BB=D0=BE=D0=BC=D0=B0=D0=BB=20sudo=20-S)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Формируем AGE-SECRET-KEY в bech32 сами, публичный ключ получаем через age-keygen -y "$dst.tmp" && age-keygen -y "$dst.tmp" /dev/null || true)" + if [ -z "$pub" ]; then + rm -f "$dst.tmp" + warn "не удалось сгенерировать age-ключ" + return 0 + fi + { + printf '# created: %s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)" + printf '# public key: %s\n' "$pub" + cat "$dst.tmp" + } >"$dst" + rm -f "$dst.tmp" +} + +# bech32_encode кодирует 32-байтовый ключ (hex) в data-часть bech32 (BIP-173). +bech32_encode() { + local hex="$1" + python3 - "$hex" <<'PYEOF' +import sys +hexs = sys.argv[1] +data = bytes.fromhex(hexs) +# convertbits(8 -> 5) +bits = 0 +value = 0 +out = [] +for byte in data: + value = (value << 8) | byte + bits += 8 + while bits >= 5: + bits -= 5 + out.append((value >> bits) & 31) +if bits: + out.append((value << (5 - bits)) & 31) +charset = "qpzry9x8gf2tvdw0s3jn54khce6mua7l" +print("".join(charset[d] for d in out)) +PYEOF +} + generate_secrets() { info "секреты" local env_existing=0 @@ -520,17 +569,15 @@ generate_secrets() { AGE_KEY_FILE="${GLCHAT_DATA_DIR}/backups/age-key.txt" else AGE_KEY_FILE="${GLCHAT_DATA_DIR}/backups/age-key.txt" - if have age-keygen; then - age-keygen -o "$AGE_KEY_FILE" >/dev/null 2>&1 - else - warn "age-keygen не найден: создаём ed25519-ключ через openssl" - openssl genpkey -algorithm ED25519 -out "$AGE_KEY_FILE" 2>/dev/null - fi + generate_age_key "$AGE_KEY_FILE" fi chmod 600 "$AGE_KEY_FILE" AGE_RECIPIENT="$(grep -o 'age1[0-9a-z]*' "$AGE_KEY_FILE" | head -1 || true)" if [ -z "$AGE_RECIPIENT" ] && have age-keygen; then - AGE_RECIPIENT="$(age-keygen -y "$AGE_KEY_FILE" 2>/dev/null || true)" + AGE_RECIPIENT="$(age-keygen -y "$AGE_KEY_FILE" /dev/null || true)" + fi + if [ -z "$AGE_RECIPIENT" ]; then + warn "не удалось определить публичный age-ключ: бэкапы будут без шифрования" fi ok "age-ключ бэкапов: ${AGE_KEY_FILE}" }