<?php
// =============================================================================
// VPN 서버 vpnid_list.vpn_user_pwd 평문 → VLSEC1: 암호문 마이그레이션 (CLI 전용)
// -----------------------------------------------------------------------------
// 사용법 (VPN 서버에서):
//   php migrate_encrypt_vpnid_pwd_cli.php              (dry-run)
//   php migrate_encrypt_vpnid_pwd_cli.php --apply      (실제 적용)
//   php migrate_encrypt_vpnid_pwd_cli.php --limit=100
//
// ※ 실행 전 반드시:
//   1) 아래 DB 접속 상수를 VPN 서버 값으로 확인/수정
//   2) vpnlink_pwd_vault.lib.php 가 같은 디렉토리에 있고 시크릿이 해석되는지 확인
//   3) 이 스크립트 적용 "이전에" vpnid_list 를 읽는 코드(관리패널/크론)에
//      vpnlink_vpn_pwd_reveal() 패치가 먼저 배포되어 있어야 함
// =============================================================================

if (php_sapi_name() !== 'cli') {
    exit("CLI 전용 스크립트입니다.\n");
}

// ─── VPN 서버 DB 접속 정보 (확인/수정 필요) ─────────────────────────────────
define('VAULT_DB_HOST', 'localhost');
define('VAULT_DB_USER', 'root');
define('VAULT_DB_PASS', '');          // ← VPN 서버 DB 비밀번호로 수정
define('VAULT_DB_NAME', 'vpnid');     // ← vpnid_list 가 있는 DB명으로 수정
// ────────────────────────────────────────────────────────────────────────────

require_once(__DIR__ . '/vpnlink_pwd_vault.lib.php');

$apply = in_array('--apply', $argv, true);
$limit = 0;
foreach ($argv as $arg) {
    if (strpos($arg, '--limit=') === 0) {
        $limit = (int)substr($arg, 8);
    }
}

echo "=== [VPN서버] vpnid_list VPN 암호 암호화 마이그레이션 ===\n";
echo "time  : " . date('Y-m-d H:i:s') . "\n";
echo "mode  : " . ($apply ? 'APPLY' : 'DRY-RUN') . "\n\n";

if (vpnlink_vault_secret() === '') {
    echo "[중단] 공유 시크릿을 찾지 못했습니다. (.env / ikev2_secret.php / 환경변수 확인)\n";
    exit(1);
}
echo "secret: OK\n";

$db = @new mysqli(VAULT_DB_HOST, VAULT_DB_USER, VAULT_DB_PASS, VAULT_DB_NAME);
if ($db->connect_error) {
    echo "[중단] DB 접속 실패: " . $db->connect_error . "\n";
    exit(1);
}
$db->set_charset('utf8');
echo "db    : OK (" . VAULT_DB_NAME . ")\n\n";

$targets = array(
    array('table' => 'vpnid_list', 'pk' => 'no', 'col' => 'vpn_user_pwd'),
    array('table' => 'vpnid_list', 'pk' => 'no', 'col' => 'member_pwd'),
);

foreach ($targets as $t) {
    $table = $t['table'];
    $pk = $t['pk'];
    $col = $t['col'];

    $r = $db->query("show tables like '" . $db->real_escape_string($table) . "'");
    if (!$r || !$r->num_rows) {
        echo "[SKIP] {$table} 테이블 없음\n";
        continue;
    }
    $r = $db->query("show columns from `{$table}` like '" . $db->real_escape_string($col) . "'");
    if (!$r || !$r->num_rows) {
        echo "[SKIP] {$table}.{$col} 컬럼 없음\n";
        continue;
    }

    $sql = "select `{$pk}`, `{$col}` from `{$table}`
             where `{$col}` is not null and `{$col}` <> ''
               and `{$col}` not like 'VLSEC1:%'";
    if ($limit > 0) {
        $sql .= " limit {$limit}";
    }

    $res = $db->query($sql);
    if ($res === false) {
        echo "[FAIL] {$table}.{$col} 조회 실패: " . $db->error . "\n";
        continue;
    }

    $cnt = 0; $done = 0; $fail = 0;
    while ($row = $res->fetch_assoc()) {
        $cnt++;
        $enc = vpnlink_vpn_pwd_protect((string)$row[$col]);
        if (!vpnlink_vpn_pwd_is_protected($enc)) {
            $fail++;
            echo "[FAIL] {$table}.{$col} {$pk}={$row[$pk]} 암호화 실패\n";
            continue;
        }
        echo ($apply ? "[ENCRYPT] " : "[DRY-RUN] ") . "{$table}.{$col} {$pk}={$row[$pk]}\n";
        if ($apply) {
            $ok = $db->query("update `{$table}` set `{$col}` = '" . $db->real_escape_string($enc) . "'
                               where `{$pk}` = '" . $db->real_escape_string((string)$row[$pk]) . "'");
            if ($ok) { $done++; } else { $fail++; echo "  -> UPDATE 실패: " . $db->error . "\n"; }
        }
    }

    echo "--- {$table}.{$col}: 대상 {$cnt}건" . ($apply ? ", 적용 {$done}건, 실패 {$fail}건" : "") . " ---\n\n";
}

echo ($apply ? "적용 완료. 관리패널/크론에서 표시·비교가 정상인지 확인하세요.\n"
             : "[DRY-RUN] 실제 변경 없음. --apply 로 적용하세요.\n");
