<?php
include $_SERVER['DOCUMENT_ROOT']."/MyAdmin_config/MyAdminConfig.php";

$server_name = addslashes(trim($_POST['server_name']));
$vpn_user_id = addslashes(trim($_POST['vpn_user_id']));
$vpn_user_pwd = addslashes(trim($_POST['vpn_user_pwd']));
// 입력값이 "2020-11-27T23:59" 또는 "2020-11-27T23:59:59"로 들어오도록
$member_id_expire_tmp = addslashes(trim($_POST['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($_POST['member_memo']));
$process_type = addslashes(trim($_POST['process_type']));
$admin_id = addslashes(trim($_POST['admin_id']));
$admin_pwd = addslashes(trim($_POST['admin_pwd']));

switch ($process_type) {
	case "수정":
	case "변경":
		if ($server_name=="" || $vpn_user_id=="" || $process_type=="" || $admin_id=="" || $admin_pwd=="" || $member_id_expire=="") {
			exit;
		}
		break;
	case "등록":
	case "추가":
		if (strtolower($vpn_user_id) == "admin" || strtolower($vpn_user_id) == "administrator" || strtolower($vpn_user_id) == "root") {
			echo "FAIL|<span style='color:orangered;'>아이디 '".$vpn_user_id."'는 추가하실 수 없습니다.</span>";
			exit; // 관리자 아이디는 추가 할수 없음
		}
		break;

	case "삭제":
		if (strtolower($vpn_user_id) == "admin" || strtolower($vpn_user_id) == "administrator" || strtolower($vpn_user_id) == "root") {
			echo "FAIL|<span style='color:orangered;'>아이디 '".$vpn_user_id."'는 삭제하실 수 없습니다.</span>";
			exit; // 관리자 아이디는 삭제 할수 없음
		}
		break;

	default:
		echo "FAIL|<span style='color:orangered;'>process_type = ".$process_type."는 처리할 수 없습니다.</span>";
		// if ($server_name=="" || $vpn_user_id=="" || $vpn_user_pwd=="" || $process_type=="" || $admin_id=="" || $admin_pwd=="" || $member_id_expire=="") {
		// 	exit;
		// }
		exit; // 조건에 맞지 않는 요청이므로 중단 시킴 (비정상적인 경로로 시도하는 것임)
}



/////////////////// 관리자 아이디와 비번이 일치하는 지 확인 [[
// 관리자 비번으로 체크하는 방법은 보안상 위험하므로 AdminPasswdCreate(8, $memid . $salt) 와 AdminPasswdVerify($admin_pwd, 8, $salt)으로 대체함
$salt = date('Ymd');
if (AdminPasswdVerify($admin_pwd, 8, $salt) == true) {
	echo "FAIL|비정상적인 접근입니다.";
	exit; // 관리자 아이디와 비번이 일치하지 않을때
} else {
	$sql = " SELECT * FROM vpnid WHERE server_name='$HTTP_HOST' AND vpn_user_id='$admin_id' AND ( is_admin IS NOT NULL OR is_admin!='' ) ";
}
$result = $db->query($sql);
$total=mysqli_num_rows($result);

if ($total != 1) {
	echo "FAIL|<span style='color:orangered;'>관리자 정보 불일치! 올바른 관리자 아이디와 암호를 입력해 주세요.</span>";
	exit; // 관리자 아이디와 비번이 일치하지 않거나 관리자 아이디가 아닐때
}
/////////////////// 관리자 아이디와 비번이 일치하는 지 확인 ]]


switch ($process_type) {
	case "등록":
	case "추가":
		/////////////////// 멤버 아이디가 이미 존재하는 지 확인 [[
		unset($sql); unset($result); unset($total);
		$sql = " SELECT * FROM vpnid WHERE server_name='$HTTP_HOST' AND vpn_user_id='$vpn_user_id' ";
		$result = $db->query($sql);
		$total=mysqli_num_rows($result);

		if ($total == 1) {
			echo "FAIL|<span style='color:orangered;'>".$vpn_user_id."는 이미 존재하는 아이디이므로 중복 둥록하실 수 없습니다.</span>";
			exit; // 조건에 맞지 않는 요청이므로 중단 시킴 (비정상적인 경로로 시도하는 것임)
		} else {
			/////////////////// DB에 저장 [[
			$DATETIME = date("Y-m-d H:i:s");
			$IP = $_SERVER['REMOTE_ADDR'];
			$DEVICE = $_SERVER['HTTP_USER_AGENT'];

			$query = " INSERT vpnid SET
				datetime='$DATETIME',
				update_datetime='$DATETIME',
				ip='$IP',
				device='$DEVICE',
				server_name='$server_name',
				vpn_user_id='$vpn_user_id',
				vpn_user_pwd='$vpn_user_pwd',
				member_id_expire='$member_id_expire',
				member_memo='$member_memo',
				admin_id='$admin_id',
				admin_pwd='$admin_pwd'
				";
			unset($QueryResult);
			$QueryResult = mysqli_query($db,$query);

			$query = " INSERT vpnid_log SET
				datetime='$DATETIME',
				update_datetime='$DATETIME',
				ip='$IP',
				device='$DEVICE',
				server_name='$server_name',
				vpn_user_id='$vpn_user_id',
				vpn_user_pwd='$vpn_user_pwd',
				member_id_expire='$member_id_expire',
				member_memo='$member_memo',
				process_type='$process_type',
				admin_id='$admin_id',
				admin_pwd='$admin_pwd'
				";
			unset($QueryResult);
			$QueryResult = mysqli_query($db,$query);
			/////////////////// DB에 저장 ]]
			if ($QueryResult) {
				echo "SUCCESS|새로운 아이디 '".$vpn_user_id."'가 정상적으로 추가되었습니다.<br>입력하신 이메일(아이디)의 받은 편지함에서 VPN접속정보를 확인하십시오.";
			} else {
				echo "FAIL|<span style='color:orangered;'>아이디 '".$vpn_user_id."'를 추가하지 못하였습니다. 만일 오류라고 판단되는 경우 관리자에게 알려 주세요.</span>";
			}
		}
		/////////////////// 관리자 아이디와 비번이 일치하는 지 확인 ]]
		break;

	case "수정":
	case "변경":
		/////////////////// 멤버 아이디가 이미 존재하는 지 확인 [[
		unset($sql); unset($result); unset($total);
		$sql = " SELECT * FROM vpnid WHERE server_name='$HTTP_HOST' AND vpn_user_id='$vpn_user_id' ";
		$result = $db->query($sql);
		$total=mysqli_num_rows($result);

		if ($total == 1) {
			/////////////////// DB에 저장 [[
			$DATETIME = date("Y-m-d H:i:s");
			$IP = $_SERVER['REMOTE_ADDR'];
			$DEVICE = $_SERVER['HTTP_USER_AGENT'];

			if ($vpn_user_pwd == "") {
				$query = " UPDATE vpnid SET
					update_datetime='$DATETIME',
					vpn_user_id='$vpn_user_id',
					member_id_expire='$member_id_expire',
					member_memo='$member_memo'
					WHERE server_name='$HTTP_HOST' AND vpn_user_id='$vpn_user_id'
					";
			} else {
				$query = " UPDATE vpnid SET
					update_datetime='$DATETIME',
					vpn_user_id='$vpn_user_id',
					vpn_user_pwd='$vpn_user_pwd',
					member_id_expire='$member_id_expire',
					member_memo='$member_memo'
					WHERE server_name='$HTTP_HOST' AND vpn_user_id='$vpn_user_id'
					";
			}
			unset($QueryResult);
			$QueryResult = mysqli_query($db,$query);

			$query = " INSERT vpnid_log SET
				datetime='$DATETIME',
				update_datetime='$DATETIME',
				ip='$IP',
				device='$DEVICE',
				server_name='$server_name',
				vpn_user_id='$vpn_user_id',
				vpn_user_pwd='$vpn_user_pwd',
				member_id_expire='$member_id_expire',
				member_memo='$member_memo',
				process_type='$process_type',
				admin_id='$admin_id',
				admin_pwd='$admin_pwd'
				";
			unset($QueryResult);
			$QueryResult = mysqli_query($db,$query);
			/////////////////// DB에 저장 ]]
			if ($QueryResult) {
				if ($vpn_user_pwd == "") {
					echo "SUCCESS|아이디 '".$vpn_user_id."'의 정보를 정상적으로 변경하였습니다.";
				} else if ($vpn_user_pwd != "" && $member_memo != "") {
					echo "SUCCESS|아이디 '".$vpn_user_id."'의 정보를 정상적으로 변경하였습니다.";
				} else if ($vpn_user_pwd != "") {
					echo "SUCCESS|아이디 '".$vpn_user_id."'의 정보를 정상적으로 변경하였습니다.";
				}
			} else {
				echo "FAIL|<span style='color:orangered;'>아이디 '".$vpn_user_id."'의 암호변경 실패! 만일 오류라고 판단되는 경우 관리자에게 알려 주세요.</span>";
			}
		} else {
			echo "FAIL|<span style='color:orangered;'>'".$vpn_user_id."'는 존재하지 않는 아이디이므로 암호변경이 되지 않습니다.</span>";
			exit; // 조건에 맞지 않는 요청이므로 중단 시킴 (비정상적인 경로로 시도하는 것임)
		}
		/////////////////// 관리자 아이디와 비번이 일치하는 지 확인 ]]
		break;

	case "삭제":
		/////////////////// 멤버 아이디가 이미 존재하는 지 확인 [[
		unset($sql); unset($result); unset($total);
		$sql = " SELECT * FROM vpnid WHERE server_name='$HTTP_HOST' AND vpn_user_id='$vpn_user_id' AND ( is_admin IS NOT NULL OR is_admin!='' ) ";
		$result = $db->query($sql);
		$total=mysqli_num_rows($result);
		if ($total > 0) {
			echo "FAIL|<span style='color:orangered;'>아이디 '".$vpn_user_id."'는 관리자 아이디이므로 삭제하실 수 없습니다.</span>";
			exit;
		}

		unset($sql); unset($result); unset($total);
		$sql = " SELECT * FROM vpnid WHERE server_name='$HTTP_HOST' AND vpn_user_id='$vpn_user_id' AND ( is_admin IS NULL OR is_admin='' ) ";
		$result = $db->query($sql);
		$total=mysqli_num_rows($result);


		if ($total == 1) {
			/////////////////// DB에 저장 [[
			$DATETIME = date("Y-m-d H:i:s");
			$IP = $_SERVER['REMOTE_ADDR'];
			$DEVICE = $_SERVER['HTTP_USER_AGENT'];

			$query = " DELETE FROM vpnid WHERE server_name='$HTTP_HOST' AND vpn_user_id='$vpn_user_id' ";
			unset($QueryResult);
			$QueryResult = mysqli_query($db,$query);

			$query = " INSERT vpnid_log SET
				datetime='$DATETIME',
				update_datetime='$DATETIME',
				ip='$IP',
				device='$DEVICE',
				server_name='$server_name',
				vpn_user_id='$vpn_user_id',
				vpn_user_pwd='$vpn_user_pwd',
				member_id_expire='$member_id_expire',
				member_memo='$member_memo',
				process_type='$process_type',
				admin_id='$admin_id',
				admin_pwd='$admin_pwd'
				";
			unset($QueryResult);
			$QueryResult = mysqli_query($db,$query);
			/////////////////// DB에 저장 ]]
			if ($QueryResult) {
				echo "SUCCESS|아이디 '".$vpn_user_id."'가 삭제 되었습니다.";
			} else {
				echo "FAIL|<span style='color:orangered;'>아이디 '".$vpn_user_id."' 삭제 실패! 만일 오류라고 판단되는 경우 관리자에게 알려 주세요.</span>";
			}
		} else {
			echo "FAIL|<span style='color:orangered;'>".$vpn_user_id."는 존재하지 않는 아이디이므로 삭제하실 수 없습니다.</span>";
			exit; // 조건에 맞지 않는 요청이므로 중단 시킴 (비정상적인 경로로 시도하는 것임)
		}
		break;

	default:
		exit;
}




///// 시크릿 파일 생성용 [[
$LINUX_LINEFEED_CHAR = chr(13).chr(10);
$ipsec_secrets = "";

unset($query); unset($result); unset($total); unset($row);
$query = " SELECT * FROM vpnid WHERE server_name='$HTTP_HOST' ORDER BY no ASC ";
$result = $db->query($query);
$total = mysqli_num_rows($result);
if ($total > 0) {
	while( $row = mysqli_fetch_array($result) ) {
		$ipsec_secrets = $ipsec_secrets . $row['vpn_user_id'] . " : EAP \"" . $row['vpn_user_pwd'] . "\"" . $LINUX_LINEFEED_CHAR;
	}
}






///// 테스트용 아이디 디폴트 [[
$IPSEC_SECRETS_HEAD_TEXT = '# ipsec.secrets - strongSwan IPsec secrets file' . $LINUX_LINEFEED_CHAR . ': RSA "privkey.pem"' . $LINUX_LINEFEED_CHAR;
$IPSEC_SECRETS_TESTID_TEXT = "TESTONLY : EAP \"AaeonwgYITG4hJfb\"" . $LINUX_LINEFEED_CHAR;
$IPSEC_SECRETS_ALL_TEXT = $IPSEC_SECRETS_HEAD_TEXT . $IPSEC_SECRETS_TESTID_TEXT . $ipsec_secrets;
///// 테스트용 아이디 디폴트 ]]

$fp = fopen("/etc/strongswan/ipsec.secrets" , "w");
fwrite($fp,$IPSEC_SECRETS_ALL_TEXT,strlen($IPSEC_SECRETS_ALL_TEXT));
fclose($fp);

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

// strongSwan에서 ipsec.secrets에 없는 사용자 연결 강제 종료 (swanctl 필요)
$secrets_file = '/etc/strongswan/ipsec.secrets';
$allowed_ids = [];
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);

// 현재 연결된 사용자 ID 목록 추출 (remote 'ID' 사용)
// exec('/var/www/html/Admin/php_my_root /usr/sbin/swanctl --list-sas 2>/dev/null', $sas_output);
// $connected_ids = [];
// foreach ($sas_output as $line) {
// 	if (preg_match("/remote '([^']+)'/", $line, $m)) {
// 		$connected_ids[] = trim($m[1]);
// 	}
// }
// $connected_ids = array_unique($connected_ids);

// // 연결 중이지만 허용되지 않은 ID의 세션 종료 (세션 블록 단위로 정확히 매칭)
// $blocks = [];
// $block = [];
// foreach ($sas_output as $line) {
//     // 블록 시작: "VPNIKEV2N0001: #261, ESTABLISHED, IKEv2, ..."
//     if (preg_match('/^([^\s:]+):\s+#(\d+),/', $line, $m)) {
//         if (!empty($block)) {
//             $blocks[] = $block;
//         }
//         $block = ['sa_num' => $m[2], 'lines' => []];
//     }
//     if (!empty($block)) {
//         $block['lines'][] = $line;
//     }
// }
// if (!empty($block)) {
//     $blocks[] = $block;
// }

// foreach ($blocks as $block) {
//     $sa_num = $block['sa_num'];
//     $remote_id = null;
//     foreach ($block['lines'] as $line) {
//         if (preg_match("/remote '([^']+)'/", $line, $m)) {
//             $remote_id = trim($m[1]);
//             break;
//         }
//     }
//     if ($remote_id && !in_array($remote_id, $allowed_ids)) {
//         exec('/var/www/html/Admin/php_my_root /usr/sbin/swanctl --terminate --ike-id ' . escapeshellarg($sa_num));
//     }
// }




///// 시크릿 파일 생성용 ]]



// 메일 발송 [[
if ($QueryResult) {
//	echo "SUCCESS|";
	// require $server_root_path."/Admin/submit_process/sendmail.php";
} else {
//	echo "FAIL|";
}
// 메일 발송 ]]

?>
