diff --git a/connect-vpn/action.yml b/connect-vpn/action.yml index 20ea678..c61936e 100644 --- a/connect-vpn/action.yml +++ b/connect-vpn/action.yml @@ -23,7 +23,13 @@ inputs: description: VPN 정적 비밀번호 (OTP만 쓰는 설정이면 비워둠) otp-seed: required: true - description: TOTP Base32 시드 키 (이 값으로 매 실행 OTP 코드를 로컬 생성) + description: TOTP 시드 키 (이 값으로 매 실행 OTP 코드를 로컬 생성) + otp-seed-format: + required: false + default: "base32" + description: > + OTP 시드 포맷. base32=구글OTP류 문자열(대문자/공백은 자동 정규화), + hex=16진수 문자열. base32에서 'Base32 invalid' 나면 hex로 시도. otp-mode: required: false default: "append" @@ -113,6 +119,7 @@ runs: VPN_USER: ${{ inputs.vpn-user }} VPN_PASS: ${{ inputs.vpn-password }} OTP_SEED: ${{ inputs.otp-seed }} + OTP_SEED_FORMAT: ${{ inputs.otp-seed-format }} OTP_MODE: ${{ inputs.otp-mode }} TIMEOUT: ${{ inputs.timeout }} CONNECTED_PATTERN: ${{ inputs.connected-pattern }} @@ -123,7 +130,21 @@ runs: [ "$(id -u)" -ne 0 ] && SUDO="sudo" # TOTP 코드 로컬 생성 (API 불필요) - OTP=$(oathtool --totp -b "$OTP_SEED") + # 시드 정규화: 앞뒤/중간 공백 제거 + SEED=$(printf '%s' "$OTP_SEED" | tr -d '[:space:]') + case "$OTP_SEED_FORMAT" in + base32) + # Base32는 대문자 필요 → 소문자 자동 변환 + SEED=$(printf '%s' "$SEED" | tr 'a-z' 'A-Z') + OTP=$(oathtool --totp -b "$SEED") + ;; + hex) + OTP=$(oathtool --totp "$SEED") + ;; + *) + echo "잘못된 otp-seed-format: $OTP_SEED_FORMAT (base32|hex)"; exit 1 + ;; + esac # OTP 결합 방식에 따라 password 필드 구성 case "$OTP_MODE" in