관리권한 부여 목록에서 최고관리자 전용 메뉴 제외
This commit is contained in:
+105
-1
@@ -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<count($menu_group); $i++) {
|
||||
if (!isset($menu_group[$i]) || !is_array($menu_group[$i])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$sub_menu = isset($menu_group[$i][0]) ? $menu_group[$i][0] : '';
|
||||
if (!$sub_menu || $sub_menu === '-' || substr($sub_menu, -3) === '000') {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (admin_menu_is_super_only($menu_group[$i])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$assignable_auth_menu[$sub_menu] = isset($menu_group[$i][1]) ? $menu_group[$i][1] : '';
|
||||
}
|
||||
}
|
||||
|
||||
return $assignable_auth_menu;
|
||||
}
|
||||
|
||||
// 접근 권한 검사
|
||||
if (!$member['mb_id']) {
|
||||
alert('로그인 하십시오.', G5_BBS_URL . '/login.php?url=' . urlencode(correct_goto_url(G5_ADMIN_URL)));
|
||||
@@ -698,4 +802,4 @@ if (run_replace('safe_admin_add_script_boolean', false) === false) {
|
||||
$config['cf_analytics'] = '';
|
||||
$config['cf_add_script'] = '';
|
||||
$config['cf_add_meta'] = '';
|
||||
}
|
||||
}
|
||||
|
||||
+6
-4
@@ -54,6 +54,8 @@ $listall = '<a href="' . $_SERVER['SCRIPT_NAME'] . '" class="ov_listall btn_ov02
|
||||
$g5['title'] = "관리권한설정";
|
||||
require_once './admin.head.php';
|
||||
|
||||
$assignable_auth_menu = admin_get_assignable_auth_menu();
|
||||
|
||||
$colspan = 5;
|
||||
?>
|
||||
|
||||
@@ -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;
|
||||
<td class="td_auth_mbnick"><?php echo $mb_nick ?></td>
|
||||
<td class="td_menu">
|
||||
<?php echo $row['au_menu'] ?>
|
||||
<?php echo $auth_menu[$row['au_menu']] ?>
|
||||
<?php echo $assignable_auth_menu[$row['au_menu']] ?>
|
||||
</td>
|
||||
<td class="td_auth"><?php echo $row['au_auth'] ?></td>
|
||||
</tr>
|
||||
@@ -205,7 +207,7 @@ echo $pagelist;
|
||||
<select id="au_menu" name="au_menu" required class="required">
|
||||
<option value=''>선택하세요</option>
|
||||
<?php
|
||||
foreach ($auth_menu as $key => $value) {
|
||||
foreach ($assignable_auth_menu as $key => $value) {
|
||||
if (!(substr($key, -3) == '000' || $key == '-' || !$key)) {
|
||||
echo '<option value="' . $key . '">' . $key . ' ' . $value . '</option>';
|
||||
}
|
||||
|
||||
@@ -19,6 +19,11 @@ if (!(isset($mb['mb_id']) && $mb['mb_id'])) {
|
||||
|
||||
check_admin_token();
|
||||
|
||||
$assignable_auth_menu = admin_get_assignable_auth_menu();
|
||||
if (!$au_menu || !isset($assignable_auth_menu[$au_menu])) {
|
||||
alert('해당 메뉴는 관리권한을 부여할 수 없습니다.');
|
||||
}
|
||||
|
||||
require_once G5_CAPTCHA_PATH . '/captcha.lib.php';
|
||||
|
||||
if (!chk_captcha()) {
|
||||
|
||||
Reference in New Issue
Block a user