<?php
include __DIR__ . "/MyAdmin_config/MyAdminConfig.php";
include __DIR__ . "/temp_block_manager.php"; // 임시 차단 관리 기능 포함

$server_name = addslashes(trim($_REQUEST['server_name']));
$member_id = addslashes(trim($_REQUEST['member_id']));
$member_pwd = addslashes(trim($_REQUEST['member_pwd']));
// 입력값이 "2020-11-27T23:59" 또는 "2020-11-27T23:59:59"로 들어오도록
$member_id_expire_tmp = addslashes(trim($_REQUEST['member_id_expire']));
// DB 저장용으로 변환 (MySQL DATETIME: "Y-m-d H:i:s")
$member_id_expire = str_replace('T', ' ', substr($member_id_expire_tmp, 0, 19));
$member_memo = addslashes(trim($_REQUEST['member_memo']));
$process_type = addslashes(trim($_REQUEST['process_type']));
$admin_id = addslashes(trim($_REQUEST['admin_id']));
$admin_pwd = addslashes(trim($_REQUEST['admin_pwd']));

$rebuild_cate = addslashes(trim($_REQUEST['rebuild_cate'])); // guest or member

// 사용자 관리 액션 처리
$user_action = addslashes(trim($_REQUEST['user_action']));
$target_user_id = addslashes(trim($_REQUEST['target_user_id']));
$new_password = addslashes(trim($_REQUEST['new_password']));
$extend_days = (int)$_REQUEST['extend_days'];

// 사용자 액션 처리
if (!empty($user_action) && !empty($target_user_id)) {
    $action_result = processUserAction($user_action, $target_user_id, $new_password, $extend_days);

    // 처리 결과 표시
    if ($action_result['success']) {
        echo "<div style='background-color: #d4edda; border: 1px solid #c3e6cb; color: #155724; padding: 10px; margin-bottom: 15px; border-radius: 5px;'>";
        echo "<strong>✅ 작업 완료:</strong> " . htmlspecialchars($action_result['message']);
        echo "</div>";
    } else {
        echo "<div style='background-color: #f8d7da; border: 1px solid #f5c6cb; color: #721c24; padding: 10px; margin-bottom: 15px; border-radius: 5px;'>";
        echo "<strong>❌ 작업 실패:</strong> " . htmlspecialchars($action_result['message']);
        echo "</div>";
    }
}

// 사용자 액션 처리 함수
function processUserAction($action, $target_user_id, $new_password = '', $extend_days = 0) {
    $secrets_file_path = "/etc/strongswan/ipsec.secrets";

    switch ($action) {
        case 'disconnect':
            return disconnectUser($target_user_id);

        case 'disable':
            return disableUser($target_user_id, $secrets_file_path);

        case 'enable':
            return enableUser($target_user_id, $secrets_file_path);

        case 'delete':
            return deleteUser($target_user_id, $secrets_file_path);

        case 'reset_password':
            return resetUserPassword($target_user_id, $new_password, $secrets_file_path);

        case 'extend_expire':
            return extendUserExpire($target_user_id, $extend_days, $secrets_file_path);

        default:
            return array('success' => false, 'message' => '알 수 없는 작업입니다.');
    }
}

// 사용자 연결 끊기 (임시 차단)
function disconnectUser($user_id) {
    // 현재 연결된 세션 찾기
    exec('/bin/php_my_root /usr/sbin/swanctl --list-sas 2>/dev/null', $sas_output);

    $session_terminated = false;
    foreach ($sas_output as $line) {
        if (preg_match("/remote\s+'$user_id'\s+@/", $line)) {
            // 해당 사용자의 세션 라인 찾음
            foreach ($sas_output as $session_line) {
                if (preg_match('/^([^\s:]+):\s+#(\d+),\s+(\w+)/', $session_line, $matches)) {
                    // swanctl로 세션 종료
                    exec("/bin/php_my_root /usr/sbin/swanctl --terminate --ike-id " . escapeshellarg($matches[2]));
                    $session_terminated = true;
                    break;
                }
            }
            break;
        }
    }

    if ($session_terminated) {
        // 임시 차단 기록 (10초간)
        createTemporaryBlock($user_id, 10, "연결 끊기 요청");
        return array('success' => true, 'message' => "사용자 '{$user_id}'의 VPN 연결을 끊고 10초간 임시 차단했습니다.");
    } else {
        return array('success' => false, 'message' => "사용자 '{$user_id}'가 현재 연결되어 있지 않습니다.");
    }
}

// 임시 차단 생성 함수
function createTemporaryBlock($user_id, $duration_seconds, $reason = '') {
    $temp_blocks_file = __DIR__ . "/vpn_temp_blocks.json";
    $current_time = time();
    $blocked_until = $current_time + $duration_seconds;

    // 기존 차단 정보 로드
    $blocks_data = array();
    if (file_exists($temp_blocks_file)) {
        $blocks_content = file_get_contents($temp_blocks_file);
        $blocks_data = json_decode($blocks_content, true);
        if (!$blocks_data) $blocks_data = array();
    }

    // 새 차단 정보 추가
    $blocks_data[$user_id] = array(
        'user_id' => $user_id,
        'blocked_at' => date('Y-m-d H:i:s T'),
        'blocked_until' => date('Y-m-d H:i:s T', $blocked_until),
        'duration_seconds' => $duration_seconds,
        'reason' => $reason,
        'initiated_by' => 'admin', // 관리자 정보가 있다면 사용
        'auto_reenable' => true,
        'updated_at' => date('Y-m-d H:i:s T')
    );

    // 파일에 저장
    file_put_contents($temp_blocks_file, json_encode($blocks_data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));

    // ipsec.secrets에서 해당 사용자 주석 처리
    disableUserInIpsecSecrets($user_id);
}

// ipsec.secrets에서 사용자 비활성화
function disableUserInIpsecSecrets($user_id) {
    $secrets_file_path = "/etc/strongswan/ipsec.secrets";

    if (!file_exists($secrets_file_path)) {
        return false;
    }

    $lines = file($secrets_file_path, FILE_IGNORE_NEW_LINES);
    $updated = false;

    for ($i = 0; $i < count($lines); $i++) {
        $line = trim($lines[$i]);

        // 활성화된 라인에서 해당 사용자 찾기
        if (substr($line, 0, 1) !== '#' && strpos($line, $user_id . ' : EAP ') !== false) {
            // 주석 처리하여 비활성화
            $lines[$i] = '#' . $line;
            $updated = true;
            break;
        }
    }

    if ($updated) {
        $file_content = implode("\n", $lines) . "\n";
        file_put_contents($secrets_file_path, $file_content);

        // strongSwan 설정 다시 로드
        exec("/bin/php_my_root /usr/sbin/strongswan rereadsecrets");

        return true;
    }

    return false;
}

// 기타 사용자 관리 함수들 (간단 구현)
function disableUser($user_id, $secrets_file_path) {
    if (disableUserInIpsecSecrets($user_id)) {
        return array('success' => true, 'message' => "사용자 '{$user_id}'를 비활성화했습니다.");
    } else {
        return array('success' => false, 'message' => "사용자 '{$user_id}' 비활성화에 실패했습니다.");
    }
}

function enableUser($user_id, $secrets_file_path) {
    if (enableUserInIpsecSecrets($user_id)) {
        return array('success' => true, 'message' => "사용자 '{$user_id}'를 활성화했습니다.");
    } else {
        return array('success' => false, 'message' => "사용자 '{$user_id}' 활성화에 실패했습니다.");
    }
}

function deleteUser($user_id, $secrets_file_path) {
    // TODO: 구현 필요
    return array('success' => false, 'message' => "삭제 기능은 아직 구현되지 않았습니다.");
}

function resetUserPassword($user_id, $new_password, $secrets_file_path) {
    // TODO: 구현 필요
    return array('success' => false, 'message' => "비밀번호 재설정 기능은 아직 구현되지 않았습니다.");
}

function extendUserExpire($user_id, $extend_days, $secrets_file_path) {
    // TODO: 구현 필요
    return array('success' => false, 'message' => "만료일 연장 기능은 아직 구현되지 않았습니다.");
}

// ipsec.secrets 파일 처리
$secrets_file_path = "/etc/strongswan/ipsec.secrets";
$current_datetime = date("Y-m-d H:i:s");

// 파일 읽기
$ipsec_secrets_lines = array();
if (file_exists($secrets_file_path)) {
    $ipsec_secrets_lines = file($secrets_file_path, FILE_IGNORE_NEW_LINES);
} else {
    // 파일이 없으면 기본 헤더 생성
    $ipsec_secrets_lines = array(
        "# ipsec.secrets - strongSwan IPsec secrets file",
        ": RSA \"privkey.pem\""
    );
}

// member_id와 member_pwd가 제공된 경우 처리
if (!empty($member_id) && !empty($member_pwd)) {
    $new_entry = $member_id . " : EAP \"" . $member_pwd . "\"";

    // 기존 사용자 ID 찾기
    $existing_created_time = "";
    $found_index = -1;
    for ($i = 0; $i < count($ipsec_secrets_lines); $i++) {
        $line = trim($ipsec_secrets_lines[$i]);
        // 코멘트가 아니고 EAP 라인인 경우
        if (!empty($line) && substr($line, 0, 1) !== '#' && strpos($line, ' : EAP ') !== false) {
            $parts = explode(' : EAP ', $line);
            if (count($parts) >= 2) {
                $existing_id = trim($parts[0]);
                if ($existing_id === $member_id) {
                    $found_index = $i;

                    // 기존 created 시간 추출 (created: 또는 단독 날짜/시간)
                    if (preg_match('/created:([0-9-: ]+)/', $line, $matches)) {
                        $existing_created_time = trim($matches[1]);
                    } else if (preg_match('/([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}) \| (updated|inserted)/', $line, $matches)) {
                        $existing_created_time = trim($matches[1]);
                    }
                    break;
                }
            }
        }
    }

    if ($found_index >= 0) {
        // 기존 사용자 업데이트 - created 시간 유지
        $final_comment_details = array();

        if (!empty($member_id_expire)) {
            $final_comment_details[] = "expire:" . $member_id_expire;
        }

        if (!empty($member_memo)) {
            $final_comment_details[] = "memo:" . $member_memo;
        }

        if (!empty($admin_id)) {
            $final_comment_details[] = "admin:" . $admin_id;
        }

        // created 시간 (기존 것 유지 또는 현재 시간)
        $created_time = !empty($existing_created_time) ? $existing_created_time : $current_datetime;
        $final_comment_details[] = "created:" . $created_time;

        // updated 시간 (현재 시간)
        $final_comment_details[] = "updated:" . $current_datetime;

        $final_comment = " # " . implode(" | ", $final_comment_details);
        $ipsec_secrets_lines[$found_index] = $new_entry . $final_comment;
        $operation = "업데이트";
        $operation_status = "기존 사용자";
    } else {
        // 새 사용자 추가 - created 시간만 설정
        $final_comment_details = array();

        if (!empty($member_id_expire)) {
            $final_comment_details[] = "expire:" . $member_id_expire;
        }

        if (!empty($member_memo)) {
            $final_comment_details[] = "memo:" . $member_memo;
        }

        if (!empty($admin_id)) {
            $final_comment_details[] = "admin:" . $admin_id;
        }

        // 새 사용자는 created 시간만
        $final_comment_details[] = "created:" . $current_datetime;

        $final_comment = " # " . implode(" | ", $final_comment_details);
        $ipsec_secrets_lines[] = $new_entry . $final_comment;
        $operation = "신규 생성";
        $operation_status = "새로운 사용자";
    }

    // 파일 쓰기
    $file_content = implode("\n", $ipsec_secrets_lines) . "\n";
    $write_success = false;
    if (file_put_contents($secrets_file_path, $file_content) !== false) {
        $write_success = true;
    }

    // 처리 결과를 테이블로 출력
    echo "<strong>사용자 계정 처리 결과:</strong><br>";
    echo "<table border='1' cellpadding='8' cellspacing='0' style='border-collapse: collapse; width: 100%; margin-bottom: 20px;'>";
    echo "<tr style='background-color: " . ($write_success ? "#d4edda;" : "#f8d7da;") . " font-weight: bold;'>";
    echo "<th>항목</th><th>내용</th>";
    echo "</tr>";

    $result_color = $write_success ? "color: green;" : "color: red;";
    $result_text = $write_success ? "✅ 성공" : "❌ 실패";

    echo "<tr>";
    echo "<td><strong>처리 결과</strong></td>";
    echo "<td style='font-weight: bold; {$result_color}'>{$result_text}</td>";
    echo "</tr>";

    echo "<tr>";
    echo "<td><strong>사용자 ID</strong></td>";
    echo "<td><strong>" . htmlspecialchars($member_id) . "</strong></td>";
    echo "</tr>";

    echo "<tr>";
    echo "<td><strong>작업 유형</strong></td>";
    echo "<td>" . htmlspecialchars($operation) . " (" . htmlspecialchars($operation_status) . ")</td>";
    echo "</tr>";

    echo "<tr>";
    echo "<td><strong>비밀번호</strong></td>";
    echo "<td style='font-family: monospace;'>" . htmlspecialchars($member_pwd) . "</td>";
    echo "</tr>";

    if (!empty($member_id_expire)) {
        echo "<tr>";
        echo "<td><strong>만료일시</strong></td>";
        echo "<td>" . htmlspecialchars($member_id_expire) . "</td>";
        echo "</tr>";
    }

    if (!empty($member_memo)) {
        echo "<tr>";
        echo "<td><strong>메모</strong></td>";
        echo "<td>" . htmlspecialchars($member_memo) . "</td>";
        echo "</tr>";
    }

    if (!empty($admin_id)) {
        echo "<tr>";
        echo "<td><strong>처리한 관리자</strong></td>";
        echo "<td>" . htmlspecialchars($admin_id) . "</td>";
        echo "</tr>";
    }

    echo "<tr>";
    echo "<td><strong>처리 시간</strong></td>";
    echo "<td>" . htmlspecialchars($current_datetime) . "</td>";
    echo "</tr>";

    if (!$write_success) {
        echo "<tr>";
        echo "<td><strong>오류 정보</strong></td>";
        echo "<td style='color: red;'>ipsec.secrets 파일 쓰기 권한을 확인해주세요.</td>";
        echo "</tr>";
    }

    echo "</table>";
}

// 현재 파일 내용 읽기 및 파싱
$ipsec_secrets = '';
$secrets_data = array();
$fp = fopen($secrets_file_path, "r");
if ($fp) {
    while (!feof($fp)) {
        $line = fgets($fp);
        $ipsec_secrets .= $line;

        // 파싱하여 테이블 데이터로 변환
        $line = trim($line);
        if (!empty($line) && substr($line, 0, 1) !== '#' && strpos($line, ' : EAP ') !== false) {
            $entry = array(
                'user_id' => '',
                'password' => '',
                'expire' => '',
                'memo' => '',
                'admin' => '',
                'created' => '',
                'updated' => '',
                'raw_line' => $line
            );

            // 사용자 ID와 비밀번호 추출
            $parts = explode(' : EAP ', $line);
            if (count($parts) >= 2) {
                $entry['user_id'] = trim($parts[0]);

                // 비밀번호와 코멘트 분리
                $password_and_comment = $parts[1];
                if (preg_match('/^"([^"]*)"(.*)$/', $password_and_comment, $matches)) {
                    $entry['password'] = $matches[1];
                    $comment_part = trim($matches[2]);

                    // 코멘트에서 정보 추출
                    if (preg_match('/expire:([^|]+)/', $comment_part, $expire_match)) {
                        $entry['expire'] = trim($expire_match[1]);
                    }
                    if (preg_match('/memo:([^|]+)/', $comment_part, $memo_match)) {
                        $entry['memo'] = trim($memo_match[1]);
                    }
                    if (preg_match('/admin:([^|]+)/', $comment_part, $admin_match)) {
                        $entry['admin'] = trim($admin_match[1]);
                    }
                    if (preg_match('/created:([^|]+)/', $comment_part, $created_match)) {
                        $entry['created'] = trim($created_match[1]);
                    }
                    if (preg_match('/updated:([^|]+)/', $comment_part, $updated_match)) {
                        $entry['updated'] = trim($updated_match[1]);
                    }

                    // 구형 포맷 지원 (날짜 | updated/inserted)
                    if (empty($entry['created']) && preg_match('/([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}) \| (updated|inserted)/', $comment_part, $old_match)) {
                        if ($old_match[2] === 'updated') {
                            $entry['updated'] = $old_match[1];
                        } else {
                            $entry['created'] = $old_match[1];
                        }
                    }
                }
            }

            $secrets_data[] = $entry;
        }
    }
    fclose($fp);
}

// 읽어온 파일 내용 출력
echo nl2br(htmlspecialchars($ipsec_secrets));

// 기존 연결을 끊지 않고 strongSwan 사용자 id/passwd(ipsec.secrets) 변경을 반영
exec("/bin/php_my_root /usr/sbin/strongswan rereadsecrets");

// strongSwan에서 ipsec.secrets에 없는 사용자 연결 강제 종료 (swanctl 필요)
$secrets_file = '/etc/strongswan/ipsec.secrets';
$allowed_ids = array();
if (file_exists($secrets_file)) {
    $lines = file($secrets_file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    foreach ($lines as $line) {
        if (strpos($line, ': EAP "') !== false && substr(trim($line), 0, 1) !== '#') {
            $parts = explode(' ', trim($line));
            if (count($parts) > 0) $allowed_ids[] = $parts[0];
        }
    }
}
$allowed_ids = array_unique($allowed_ids);

// 현재 연결된 사용자 상세 정보 추출
exec('/bin/php_my_root /usr/sbin/swanctl --list-sas 2>/dev/null', $sas_output);
$connected_sessions = array();
$current_session = null;

foreach ($sas_output as $line) {
    $line = trim($line);

    // 세션 시작 라인 (예: VPNIKEV2N0001: #1107, ESTABLISHED, IKEv2, ...)
    if (preg_match('/^([^\s:]+):\s+#(\d+),\s+(\w+),\s+(\w+)/', $line, $matches)) {
        // 이전 세션 저장
        if ($current_session && !empty($current_session['remote_id'])) {
            $connected_sessions[] = $current_session;
        }
        // 새 세션 시작
        $current_session = array(
            'session_name' => $matches[1],
            'session_id' => $matches[2],
            'status' => $matches[3],
            'protocol' => $matches[4],
            'remote_id' => '',
            'local_host' => '',
            'remote_host' => '',
            'established' => '',
            'bytes_in' => '',
            'bytes_out' => '',
            'rekey_time' => ''
        );
    }

    if ($current_session) {
        // Remote ID와 클라이언트 IP 추출
        // 패턴: remote 'test3' @ 60.20.10.118[51036] [10.11.12.3]
        if (preg_match("/remote\s+'([^']+)'\s+@\s+([0-9.]+)\[(\d+)\]\s+\[([0-9.]+)\]/", $line, $matches)) {
            $current_session['remote_id'] = trim($matches[1]);
            $current_session['remote_host'] = $matches[2]; // 실제 클라이언트 IP
            // $matches[3]은 포트, $matches[4]는 VPN 내부 IP
        }

        // Local 서버 정보 추출
        // 패턴: local 'vpn.pcdaiso.com' @ 211.192.71.14[4500]
        if (preg_match("/local\s+'([^']+)'\s+@\s+([0-9.]+)\[(\d+)\]/", $line, $matches)) {
            $current_session['local_host'] = $matches[2];
        }

        // 연결 시간 추출
        // 패턴: established 177s ago
        if (preg_match('/established\s+(\d+)s\s+ago/', $line, $matches)) {
            $seconds = (int)$matches[1];
            $hours = floor($seconds / 3600);
            $minutes = floor(($seconds % 3600) / 60);
            $secs = $seconds % 60;
            $current_session['established'] = sprintf("%02d:%02d:%02d", $hours, $minutes, $secs);
        }
    }

    // 데이터 전송량 추출 (별도 라인에서)
    // 패턴: in c8fcffad, 59036 bytes, 600 packets, 37s ago
    if (preg_match('/^\s*in\s+[a-f0-9]+,\s+(\d+)\s+bytes/', $line, $matches)) {
        if ($current_session) {
            $current_session['bytes_in'] = number_format((int)$matches[1]);
        }
    }

    // 패턴: out 447db6fd, 149776 bytes, 451 packets, 37s ago
    if (preg_match('/^\s*out\s+[a-f0-9]+,\s+(\d+)\s+bytes/', $line, $matches)) {
        if ($current_session) {
            $current_session['bytes_out'] = number_format((int)$matches[1]);
        }
    }
}

// 마지막 세션 저장
if ($current_session && !empty($current_session['remote_id'])) {
    $connected_sessions[] = $current_session;
}

// 허용되지 않은 사용자 강제 종료
foreach ($connected_sessions as $session) {
    if (!in_array($session['remote_id'], $allowed_ids)) {
        // swanctl로 해당 세션 종료
        exec("/bin/php_my_root /usr/sbin/swanctl --terminate --ike-id " . escapeshellarg($session['session_id']));
        echo "허용되지 않은 사용자 '{$session['remote_id']}' 연결 종료됨<br>";
    }
}

// JavaScript 함수들 추가
echo "<script>
function confirmAction(action, userId) {
    var messages = {
        'disconnect': '사용자 \"' + userId + '\"의 VPN 연결을 끊으시겠습니까? (10초간 임시 차단됩니다)',
        'disable': '사용자 \"' + userId + '\"의 접근을 제한하시겠습니까? (ipsec.secrets에서 주석 처리됨)',
        'enable': '사용자 \"' + userId + '\"의 접근 제한을 해제하시겠습니까?',
        'delete': '사용자 \"' + userId + '\"를 완전히 삭제하시겠습니까? (복구 불가능)',
        'reset_password': '사용자 \"' + userId + '\"의 비밀번호를 재설정하시겠습니까?',
        'extend_expire': '사용자 \"' + userId + '\"의 만료일을 연장하시겠습니까?'
    };

    if (confirm(messages[action])) {
        var form = document.createElement('form');
        form.method = 'POST';
        form.action = '';

        var actionInput = document.createElement('input');
        actionInput.type = 'hidden';
        actionInput.name = 'user_action';
        actionInput.value = action;

        var userInput = document.createElement('input');
        userInput.type = 'hidden';
        userInput.name = 'target_user_id';
        userInput.value = userId;

        form.appendChild(actionInput);
        form.appendChild(userInput);
        document.body.appendChild(form);
        form.submit();
    }
}

function resetPassword(userId) {
    var newPassword = prompt('사용자 \"' + userId + '\"의 새 비밀번호를 입력하세요 (8자 이상):', '');
    if (newPassword && newPassword.length >= 8) {
        var form = document.createElement('form');
        form.method = 'POST';
        form.action = '';

        var actionInput = document.createElement('input');
        actionInput.type = 'hidden';
        actionInput.name = 'user_action';
        actionInput.value = 'reset_password';

        var userInput = document.createElement('input');
        userInput.type = 'hidden';
        userInput.name = 'target_user_id';
        userInput.value = userId;

        var passwordInput = document.createElement('input');
        passwordInput.type = 'hidden';
        passwordInput.name = 'new_password';
        passwordInput.value = newPassword;

        form.appendChild(actionInput);
        form.appendChild(userInput);
        form.appendChild(passwordInput);
        document.body.appendChild(form);
        form.submit();
    } else if (newPassword !== null) {
        alert('비밀번호는 8자 이상이어야 합니다.');
    }
}

function extendExpire(userId) {
    var days = prompt('몇 일 연장하시겠습니까? (숫자만 입력)', '30');
    if (days && !isNaN(days) && parseInt(days) > 0) {
        var form = document.createElement('form');
        form.method = 'POST';
        form.action = '';

        var actionInput = document.createElement('input');
        actionInput.type = 'hidden';
        actionInput.name = 'user_action';
        actionInput.value = 'extend_expire';

        var userInput = document.createElement('input');
        userInput.type = 'hidden';
        userInput.name = 'target_user_id';
        userInput.value = userId;

        var daysInput = document.createElement('input');
        daysInput.type = 'hidden';
        daysInput.name = 'extend_days';
        daysInput.value = days;

        form.appendChild(actionInput);
        form.appendChild(userInput);
        form.appendChild(daysInput);
        document.body.appendChild(form);
        form.submit();
    }
}

// 페이지 자동 새로고침 (10초마다 - 임시 차단 해제 확인용)
setTimeout(function() {
    location.reload();
}, 10000);
</script>";

// ipsec.secrets 파일 내용을 테이블로 출력
echo "<br><br><strong>ipsec.secrets 파일 내용:</strong><br>";
echo "<table border='1' cellpadding='8' cellspacing='0' style='border-collapse: collapse; width: 100%; margin-bottom: 20px;'>";
echo "<tr style='background-color: #e6f3ff; font-weight: bold;'>";
echo "<th>사용자 ID</th><th>비밀번호</th><th>만료일시</th><th>메모</th><th>관리자</th><th>생성일시</th><th>수정일시</th><th>상태</th><th style='width: 300px;'>관리 기능</th>";
echo "</tr>";

$total_users = 0;
foreach ($secrets_data as $entry) {
    if (!empty($entry['user_id'])) {
        $total_users++;
        $is_system_user = in_array($entry['user_id'], ['TESTONLY']) ? true : false;
        $row_color = $is_system_user ? 'background-color: #f0f0f0;' : '';

        // 만료 상태 확인
        $expire_status = '';
        $expire_color = '';
        if (!empty($entry['expire'])) {
            $expire_time = strtotime($entry['expire']);
            $current_time = time();
            if ($expire_time && $expire_time > $current_time) {
                $expire_status = '유효';
                $expire_color = 'color: green;';
            } else if ($expire_time) {
                $expire_status = '만료';
                $expire_color = 'color: red;';
            } else {
                $expire_status = '무제한';
                $expire_color = 'color: blue;';
            }
        } else {
            $expire_status = '무제한';
            $expire_color = 'color: blue;';
        }

        // 현재 연결 상태 확인
        $is_connected = false;
        foreach ($connected_sessions as $session) {
            if ($session['remote_id'] === $entry['user_id']) {
                $is_connected = true;
                break;
            }
        }

        echo "<tr style='{$row_color}'>";
        echo "<td><strong>" . htmlspecialchars($entry['user_id']) . "</strong></td>";
        echo "<td style='font-family: monospace;'>" . htmlspecialchars($entry['password']) . "</td>";
        echo "<td>" . ($entry['expire'] ? htmlspecialchars($entry['expire']) : '-') . "</td>";
        echo "<td>" . ($entry['memo'] ? htmlspecialchars($entry['memo']) : '-') . "</td>";
        echo "<td>" . ($entry['admin'] ? htmlspecialchars($entry['admin']) : '-') . "</td>";
        echo "<td>" . ($entry['created'] ? htmlspecialchars($entry['created']) : '-') . "</td>";
        echo "<td>" . ($entry['updated'] ? htmlspecialchars($entry['updated']) : '-') . "</td>";
        echo "<td style='text-align: center; font-weight: bold; {$expire_color}'>" . $expire_status . "</td>";

        // 관리 기능 버튼들
        echo "<td style='text-align: center;'>";

        // 시스템 사용자가 아닌 경우에만 관리 기능 제공
        if (!$is_system_user) {
            $user_id_js = htmlspecialchars($entry['user_id']);

            // 연결 상태에 따른 버튼
            if ($is_connected) {
                echo "<button onclick='confirmAction(\"disconnect\", \"$user_id_js\")' style='background-color: #dc3545; color: white; border: none; padding: 3px 8px; margin: 1px; border-radius: 3px; cursor: pointer; font-size: 11px;' title='VPN 연결 끊기 (10초 임시차단)'>연결끊기</button>";
            }

            // 계정 비활성화/활성화
            $is_disabled = (strpos($entry['raw_line'], '#') === 0);
            if ($is_disabled) {
                echo "<button onclick='confirmAction(\"enable\", \"$user_id_js\")' style='background-color: #28a745; color: white; border: none; padding: 3px 8px; margin: 1px; border-radius: 3px; cursor: pointer; font-size: 11px;' title='계정 활성화'>활성화</button>";
            } else {
                echo "<button onclick='confirmAction(\"disable\", \"$user_id_js\")' style='background-color: #ffc107; color: black; border: none; padding: 3px 8px; margin: 1px; border-radius: 3px; cursor: pointer; font-size: 11px;' title='계정 비활성화'>비활성화</button>";
            }

            // 비밀번호 재설정
            echo "<button onclick='resetPassword(\"$user_id_js\")' style='background-color: #17a2b8; color: white; border: none; padding: 3px 8px; margin: 1px; border-radius: 3px; cursor: pointer; font-size: 11px;' title='비밀번호 변경'>비밀번호</button>";

            // 만료일 연장 (만료일이 있는 경우에만)
            if (!empty($entry['expire'])) {
                echo "<button onclick='extendExpire(\"$user_id_js\")' style='background-color: #6f42c1; color: white; border: none; padding: 3px 8px; margin: 1px; border-radius: 3px; cursor: pointer; font-size: 11px;' title='만료일 연장'>연장</button>";
            }

            // 계정 삭제 (위험한 작업이므로 빨간색)
            echo "<button onclick='confirmAction(\"delete\", \"$user_id_js\")' style='background-color: #dc3545; color: white; border: none; padding: 3px 8px; margin: 1px; border-radius: 3px; cursor: pointer; font-size: 11px;' title='계정 완전 삭제'>삭제</button>";
        } else {
            echo "<span style='color: #6c757d; font-size: 11px;'>시스템 계정</span>";
        }

        echo "</td>";
        echo "</tr>";
    }
}

echo "</table>";
echo "<strong>총 등록된 사용자:</strong> {$total_users}개<br>";

// 현재 연결된 사용자 상세 정보 출력
echo "<br><br><strong>현재 연결된 VPN 사용자 상세 정보:</strong><br>";
echo "<table border='1' cellpadding='8' cellspacing='0' style='border-collapse: collapse; width: 100%;'>";
echo "<tr style='background-color: #f0f0f0; font-weight: bold;'>";
echo "<th>사용자 ID</th><th>세션명</th><th>상태</th><th>프로토콜</th><th>클라이언트 IP</th><th>연결시간</th><th>수신량</th><th>송신량</th><th>허용상태</th>";
echo "</tr>";

$total_sessions = 0;
foreach ($connected_sessions as $session) {
    if (!empty($session['remote_id'])) {
        $total_sessions++;
        $is_allowed = in_array($session['remote_id'], $allowed_ids);
        $row_color = $is_allowed ? '' : 'background-color: #ffcccc;'; // 허용되지 않은 사용자는 빨간 배경

        echo "<tr style='{$row_color}'>";
        echo "<td><strong>" . htmlspecialchars($session['remote_id']) . "</strong></td>";
        echo "<td>" . htmlspecialchars($session['session_name']) . "</td>";
        echo "<td>" . htmlspecialchars($session['status']) . "</td>";
        echo "<td>" . htmlspecialchars($session['protocol']) . "</td>";
        echo "<td>" . ($session['remote_host'] ? htmlspecialchars($session['remote_host']) : '정보없음') . "</td>";
        echo "<td>" . ($session['established'] ? $session['established'] : '정보없음') . "</td>";
        echo "<td style='text-align: right;'>" . ($session['bytes_in'] ? $session['bytes_in'] . ' bytes' : '0 bytes') . "</td>";
        echo "<td style='text-align: right;'>" . ($session['bytes_out'] ? $session['bytes_out'] . ' bytes' : '0 bytes') . "</td>";
        echo "<td style='text-align: center; " . ($is_allowed ? "color: green;" : "color: red;") . "'>" . ($is_allowed ? '허용됨' : '차단됨') . "</td>";
        echo "</tr>";
    }
}

echo "</table>";
echo "<br><strong>총 연결 수:</strong> {$total_sessions}개<br>";

// 허용된 사용자 ID 목록 표시
echo "<br><strong>허용된 사용자 ID 목록:</strong><br>";
echo "<div style='background-color: #f9f9f9; padding: 10px; border: 1px solid #ddd;'>";
if (count($allowed_ids) > 0) {
    echo implode(', ', array_map('htmlspecialchars', $allowed_ids));
} else {
    echo "허용된 사용자가 없습니다.";
}
echo "</div><br>";

// 원본 파일 내용도 표시 (접을 수 있는 형태로)
echo "<br><details style='margin-top: 20px;'>";
echo "<summary style='cursor: pointer; font-weight: bold; padding: 10px; background-color: #f5f5f5; border: 1px solid #ddd;'>원본 ipsec.secrets 파일 내용 보기/숨기기</summary>";
echo "<pre style='background-color: #f9f9f9; padding: 15px; border: 1px solid #ddd; margin-top: 10px; font-size: 12px; overflow-x: auto;'>";
echo htmlspecialchars($ipsec_secrets);
echo "</pre>";
echo "</details>";
?>