From 33416852fc1511c93472086b12824c8a931c487e Mon Sep 17 00:00:00 2001 From: thisgun Date: Tue, 9 Jun 2026 01:34:33 +0000 Subject: [PATCH 1/3] =?UTF-8?q?=EB=82=98=EC=9D=B4=EC=8A=A4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=20=EA=B0=80=EC=83=81=EA=B3=84=EC=A2=8C=20=EC=B1=84?= =?UTF-8?q?=EB=B2=88=20=EC=8B=9C=20od=5Fapp=5Fno=20=EB=88=84=EB=9D=BD=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 가상계좌(4100) 채번 시 od_app_no가 빈 AuthCode로 남아 입금통보 매칭(od_app_no = VbankNum)이 실패하던 문제 수정 Co-Authored-By: Claude Opus 4.8 --- shop/nicepay/nicepay_result.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shop/nicepay/nicepay_result.php b/shop/nicepay/nicepay_result.php index bd78ed89a..5c47d5015 100644 --- a/shop/nicepay/nicepay_result.php +++ b/shop/nicepay/nicepay_result.php @@ -137,7 +137,7 @@ if($authResultCode === "0000"){ $bank_name = $bankname = nicepay_res('VbankBankName', $respArr); $account = nicepay_res('VbankNum', $respArr); $va_date = nicepay_res('VbankExpDate', $respArr).' '.nicepay_res('VbankExpTime', $respArr); // 가상계좌 입금마감시간 - $app_no = nicepay_res('VbankNum', $respArr); + $od_app_no = $app_no = nicepay_res('VbankNum', $respArr); // 입금통보 매칭을 위해 가상계좌번호를 보관 if ($default['de_escrow_use'] == 1) $escw_yn = 'Y'; From 77835010dff8095a332f03539ecba50e1a932ccf Mon Sep 17 00:00:00 2001 From: thisgun Date: Tue, 9 Jun 2026 02:26:01 +0000 Subject: [PATCH 2/3] =?UTF-8?q?=EB=A9=94=EC=9D=BC=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EB=B0=9C=EC=86=A1=20=EC=95=88=EB=82=B4=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- adm/sendmail_test.php | 80 ++++++++++++++++++++++++++++++------------- 1 file changed, 56 insertions(+), 24 deletions(-) diff --git a/adm/sendmail_test.php b/adm/sendmail_test.php index 0332d43bd..1768a91db 100644 --- a/adm/sendmail_test.php +++ b/adm/sendmail_test.php @@ -20,33 +20,65 @@ if (isset($_POST['email'])) { $_POST['email'] = strip_tags($_POST['email']); $email = explode(',', $_POST['email']); - $real_email = array(); + $sent_email = array(); // 발송 요청 성공 + $failed_email = array(); // 발송 실패 (메일 서버에서 거부/오류) for ($i=0; $i[메일검사] 내용

이 내용이 제대로 보인다면 보내는 메일 서버에는 이상이 없는것입니다.

'.G5_TIME_YMDHIS.'

이 메일 주소로는 회신되지 않습니다.', 1); + + $to = trim($email[$i]); + $send_result = mailer($config['cf_admin_email_name'], $config['cf_admin_email'], $to, '[메일검사] 제목', '[메일검사] 내용

이 내용이 제대로 보인다면 보내는 메일 서버에는 이상이 없는것입니다.

'.G5_TIME_YMDHIS.'

이 메일 주소로는 회신되지 않습니다.', 1); + + if ($send_result) { + $sent_email[] = $to; + } else { + $failed_email[] = $to; + } } - if( $real_email ){ + if( $sent_email || $failed_email ){ echo '

'; - echo '

결과메세지

'; - echo '

'; - echo '다음 '.count($real_email).'개의 메일 주소로 테스트 메일 발송이 완료되었습니다.'; - echo '

'; - echo '
    '; - for ($i=0;$i'.$real_email[$i].''; + echo '

    결과 메시지

    '; + + if( $sent_email ){ + echo '

    '; + echo '다음 '.count($sent_email).'개의 메일 주소로 테스트 메일 발송 요청이 성공했습니다. 수신함 도착 여부는 별도 확인이 필요합니다.'; + echo '

    '; + echo '
      '; + for ($i=0;$i'.get_text($sent_email[$i]).''; + } + echo '
    '; + echo '

    '; + echo '발송 요청 성공은 사이트가 메일 서버에 메일을 넘겼다는 의미이며, 받은편지함 도착을 보장하지는 않습니다.
    '; + echo '메일이 보이지 않는다면 아래 항목을 순서대로 확인해 주십시오.'; + echo '

    '; + echo '
      '; + echo '
    1. 받은편지함뿐 아니라 스팸함, 정크메일함, 프로모션함을 확인합니다.
    2. '; + echo '
    3. 네이버, 지메일, 회사메일 등 서로 다른 메일 주소로 다시 테스트합니다.
    4. '; + echo '
    5. 관리자 메일 주소가 사이트 도메인과 같은지 확인합니다. 도메인이 다르면 스팸으로 분류될 가능성이 높습니다.
    6. '; + echo '
    7. 도메인 메일을 사용한다면 SPF, DKIM, DMARC 설정을 확인합니다.
    8. '; + echo '
    9. 계속 도착하지 않으면 서버 개발자에게 메일 발송 로그를 확인해주세요.
    10. '; + echo '
    '; } - echo '
'; - echo '

'; - echo '해당 주소로 테스트 메일이 도착했는지 확인해 주십시오.
'; - echo '만약, 테스트 메일이 오지 않는다면 더 다양한 계정의 메일 주소로 메일을 보내 보십시오.
'; - echo '그래도 메일이 하나도 도착하지 않는다면 메일 서버(sendmail server)의 오류일 가능성이 높으니, 웹 서버관리자에게 문의하여 주십시오.
'; - echo '도메인을 소유하고 있을시 SPF, DKIM 설정이 필요할수 있습니다.
'; - echo '

'; + + if( $failed_email ){ + echo '

'; + echo '다음 '.count($failed_email).'개의 메일 주소는 발송에 실패했습니다.'; + echo '

'; + echo '
    '; + for ($i=0;$i'.get_text($failed_email[$i]).''; + } + echo '
'; + echo '

'; + echo '발송 실패는 받는 사람의 문제가 아니라 보내는 서버(메일 발송) 설정 문제일 가능성이 높습니다.
'; + echo 'SMTP 정보(주소/포트/인증)가 올바른지, 서버에서 메일 발송(sendmail/mail 함수)이 허용되어 있는지 확인하시고, 웹 서버 관리자(호스팅 업체)에게 문의해 주십시오.
'; + echo '자세한 오류 내용은 서버의 PHP error_log 에 기록됩니다.
'; + echo '

'; + } + echo '
'; } } @@ -56,11 +88,11 @@ if (isset($_POST['email'])) {

테스트 메일 발송

- 메일서버가 정상적으로 동작 중인지 확인할 수 있습니다.
+ 사이트에서 메일 서버로 메일을 전달할 수 있는지 확인합니다. 이 테스트는 받은편지함 도착을 보장하지 않습니다.
아래 입력칸에 테스트 메일을 발송하실 메일 주소를 입력하시면, [메일검사] 라는 제목으로 테스트 메일을 발송합니다.
보내는 메일주소 :
- 기본환경설정에서 관리자 메일 주소를 name'.domain_mail_host().' 과 같은 도메인 형식으로 설정할것을 권장합니다.'; ?> + 외부메일설정이나 기타 설정을 하지 않았다면, 기본환경설정에서 관리자 메일 주소를 name'.domain_mail_host().' 과 같은 도메인 형식으로 설정할것을 권장합니다.'; ?>

@@ -75,11 +107,11 @@ if (isset($_POST['email'])) {

- 만약 [메일검사] 라는 내용으로 테스트 메일이 도착하지 않는다면 보내는 메일서버 혹은 받는 메일서버 중 문제가 발생했을 가능성이 있습니다.
- 따라서 보다 정확한 테스트를 원하신다면 여러 곳으로 테스트 메일을 발송하시기 바랍니다.
+ 테스트 결과가 발송 요청 성공으로 표시되어도 수신 메일 서버의 스팸 정책에 따라 도착하지 않을 수 있습니다.
+ 정확한 확인을 위해 여러 메일 서비스로 테스트하고, 도착하지 않으면 스팸함과 도메인 인증(SPF, DKIM, DMARC)을 확인해 주십시오.

Date: Tue, 9 Jun 2026 02:26:01 +0000 Subject: [PATCH 3/3] =?UTF-8?q?=EA=B4=80=EB=A6=AC=EA=B6=8C=ED=95=9C=20?= =?UTF-8?q?=EB=B6=80=EC=97=AC=20=EB=AA=A9=EB=A1=9D=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=B5=9C=EA=B3=A0=EA=B4=80=EB=A6=AC=EC=9E=90=20=EC=A0=84?= =?UTF-8?q?=EC=9A=A9=20=EB=A9=94=EB=89=B4=20=EC=A0=9C=EC=99=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- adm/admin.lib.php | 106 +++++++++++++++++++++++++++++++++++++++++++- adm/auth_list.php | 10 +++-- adm/auth_update.php | 5 +++ 3 files changed, 116 insertions(+), 5 deletions(-) diff --git a/adm/admin.lib.php b/adm/admin.lib.php index ff2b9766c..1d2d70a97 100644 --- a/adm/admin.lib.php +++ b/adm/admin.lib.php @@ -610,6 +610,110 @@ function admin_menu_find_by($call, $search_key) return ''; } +function admin_menu_local_path($url) +{ + $url = (string) $url; + + if (!$url) { + return ''; + } + + $url = preg_replace('/[?#].*$/', '', $url); + + $maps = array( + G5_ADMIN_URL => G5_ADMIN_PATH, + ); + + if (defined('G5_SMS5_ADMIN_URL') && defined('G5_SMS5_ADMIN_PATH')) { + $maps[G5_SMS5_ADMIN_URL] = G5_SMS5_ADMIN_PATH; + } + + foreach ($maps as $base_url => $base_path) { + if (strpos($url, $base_url) !== 0) { + continue; + } + + $path = $base_path.substr($url, strlen($base_url)); + + if (substr($path, -1) === '/') { + $path .= 'index.php'; + } + + return $path; + } + + return ''; +} + +function admin_menu_is_super_only($menu_item) +{ + static $cache = array(); + + $sub_menu = isset($menu_item[0]) ? (string) $menu_item[0] : ''; + if (!$sub_menu) { + return false; + } + + if (isset($cache[$sub_menu])) { + return $cache[$sub_menu]; + } + + // 향후 메뉴 정의에서 명시적으로 최고관리자 전용 표시가 필요할 때 사용한다. + if (isset($menu_item[4]) && $menu_item[4] === 'super') { + return $cache[$sub_menu] = true; + } + + $path = admin_menu_local_path(isset($menu_item[2]) ? $menu_item[2] : ''); + if (!$path || !is_readable($path)) { + return $cache[$sub_menu] = false; + } + + $content = file_get_contents($path, false, null, 0, 12000); + if ($content === false) { + return $cache[$sub_menu] = false; + } + + $pattern = '/if\s*\([^\)]*\$is_admin\s*(?:!==|!=)\s*[\'"]super[\'"][^\)]*\)\s*\{?[\s\S]{0,250}(?:alert|alert_close|die)\s*\([^\;]*(?:최고관리자만|최고관리자로)/u'; + + return $cache[$sub_menu] = (bool) preg_match($pattern, $content); +} + +function admin_get_assignable_auth_menu() +{ + global $menu; + + $assignable_auth_menu = array(); + + if (!isset($menu) || !is_array($menu)) { + return $assignable_auth_menu; + } + + foreach ($menu as $menu_group) { + if (!is_array($menu_group)) { + continue; + } + + for ($i=1; $i @@ -105,8 +107,8 @@ $colspan = 5; $is_continue = true; } - // 메뉴번호가 바뀌는 경우에 현재 없는 저장된 메뉴는 삭제함 - if (!isset($auth_menu[$row['au_menu']])) { + // 메뉴번호가 바뀌거나 권한 부여 대상이 아닌 메뉴는 삭제함 + if (!isset($assignable_auth_menu[$row['au_menu']])) { sql_query(" delete from {$g5['auth_table']} where au_menu = '{$row['au_menu']}' "); $is_continue = true; } @@ -130,7 +132,7 @@ $colspan = 5; - + @@ -205,7 +207,7 @@ echo $pagelist;