<?php // (2020.10.4, 차재복, Cha Jae Bok, cjbword@gmailcom)
//** 폴더별 소스 파일 보기 (open_src_dirs.php) **
# 세션 스타트 (매 웹페이지 마다 필요)
session_start();
// 세션 변수에 따른 사용자 타입 설정 ('일반사용자' or '테스트편집자' or '정식편집자' or '종합관리자')
$_SESSION['user_type'] = ( empty($_SESSION['user_name']) ? '일반사용자' : $_SESSION['user_name'] );
# db 접속 (dbi), title (정보통신기술용어해설), html 헤더부 (utf-8 선언), 모바일 셋팅 (viewport)
if ($_REQUEST[bare] != '1') {
include_once "../base_utils/config.php";
} else {
include_once "../base_utils/db_conn.php";
}
# (편집자용) 전달 변수 처리 (choice,dir,filename,comment)
$dir = $_REQUEST[dir];
if (empty($dir)) $dir = 'base_utils';
if (!empty($_REQUEST[choice]) and !empty($_REQUEST[dir]) and !empty($_REQUEST[filename]) and !empty($_REQUEST[comment])
and $_SESSION['user_name'] == '종합관리자') {
// 매개변수 배열화 (디렉토리명,파일명,설명,db명)
$arr_vars = array('dir' => $_REQUEST[dir], 'filename' => $_REQUEST[filename], 'comment' => $_REQUEST[comment],
'dbi' => $dbi);
// 삽입 또는 편집
switch ($_REQUEST[choice]) {
case 'insert' : // 소스 파일 항목 삽입
fileinfo_insert($arr_vars);
break;
case 'update' : // 소스 파일 설명 편집
fileinfo_update($arr_vars);
break;
}
}
// 머리글,바닥글 표출 유무
$bare = $_REQUEST[bare];
# 전체 스타일
echo "<style> * { font-size: 13px; } </style>";
# 상단 제목줄
if (empty($bare)) {
// 상단 제목
$title = '폴더별 소스 목록';
include "../base_utils/top_section.php";
// 구분선
echo "<hr style='clear:both;margin-top:10px;'>";
}
# (test.db.src_files) 쿼리 실행 후 결과를 배열로 저장
$query = "select * from src_files order by dir,filename ";
$result = mysqli_query($dbi, $query);
while ( $matched = mysqli_fetch_assoc($result) ) {
$rows[$matched[dir]][] = $matched;
}
# 폴더별 폼 submit 버튼
// if (empty($bare)) {
echo "<form action='../open_src/".basename($_SERVER['SCRIPT_NAME'])."' method='post'>";
foreach ($rows as $key => $value) {
// 강조체 스타일
$style = ( ($_REQUEST[dir]==$key or (!isset($_REQUEST[dir])) and $key=='base_utils') ? "style='font-weight:bold;'" : "" );
echo "<input type='submit' class='open_dir_btn' name='dir' value='{$key}' {$style}>";
}
echo "</form>";
echo "\n";
# 레코드별로 가져와서 화면에 테이블 형태로 출력함
// table 스타일
echo "<style>
#dir { margin-top:10px; border-collapse:collapse; }
#dir td { border:1px solid gray; font-size:13px; padding:5px;}
#dir form { display:inline-block; margin:0; }
#dir input { width:100px; font-size:13px; }
#dir input[name=comment] { width:300px; }
#dir input[type=submit] { margin:2px; padding:0; width:45px; }
</style>";
echo "\n";
//echo "<pre>";print_r($rows);echo "</pre>";
// table 출력
echo "<table id='dir'>";
$files = $rows[$dir];
$rowspan = count($files)
+ (empty($_SESSION['user_name']) ? 0 : 1); // 편집자이면, insert용 1줄 추가
foreach ($files as $key => $value) {
echo "<tr>";
// 디렉토리
if ($key == 0) {
echo "<td rowspan='{$rowspan}'>";
echo "/".$value[dir]."/";
echo "</td>";
}
// 파일명
echo "<td>";
echo "<a href='../open_src/view_src.php?file={$value[filename]}&dir={$value[dir]}'>";
echo $value[filename];
echo "</a>";
if (!empty($value[run])) echo " <a href='../{$value[dir]}/{$value[filename]}'>실행</a>";
echo "</td>";
// 날짜
echo "<td>";
$style = '';
if (!empty($_SESSION['user_name'])) {
$timestamp = filemtime('../'.$value[dir].'/'.$value[filename]);
if (strtotime($value[date]) < $timestamp) $style = "style='color:red;'";
}
echo "<span $style>".date_format(date_create($value[date]),"Y-m-d")."</span>";
echo "</td>";
// 설명
echo "<td>";
// (일반사용자용)
if (empty($_SESSION['user_name'])) {
echo $value[expr];
// (편집자용)
} else {
// echo "<form id='src_update' action='./".basename($_SERVER['SCRIPT_NAME'])."' method='post'>";
echo "<form action='' method='post' class='src_update'>";
echo "<input type='text' name=comment value='{$value[expr]}'>";
echo "<input type='hidden' name='dir' value='{$value[dir]}'>";
echo "<input type='hidden' name='filename' value='{$value[filename]}'>";
echo "<input type='hidden' name='choice' value='update'>";
echo "<input type='submit' value='update'>";
echo "</form>";
}
echo "</td>";
echo "</tr>";
// 편집자용 1줄
$dbfiles[] = $value[filename];
if ($key==($rowspan-2) and !empty($_SESSION['user_name'])) {
echo "<tr>";
echo "<td colspan=3>";
$dirfiles = array_filter(scandir('../'.$dir), "is_include"); // is_include() : callback 함수
$result_arr = array_diff($dirfiles, $dbfiles);
if (count($result_arr)>0) {
foreach ($result_arr as $name) {
echo "<a href='../open_src/view_src.php?file={$name}&dir={$value[dir]}'>$name</a>";
echo " ";
}
echo "<form action='../open_src/".basename($_SERVER['SCRIPT_NAME'])."' method='post'>";
echo " 파일추가 : 디렉토리 <input type='text' name='dir' value='{$value[dir]}'>, 파일명 <input type='text' name='filename'>, 설명 <input type='text' name='comment'>";
echo "<input type='hidden' name='choice' value='insert'>";
echo "<input type='submit' value='insert'>";
echo "</form>";
}
echo "</td>";
echo "</tr>";
$dbfiles = null;
}
}
echo "</table>";
echo "\n";
# 하단 마무리
if (empty($bare)) {
// 구분선
echo "<hr style='clear:both;'>";
// 저작권
include "../base_utils/copyright.php";
// 소스 개방 메뉴
// include "../open_src/open.php"; // (소스이력 폴더별소스 ... )
// 구분선
echo "<hr>";
}
# 통계처리 요청 (stat_page)
include "../base_utils/stat_utils.php";
html_access('open_src_dirs.php',$dbi);
# test
if ($bare == 1) {
echo "<script type='text/javascript'>
alert('하단 자바스크립트 실행 !!!');
</script>";
}
?>
<?php
function is_include ($str) {
if ($str == '.' or $str == '..' or $str == 'backup' or strpos($str,'.bak')!==false
or strpos($str,'.2nd')!==false or strpos($str,'.src')!==false) return false;
return true;
}
# 소스 파일 항목 삽입
function fileinfo_insert ($arr_vars='') {
if ($_SESSION['user_name'] != '종합관리자') return;
if (empty($arr_vars)) return;
$dbi = $arr_vars[dbi];
// 해킹 방어
$dir = mysqli_real_escape_string($dbi, $arr_vars[dir]);
$filename = mysqli_real_escape_string($dbi, $arr_vars[filename]);
$comment = mysqli_real_escape_string($dbi, $arr_vars[comment]);
$file_pos = '../'.$dir.'/'.$filename;
if (file_exists($file_pos)) {
$timestamp = filemtime($file_pos);
$fdate = date('Y-m-d H:i:s',$timestamp);
} else {
echo "해당 파일({$file_pos})이 존재하지 않는 것 같습니다 !!!";
return;
}
// 신규 번호 찾기
// $query = "select a.fno + 1 as available from src_files a left join src_files b on b.fno = (a.fno + 1)
// where b.fno is null order by a.fno limit 0,1";
$query = "select max(fno) + 1 as available from src_files order by fno";
$result = mysqli_query($dbi,$query);
if (mysqli_errno($dbi)) { echo mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
$matched=mysqli_fetch_assoc($result);
$available = $matched[available];
// 레코드 삽입
$query = "insert src_files
set fno={$available},dir='{$dir}',filename='{$filename}',expr='{$comment}',date='{$fdate}'";
mysqli_query($dbi, $query);
// 성공/실패 결과 리턴
if (mysqli_affected_rows($dbi) > 0) {
echo "insert 성공";
} else {
echo "insert 실패";
}
}
# 소스 파일 설명 편집
function fileinfo_update ($arr_vars='') {
// 편집 권한 체크
if ($_SESSION['user_name'] != '종합관리자') return;
// 디버깅 테스트
// echo "<pre>";print_r($arr_vars);echo "</pre>";
// 전달 변수 체크
if (empty($arr_vars)) {
return;
} else {
// db 선택
$dbi = $arr_vars[dbi];
// 해킹 방어
$dir = mysqli_real_escape_string($dbi, $arr_vars[dir]);
$filename = mysqli_real_escape_string($dbi, $arr_vars[filename]);
$comment = mysqli_real_escape_string($dbi, $arr_vars[comment]);
}
$file_pos = '../'.$dir.'/'.$filename;
if (file_exists($file_pos)) {
// 파일 날짜 추출
$timestamp = filemtime($file_pos);
$fdate = date('Y-m-d H:i:s',$timestamp);
// 파일 내용
$src_code = file_get_contents($file_pos);
$src_code = mysqli_real_escape_string($dbi, $src_code);
} else {
echo "해당 파일({$file_pos})이 존재하지 않는 것 같습니다 !!!";
return;
}
// 레코드 편집
$query = "update src_files
set expr='{$comment}', date='{$fdate}', code='{$src_code}'
where dir='{$dir}' and filename='{$filename}'";
// 디버깅 테스트
// echo $query;
mysqli_query($dbi, $query);
if (mysqli_errno($dbi)) { echo mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
// 성공/실패 결과 리턴
if (mysqli_affected_rows($dbi) > 0) {
echo "<br>update 실행됨<br>";
} else {
echo "<br>update 실행 안됨<br>";
}
}
?>