From e5a1418503a1b0f7d20a0c5c51d44f10a881411a Mon Sep 17 00:00:00 2001 From: neoraider Date: Mon, 18 Sep 2006 22:53:00 +0000 Subject: Interne Modulverwaltung neu geschrieben; Basis modularisiert; das gesamte System an die neue Modulverwaltung angepasst. --- base.xml | 41 ++++++++++ code/config.inc.php | 11 --- code/db.inc.php | 10 --- code/links.inc.php | 2 +- code/message.inc.php | 3 +- code/modules.inc.php | 148 ----------------------------------- code/nav.inc.php | 2 +- code/pages.inc.php | 12 +-- code/templates.inc.php | 14 +--- code/user.inc.php | 2 - code/xmlparser.inc.php | 95 ----------------------- core/config.inc.php | 11 +++ core/db.inc.php | 10 +++ core/modules.inc.php | 164 +++++++++++++++++++++++++++++++++++++++ core/xmlparser.inc.php | 95 +++++++++++++++++++++++ index.php | 12 +-- pages/content/Login.xml | 5 +- pages/content/Logout.xml | 5 +- pages/content/Modules.xml | 10 +-- pages/content/Modules:Enable.xml | 4 +- pages/content/Pages.xml | 4 +- pages/content/Pages:Copy.xml | 5 +- pages/content/Pages:Delete.xml | 3 +- pages/content/Pages:Edit.xml | 4 +- pages/content/Pages:Handle.xml | 4 +- pages/content/Pages:New.xml | 4 +- pages/content/Pages:Privs.xml | 4 +- pages/content/Pages:Rename.xml | 4 +- pages/content/Users.xml | 4 +- pages/content/Users:Delete.xml | 3 +- pages/content/Users:Group.xml | 3 +- pages/content/Users:Handle.xml | 5 +- pages/content/Users:New.xml | 4 +- pages/content/Users:Password.xml | 4 +- pages/content/Users:Rename.xml | 4 +- pages/editor/default.xml | 2 +- pages/editor/phpexec.xml | 2 +- pages/nav/Login.xml | 6 +- templates/default.inc.php | 2 +- templates/phpexec.inc.php | 3 +- 40 files changed, 368 insertions(+), 362 deletions(-) create mode 100644 base.xml delete mode 100644 code/config.inc.php delete mode 100644 code/db.inc.php delete mode 100644 code/modules.inc.php delete mode 100644 code/xmlparser.inc.php create mode 100644 core/config.inc.php create mode 100644 core/db.inc.php create mode 100644 core/modules.inc.php create mode 100644 core/xmlparser.inc.php diff --git a/base.xml b/base.xml new file mode 100644 index 0000000..a350b20 --- /dev/null +++ b/base.xml @@ -0,0 +1,41 @@ + + + + Neon + 0.1 + + + links + message + nav + pages + templates + user + util + Login + Logout + Modules + Modules:Config + Modules:Enable + Pages + Pages:Copy + Pages:Delete + Pages:Edit + Pages:Handle + Pages:New + Pages:Privs + Pages:Rename + Users + Users:Delete + Users:Group + Users:Handle + Users:New + Users:Password + Users:Rename + default + phpexec + Login + + + + diff --git a/code/config.inc.php b/code/config.inc.php deleted file mode 100644 index b94a74e..0000000 --- a/code/config.inc.php +++ /dev/null @@ -1,11 +0,0 @@ -Execute('SELECT name, value FROM config WHERE module = 0'); - - while($row = $res->FetchRow()) - $GLOBALS['config'][$row[0]] = $row[1]; -?> diff --git a/code/db.inc.php b/code/db.inc.php deleted file mode 100644 index 706f63d..0000000 --- a/code/db.inc.php +++ /dev/null @@ -1,10 +0,0 @@ -PConnect($GLOBALS['config']['server'], $GLOBALS['config']['user'], - $GLOBALS['config']['password'], $GLOBALS['config']['db']); -?> diff --git a/code/links.inc.php b/code/links.inc.php index 4484a72..cb264cd 100644 --- a/code/links.inc.php +++ b/code/links.inc.php @@ -1,5 +1,5 @@ code[$file])) - require_once($GLOBALS['modules']->code[$file]); - elseif(isset($GLOBALS['modules']->templates[$file])) - require_once($GLOBALS['modules']->templates[$file]); - else - require_once($file); - } - - class Modules { - var $modules = array(); - var $pages = array(); - var $code = array(); - var $templates = array(); - - function Modules() { - $dir = opendir('modules'); - - while($moddir = readdir($dir)) { - if($moddir[0] != '.' && is_dir('modules/' . $moddir) && is_file('modules/' . $moddir . '/module.xml')) { - $data = $GLOBALS['xmlparser']->ParseFile('modules/' . $moddir . '/module.xml'); - - if(!$data) continue; - - $info = $GLOBALS['xmlparser']->FindTag($data, 'info'); - if(!$info) continue; - - $name = $GLOBALS['xmlparser']->FindTag($info, 'name'); - if(!$name) continue; - if(count($name['children']) != 1) continue; - if(!is_string($name['children'][0])) continue; - $name = $name['children'][0]; - - $version = $GLOBALS['xmlparser']->FindTag($info, 'version'); - if(!$version) continue; - if(count($version['children']) != 1) continue; - if(!is_string($version['children'][0])) continue; - $version = $version['children'][0]; - - $desc = $GLOBALS['xmlparser']->FindTag($info, 'desc'); - if(!$desc) continue; - if(count($desc['children']) != 1) continue; - if(!is_string($desc['children'][0])) continue; - $desc = $desc['children'][0]; - - $this->modules[$name] = array('name' => $name, 'version' => $version, 'desc' => $desc, 'code' => array(), - 'templates' => array(), 'config' => false, 'enabled' => false); - - if($GLOBALS['xmlparser']->FindTag($info, 'config')) $this->modules[$name]['config'] = true; - - $files = $GLOBALS['xmlparser']->FindTag($data, 'files'); - if(!$files) continue; - - foreach($files['children'] as $file) { - if(!is_array($file)) continue; - if(count($file['children']) != 1) continue; - if(!is_string($file['children'][0])) continue; - - switch($file['tag']) { - case 'page': - $type = $file['attribs']['type']; - if(!$type) $type = 'c'; - - $pagename = $file['children'][0] . '.' . $type; - $realname = 'modules/' . $moddir . '/pages/' . strtr($type, array('c' => 'content', 'e' => 'editor', 'n' => 'nav')) - . '/' . $file['children'][0] . '.xml'; - - $this->modules[$name]['pages'][$pagename] = $realname; - break; - case 'code': - $filename = 'code/' . $file['children'][0] . '.inc.php'; - $realname = 'modules/' . $moddir . '/code/' . $file['children'][0] . '.inc.php'; - - $this->modules[$name]['code'][$filename] = $realname; - break; - case 'template': - $filename = 'templates/' . $file['children'][0] . '.inc.php'; - $realname = 'modules/' . $moddir . '/templates/' . $file['children'][0] . '.inc.php'; - - $this->modules[$name]['templates'][$filename] = $realname; - } - } - } - } - - closedir($dir); - - $res = $GLOBALS['db']->Execute('SELECT name, enabled FROM modules'); - - while($row = $res->FetchRow()) { - if(!array_key_exists($row[0], $this->modules)) { - $GLOBALS['db']->Execute('DELETE FROM modules WHERE name = ?', $row[0]); - continue; - } - - if(!$row[1]) continue; - - $this->modules[$row[0]]['enabled'] = true; - - $this->pages = array_merge($this->pages, $this->modules[$row[0]]['pages']); - $this->code = array_merge($this->code, $this->modules[$row[0]]['code']); - $this->templates = array_merge($this->templates, $this->modules[$row[0]]['templates']); - } - } - - function Exists($name) { - return array_key_exists($name, $this->modules); - } - - function Enabled($name) { - return $this->Exists($name) && $this->modules[$name]['enabled']; - } - - function HasConfig($name) { - if(!$this->Exists($name)) return false; - - return $this->modules[$name]['config']; - } - - function Enable($name, $enable = true) { - if(!$this->Exists($name)) return false; - - if($this->Enabled($name) == $enable) return true; - - $res = $GLOBALS['db']->Execute('SELECT id FROM modules WHERE name = ?', $name); - - if($res->RecordCount()) { - $GLOBALS['db']->Execute('UPDATE modules SET enabled = ? WHERE name = ?', array(intval($enable), $name)); - - return ($GLOBALS['db']->Affected_Rows() > 0); - } - - $GLOBALS['db']->Execute('INSERT INTO modules (name, enabled) VALUES (?, ?)', array($name, intval($enable))); - - return ($GLOBALS['db']->Affected_Rows() > 0); - } - - function Disable($name) { - return $this->Enable($name, false); - } - } - - $GLOBALS['modules'] = new Modules; -?> diff --git a/code/nav.inc.php b/code/nav.inc.php index bb7ce12..d5ede02 100644 --- a/code/nav.inc.php +++ b/code/nav.inc.php @@ -1,5 +1,5 @@ '', 'data' => $data); } else { - $filename = $GLOBALS['modules']->pages[$page . '.' . $type]; - if(!$filename) $filename = 'pages/' . strtr($type, array('c' => 'content', 'e' => 'editor', 'n' => 'nav')) - . '/' . $page . '.xml'; + $filename = $GLOBALS['modules']->pages[$page . '.' . $type]['path'] . 'pages/' + . strtr($type, array('c' => 'content', 'e' => 'editor', 'n' => 'nav')) . '/' . $page . '.xml'; $xmldata = $GLOBALS['xmlparser']->ParseFile($filename); if(!$xmldata) return null; diff --git a/code/templates.inc.php b/code/templates.inc.php index 7abfe79..9db1ff2 100644 --- a/code/templates.inc.php +++ b/code/templates.inc.php @@ -1,14 +1,4 @@ templates as $file) - include($file); + foreach($GLOBALS['modules']->templates as $file => $module) + require_once($module['path'] . 'templates/' . $file . '.inc.php'); ?> diff --git a/code/user.inc.php b/code/user.inc.php index 4912bcc..7c9b907 100644 --- a/code/user.inc.php +++ b/code/user.inc.php @@ -1,6 +1,4 @@ tags = array(); - $this->depth = 0; - - $parser = xml_parser_create(); - - xml_set_object($parser, $this); - xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); - - xml_set_element_handler($parser, 'openTagHandler', 'closeTagHandler'); - xml_set_character_data_handler($parser, 'cdataHandler'); - - $file = fopen($filename, 'r'); - - while ($xml = fread($file, 4096)) { - if(!xml_parse($parser, $xml, feof($file))) { - $this->tags = null; - break; - } - } - - fclose($file); - - xml_parser_free($parser); - - return $this->tags[0]; - } - - function ParseXML($xml) { - $this->tags = array(); - $this->depth = 0; - - $parser = xml_parser_create(); - - xml_set_object($parser, $this); - xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); - - xml_set_element_handler($parser, 'openTagHandler', 'closeTagHandler'); - xml_set_character_data_handler($parser, 'cdataHandler'); - - if(!xml_parse($parser, $xml, true)) - $this->tags = null; - - xml_parser_free($parser); - - return $this->tags[0]; - } - - function FindTag($data, $tag, $start = 0) { - for($i = $start; $i < count($data['children']); $i++) { - if(!is_array($data['children'][$i])) continue; - if($data['children'][$i]['tag'] == $tag) return $data['children'][$i]; - } - } - - function openTagHandler($parser, $name, $attribs) { - $children = &$this->tags[$this->depth-1]['children']; - - $children[count($children)-1] = trim($children[count($children)-1]); - - $this->tags[$this->depth] = array('tag' => $name, - 'attribs' => $attribs, - 'children' => array()); - - $this->depth++; - } - - function closeTagHandler($parser, $name) { - $children = &$this->tags[$this->depth-1]['children']; - - $children[count($children)-1] = trim($children[count($children)-1]); - - $this->depth--; - - if($this->depth > 0) - array_push($this->tags[$this->depth-1]['children'], $this->tags[$this->depth]); - } - - function cdataHandler($parser, $data) { - $children = &$this->tags[$this->depth-1]['children']; - - if(is_string($children[count($children)-1])) - $children[count($children)-1] .= $data; - elseif(trim($data) != '') - array_push($children, $data); - } - } - - $GLOBALS['xmlparser'] = new XMLParser; -?> diff --git a/core/config.inc.php b/core/config.inc.php new file mode 100644 index 0000000..5318341 --- /dev/null +++ b/core/config.inc.php @@ -0,0 +1,11 @@ +Execute('SELECT name, value FROM config WHERE module = 0'); + + while($row = $res->FetchRow()) + $GLOBALS['config'][$row[0]] = $row[1]; +?> diff --git a/core/db.inc.php b/core/db.inc.php new file mode 100644 index 0000000..706f63d --- /dev/null +++ b/core/db.inc.php @@ -0,0 +1,10 @@ +PConnect($GLOBALS['config']['server'], $GLOBALS['config']['user'], + $GLOBALS['config']['password'], $GLOBALS['config']['db']); +?> diff --git a/core/modules.inc.php b/core/modules.inc.php new file mode 100644 index 0000000..c1ebc80 --- /dev/null +++ b/core/modules.inc.php @@ -0,0 +1,164 @@ +code[$file])) + require_once($GLOBALS['modules']->code[$file]['path'] . 'code/' . $file . '.inc.php'); + else + die('Fatal: a required code file was not found.'); + } + } + + class Modules { + var $modules = array(); + var $pages = array(); + var $code = array(); + var $templates = array(); + + function Modules() { + $module = $this->Load('base.xml'); + if(!$module) die('Fatal: could not load Neon base.'); + + $module['path'] = ''; + + $this->modules['base'] = $module; + + + $dir = opendir('modules'); + + while($moddir = readdir($dir)) { + if($moddir[0] == '.' || !is_dir('modules/' . $moddir) || !is_file('modules/' . $moddir . '/module.xml')) + continue; + + $module = $this->Load('modules/' . $moddir . '/module.xml'); + + if(!$module) continue; + + $module['path'] = 'modules/' . $moddir . '/'; + $this->modules[$module['name']] = $module; + } + + closedir($dir); + + $res = $GLOBALS['db']->Execute('SELECT name, enabled FROM modules'); + + $row[0] = 'base'; + $row[1] = 1; + + do { + if(!array_key_exists($row[0], $this->modules)) { + $GLOBALS['db']->Execute('DELETE FROM modules WHERE name = ?', $row[0]); + continue; + } + + if(!$row[1]) continue; + + $this->modules[$row[0]]['enabled'] = true; + + foreach($this->modules[$row[0]]['pages'] as $page) + $this->pages[$page] = &$this->modules[$row[0]]; + foreach($this->modules[$row[0]]['code'] as $code) + $this->code[$code] = &$this->modules[$row[0]]; + foreach($this->modules[$row[0]]['templates'] as $template) + $this->templates[$template] = &$this->modules[$row[0]]; + } while($row = $res->FetchRow()); + } + + function Load($file) { + if(!is_file($file)) return null; + + $data = $GLOBALS['xmlparser']->ParseFile($file); + if(!$data) return null; + + $info = $GLOBALS['xmlparser']->FindTag($data, 'info'); + if(!$info) return null; + + $name = $GLOBALS['xmlparser']->FindTag($info, 'name'); + if(!$name) return null; + if(count($name['children']) != 1) return null; + if(!is_string($name['children'][0])) return null; + $name = $name['children'][0]; + + $version = $GLOBALS['xmlparser']->FindTag($info, 'version'); + if(!$version) return null; + if(count($version['children']) != 1) return null; + if(!is_string($version['children'][0])) return null; + $version = $version['children'][0]; + + $desc = $GLOBALS['xmlparser']->FindTag($info, 'desc'); + if($desc && (count($desc['children']) == 1) && is_string($desc['children'][0])) $desc = $desc['children'][0]; + else $desc = ''; + + + $module = array('name' => $name, 'version' => $version, 'desc' => $desc, 'code' => array(), + 'pages' => array(), 'templates' => array(), 'config' => false, 'enabled' => false); + + if($GLOBALS['xmlparser']->FindTag($info, 'config')) $module['config'] = true; + + $files = $GLOBALS['xmlparser']->FindTag($data, 'files'); + if(!$files) return $module; + + foreach($files['children'] as $file) { + if(!is_array($file)) continue; + if(count($file['children']) != 1) continue; + if(!is_string($file['children'][0])) continue; + + switch($file['tag']) { + case 'page': + $type = $file['attribs']['type']; + if(!$type) $type = 'c'; + + array_push($module['pages'], $file['children'][0] . '.' . $type); + break; + case 'code': + array_push($module['code'], $file['children'][0]); + break; + case 'template': + array_push($module['templates'], $file['children'][0]); + } + } + + return $module; + } + + function Exists($name) { + return array_key_exists($name, $this->modules); + } + + function Enabled($name) { + return $this->Exists($name) && $this->modules[$name]['enabled']; + } + + function HasConfig($name) { + if(!$this->Exists($name)) return false; + + return $this->modules[$name]['config']; + } + + function Enable($name, $enable = true) { + if(!$this->Exists($name)) return false; + + if($this->Enabled($name) == $enable) return true; + + $res = $GLOBALS['db']->Execute('SELECT id FROM modules WHERE name = ?', $name); + + if($res->RecordCount()) { + $GLOBALS['db']->Execute('UPDATE modules SET enabled = ? WHERE name = ?', array(intval($enable), $name)); + + return ($GLOBALS['db']->Affected_Rows() > 0); + } + + $GLOBALS['db']->Execute('INSERT INTO modules (name, enabled) VALUES (?, ?)', array($name, intval($enable))); + + return ($GLOBALS['db']->Affected_Rows() > 0); + } + + function Disable($name) { + return $this->Enable($name, false); + } + } + + $GLOBALS['modules'] = new Modules; +?> diff --git a/core/xmlparser.inc.php b/core/xmlparser.inc.php new file mode 100644 index 0000000..0666c5a --- /dev/null +++ b/core/xmlparser.inc.php @@ -0,0 +1,95 @@ +tags = array(); + $this->depth = 0; + + $parser = xml_parser_create(); + + xml_set_object($parser, $this); + xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); + + xml_set_element_handler($parser, 'openTagHandler', 'closeTagHandler'); + xml_set_character_data_handler($parser, 'cdataHandler'); + + $file = fopen($filename, 'r'); + + while ($xml = fread($file, 4096)) { + if(!xml_parse($parser, $xml, feof($file))) { + $this->tags = null; + break; + } + } + + fclose($file); + + xml_parser_free($parser); + + return $this->tags[0]; + } + + function ParseXML($xml) { + $this->tags = array(); + $this->depth = 0; + + $parser = xml_parser_create(); + + xml_set_object($parser, $this); + xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); + + xml_set_element_handler($parser, 'openTagHandler', 'closeTagHandler'); + xml_set_character_data_handler($parser, 'cdataHandler'); + + if(!xml_parse($parser, $xml, true)) + $this->tags = null; + + xml_parser_free($parser); + + return $this->tags[0]; + } + + function FindTag($data, $tag, $start = 0) { + for($i = $start; $i < count($data['children']); $i++) { + if(!is_array($data['children'][$i])) continue; + if($data['children'][$i]['tag'] == $tag) return $data['children'][$i]; + } + } + + function openTagHandler($parser, $name, $attribs) { + $children = &$this->tags[$this->depth-1]['children']; + + $children[count($children)-1] = trim($children[count($children)-1]); + + $this->tags[$this->depth] = array('tag' => $name, + 'attribs' => $attribs, + 'children' => array()); + + $this->depth++; + } + + function closeTagHandler($parser, $name) { + $children = &$this->tags[$this->depth-1]['children']; + + $children[count($children)-1] = trim($children[count($children)-1]); + + $this->depth--; + + if($this->depth > 0) + array_push($this->tags[$this->depth-1]['children'], $this->tags[$this->depth]); + } + + function cdataHandler($parser, $data) { + $children = &$this->tags[$this->depth-1]['children']; + + if(is_string($children[count($children)-1])) + $children[count($children)-1] .= $data; + elseif(trim($data) != '') + array_push($children, $data); + } + } + + $GLOBALS['xmlparser'] = new XMLParser; +?> diff --git a/index.php b/index.php index f66ba01..ae92eaf 100644 --- a/index.php +++ b/index.php @@ -1,10 +1,10 @@ Login(Unquote($_POST['name']), Unquote($_POST['password']))) { header('Location: ' . $GLOBALS['links']->GetNeonLink($_POST['page'], null, false)); diff --git a/pages/content/Logout.xml b/pages/content/Logout.xml index 8cff751..5f2b95c 100644 --- a/pages/content/Logout.xml +++ b/pages/content/Logout.xml @@ -10,10 +10,7 @@ Logout(); diff --git a/pages/content/Modules.xml b/pages/content/Modules.xml index d6d7950..86a031b 100644 --- a/pages/content/Modules.xml +++ b/pages/content/Modules.xml @@ -10,22 +10,22 @@ Module'; $modules = array_keys($GLOBALS['modules']->modules); + unset($modules[array_search('base', $modules)]); sort($modules); foreach($modules as $module) { echo '
'; - if($GLOBALS['modules']->HasConfig($module)) - echo '

' . htmlspecialchars($module) . '

'; - else + //if($GLOBALS['modules']->HasConfig($module)) + // echo '

' . htmlspecialchars($module) . '

'; + //else echo '

' . htmlspecialchars($module) . '

'; echo htmlspecialchars($GLOBALS['modules']->modules[$module]['version']); diff --git a/pages/content/Modules:Enable.xml b/pages/content/Modules:Enable.xml index d0e2741..d12f63a 100644 --- a/pages/content/Modules:Enable.xml +++ b/pages/content/Modules:Enable.xml @@ -10,9 +10,7 @@ uid) { - require_once('code/user.inc.php'); - require_once('code/links.inc.php'); - require_once('code/util.inc.php'); - echo '
'; diff --git a/templates/default.inc.php b/templates/default.inc.php index 5ec0c75..12609c6 100644 --- a/templates/default.inc.php +++ b/templates/default.inc.php @@ -1,5 +1,5 @@