From ea2fede30ef598a8f1cf3fadb21d15ea3d46b63f Mon Sep 17 00:00:00 2001 From: zero Date: Wed, 18 Jun 2008 06:56:29 +0000 Subject: [PATCH] =?UTF-8?q?#472=20=EC=84=B8=EC=85=98=EC=9D=84=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=EA=B8=B0=EB=B0=98=EC=9D=B4=20=EC=95=84=EB=8B=8C=20DB?= =?UTF-8?q?=EA=B8=B0=EB=B0=98=EC=9C=BC=EB=A1=9C=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD=ED=95=98?= =?UTF-8?q?=EA=B3=A0=20=EC=A0=91=EC=86=8D=EC=9E=90=20=EC=B6=9C=EB=A0=A5=20?= =?UTF-8?q?=EC=9C=84=EC=A0=AF=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@4290 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/context/Context.class.php | 28 ++++-- classes/db/DB.class.php | 34 ++++--- classes/db/DBCubrid.class.php | 2 +- classes/db/DBFirebird.class.php | 2 +- classes/db/DBMysql.class.php | 2 +- classes/db/DBMysql_innodb.class.php | 2 +- classes/db/DBPostgresql.class.php | 2 +- classes/db/DBSqlite2.class.php | 2 +- classes/db/DBSqlite3_pdo.class.php | 2 +- classes/file/FileHandler.class.php | 2 + classes/module/ModuleHandler.class.php | 27 +++--- classes/module/ModuleObject.class.php | 8 +- classes/xml/XmlQueryParser.class.php | 6 +- common/js/tree_menu.js | 3 + config/config.inc.php | 48 ++++------ config/func.inc.php | 2 +- modules/document/document.controller.php | 59 +++++++++--- modules/menu/menu.admin.controller.php | 65 +++++++++---- modules/session/conf/info.xml | 11 +++ modules/session/conf/module.xml | 9 ++ modules/session/lang/ko.lang.php | 13 +++ modules/session/queries/deleteSession.xml | 8 ++ modules/session/queries/gcSession.xml | 8 ++ modules/session/queries/getLoggedMembers.xml | 19 ++++ .../session/queries/getLoogedMemberList.xml | 14 +++ modules/session/queries/getSession.xml | 11 +++ modules/session/queries/insertSession.xml | 13 +++ modules/session/queries/updateSession.xml | 15 +++ modules/session/schemas/session.xml | 8 ++ modules/session/session.admin.controller.php | 26 ++++++ modules/session/session.admin.view.php | 26 ++++++ modules/session/session.class.php | 87 ++++++++++++++++++ modules/session/session.controller.php | 65 +++++++++++++ modules/session/session.model.php | 63 +++++++++++++ modules/session/tpl/index.html | 8 ++ modules/session/tpl/js/session.js | 9 ++ widgets/logged_members/conf/info.xml | 17 ++++ .../logged_members/logged_members.class.php | 42 +++++++++ .../skins/default/css/normal.css | 4 + .../default/images/normal/lineNotice.gif | Bin 0 -> 139 bytes .../logged_members/skins/default/list.html | 16 ++++ widgets/logged_members/skins/default/skin.xml | 25 +++++ 42 files changed, 702 insertions(+), 111 deletions(-) create mode 100644 modules/session/conf/info.xml create mode 100644 modules/session/conf/module.xml create mode 100644 modules/session/lang/ko.lang.php create mode 100644 modules/session/queries/deleteSession.xml create mode 100644 modules/session/queries/gcSession.xml create mode 100644 modules/session/queries/getLoggedMembers.xml create mode 100644 modules/session/queries/getLoogedMemberList.xml create mode 100644 modules/session/queries/getSession.xml create mode 100644 modules/session/queries/insertSession.xml create mode 100644 modules/session/queries/updateSession.xml create mode 100644 modules/session/schemas/session.xml create mode 100644 modules/session/session.admin.controller.php create mode 100644 modules/session/session.admin.view.php create mode 100644 modules/session/session.class.php create mode 100644 modules/session/session.controller.php create mode 100644 modules/session/session.model.php create mode 100644 modules/session/tpl/index.html create mode 100644 modules/session/tpl/js/session.js create mode 100644 widgets/logged_members/conf/info.xml create mode 100644 widgets/logged_members/logged_members.class.php create mode 100644 widgets/logged_members/skins/default/css/normal.css create mode 100644 widgets/logged_members/skins/default/images/normal/lineNotice.gif create mode 100644 widgets/logged_members/skins/default/list.html create mode 100644 widgets/logged_members/skins/default/skin.xml diff --git a/classes/context/Context.class.php b/classes/context/Context.class.php index 37fb01e20..8acfff40c 100644 --- a/classes/context/Context.class.php +++ b/classes/context/Context.class.php @@ -73,12 +73,25 @@ // 기본적인 DB정보 세팅 $this->_loadDBInfo(); + // 세션 핸들러 지정 + $oSessionModel = &getModel('session'); + $oSessionController = &getController('session'); + session_set_save_handler( + array(&$oSessionController,"open"), + array(&$oSessionController,"close"), + array(&$oSessionModel,"read"), + array(&$oSessionController,"write"), + array(&$oSessionController,"destroy"), + array(&$oSessionController,"gc") + ); + session_start(); + // 쿠키로 설정된 언어타입 가져오기 if($_COOKIE['lang_type']) $this->lang_type = $_COOKIE['lang_type']; else $this->lang_type = $this->db_info->lang_type; // 등록된 기본 언어파일 찾기 - $langs = file('./common/lang/lang.info'); + $langs = file(_XE_PATH_.'common/lang/lang.info'); $accept_lang = strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE']); foreach($langs as $val) { list($lang_prefix, $lang_text) = explode(',',$val); @@ -99,7 +112,7 @@ // 기본 언어파일 로드 $this->lang = &$GLOBALS['lang']; - $this->_loadLang("./common/lang/"); + $this->_loadLang(_XE_PATH_."common/lang/"); // Request Method 설정 $this->_setRequestMethod(); @@ -129,7 +142,7 @@ } // rewrite 모듈사용 상태 체크 - if(file_exists('./.htaccess')&&$this->db_info->use_rewrite == 'Y') $this->allow_rewrite = true; + if(file_exists(_XE_PATH_.'.htaccess')&&$this->db_info->use_rewrite == 'Y') $this->allow_rewrite = true; else $this->allow_rewrite = false; // 기본 JS/CSS 등록 @@ -164,6 +177,9 @@ * @brief DB및 기타 자원들의 close **/ function close() { + // Session Close + if(function_exists('session_write_close')) session_write_close(); + // DB close $oDB = &DB::getInstance(); if(is_object($oDB)&&method_exists($oDB, 'close')) $oDB->close(); @@ -828,7 +844,7 @@ * @brief js file 목록을 return **/ function _getJsFile() { - require_once("./classes/optimizer/Optimizer.class.php"); + require_once(_XE_PATH_."classes/optimizer/Optimizer.class.php"); $oOptimizer = new Optimizer(); return $oOptimizer->getOptimizedFiles($this->_getUniqueFileList($this->js_files), "js"); } @@ -863,7 +879,7 @@ * @brief CSS file 목록 return **/ function _getCSSFile() { - require_once("./classes/optimizer/Optimizer.class.php"); + require_once(_XE_PATH_."classes/optimizer/Optimizer.class.php"); $oOptimizer = new Optimizer(); return $oOptimizer->getOptimizedFiles($this->_getUniqueFileList($this->css_files), "css"); } @@ -932,7 +948,7 @@ * @brief db설정내용이 저장되어 있는 config file의 path를 return **/ function getConfigFile() { - return "./files/config/db.config.php"; + return _XE_PATH_."files/config/db.config.php"; } /** diff --git a/classes/db/DB.class.php b/classes/db/DB.class.php index 0ce072ecd..e7cdb0e10 100644 --- a/classes/db/DB.class.php +++ b/classes/db/DB.class.php @@ -15,7 +15,7 @@ class DB { - var $count_cache_path = './files/cache/db'; + var $count_cache_path = 'files/cache/db'; var $cond_operation = array( ///< 조건문에서 조건을 등호로 표시하는 변수 'equal' => '=', @@ -43,7 +43,7 @@ var $supported_list = array(); ///< 지원하는 DB의 종류, classes/DB/DB***.class.php 를 이용하여 동적으로 작성됨 - var $cache_file = './files/cache/queries/'; ///< query cache파일의 위치 + var $cache_file = 'files/cache/queries/'; ///< query cache파일의 위치 /** * @brief DB를 상속받는 특정 db type의 instance를 생성 후 return @@ -54,15 +54,23 @@ if(!$GLOBALS['__DB__']) { $class_name = sprintf("DB%s%s", strtoupper(substr($db_type,0,1)), strtolower(substr($db_type,1))); - $class_file = sprintf("./classes/db/%s.class.php", $class_name); + $class_file = sprintf("%sclasses/db/%s.class.php", _XE_PATH_, $class_name); if(!file_exists($class_file)) new Object(-1, 'msg_db_not_setted'); require_once($class_file); - $eval_str = sprintf('$GLOBALS[\'__DB__\'] = new %s();', $class_name); + $eval_str = sprintf('$GLOBALS[\'__DB__\'][\''.$db_type.'\'] = new %s();', $class_name); eval($eval_str); } - return $GLOBALS['__DB__']; + return $GLOBALS['__DB__'][$db_type]; + } + + /** + * @brief constructor + **/ + function DB() { + $this->count_cache_path = _XE_PATH_.$this->count_cache_path; + $this->cache_file = _XE_PATH_.$this->cache_file; } /** @@ -77,7 +85,7 @@ * @brief 지원 가능한 DB 목록을 return **/ function _getSupportedList() { - $db_classes_path = "./classes/db/"; + $db_classes_path = _XE_PATH_."classes/db/"; $filter = "/^DB([^\.]+)\.class\.php/i"; $supported_list = FileHandler::readDir($db_classes_path, $filter, true); sort($supported_list); @@ -89,7 +97,7 @@ if(version_compare(phpversion(), '5.0') < 0 && preg_match('/pdo/i',$db_type)) continue; $class_name = sprintf("DB%s%s", strtoupper(substr($db_type,0,1)), strtolower(substr($db_type,1))); - $class_file = sprintf("./classes/db/%s.class.php", $class_name); + $class_file = sprintf(_XE_PATH_."classes/db/%s.class.php", $class_name); if(!file_exists($class_file)) continue; unset($oDB); @@ -144,7 +152,7 @@ $str .= sprintf("\t Query Failed : %d\n\t\t\t %s\n", $this->errno, $this->errstr); if(__DEBUG_DB_OUTPUT__==1) { - $debug_file = "./files/_debug_db_query.php"; + $debug_file = _XE_PATH_."files/_debug_db_query.php"; $buff = sprintf("%s\n",print_r($str,true)); if($display_line) $buff = "\n====================================\n".$buff."------------------------------------\n"; @@ -161,7 +169,7 @@ // __LOG_SLOW_QUERY__ 가 정해져 있다면 시간 체크후 쿼리 로그 남김 if(__LOG_SLOW_QUERY__>0 && $elapsed_time > __LOG_SLOW_QUERY__) { $buff = ''; - $log_file = './files/_db_slow_query.php'; + $log_file = _XE_PATH_.'files/_db_slow_query.php'; if(!file_exists($log_file)) { $buff = ''."\n"; } @@ -218,17 +226,17 @@ } if(!$target || !$module || !$id) return new Object(-1, 'msg_invalid_queryid'); - $xml_file = sprintf('./%s/%s/queries/%s.xml', $target, $module, $id); + $xml_file = sprintf('%s%s/%s/queries/%s.xml', _XE_PATH_, $target, $module, $id); if(!file_exists($xml_file)) return new Object(-1, 'msg_invalid_queryid'); // 일단 cache 파일을 찾아본다 - $cache_file = sprintf('%s%s.cache.php', $this->cache_file, $query_id); + $cache_file = sprintf('%s%s%s.cache.php', _XE_PATH_, $this->cache_file, $query_id); if(file_exists($cache_file)) $cache_time = filemtime($cache_file); else $cache_time = -1; // 캐시 파일이 없거나 시간 비교하여 최근것이 아니면 원본 쿼리 xml파일을 찾아서 파싱을 한다 - if($cache_timeparse($query_id, $xml_file, $cache_file); } diff --git a/classes/db/DBCubrid.class.php b/classes/db/DBCubrid.class.php index 2a94d2c4e..e8ddca98d 100644 --- a/classes/db/DBCubrid.class.php +++ b/classes/db/DBCubrid.class.php @@ -668,7 +668,7 @@ * 그닥 좋지는 않은 구조이지만 편리하다.. -_-; **/ function _getNavigationData($table_list, $columns, $condition, $output) { - require_once('./classes/page/PageHandler.class.php'); + require_once(_XE_PATH_.'classes/page/PageHandler.class.php'); // 전체 개수를 구함 $count_query = sprintf('select count(*) as "count" from %s %s', implode(',',$table_list), $condition); diff --git a/classes/db/DBFirebird.class.php b/classes/db/DBFirebird.class.php index 12b5ef476..aa00106b9 100644 --- a/classes/db/DBFirebird.class.php +++ b/classes/db/DBFirebird.class.php @@ -814,7 +814,7 @@ * 그닥 좋지는 않은 구조이지만 편리하다.. -_-; **/ function _getNavigationData($table_list, $columns, $condition, $output) { - require_once('./classes/page/PageHandler.class.php'); + require_once(_XE_PATH_.'classes/page/PageHandler.class.php'); // 전체 개수를 구함 $count_query = sprintf('select count(*) as "count" from %s %s;', implode(',',$table_list), $condition); diff --git a/classes/db/DBMysql.class.php b/classes/db/DBMysql.class.php index 6c6573486..a0875db52 100644 --- a/classes/db/DBMysql.class.php +++ b/classes/db/DBMysql.class.php @@ -546,7 +546,7 @@ * 그닥 좋지는 않은 구조이지만 편리하다.. -_-; **/ function _getNavigationData($table_list, $columns, $condition, $output) { - require_once('./classes/page/PageHandler.class.php'); + require_once(_XE_PATH_.'classes/page/PageHandler.class.php'); // 전체 개수를 구함 $count_query = sprintf("select count(*) as count from %s %s", implode(',',$table_list), $condition); diff --git a/classes/db/DBMysql_innodb.class.php b/classes/db/DBMysql_innodb.class.php index a3a982eed..aebf7a07d 100644 --- a/classes/db/DBMysql_innodb.class.php +++ b/classes/db/DBMysql_innodb.class.php @@ -556,7 +556,7 @@ * 그닥 좋지는 않은 구조이지만 편리하다.. -_-; **/ function _getNavigationData($table_list, $columns, $condition, $output) { - require_once('./classes/page/PageHandler.class.php'); + require_once(_XE_PATH_.'classes/page/PageHandler.class.php'); // 전체 개수를 구함 $count_query = sprintf("select count(*) as count from %s %s", implode(',',$table_list), $condition); diff --git a/classes/db/DBPostgresql.class.php b/classes/db/DBPostgresql.class.php index 70c6d5f5e..545527fb4 100644 --- a/classes/db/DBPostgresql.class.php +++ b/classes/db/DBPostgresql.class.php @@ -545,7 +545,7 @@ * 그닥 좋지는 않은 구조이지만 편리하다.. -_-; **/ function _getNavigationData($table_list, $columns, $condition, $output) { - require_once('./classes/page/PageHandler.class.php'); + require_once(_XE_PATH_.'classes/page/PageHandler.class.php'); // 전체 개수를 구함 $count_query = sprintf("select count(*) as count from %s %s", implode(',',$table_list), $condition); diff --git a/classes/db/DBSqlite2.class.php b/classes/db/DBSqlite2.class.php index ef3e6fb2f..6a993b2eb 100644 --- a/classes/db/DBSqlite2.class.php +++ b/classes/db/DBSqlite2.class.php @@ -564,7 +564,7 @@ * 그닥 좋지는 않은 구조이지만 편리하다.. -_-; **/ function _getNavigationData($table_list, $columns, $condition, $output) { - require_once('./classes/page/PageHandler.class.php'); + require_once(_XE_PATH_.'classes/page/PageHandler.class.php'); // 전체 개수를 구함 $count_query = sprintf("select count(*) as count from %s %s", implode(',',$table_list), $condition); diff --git a/classes/db/DBSqlite3_pdo.class.php b/classes/db/DBSqlite3_pdo.class.php index 3256e90e6..03de0920f 100644 --- a/classes/db/DBSqlite3_pdo.class.php +++ b/classes/db/DBSqlite3_pdo.class.php @@ -605,7 +605,7 @@ * 그닥 좋지는 않은 구조이지만 편리하다.. -_-; **/ function _getNavigationData($table_list, $columns, $condition, $output) { - require_once('./classes/page/PageHandler.class.php'); + require_once(_XE_PATH_.'classes/page/PageHandler.class.php'); // 전체 개수를 구함 $count_query = sprintf("select count(*) as count from %s %s", implode(',',$table_list), $condition); diff --git a/classes/file/FileHandler.class.php b/classes/file/FileHandler.class.php index 2cd29f1d5..5742b9963 100644 --- a/classes/file/FileHandler.class.php +++ b/classes/file/FileHandler.class.php @@ -88,8 +88,10 @@ * 주어진 경로를 단계별로 접근하여 recursive하게 디렉토리 생성 **/ function makeDir($path_string) { + $path_string = str_replace(_XE_PATH_,'',$path_string); $path_list = explode('/', $path_string); + $path = _XE_PATH_; for($i=0;$itemplate_path = $path; } @@ -274,8 +274,8 @@ * @brief layout 경로 지정 **/ function setLayoutPath($path) { + if(substr($path,0,1)!='/' && substr($path,0,2)!='./') $path = './'.$path; if(substr($path,-1)!='/') $path .= '/'; - if(substr($path,0,2)!='./') $path = './'.$path; $this->layout_path = $path; } @@ -297,7 +297,7 @@ // addon 실행(called_position 를 before_module_proc로 하여 호출) $called_position = 'before_module_proc'; - @include("./files/cache/activated_addons.cache.php"); + @include(_XE_PATH_."files/cache/activated_addons.cache.php"); // 지금까지 이상이 없었다면 action 실행 if(!$this->stop_proc) { @@ -347,7 +347,7 @@ // addon 실행(called_position 를 after_module_proc로 하여 호출) $called_position = 'after_module_proc'; - @include("./files/cache/activated_addons.cache.php"); + @include(_XE_PATH_."files/cache/activated_addons.cache.php"); if(is_a($output, 'Object') || is_subclass_of($output, 'Object')) { $this->setError($output->getError()); diff --git a/classes/xml/XmlQueryParser.class.php b/classes/xml/XmlQueryParser.class.php index e08dffab4..fbbd06181 100644 --- a/classes/xml/XmlQueryParser.class.php +++ b/classes/xml/XmlQueryParser.class.php @@ -49,12 +49,12 @@ $output->tables[$alias] = $table_name; // 테이블을 찾아서 컬럼의 속성을 구함 - $table_file = sprintf('./%s/%s/schemas/%s.xml', 'modules', $module, $table_name); + $table_file = sprintf('%s%s/%s/schemas/%s.xml', _XE_PATH_, 'modules', $module, $table_name); if(!file_exists($table_file)) { - $searched_list = FileHandler::readDir('./modules'); + $searched_list = FileHandler::readDir(_XE_PATH_.'modules'); $searched_count = count($searched_list); for($i=0;$i<$searched_count;$i++) { - $table_file = sprintf('./%s/%s/schemas/%s.xml', 'modules', $searched_list[$i], $table_name); + $table_file = sprintf('%s%s/%s/schemas/%s.xml', _XE_PATH_, 'modules', $searched_list[$i], $table_name); if(file_exists($table_file)) break; } } diff --git a/common/js/tree_menu.js b/common/js/tree_menu.js index 7b2d6b39d..0e9e0ae27 100644 --- a/common/js/tree_menu.js +++ b/common/js/tree_menu.js @@ -126,6 +126,9 @@ function drawTreeMenu(oXml, callback_func, resopnse_tags, null_func, param) { if(manual_select_node_srl) manualSelectNode(menu_id, manual_select_node_srl); } + var waiting_obj = xGetElementById("waitingforserverresponse"); + if(waiting_obj) waiting_obj.style.visibility = "hidden"; + return null; } diff --git a/config/config.inc.php b/config/config.inc.php index a8e15edfe..983c473fe 100644 --- a/config/config.inc.php +++ b/config/config.inc.php @@ -55,10 +55,15 @@ **/ define('__OB_GZHANDLER_ENABLE__', 1); + /** + * @brief zbXE가 설치된 장소의 base path를 구함 + **/ + define('_XE_PATH_', str_replace('config/config.inc.php','',__FILE__)); + /** * @brief 간단하게 사용하기 위한 함수 정의한 파일 require **/ - require_once('./config/func.inc.php'); + require_once(_XE_PATH_.'config/func.inc.php'); if(__DEBUG__) define('__StartTime__', getMicroTime()); @@ -69,33 +74,18 @@ * php5 기반으로 바꾸게 되면 _autoload를 이용할 수 있기에 제거 대상 **/ if(__DEBUG__) define('__ClassLoadStartTime__', getMicroTime()); - require_once('./classes/object/Object.class.php'); - require_once('./classes/handler/Handler.class.php'); - require_once('./classes/xml/XmlParser.class.php'); - require_once('./classes/context/Context.class.php'); - require_once('./classes/db/DB.class.php'); - require_once('./classes/file/FileHandler.class.php'); - require_once('./classes/widget/WidgetHandler.class.php'); - require_once('./classes/editor/EditorHandler.class.php'); - require_once('./classes/module/ModuleObject.class.php'); - require_once('./classes/module/ModuleHandler.class.php'); - require_once('./classes/display/DisplayHandler.class.php'); - require_once('./classes/template/TemplateHandler.class.php'); - require_once('./classes/mail/Mail.class.php'); + require_once(_XE_PATH_.'classes/object/Object.class.php'); + require_once(_XE_PATH_.'classes/handler/Handler.class.php'); + require_once(_XE_PATH_.'classes/xml/XmlParser.class.php'); + require_once(_XE_PATH_.'classes/context/Context.class.php'); + require_once(_XE_PATH_.'classes/db/DB.class.php'); + require_once(_XE_PATH_.'classes/file/FileHandler.class.php'); + require_once(_XE_PATH_.'classes/widget/WidgetHandler.class.php'); + require_once(_XE_PATH_.'classes/editor/EditorHandler.class.php'); + require_once(_XE_PATH_.'classes/module/ModuleObject.class.php'); + require_once(_XE_PATH_.'classes/module/ModuleHandler.class.php'); + require_once(_XE_PATH_.'classes/display/DisplayHandler.class.php'); + require_once(_XE_PATH_.'classes/template/TemplateHandler.class.php'); + require_once(_XE_PATH_.'classes/mail/Mail.class.php'); if(__DEBUG__) $GLOBALS['__elapsed_class_load__'] = getMicroTime() - __ClassLoadStartTime__; - - /** - * @brief 세션 설정 - * 세션의 파기 시간을 5시간으로 하고 세션 저장 경로를 files/session 으로 변경 - **/ - if(!ini_get('session.auto_start')) { - session_cache_limiter('no-cache, must-revalidate'); - ini_set('session.gc_maxlifetime', '18000'); - if(!is_dir('./files/sessions')) { - FileHandler::makeDir('./files/sessions'); - @chmod('./files/sessions', 0777); - } - if(is_dir('./files/sessions')) session_save_path(realpath('.').'/files/sessions/'); - session_start(); - } ?> diff --git a/config/func.inc.php b/config/func.inc.php index a3e9aaafa..571cceb74 100644 --- a/config/func.inc.php +++ b/config/func.inc.php @@ -313,7 +313,7 @@ * tail -f ./files/_debug_message.php 하여 계속 살펴 볼 수 있다 **/ function debugPrint($buff = null, $display_line = true) { - $debug_file = "./files/_debug_message.php"; + $debug_file = _XE_PATH_."files/_debug_message.php"; $buff = sprintf("%s\n",print_r($buff,true)); if($display_line) $buff = "\n====================================\n".$buff."------------------------------------\n"; diff --git a/modules/document/document.controller.php b/modules/document/document.controller.php index af002f7fc..eac846243 100644 --- a/modules/document/document.controller.php +++ b/modules/document/document.controller.php @@ -793,23 +793,52 @@ $tree[$parent_srl][$category_srl] = $node; } - // 세션 디렉토리 변경 구문 - $php_script = ""; - if(!ini_get('session.auto_start')) { - if(!is_dir("./files/sessions")) { - FileHandler::makeDir("./files/sessions"); - @chmod("./files/sessions", 0777); - } + // 캐시 파일의 권한과 그룹 설정을 위한 공통 헤더 + $header_script = + '$lang_type = Context::getLangType(); '. + '$is_logged = Context::get(\'is_logged\'); '. + '$logged_info = Context::get(\'logged_info\'); '. + 'if($is_logged && $logged_info->is_admin=="Y") { '. + '$is_admin = true; '. + '$group_srls = array_keys($logged_info->group_list); '. + '} else { '. + '$is_admin = false; '. + '$group_srsl = array(); '. + '} '; - $php_script = 'session_cache_limiter("no-cache, must-revalidate"); ini_set("session.gc_maxlifetime", "18000"); if(is_dir("../../sessions")) session_save_path("../../sessions/"); session_start();'; - } - - // xml 캐시 파일 생성 - $xml_buff = sprintf('%s', $php_script, $this->getXmlTree($tree[0], $tree)); + // xml 캐시 파일 생성 (xml캐시는 따로 동작하기에 session 지정을 해주어야 함) + $xml_buff = sprintf( + 'init(); '. + 'header("Content-Type: text/xml; charset=UTF-8"); '. + 'header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); '. + 'header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); '. + 'header("Cache-Control: no-store, no-cache, must-revalidate"); '. + 'header("Cache-Control: post-check=0, pre-check=0", false); '. + 'header("Pragma: no-cache"); '. + '%s'. + '?>'. + '%s', + $header_script, + $this->getXmlTree($tree[0], $tree) + ); // php 캐시 파일 생성 $php_output = $this->getPhpCacheCode($tree[0], $tree, 0); - $php_buff = sprintf('list = array(%s); ?>', $php_output['category_title_str'], $php_output['buff']); + $php_buff = sprintf( + 'list = array(%s); '. + '?>', + $header_script, + $php_output['category_title_str'], + $php_output['buff'] + ); // 파일 저장 FileHandler::writeFile($xml_file, $xml_buff); @@ -839,7 +868,7 @@ $module_srl = $node->module_srl; // node->group_srls값이 있으면 - if($group_srls) $group_check_code = sprintf('($_SESSION["is_admin"]==true||(is_array($_SESSION["group_srls"])&&count(array_intersect($_SESSION["group_srls"], array(%s)))))',$group_srls); + if($group_srls) $group_check_code = sprintf('($is_admin==true||(is_array($group_srls)&&count(array_intersect($group_srls, array(%s)))))',$group_srls); else $group_check_code = "true"; $attribute = sprintf( @@ -886,7 +915,7 @@ $output['category_srl_list'] = array_merge($output['category_srl_list'], $child_output['category_srl_list']); // node->group_srls값이 있으면 - if($node->group_srls) $group_check_code = sprintf('($_SESSION["is_admin"]==true||(is_array($_SESSION["group_srls"])&&count(array_intersect($_SESSION["group_srls"], array(%s)))))',$node->group_srls); + if($node->group_srls) $group_check_code = sprintf('($is_admin==true||(is_array($group_srls)&&count(array_intersect($group_srls, array(%s)))))',$node->group_srls); else $group_check_code = "true"; // 변수 정리 diff --git a/modules/menu/menu.admin.controller.php b/modules/menu/menu.admin.controller.php index 0d928b989..2d80c4cd7 100644 --- a/modules/menu/menu.admin.controller.php +++ b/modules/menu/menu.admin.controller.php @@ -349,23 +349,52 @@ $tree[$parent_srl][$menu_item_srl] = $node; } - // 세션 디렉토리 변경 구문 - $php_script = ""; - if(!ini_get('session.auto_start')) { - if(!is_dir("./files/sessions")) { - FileHandler::makeDir("./files/sessions"); - @chmod("./files/sessions", 0777); - } + // 캐시 파일의 권한과 그룹 설정을 위한 공통 헤더 + $header_script = + '$lang_type = Context::getLangType(); '. + '$is_logged = Context::get(\'is_logged\'); '. + '$logged_info = Context::get(\'logged_info\'); '. + 'if($is_logged && $logged_info->is_admin=="Y") { '. + '$is_admin = true; '. + '$group_srls = array_keys($logged_info->group_list); '. + '} else { '. + '$is_admin = false; '. + '$group_srsl = array(); '. + '} '; - $php_script = 'session_cache_limiter("no-cache, must-revalidate"); ini_set("session.gc_maxlifetime", "18000"); if(is_dir("../../sessions")) session_save_path("../../sessions/"); session_start();'; - } - - // xml 캐시 파일 생성 - $xml_buff = sprintf('is_admin=="Y") $_is_admin = true; ?>%s', $php_script, $this->getXmlTree($tree[0], $tree)); + // xml 캐시 파일 생성 (xml캐시는 따로 동작하기에 session 지정을 해주어야 함) + $xml_buff = sprintf( + 'init(); '. + 'header("Content-Type: text/xml; charset=UTF-8"); '. + 'header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); '. + 'header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); '. + 'header("Cache-Control: no-store, no-cache, must-revalidate"); '. + 'header("Cache-Control: post-check=0, pre-check=0", false); '. + 'header("Pragma: no-cache"); '. + '%s'. + '?>'. + '%s', + $header_script, + $this->getXmlTree($tree[0], $tree) + ); // php 캐시 파일 생성 $php_output = $this->getPhpCacheCode($tree[0], $tree); - $php_buff = sprintf('is_admin=="Y") $_is_admin = true; $lang_type = Context::getLangType(); %s; $menu->list = array(%s); ?>', $php_output['name'], $php_output['buff']); + $php_buff = sprintf( + 'list = array(%s); '. + '?>', + $header_script, + $php_output['name'], + $php_output['buff'] + ); // 파일 저장 FileHandler::writeFile($xml_file, $xml_buff); @@ -394,7 +423,7 @@ foreach($names as $key => $val) { $name_arr_str .= sprintf('"%s"=>"%s",',$key, htmlspecialchars($val)); } - $name_str = sprintf('$_names = array(%s); print $_names[$_SESSION["lang_type"]];', $name_arr_str); + $name_str = sprintf('$_names = array(%s); print $_names[$lang_type];', $name_arr_str); $url = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->url); if(preg_match('/^([0-9a-zA-Z\_\-]+)$/', $node->url)) { @@ -422,13 +451,13 @@ else $classname = ''; if($hover_btn) $hover_str = sprintf('onmouseover="this.src=\'%s\'"', $hover_btn); else $hover_str = ''; if($active_btn) $active_str = sprintf('onmousedown="this.src=\'%s\'"', $active_btn); else $active_str = ''; - $link = sprintf('<img src="%s" onmouseout="this.src=\'%s\'" alt="" %s %s %s />', $normal_btn, $normal_btn, $hover_str, $active_str, $classname); + $link = sprintf('<img src="%s" onmouseout="this.src=\'%s\'" alt="" %s %s %s />', $normal_btn, $normal_btn, $hover_str, $active_str, $classname); } else { - $link = ''; + $link = ''; } // node->group_srls값이 있으면 - if($group_srls) $group_check_code = sprintf('($_is_admin==true||(is_array($_SESSION["group_srls"])&&count(array_intersect($_SESSION["group_srls"], array(%s)))))',$group_srls); + if($group_srls) $group_check_code = sprintf('($is_admin==true||(is_array($group_srls)&&count(array_intersect($group_srls, array(%s)))))',$group_srls); else $group_check_code = "true"; $attribute = sprintf( 'node_srl="%s" parent_srl="%s" text="" url="" href="" open_window="%s" expand="%s" normal_btn="%s" hover_btn="%s" active_btn="%s" link="%s"', @@ -484,7 +513,7 @@ $output['url_list'] = array_merge($output['url_list'], $child_output['url_list']); // node->group_srls값이 있으면 - if($node->group_srls) $group_check_code = sprintf('($_is_admin==true||(is_array($_SESSION["group_srls"])&&count(array_intersect($_SESSION["group_srls"], array(%s)))))',$node->group_srls); + if($node->group_srls) $group_check_code = sprintf('($is_admin==true||(is_array($group_srls)&&count(array_intersect($group_srls, array(%s)))))',$node->group_srls); else $group_check_code = "true"; // 변수 정리 diff --git a/modules/session/conf/info.xml b/modules/session/conf/info.xml new file mode 100644 index 000000000..8c8b56301 --- /dev/null +++ b/modules/session/conf/info.xml @@ -0,0 +1,11 @@ + + + Session관리자 + + zero + + 접속자의 session을 관리하는 모듈입니다. + 기본적인 세션 설정과 사용뿐 아니라 세션 정보를 이용하여 접속자등의 세션 기반의 정보를 제공하는 기능도 있습니다. + + + diff --git a/modules/session/conf/module.xml b/modules/session/conf/module.xml new file mode 100644 index 000000000..b0f68feb6 --- /dev/null +++ b/modules/session/conf/module.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/modules/session/lang/ko.lang.php b/modules/session/lang/ko.lang.php new file mode 100644 index 000000000..f125d39b1 --- /dev/null +++ b/modules/session/lang/ko.lang.php @@ -0,0 +1,13 @@ + + * @brief 한국어 언어팩 (기본적인 내용만 수록) + **/ + + $lang->session = '세션'; + $lang->about_session = "세션 관리를 하는 모듈입니다\n틈틈히 세션 정리를 하시면 사이트 운영시 보다 좋은 효과를 낼 수 있습니다."; + + $lang->cmd_clear_session = '세션 정리'; + $lang->session_cleared = '쓸모 없는 세션 정보가 정리되었습니다'; +?> diff --git a/modules/session/queries/deleteSession.xml b/modules/session/queries/deleteSession.xml new file mode 100644 index 000000000..bb6165f19 --- /dev/null +++ b/modules/session/queries/deleteSession.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/modules/session/queries/gcSession.xml b/modules/session/queries/gcSession.xml new file mode 100644 index 000000000..5acdb4674 --- /dev/null +++ b/modules/session/queries/gcSession.xml @@ -0,0 +1,8 @@ + + +
+ + + + + diff --git a/modules/session/queries/getLoggedMembers.xml b/modules/session/queries/getLoggedMembers.xml new file mode 100644 index 000000000..a7c1f338f --- /dev/null +++ b/modules/session/queries/getLoggedMembers.xml @@ -0,0 +1,19 @@ + + +
+ + + + + + + + + + + + + + + + diff --git a/modules/session/queries/getLoogedMemberList.xml b/modules/session/queries/getLoogedMemberList.xml new file mode 100644 index 000000000..4a6705354 --- /dev/null +++ b/modules/session/queries/getLoogedMemberList.xml @@ -0,0 +1,14 @@ + + +
+ + + + + + + + + + + diff --git a/modules/session/queries/getSession.xml b/modules/session/queries/getSession.xml new file mode 100644 index 000000000..d7ae83a0c --- /dev/null +++ b/modules/session/queries/getSession.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/session/queries/insertSession.xml b/modules/session/queries/insertSession.xml new file mode 100644 index 000000000..c47ecae20 --- /dev/null +++ b/modules/session/queries/insertSession.xml @@ -0,0 +1,13 @@ + + +
+ + + + + + + + + + diff --git a/modules/session/queries/updateSession.xml b/modules/session/queries/updateSession.xml new file mode 100644 index 000000000..f0f718e88 --- /dev/null +++ b/modules/session/queries/updateSession.xml @@ -0,0 +1,15 @@ + + +
+ + + + + + + + + + + + diff --git a/modules/session/schemas/session.xml b/modules/session/schemas/session.xml new file mode 100644 index 000000000..6550fa48e --- /dev/null +++ b/modules/session/schemas/session.xml @@ -0,0 +1,8 @@ +
+ + + + + + +
diff --git a/modules/session/session.admin.controller.php b/modules/session/session.admin.controller.php new file mode 100644 index 000000000..3e61a24f4 --- /dev/null +++ b/modules/session/session.admin.controller.php @@ -0,0 +1,26 @@ +gc(0); + + $this->add('result',Context::getLang('session_cleared')); + } + } +?> diff --git a/modules/session/session.admin.view.php b/modules/session/session.admin.view.php new file mode 100644 index 000000000..56e1b6f07 --- /dev/null +++ b/modules/session/session.admin.view.php @@ -0,0 +1,26 @@ +setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('index'); + } + + } +?> diff --git a/modules/session/session.class.php b/modules/session/session.class.php new file mode 100644 index 000000000..594c65551 --- /dev/null +++ b/modules/session/session.class.php @@ -0,0 +1,87 @@ +session_started= true; + } + + /** + * @brief 설치시 추가 작업이 필요할시 구현 + **/ + function moduleInstall() { + // action forward에 등록 (관리자 모드에서 사용하기 위함) + $oModuleController = &getController('module'); + $oModuleController->insertActionForward('session', 'view', 'dispSessionAdminIndex'); + + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + $oDB = &DB::getInstance(); + $oModuleModel = &getModel('module'); + + if(!$oModuleModel->getActionForward('dispSessionAdminIndex')) return true; + + if(!$oDB->isTableExists('session')) return true; + + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + $oDB = &DB::getInstance(); + $oModuleModel = &getModel('module'); + $oModuleController = &getController('module'); + + if(!$oDB->isTableExists('session')) $oDB->createTableByXmlFile($this->module_path.'schemas/session.xml'); + + if(!$oModuleModel->getActionForward('dispSessionAdminIndex')) + $oModuleController->insertActionForward('document', 'view', 'dispSessionAdminIndex'); + } + + /** + * @brief session string decode + **/ + function unSerializeSession($val) { + $vars = preg_split('/([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff^|]*)\|/', $val,-1,PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); + for($i=0; $vars[$i]; $i++) $result[$vars[$i++]] = unserialize($vars[$i]); + return $result; + } + + /** + * @brief session string encode + **/ + function serializeSession($data) { + if(!count($data)) return; + + $str = ''; + foreach($data as $key => $val) $str .= $key.'|'.serialize($val); + return substr($str, 0, strlen($str)-1).'}'; + } + + /** + * @brief 캐시 파일 재생성 + **/ + function recompileCache() { + // 기존 파일 기반의 세션 삭제 + FileHandler::removeDir(_XE_PATH_."files/sessions"); + } + } +?> diff --git a/modules/session/session.controller.php b/modules/session/session.controller.php new file mode 100644 index 000000000..0108e0d7f --- /dev/null +++ b/modules/session/session.controller.php @@ -0,0 +1,65 @@ +session_started) return; + + $args->session_key = $session_key; + $output = executeQuery('session.getSession', $args); + $session_info = $output->data; + if($session_info->session_key == $session_key && $session_info->ipaddress != $_SERVER['REMOTE_ADDR']) { + executeQuery('session.deleteSession', $args); + return true; + } + + $args->expired = date("YmdHis", time()+$this->lifetime); + $args->val = $val; + + if(Context::get('is_logged')) { + $logged_info = Context::get('logged_info'); + $args->member_srl = $logged_info->member_srl; + } else { + $args->member_srl = 0; + } + + if($session_info->session_key) $output = executeQuery('session.updateSession', $args); + else $output = executeQuery('session.insertSession', $args); + + return true; + } + + function destroy($session_key) { + if(!$session_key || !$this->session_started) return; + + $args->session_key = $session_key; + executeQuery('session.deleteSession', $args); + return true; + } + + function gc($maxlifetime) { + if(!$this->session_started) return; + executeQuery('session.gcSession'); + return true; + } + } +?> diff --git a/modules/session/session.model.php b/modules/session/session.model.php new file mode 100644 index 000000000..ecc0d2d79 --- /dev/null +++ b/modules/session/session.model.php @@ -0,0 +1,63 @@ +lifetime; + } + + function read($session_key) { + if(!$session_key || !$this->session_started) return; + + $args->session_key = $session_key; + $output = executeQuery('session.getSession', $args); + + // 읽기 오류 발생시 테이블 생성 유무 확인 + if(!$output->toBool()) { + $oDB = &DB::getInstance(); + if(!$oDB->isTableExists('session')) $oDB->createTableByXmlFile($this->module_path.'schemas/session.xml'); + } + + return $output->data->val; + } + + /** + * @brief 현재 접속중인 사용자의 목록을 구함 + * period_time 인자의 값을 n으로 하여 최근 n분 이내에 세션을 갱신한 대상을 추출함 + **/ + function getLoggedMembers($limit_count = 20, $page = 1, $period_time = 3) { + $args->last_update = date("YmdHis", time() - $period_time*60); + $args->page = $page; + + $output = executeQueryArray('session.getLoggedMembers', $args); + if(!$output->toBool() || !$output->data) return $output; + + $member_srls = array(); + foreach($output->data as $key => $val) { + $member_srls[$key] = $val->member_srl; + $member_keys[$val->member_srl] = $key; + } + + $member_args->member_srl = implode(',',$member_srls); + $member_output = executeQueryArray('member.getMembers', $member_args); + if($member_output->data) { + foreach($member_output->data as $key => $val) { + $output->data[$member_keys[$val->member_srl]] = $val; + } + } + + return $output; + } + } +?> diff --git a/modules/session/tpl/index.html b/modules/session/tpl/index.html new file mode 100644 index 000000000..017505390 --- /dev/null +++ b/modules/session/tpl/index.html @@ -0,0 +1,8 @@ + + +

{$lang->session} {$lang->cmd_management}

+
{nl2br($lang->about_session)}
+ +
+ +
diff --git a/modules/session/tpl/js/session.js b/modules/session/tpl/js/session.js new file mode 100644 index 000000000..53c740e6a --- /dev/null +++ b/modules/session/tpl/js/session.js @@ -0,0 +1,9 @@ +function doClearSession() { + var response_tags = new Array('error','message','result'); + var params = new Array(); + exec_xml('session','procSessionAdminClear', params, completeClearSession, response_tags); +} + +function completeClearSession(ret_obj, response_tags) { + alert(ret_obj['result']); +} diff --git a/widgets/logged_members/conf/info.xml b/widgets/logged_members/conf/info.xml new file mode 100644 index 000000000..a88c176c8 --- /dev/null +++ b/widgets/logged_members/conf/info.xml @@ -0,0 +1,17 @@ + + + 로그인 사용자 출력 위젯 + + zero + + 로그인 사용자를 출력하는 위젯입니다. + + + + + 목록수 + text + 출력될 목록의 수를 정하실 수 있습니다. (기본 5개) + + + diff --git a/widgets/logged_members/logged_members.class.php b/widgets/logged_members/logged_members.class.php new file mode 100644 index 000000000..0551c6971 --- /dev/null +++ b/widgets/logged_members/logged_members.class.php @@ -0,0 +1,42 @@ +list_count; + if(!$list_count) $list_count = 5; + + // session model 객체 생성 + $oSessionModel = &getModel('session'); + $output = $oSessionModel->getLoggedMembers($list_count); + $widget_info->member_list = $output->data; + Context::set('widget_info', $widget_info); + + // 템플릿의 스킨 경로를 지정 (skin, colorset에 따른 값을 설정) + $tpl_path = sprintf('%sskins/%s', $this->widget_path, $args->skin); + Context::set('colorset', $args->colorset); + + // 템플릿 파일을 지정 + $tpl_file = 'list'; + + // 템플릿 컴파일 + $oTemplate = &TemplateHandler::getInstance(); + $output = $oTemplate->compile($tpl_path, $tpl_file); + return $output; + } + } +?> diff --git a/widgets/logged_members/skins/default/css/normal.css b/widgets/logged_members/skins/default/css/normal.css new file mode 100644 index 000000000..5e5f3d3c0 --- /dev/null +++ b/widgets/logged_members/skins/default/css/normal.css @@ -0,0 +1,4 @@ +.mg { padding-bottom:15px; overflow:hidden; position:relative;} +.mg h2 { font-size:1em; display:block; height:21px; padding:9px 0 0 9px; margin-bottom:4px; color:#000000; background:url(../images/normal/lineNotice.gif) no-repeat left bottom;} +.mg ul { margin:0; padding:0; overflow:hidden; width:100%;} +.mg ul li { white-space:nowrap; padding:3px 0 3px 10px; overflow:hidden; border-bottom:1px dashed #EEEEEE; color:#54564b;} diff --git a/widgets/logged_members/skins/default/images/normal/lineNotice.gif b/widgets/logged_members/skins/default/images/normal/lineNotice.gif new file mode 100644 index 0000000000000000000000000000000000000000..dbf2c8220a7eb9d2b007167e9e0efe70cec5b33c GIT binary patch literal 139 zcmV;60CfLHNk%w1VF(8T0DuAj{x%eRe0(AP6+?1mVRU6=Aa`kWXdqN*WgtgMO;7+V z000002nPZH00L2jkEzS;52Ku++KaQ^y!#J^;z*X}iKgnxw(bkZ@=VwEjpzE#_x=wI t3Wvm^@rX<+mrU2>35`mpl&1BH&1$#YuJ;QLi^t@$`HW7h*KAJ#06We2KUn|( literal 0 HcmV?d00001 diff --git a/widgets/logged_members/skins/default/list.html b/widgets/logged_members/skins/default/list.html new file mode 100644 index 000000000..b071d42aa --- /dev/null +++ b/widgets/logged_members/skins/default/list.html @@ -0,0 +1,16 @@ + + + + + + +
+ +
    + +
  • +
    {htmlspecialchars($val->nick_name)}
    +
  • + +
+
diff --git a/widgets/logged_members/skins/default/skin.xml b/widgets/logged_members/skins/default/skin.xml new file mode 100644 index 000000000..ac3fc8464 --- /dev/null +++ b/widgets/logged_members/skins/default/skin.xml @@ -0,0 +1,25 @@ + + + 그룹회원 출력 위젯 기본 스킨 + グループ会員表示ウィジェットのデフォルトスキン + Basic Skin of Group Member Display Widget + 会员列表默认皮肤 + + 제로 + Zero + zero + Zero + 그룹회원 출력 위젯의 기본 스킨 + グループ会員表示ウィジェットのデフォルトスキン + Basic skin of group member display widget + 显示特定用户组会员列表的默认皮肤。 + + + + 기본 컬러 + デフォルトカラー + Default Color + 默认颜色 + + +