001002003004005006007008009010011012013014015016017018019020021022023024025026027028029030031032033034035036037038039040041042043044045046047048049050051052053054055056057058059060061062063064065066067068069070071072073074075076077078079080081082083084085086087088089090091092093094095096097098099100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
<?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>"; } } ?>