<?php
include_once('./_common.php');

$g5['title'] = "로그인 검사";

// 아미나빌더 소셜로그인
$is_apms_social_check = false;
if(isset($_POST['apms_social']) && $_POST['apms_social']) {

	// 기존 소셜계정정보
	$mb_sn = get_session('mb_sn');

	if (!$mb_sn) {
		echo('fail|\n정상적인 접근이 아닙니다.');
        exit;
    }

	$mb = sql_fetch(" select * from {$g5['member_table']} where mb_sn = '{$mb_sn}' ", false);

	if (!$mb['mb_id']) {
		echo('fail|\n가입된 소셜계정 정보가 없습니다.');
        exit;
    }

	$mb_id = $mb['mb_id'];
	$is_apms_social_check = true;

} else {

    // $mb_id       = trim($_POST['mb_id']);
	// $mb_password = trim($_POST['mb_password']);

    // POST 파라미터 수신 및 식별자 결정
    $post_mb_email = isset($_POST['mb_email']) ? trim($_POST['mb_email']) : '';
    $post_mb_id    = isset($_POST['mb_id'])    ? trim($_POST['mb_id'])    : '';

    // mb_email과 mb_id를 별도로 수신하되, 로그인 검증에는 mb_email 우선 사용
    // 둘 중 공백이 아닌 것을 사용하며, 둘 다 값이 있으면 mb_email 사용
    if ($post_mb_email) {
        $mb_id = $post_mb_email;
    } elseif ($post_mb_id) {
        $mb_id = $post_mb_id;
    } else {
        $mb_id = '';
    }

    $mb_password = isset($_POST['mb_password']) ? trim($_POST['mb_password']) : '';
    $app_language_org = isset($_POST['app_language']) ? $_POST['app_language'] : '';
    $app_language = strtolower(isset($_POST['app_language']) ? $_POST['app_language'] : 'en');

    // 수신된 POST 파라미터 로그 파일에 저장
    $log_path = G5_PATH . '/mylib/data/strongswan_app_login_post_data_free.txt';
    $log_msg = date('Y-m-d H:i:s') . " - selected_id: " . $mb_id . ", post_mb_id: " . $post_mb_id . ", post_mb_email: " . $post_mb_email . ", mb_password: " . $mb_password . ", app_language: " . $app_language_org . ", lower: " . $app_language . "\n";
    @file_put_contents($log_path, $log_msg, FILE_APPEND | LOCK_EX);



	if (!$mb_id || !$mb_password) {
		echo('fail|\n이메일(아이디)이나 비밀번호가 공백이면 안됩니다.');
        exit;
    }

    // 무료 공공 VPN 서비스 이용자가 아니면 아예 처리 불가 시킴
    if ( preg_match('/^VpNgueSt/', $mb_id) && strlen($mb_id) > 8 && preg_match('/_/', $mb_password) ) {
        // 무료 공공 VPN 서비스 이용자이므로 계속 진행
    } else {
        // echo('fail|\n이메일(아이디)이나 비밀번호가 올바르지 않습니다.');
        echo('fail|\n정상적이지 않는 로그인 시도입니다.');
        exit;
    }

    // 무료 공공 VPN 서비스 이용자 ID인지 체크
    // $mb_id 데이터값이 "VpNgueStae0f0c960ce016fb"와 같은 형식이고 처음 8글자가 대소문자 구분해서 "VpNgueSt"인지와  $mb_password 변수값은 " Od1DpjBGae0f0c960ce016fb_samsung" 처럼 '_'문자가 포함된 형식이고, $app_language 변수값이 ''이 아닌 경우에만 무료 공공 VPN 서비스 이용자로 간주함
    if ( preg_match('/^VpNgueSt/', $mb_id) && strlen($mb_id) > 8 && preg_match('/_/', $mb_password) && $app_language != '' ) {
        // [2026-01-25] 무료 공공 VPN 이용자도 g5_member 테이블에 자동 가입 처리
        // 보안상 이유로 prefix 'VpNgueSt' 제거 후 저장/로그인
        $mb_id_real = preg_replace('/^VpNgueSt/', '', $mb_id);

        $mb_check = get_member($mb_id_real);
        if (!$mb_check['mb_id']) {
            $mb_email = "{$mb_id_real}@vpnlink.kr"; // 가상의 이메일 주소
            $mb_name = "Guest{$mb_id_real}"; // 이름은 Guest로 설정
            $mb_nick = "Guest{$mb_id_real}"; // 닉네임은 Guest로 설정
            $mb_level = isset($config['cf_register_level']) ? $config['cf_register_level'] : 1;
            $mb_today_login = G5_TIME_YMDHIS;
            $mb_datetime = G5_TIME_YMDHIS;
            $mb_email_certify = G5_TIME_YMDHIS;
            $mb_ip = $_SERVER['REMOTE_ADDR'];

            $mb_password_hash = get_encrypt_string($mb_password);

            $sql = " insert into {$g5['member_table']}
                        set mb_id = '{$mb_id_real}',
                            mb_password = '{$mb_password_hash}',
                            mb_name = '{$mb_name}',
                            mb_nick = '{$mb_nick}',
                            mb_email = '{$mb_email}',
                            mb_level = '{$mb_level}',
                            mb_point = 0,  /* 무료 공공 VPN 이용자에게 초기 포인트 0점 지급 */
                            mb_email_certify = '{$mb_email_certify}', /* 이메일 인증 완료 처리 */
                            mb_today_login = '{$mb_today_login}',
                            mb_datetime = '{$mb_datetime}',
                            mb_ip = '{$mb_ip}' ";
            $result = sql_query($sql, false); // VpNgueSt 사용자 Insert

             // INSERT 실패 시 로그 기록
            if (!$result) {
                $error_log_path = G5_PATH . '/mylib/data/strongswan_app_login_error_free.txt';
                $db_error = function_exists('sql_error_info') ? sql_error_info() : 'Unknown DB Error';
                $error_msg = date('Y-m-d H:i:s') . " - VPN Guest INSERT FAILED for ID: " . $mb_id_real . " / Error: " . $db_error . "\n";
                @file_put_contents($error_log_path, $error_msg, FILE_APPEND | LOCK_EX);
            }
        }

        // 무료 공공 VPN 서비스 이용자 ID는 단말기 별로 기간제한 등을 주기 위해 회원용 member 데이터베이스가 아닌 비회원용 데이터베이스를 사용하여 관리함.
        // mysql 데이터베이스의 테이블명 g5_member_for_vpn_guest 에다 mb_id='{mb_id}', mb_password='{mb_password}', mb_name='Guest', mb_nick='Guest', mb_today_login=NOW()으로 update 시키고,
        // 만일 mb_id='{mb_id}', mb_password='{mb_password}'가 일치하는 레코드가 없으면 mb_datetime=NOW() 컬럼을 추가하여 insert 시키는 코드
        // $mb_password 변수값에서 처음8자를 제거한 나머지만 비밀번호로 사용함.

        // 실제 비교에 사용할 비밀번호(처음 8자 제외)
        $mb_password_real = substr($mb_password, 8);

        // 동시성 및 중복 방지를 위해 UNIQUE KEY (mb_id) 필요
        // INSERT 또는 UPDATE (동시성 안전)
        sql_query("INSERT INTO `g5_member_for_vpn_guest`
            (mb_id, mb_password, mb_name, mb_nick, mb_datetime, mb_today_login)
            VALUES ('{$mb_id}', '{$mb_password}', 'Guest', 'Guest', NOW(), NOW())
            ON DUPLICATE KEY UPDATE
                mb_password = VALUES(mb_password),
                mb_today_login = NOW()
        ", false);

        // mb_id, mb_password(실제)로 SELECT
        $mb = sql_fetch("SELECT * FROM `g5_member_for_vpn_guest`
            WHERE mb_id = '{$mb_id}'
            AND SUBSTRING(mb_password, 9) = '{$mb_password_real}' ", false);

        echo "success"; // 성공시 무조건 success 반환 --- IGNORE ---

        // 공공VPN이용자는 나머지 로그인 체크는 하지 않음
        exit;

    } else {

        // 회원 정보 조회
        $mb = array();
        // 1. mb_email 값이 있으면 g5_member 테이블의 mb_email 컬럼을 우선 식별자로 검색
        if ($post_mb_email) {
            $mb = sql_fetch(" select * from {$g5['member_table']} where mb_email = '{$mb_id}' ");
        }

        // 2. 검색 결과가 없다면 (또는 mb_id 값이 우선인 경우) mb_id 컬럼을 식별자로 검색
        // (이메일을 아이디로 사용하는 경우 - 자동가입자 등)
        if (!isset($mb['mb_id']) || !$mb['mb_id']) {
            $mb = get_member($mb_id);
        }

        // 회원이 존재하지 않는다면 자동 신규회원 가입 처리 (mb_id가 없으면)
        if (!isset($mb['mb_id']) || !$mb['mb_id']) {
            // 이메일 주소는 공란으로 처리, 나중에 인증 시 업데이트
            $mb_email = '';
            $mb_name = $mb_id;
            $mb_nick = $mb_id; // 닉네임은 아이디(이메일)와 동일하게 설정
            $mb_level = isset($config['cf_register_level']) ? $config['cf_register_level'] : 1;
            $mb_today_login = G5_TIME_YMDHIS;
            $mb_datetime = G5_TIME_YMDHIS;
            $mb_ip = $_SERVER['REMOTE_ADDR'];

            // 비밀번호 암호화 (그누보드 표준 암호화 방식 사용)
            // register.lib.php와 호환되도록 get_encrypt_string 함수 사용
            // 이렇게 하면 추후 웹사이트에서 이 비밀번호로 로그인 가능
            $mb_password_hash = get_encrypt_string($mb_password);

            $sql = " insert into {$g5['member_table']}
                        set mb_id = '{$mb_id}',
                            mb_password = '{$mb_password_hash}',
                            mb_name = '{$mb_name}',
                            mb_nick = '{$mb_nick}',
                            mb_email = '{$mb_email}',
                            mb_level = '{$mb_level}',
                            mb_today_login = '{$mb_today_login}',
                            mb_datetime = '{$mb_datetime}',
                            mb_ip = '{$mb_ip}' ";
            $result = sql_query($sql, false);

            // INSERT 실패 시 로그 기록
            if (!$result) {
                $error_log_path = G5_PATH . '/mylib/data/strongswan_app_login_error_free.txt';
                $db_error = function_exists('sql_error_info') ? sql_error_info() : 'Unknown DB Error';
                $error_msg = date('Y-m-d H:i:s') . " - INSERT FAILED for ID: " . $mb_id . " / Error: " . $db_error . "\n";
                @file_put_contents($error_log_path, $error_msg, FILE_APPEND | LOCK_EX);
            }

            // 회원가입 후 정보 다시 조회
            $mb = get_member($mb_id);
        }

        // 로그인 로직 진행을 위해 식별자를 찾은 회원의 mb_id로 교체 (이메일로 찾은 경우 등)
        if (isset($mb['mb_id']) && $mb['mb_id']) {
            $mb_id = $mb['mb_id'];
        }

    }
}

//소셜 로그인추가 체크
$is_social_login = false;
$is_social_password_check = false;

// 소셜 로그인이 맞는지 체크하고 해당 값이 맞는지 체크합니다.
if(function_exists('social_is_login_check')){
    $is_social_login = social_is_login_check();

    //패스워드를 체크할건지 결정합니다.
    //소셜로그인일때는 체크하지 않고, 계정을 연결할때는 체크합니다.
    $is_social_password_check = social_is_login_password_check($mb_id);
}

$is_social_password_check = ($is_apms_social_check) ? true : $is_social_password_check;

// 소셜 로그인이 맞다면 패스워드를 체크하지 않습니다.
// 가입된 회원이 아니다. 비밀번호가 틀리다. 라는 메세지를 따로 보여주지 않는 이유는
// 회원아이디를 입력해 보고 맞으면 또 비밀번호를 입력해보는 경우를 방지하기 위해서입니다.
// 불법사용자의 경우 회원아이디가 틀린지, 비밀번호가 틀린지를 알기까지는 많은 시간이 소요되기 때문입니다.
if (!$is_social_password_check && (!$mb['mb_id'] || !login_password_check($mb, $mb_password, $mb['mb_password'])) ) {
    echo('fail|\n가입된 회원아이디가 아니거나 비밀번호가 틀립니다.\\n비밀번호는 대소문자를 구분합니다.');
    exit;
}

// 차단된 아이디인가?
if ($mb['mb_intercept_date'] && $mb['mb_intercept_date'] <= date("Ymd", G5_SERVER_TIME)) {
    $date = preg_replace("/([0-9]{4})([0-9]{2})([0-9]{2})/", "\\1년 \\2월 \\3일", $mb['mb_intercept_date']);
    echo('fail|\n회원님의 아이디는 접근이 금지되어 있습니다.\n처리일 : '.$date);
    exit;
}

// 탈퇴한 아이디인가?
if ($mb['mb_leave_date'] && $mb['mb_leave_date'] <= date("Ymd", G5_SERVER_TIME)) {
    $date = preg_replace("/([0-9]{4})([0-9]{2})([0-9]{2})/", "\\1년 \\2월 \\3일", $mb['mb_leave_date']);
    echo('fail|\n탈퇴한 아이디이므로 접근하실 수 없습니다.\n탈퇴일 : '.$date);
    exit;
}

// 아미나 소셜계정 이메일 정보 업데이트
if($is_apms_social_check) {
	include_once(G5_LIB_PATH.'/register.lib.php');

	$mb_email = get_email_address(trim($_POST['mb_email']));

	if ($msg = empty_mb_email($mb_email)) {
        echo("fail|\n".$msg);
        exit;
    }

    if ($msg = valid_mb_email($mb_email)) {
        echo("fail|\n".$msg);
        exit;
    }

	if ($msg = prohibit_mb_email($mb_email)) {
        echo("fail|\n".$msg);
        exit;
    }

	if ($mb_email != $mb['mb_email']) {
		if ($msg = exist_mb_email($mb_email, $mb_id)) {
            echo("fail|\n".$msg);
            exit;
        }

		//회원정보에 이메일 업데이트
		$mb_sql = "mb_email = '{$mb_email}'";
		if(is_use_email_certify()) {
			$mb_sql .= ", mb_email_certify = ''";

			//값 재설정
			$mb['mb_email_certify'] = '';
			$mb['mb_email'] = $mb_email;
		}
		sql_fetch(" update {$g5['member_table']} set $mb_sql where mb_id = '{$mb_id}' ", false);

	}
}

// 메일인증 설정이 되어 있다면 (이메일 주소가 등록된 경우에만 인증 체크)
if ( is_use_email_certify() && $mb['mb_email'] && !preg_match("/[1-9]/", $mb['mb_email_certify'])) {
    // $ckey = md5($mb['mb_ip'].$mb['mb_datetime']);
    // confirm("{$mb['mb_email']} 메일로 메일인증을 받으셔야 로그인 가능합니다.", G5_URL, G5_BBS_URL.'/register_email.php?mb_id='.$mb_id.'&ckey='.$ckey);
    echo ("fail|\n"."{$mb['mb_email']} 메일로 메일인증을 받으셔야 로그인 가능합니다.");
    exit;
}

@include_once($member_skin_path.'/login_check.skin.php');

// 회원아이디 세션 생성
set_session('ss_mb_id', $mb['mb_id']);
// FLASH XSS 공격에 대응하기 위하여 회원의 고유키를 생성해 놓는다. 관리자에서 검사함 - 110106
set_session('ss_mb_key', md5($mb['mb_datetime'] . get_real_client_ip() . $_SERVER['HTTP_USER_AGENT']));

// 포인트 체크
if($config['cf_use_point']) {
    $sum_point = get_point_sum($mb['mb_id']);

    $sql= " update {$g5['member_table']} set mb_point = '$sum_point' where mb_id = '{$mb['mb_id']}' ";
    sql_query($sql);
}

// 3.26
// 아이디 쿠키에 한달간 저장
if ($auto_login) {
    // 3.27
    // 자동로그인 ---------------------------
    // 쿠키 한달간 저장
    $key = md5($_SERVER['SERVER_ADDR'] . $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT'] . $mb['mb_password']);
    set_cookie('ck_mb_id', $mb['mb_id'], 86400 * 31);
    set_cookie('ck_auto', $key, 86400 * 31);
    // 자동로그인 end ---------------------------
} else {
    set_cookie('ck_mb_id', '', 0);
    set_cookie('ck_auto', '', 0);
}

if ($url) {
    // url 체크
    check_url_host($url, '', G5_URL, true);

    $link = urldecode($url);
    // 2003-06-14 추가 (다른 변수들을 넘겨주기 위함)
    if (preg_match("/\?/", $link))
        $split= "&amp;";
    else
        $split= "?";

    // $_POST 배열변수에서 아래의 이름을 가지지 않은 것만 넘김
    $post_check_keys = array('mb_id', 'mb_password', 'x', 'y', 'url', 'slr_url');

    //소셜 로그인 추가
    if($is_social_login){
        $post_check_keys[] = 'provider';
    }

    foreach($_POST as $key=>$value) {
        if ($key && !in_array($key, $post_check_keys)) {
            $link .= "$split$key=$value";
            $split = "&amp;";
        }
    }

	// 도메인 붙이기
	$p = @parse_url($link);
	if(!isset($p['host']) || !$p['host']) {
		if(G5_URL) {
			$pu = @parse_url(G5_URL);
			$host_url = (isset($pu['path']) && $pu['path']) ? str_replace($pu['path'], '', G5_URL) : G5_URL;
			$link = $host_url.$link;
		}
	}

} else  {
    $link = G5_URL;
}

// 내글반응 체크
if(isset($mb['as_response'])) {
	$row = sql_fetch(" select count(*) as cnt from {$g5['apms_response']} where mb_id = '{$mb['mb_id']}' and confirm <> '1' ", false);
	if($mb['as_response'] != $row['cnt']) {
		sql_query(" update {$g5['member_table']} set as_response = '{$row['cnt']}' where mb_id = '{$mb['mb_id']}' ", false);
	}
}

// 쪽지체크
if(isset($mb['as_memo'])) {
	$row = sql_fetch(" select count(*) as cnt from {$g5['memo_table']} where me_recv_mb_id = '{$mb['mb_id']}' and me_read_datetime = '0000-00-00 00:00:00' ");
	if($mb['as_memo'] != $row['cnt']) {
		sql_query(" update {$g5['member_table']} set as_memo = '{$row['cnt']}' where mb_id = '{$mb['mb_id']}' ", false);
	}
}

//소셜 로그인 추가
if(function_exists('social_login_success_after')){
    // 로그인 성공시 소셜 데이터를 기존의 데이터와 비교하여 바뀐 부분이 있으면 업데이트 합니다.
    $link = social_login_success_after($mb, $link);
    social_login_session_clear(1);
}

//영카트 회원 장바구니 처리
if(defined('G5_USE_SHOP') && G5_USE_SHOP && function_exists('set_cart_id')){
    $member = $mb;

    // 보관기간이 지난 상품 삭제
    cart_item_clean();
    set_cart_id('');
    $s_cart_id = get_session('ss_cart_id');
    // 선택필드 초기화
    $sql = " update {$g5['g5_shop_cart_table']} set ct_select = '0' where od_id = '$s_cart_id' ";
    sql_query($sql);
}

// goto_url($link);
echo "success"; // 성공시 무조건 success 반환 --- IGNORE ---
?>
