X-Git-Url: http://git.osdn.net/view?p=nucleus-jp%2Fnucleus-next.git;a=blobdiff_plain;f=install%2Findex.php;h=13fd7be1657d0444cb2171691e3f2dd85eebd918;hp=17fb9a388714f276b19b8a810e3d5a9425248f79;hb=refs%2Fheads%2Fmaster;hpb=fe4e862f6b23596d657c5228588785dfe537fb8f diff --git a/install/index.php b/install/index.php index 17fb9a3..13fd7be 100644 --- a/install/index.php +++ b/install/index.php @@ -1,3 +1,4 @@ +<<<<<<< HEAD Nucleus requires at least PHP version ' . $minimum_php_version . ''); +} + +// make sure there's no unnecessary escaping: # set_magic_quotes_runtime(0); +if ( version_compare(PHP_VERSION, '5.3.0', '<') ) +{ + ini_set('magic_quotes_runtime', '0'); +} + +/* default installed plugins and skins */ +$aConfPlugsToInstall = array('NP_SecurityEnforcer', 'NP_SkinFiles', 'NP_Medium'); +$aConfSkinsToImport = array('atom', 'rss2.0', 'rsd', 'default', 'admin/default', 'admin/bookmarklet'); + +// Check if some important files +do_check_files(); + +/* i18n class is needed for internationalization */ +include_once('../nucleus/libs/i18n.php'); +if ( !i18n::init('UTF-8', '../nucleus/locales') ) +{ + exit('
Failed to initialize iconv or mbstring extension. Would you please contact the administrator of your PHP server?
'); +} + +// include core classes that are needed for login & plugin handling + +// added for 3.5 sql_* wrapper +global $MYSQL_HANDLER; + +if ( !isset($MYSQL_HANDLER) ) +{ + $MYSQL_HANDLER = array('mysql', ''); + + // check if mysql support is installed; this check may not make sense, as is, in a version past 3.5x + if ( !function_exists('mysql_query') && !function_exists('mysqli_query') ) + { + exit('
Your PHP version does not have support for MySQL :(
'); +} +} +include_once('../nucleus/libs/sql/sql.php'); + +session_start(); +if ( count($_GET) == 0 && count($_POST) == 0 ) +{ + unset($_SESSION['param_manager']); +} + +// restore the $param from the session +if ( array_key_exists('param_manager', $_SESSION) ) +{ + $param = $_SESSION['param_manager']; +} +else +{ + $param = new ParamManager(); +} + +// include translation file +$param->set_locale(); + +do_action(); + +// $param is saved to the session +if ( isset($param) ) +{ + $_SESSION['param_manager'] = $param; +} +else +{ + unset($_SESSION['param_manager']); +} +exit; + +/** + * installer action + */ +function do_action() +{ + global $param; + + if ( array_key_exists('action', $_POST) ) + { + $isPostback = true; + } + else + { + $isPostback = false; + } + + // mode change + if ( array_key_exists('mode', $_REQUEST) ) + { + if ( $_REQUEST['mode'] == 'detail' ) + { + $param->set_state('detail'); + } + elseif ( $_REQUEST['mode'] == 'simple' ) + { + $param->set_state('mysql'); + } + } + + // input parameter check + if ( $isPostback ) + { + switch ( $param->state ) + { + case 'locale': + $param->set_state('mysql'); + $isPostback = false; + break; + case 'mysql': + if ( count($param->check_mysql_parameters()) == 0 ) + { + $param->set_state('weblog'); + $isPostback = false; + } + break; + case 'weblog': + if ( count($param->check_user_parameters()) == 0 + && count($param->check_weblog_parameters()) == 0 ) + { + $param->set_state('install'); + $isPostback = false; + } + break; + case 'detail': + if ( $param->check_all_parameters() ) + { + $param->set_state('install'); + $isPostback = false; + } + break; + } + } + + // page render + show_header(); + switch ( $param->state ) + { + case 'locale': + show_select_locale_form(); + break; + case 'mysql': + show_database_setting_form($isPostback); + break; + case 'weblog': + show_blog_setting_form($isPostback); + break; + case 'detail': + show_detail_setting_form($isPostback); + break; + case 'install': + show_install_complete_form(); + break; + } + show_footer(); +} + +/** + * header tag of the installation screens + **/ +function show_header() +{ + global $param; + + /* HTTP 1.1 application for no caching */ + header("Cache-Control: no-cache, must-revalidate"); + header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); + header('Content-Type: text/html; charset=' . i18n::get_current_charset()); +?> + + + + <?php echo _TITLE; ?> + + + + + + + + + + + +
+

+ +

+
+ +
+ +

+

+

+

+ +

+
+
+
+ +
+

+', $config_writable, ''; + } + if ( $mysql_version == '0.0.0' ) + { + echo '', _DBVERSION_UNKOWN, ''; + } + elseif ( version_compare($mysql_version, $minimum_mysql_version, '<') ) + { + echo '', sprintf(_DBVERSION_TOOLOW, $minimum_mysql_version), ''; + } +?> +

+
+
+

+

+check_mysql_parameters(); + if ( is_array($errors) ) + { + foreach ( $errors as $error ) + { + echo '', $error, "\n"; + } + } + } +?> +

+ + + + + + + + + + + + + + + + + +
+

+ + +

+

+ +

+
+
+
+ +
+

+ +

+
+
+

+

+check_weblog_parameters(); + if ( is_array($errors) ) + { + foreach ( $errors as $error ) + { + echo '', $error, "\n"; + } + } + } +?> +

+ + + + + + + + + +
+
+ +
+

+

+check_user_parameters(); + if ( is_array($errors) ) + { + foreach ( $errors as $error ) + { + echo '', $error, "\n"; + } + } + } +?> +

+ + + + + + + + + + + + + + + + + + + + + +
+

+ +

+
+
+
+ +
+

+ +check_all_parameters() ) + { + echo '', _VALID_ERROR, "\n"; + } +?> +

+ +
+ +
+

+

+check_mysql_parameters(); + if ( is_array($errors) ) + { + foreach ( $errors as $error ) + { + echo '', $error, "\n"; + } + } + } +?> +

+ + + + + + + + + + + + + + + + + + + + + +
+ +

+

+check_uri_parameters(); + if ( is_array($errors) ) + { + foreach ( $errors as $error ) + { + echo '', $error, "\n"; + } + } + $errors = $param->check_path_parameters(); + if ( is_array($errors) ) + { + foreach ( $errors as $error ) + { + echo '', $error, "\n"; + } + } + } +?> +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+ +

+ +

+

+check_user_parameters(); + if ( is_array($errors) ) + { + foreach ( $errors as $error ) + { + echo '', $error, "\n"; + } + } + } +?> +

+ + + + + + + + + + + + + + + + + + + + + +
+ +

+

+check_weblog_parameters(); + if ( is_array($errors) ) + { + foreach ( $errors as $error ) + { + echo '', $error, "\n"; + } + } + } +?> +

+ + + + + + + + + +
+ +

+ +

+ +

+ +

+
+
+
+ +
+

+ 0 ) + { + echo _INST_ERROR; + foreach ( $errors as $error ) + { + echo '', $error, "\n"; + } + } + else + { + echo _INST_TEXT; + if ( array_key_exists('config_data', $_SESSION) ) + { + echo '', _INST_TEXT4, ''; +?> + +', _INST_TEXT5, ''; + } +?> +

+
+
+

+

+ blog_name); ?> +

+

+ +

+
+ +
+

+

+ +

+

+ +

+
+ +
+

+

+ +

+

+ +

+
+
+ +
+mysql_host; + $MYSQL_USER = $param->mysql_user; + $MYSQL_PASSWORD = $param->mysql_password; + $MYSQL_DATABASE = $param->mysql_database; + $MYSQL_PREFIX = $param->mysql_tablePrefix; + + $DIR_NUCLEUS = $param->AdminPath; + $DIR_MEDIA = $param->MediaPath; + $DIR_SKINS = $param->SkinsPath; + $DIR_PLUGINS = $DIR_NUCLEUS . 'plugins/'; + $DIR_LOCALES = $DIR_NUCLEUS . 'locales/'; + $DIR_LIBS = $DIR_NUCLEUS . 'libs/'; + + /* + * 2.open mySQL connection + */ + $MYSQL_CONN = @DB::setConnectionInfo($MYSQL_HANDLER[1], $MYSQL_HOST, $MYSQL_USER, $MYSQL_PASSWORD); + if ( $MYSQL_CONN == FALSE ) + { + $errors[] = _DBCONNECT_ERROR; + return $errors; + } + + /* + * 3. try to create database if needed + */ + if ( DB::execute("CREATE DATABASE IF NOT EXISTS {$MYSQL_DATABASE}") === FALSE ) + { + $errinfo = DB::getError(); + $errors[] = _INST_ERROR1 . ': ' . $errinfo[2]; + } + + /* + * 4. try to select database + */ + $MYSQL_CONN = @DB::setConnectionInfo($MYSQL_HANDLER[1], $MYSQL_HOST, $MYSQL_USER, $MYSQL_PASSWORD, $MYSQL_DATABASE); + if ( !$MYSQL_CONN ) + { + $errors[] = _INST_ERROR2; + } + + if ( count($errors) > 0 ) + { + return $errors; + } + + /* + * 5. execute queries + */ + $table_names = array( + 'nucleus_actionlog', + 'nucleus_ban', + 'nucleus_blog', + 'nucleus_category', + 'nucleus_comment', + 'nucleus_config', + 'nucleus_item', + 'nucleus_karma', + 'nucleus_member', + 'nucleus_plugin', + 'nucleus_skin', + 'nucleus_template', + 'nucleus_team', + 'nucleus_activation', + 'nucleus_tickets' + ); + + $prefixed_table_names = array(); + foreach ( $table_names as $table_name ) + { + $prefixed_table_names[] = $MYSQL_PREFIX . $table_name; + } + + // table exists check + $result = DB::getResult('SHOW TABLES'); + foreach ( $result as $row ) + { + if ( in_array($row[0], $prefixed_table_names) ) + { + $errors[] = _INST_ERROR3; + break; + } + } + if ( count($errors) > 0 ) + { + return $errors; + } + + $filename = 'install.sql'; + $fd = fopen($filename, 'r'); + $queries = fread($fd, filesize($filename)); + fclose($fd); + + $queries = preg_split('#(;\n|;\r)#', $queries); + + foreach ( $queries as $query ) + { + if ( preg_match('/\w+/', $query) ) + { + if ( $MYSQL_PREFIX ) + { + $query = str_replace($table_names, $prefixed_table_names, $query); + } + + if ( DB::execute($query) === FALSE ) + { + $errinfo = DB::getError(); + $errors[] = _INST_ERROR4 . ' (' . $query . '): ' . $errinfo[2]; + } + } + } + + /* + * 6. put needed records + */ + /* push first post */ + $query = "INSERT INTO %s VALUES (1, %s, %s, %s, 1, 1, %s, 0, 0, 0, 1, 0, 1)"; + $query = sprintf($query, + tableName('nucleus_item'), + DB::quoteValue(_1ST_POST_TITLE), + DB::quoteValue(_1ST_POST), + DB::quoteValue(_1ST_POST2), + DB::formatDateTime() + ); + if ( DB::execute($query) === FALSE ) + { + $errinfo = DB::getError(); + $errors[] = _INST_ERROR4 . ' (' . $query . '): ' . $errinfo[2]; + } + + /* push configurations */ + array_merge($errors, updateConfig('IndexURL', $param->IndexURL)); + array_merge($errors, updateConfig('AdminURL', $param->AdminURL)); + array_merge($errors, updateConfig('MediaURL', $param->MediaURL)); + array_merge($errors, updateConfig('SkinsURL', $param->SkinsURL)); + array_merge($errors, updateConfig('PluginURL', $param->PluginURL)); + array_merge($errors, updateConfig('ActionURL', $param->ActionURL)); + array_merge($errors, updateConfig('AdminEmail', $param->user_email)); + array_merge($errors, updateConfig('SiteName', $param->blog_name)); + array_merge($errors, updateConfig('Locale', i18n::get_current_locale())); + + /* push super admin */ + $query = "UPDATE %s SET mname = %s, mrealname = %s, mpassword = %s, memail = %s, murl = %s, madmin = 1, mcanlogin = 1 WHERE mnumber = 1"; + $query = sprintf($query, + tableName('nucleus_member'), + DB::quoteValue($param->user_name), + DB::quoteValue($param->user_realname), + DB::quoteValue(md5($param->user_password)), + DB::quoteValue($param->user_email), + DB::quoteValue($param->IndexURL) + ); + if ( DB::execute($query) === FALSE ) + { + $errinfo = DB::getError(); + $errors[] = _INST_ERROR5 . ': ' . $errinfo[2]; + } + + /* push new weblog */ + $query = "UPDATE %s SET bname = %s, bshortname = %s, burl = %s WHERE bnumber = 1"; + $query = sprintf($query, + tableName('nucleus_blog'), + DB::quoteValue($param->blog_name), + DB::quoteValue($param->blog_shortname), + DB::quoteValue($param->IndexURL) + ); + if ( DB::execute($query) === FALSE ) + { + $errinfo = DB::getError(); + $errors[] = _INST_ERROR6 . ': ' . $errinfo[2]; + } + + /* push default category */ + $query = "UPDATE %s SET cname = %s, cdesc = %s WHERE catid = 1"; + $query = sprintf($query, + tableName('nucleus_category'), + DB::quoteValue(_GENERALCAT_NAME), + DB::quoteValue(_GENERALCAT_DESC) + ); + if ( DB::execute($query) === FALSE ) + { + $errinfo = DB::getError(); + $errors[] = _INST_ERROR6 . ': ' . $errinfo[2]; + } + + /* + * 7. install default plugins and skins + */ + global $aConfPlugsToInstall, $aConfSkinsToImport; + $aSkinErrors = array(); + $aPlugErrors = array(); + + if ( (count($aConfPlugsToInstall) > 0) || (count($aConfSkinsToImport) > 0) ) + { + include_once($DIR_LIBS . 'globalfunctions.php'); + global $manager; + if ( !isset($manager) ) + { + $manager = new Manager(); + } + + include_once($DIR_LIBS . 'skinie.php'); + + $aSkinErrors = installCustomSkins(); + if ( count($aSkinErrors) > 0 ) + { + array_merge($errors, $aSkinErrors); + } + + $query = "SELECT sdnumber FROM %s WHERE sdname='admin/default'"; + $query = sprintf($query, tableName('nucleus_skin_desc')); + $res = intval(DB::getValue($query)); + array_merge($errors, updateConfig('AdminSkin', $res)); + + $query = "SELECT sdnumber FROM %s WHERE sdname='admin/bookmarklet'"; + $query = sprintf($query, tableName('nucleus_skin_desc')); + $res = intval(DB::getValue($query)); + array_merge($errors, updateConfig('BookmarkletSkin', $res)); + + $query = "SELECT sdnumber FROM %s WHERE sdname='default'"; + $query = sprintf($query, tableName('nucleus_skin_desc')); + $defSkinID = intval(DB::getValue($query)); + + $query = "UPDATE %s SET bdefskin=%d WHERE bnumber=1"; + $query = sprintf($query, tableName('nucleus_blog'), $defSkinID); + DB::execute($query); + $query = "UPDATE %s SET value=%d WHERE name='BaseSkin'"; + $query = sprintf($query, tableName('nucleus_config'), $defSkinID); + DB::execute($query); + + $aPlugErrors = installCustomPlugs(); + if ( count($aPlugErrors) > 0 ) + { + array_merge($errors, $aPlugErrors); + } + } + + /* + * 8. Write config file ourselves (if possible) + */ + $config_data = '<' . '?php' . "\n"; + $config_data .= "// mySQL connection information\n"; + $config_data .= "\$MYSQL_HOST = '" . $MYSQL_HOST . "';\n"; + $config_data .= "\$MYSQL_USER = '" . $MYSQL_USER . "';\n"; + $config_data .= "\$MYSQL_PASSWORD = '" . $MYSQL_PASSWORD . "';\n"; + $config_data .= "\$MYSQL_DATABASE = '" . $MYSQL_DATABASE . "';\n"; + $config_data .= "\$MYSQL_PREFIX = '" . $MYSQL_PREFIX . "';\n"; + $config_data .= "// new in 3.50. first element is db handler, the second is the db driver used by the handler\n"; + $config_data .= "// default is \$MYSQL_HANDLER = array('mysql','mysql');\n"; + $config_data .= "//\$MYSQL_HANDLER = array('mysql','mysql');\n"; + $config_data .= "//\$MYSQL_HANDLER = array('pdo','mysql');\n"; + $config_data .= "\$MYSQL_HANDLER = array('" . $MYSQL_HANDLER[0] . "','" . $MYSQL_HANDLER[1] . "');\n"; + $config_data .= "\n"; + $config_data .= "// main nucleus directory\n"; + $config_data .= "\$DIR_NUCLEUS = '" . $DIR_NUCLEUS . "';\n"; + $config_data .= "\n"; + $config_data .= "// path to media dir\n"; + $config_data .= "\$DIR_MEDIA = '" . $DIR_MEDIA . "';\n"; + $config_data .= "\n"; + $config_data .= "// extra skin files for imported skins\n"; + $config_data .= "\$DIR_SKINS = '" . $DIR_SKINS . "';\n"; + $config_data .= "\n"; + $config_data .= "// these dirs are normally sub dirs of the nucleus dir, but \n"; + $config_data .= "// you can redefine them if you wish\n"; + $config_data .= "\$DIR_PLUGINS = \$DIR_NUCLEUS . 'plugins/';\n"; + $config_data .= "\$DIR_LOCALES = \$DIR_NUCLEUS . 'locales/';\n"; + $config_data .= "\$DIR_LIBS = \$DIR_NUCLEUS . 'libs/';\n"; + $config_data .= "\n"; + $config_data .= "// include libs\n"; + $config_data .= "include(\$DIR_LIBS.'globalfunctions.php');\n"; + $config_data .= "?" . ">"; + + $result = false; + if ( @!file_exists('../config.php') || is_writable('../config.php') ) + { + if ( $fp = @fopen('../config.php', 'w') ) + { + $result = @fwrite($fp, $config_data, i18n::strlen($config_data)); + fclose($fp); + } + } + + if ( $result ) + { + // try to change the read-only permission. + if ( strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN' ) + { + @chmod('../config.php', 0444); + } + } + else + { + $_SESSION['config_data'] = $config_data; + } + + return $errors; +} + +/** + * Confirm that you can write to the configuration file + * @return string error message + */ +function canConfigFileWritable() +{ + if ( @file_exists('../config.php') && @!is_writable('../config.php') ) + { + // try to change the read-write permission. + if ( strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN' ) + { + @chmod('../config.php', 0666); + } + + if ( @!is_writable('../config.php') ) + { + return _INST_ERROR8; + } + } + return ''; +} + +/** + * To obtain the version of MySQL + * @return string + */ +function getMySqlVersion() +{ + global $MYSQL_HANDLER, $minimum_mysql_version, $errors; + // Turn on output buffer + // Needed to repress the output of the sql function that are + // not part of php (in this case the @ operator doesn't work) + ob_start(); + + // note: this piece of code is taken from phpMyAdmin + $conn = @DB::setConnectionInfo($MYSQL_HANDLER[1], 'localhost', '', ''); + + if ( $conn ) + { + $row = DB::getAttribute(PDO::ATTR_SERVER_VERSION); + $match = preg_split('#\.#', $row); + } + else + { + $row = @DB::getRow('SHOW VARIABLES LIKE \'version\''); + + if ( $row ) + { + $match = preg_split('#\.#', $row[1]); + } + else + { + $output = (function_exists('shell_exec')) ? @shell_exec('mysql -V') : '0.0.0'; + preg_match('@[0-9]+\.[0-9]+\.[0-9]+@', $output, $version); + $match = preg_split('#\.#', $version[0]); + + if ( $match[0] == '' ) + { + $match = array('0', '0', '0'); + } + } + } + + @DB::disConnect(); + + //End and clean output buffer + ob_end_clean(); + + return implode($match, '.'); +} + +/** + * Add a table prefix if it is used + * + * @param string $input table name with prefix + * @return string + */ +function tableName($input) +{ + global $MYSQL_PREFIX; + if ( $MYSQL_PREFIX ) + { + return $MYSQL_PREFIX . $input; + } + else + { + return $input; + } +} + +/** + * Install custom plugins + */ +function installCustomPlugs() +{ + global $aConfPlugsToInstall, $DIR_LIBS, $manager; + + $aErrors = array(); + if ( count($aConfPlugsToInstall) == 0 ) + { + return $aErrors; + } + + $query = sprintf('SELECT * FROM %s', tableName('nucleus_plugin')); + $res = DB::getResult($query); + $numCurrent = $res->rowCount(); + + foreach ( $aConfPlugsToInstall as $plugName ) + { + $query = sprintf('INSERT INTO %s (porder, pfile) VALUES (%d, %s)', + tableName('nucleus_plugin'), + (++$numCurrent), + DB::quoteValue($plugName)); + DB::execute($query); + + $manager->clearCachedInfo('installedPlugins'); + $plugin =& $manager->getPlugin($plugName); + $plugin->setID($numCurrent); + + if ( !$plugin ) + { + $query = sprintf('DELETE FROM %s WHERE pfile = %s', + tableName('nucleus_plugin'), + DB::quoteValue($plugName)); + DB::execute($query); + $numCurrent--; + array_push($aErrors, sprintf(_INST_ERROR9, $plugName)); + continue; + } + $plugin->install(); + } + + $query = sprintf('DELETE FROM %s', tableName('nucleus_plugin_event')); + DB::execute($query); + $query = sprintf('SELECT pid, pfile FROM %s', tableName('nucleus_plugin')); + $res = DB::getResult($query); + + foreach ( $res as $row ) + { + $plug =& $manager->getPlugin($row['pfile']); + + if ( $plug ) + { + $eventList = $plug->getEventList(); + foreach ( $eventList as $eventName ) + { + $query = sprintf('INSERT INTO %s (pid, event) VALUES (%d, %s)', + tableName('nucleus_plugin_event'), + intval($row['pid']), + DB::quoteValue($eventName)); + DB::execute($query); + } + } + } + return $aErrors; +} + +/** + * Install custom skins + * Prepares the installation of custom skins + */ +function installCustomSkins() +{ + global $aConfSkinsToImport, $DIR_LIBS, $DIR_SKINS; + + $aErrors = array(); + if ( count($aConfSkinsToImport) == 0 ) + { + return $aErrors; + } + + $importer = new SkinImport(); + + foreach ( $aConfSkinsToImport as $skinName ) + { + $importer->reset(); + $skinFile = $DIR_SKINS . $skinName . '/skinbackup.xml'; + + if ( !@file_exists($skinFile) ) + { + array_push($aErrors, sprintf(_INST_ERROR10, $skinFile)); + continue; + } + + $error = $importer->readFile($skinFile); + + if ( $error ) + { + array_push($aErrors, sprintf(_INST_ERROR11, $skinName) . ' : ' . $error); + continue; + } + + $error = $importer->writeToDatabase(1); + + if ( $error ) + { + array_push($aErrors, sprintf(_INST_ERROR12, $skinName) . ' : ' . $error); + continue; + } + } + return $aErrors; +} + +/** + * Check if some important files of the Nucleus CMS installation are available + * Give an error if one or more files are not accessible + */ +function do_check_files() +{ + $missingfiles = array(); + $files = array( + './install.sql', + '../index.php', + '../action.php', + '../nucleus/index.php', + '../nucleus/libs/ACTION.php', + '../nucleus/libs/ACTIONLOG.php', + '../nucleus/libs/ACTIONS.php', + '../nucleus/libs/ADMIN.php', + '../nucleus/libs/BaseActions.php', + '../nucleus/libs/BLOG.php', + '../nucleus/libs/BODYACTIONS.php', + '../nucleus/libs/COMMENT.php', + '../nucleus/libs/COMMENTACTIONS.php', + '../nucleus/libs/COMMENTS.php', + '../nucleus/libs/ENTITY.php', + '../nucleus/libs/globalfunctions.php', + '../nucleus/libs/i18n.php', + '../nucleus/libs/ITEM.php', + '../nucleus/libs/ITEMACTIONS.php', + '../nucleus/libs/LINK.php', + '../nucleus/libs/MANAGER.php', + '../nucleus/libs/MEDIA.php', + '../nucleus/libs/MEMBER.php', + '../nucleus/libs/NOTIFICATION.php', + '../nucleus/libs/PARSER.php', + '../nucleus/libs/PLUGIN.php', + '../nucleus/libs/PLUGINADMIN.php', + '../nucleus/libs/SEARCH.php', + '../nucleus/libs/showlist.php', + '../nucleus/libs/SKIN.php', + '../nucleus/libs/TEMPLATE.php', + '../nucleus/libs/vars4.1.0.php', + '../nucleus/libs/xmlrpc.inc.php', + '../nucleus/libs/xmlrpcs.inc.php', + '../nucleus/libs/sql/DB.php', + '../nucleus/libs/sql/MYSQLPDO.php' + ); + + $count = count($files); + for ( $i = 0; $i < $count; $i++ ) + { + if ( !is_readable($files[$i]) ) + { + array_push($missingfiles, 'File ' . $files[$i] . ' is missing or not readable.
'); + } + } + + if ( count($missingfiles) > 0 ) + { + exit(implode("\n", $missingfiles)); + } +} + +/** + * Updates the configuration in the database + * + * @param string $name name of the config var + * @param string $value new value of the config var + * @return array + */ +function updateConfig($name, $value) +{ + $errors = array(); + + $query = "UPDATE %s SET value = %s WHERE name = %s"; + $query = sprintf($query, tableName('nucleus_config'), DB::quoteValue(trim($value)), DB::quoteValue($name)); + + if ( DB::execute($query) === FALSE ) + { + $errinfo = DB::getError(); + $errors[] = _INST_ERROR4 . ': ' . $errinfo[2]; + } + return $errors; +} + +class ParamManager +{ + /* process parameter */ + public $state; + public $locale; + + /* mysql connection parameters */ + public $mysql_host; + public $mysql_user; + public $mysql_password; + public $mysql_database; + public $mysql_tablePrefix; + + /* weblog configuration parameters */ + public $blog_name; + public $blog_shortname; + + /* member configuration parameters */ + public $user_name; + public $user_realname; + public $user_password; + private $user_password2; + public $user_email; + + /* URI parameters */ + private $root_url; + public $IndexURL; + public $AdminURL; + public $MediaURL; + public $SkinsURL; + public $PluginURL; + public $ActionURL; + + /* path parameters */ + private $root_path; + public $AdminPath; + public $MediaPath; + public $SkinsPath; + + /** + * constructor + */ + public function __construct() + { + $this->init(); + } + + public function init() + { + // set default values + $this->state = 'locale'; + $this->install_mode = 'simple'; + $this->locale = ''; + $this->mysql_host = @ini_get('mysql.default_host'); + $this->blog_name = 'My Nucleus CMS'; + $this->blog_shortname = 'mynucleuscms'; + + /* root path */ + $directory_separator = preg_quote(DIRECTORY_SEPARATOR, '|'); + $this->root_path = implode('/', preg_split("|$directory_separator|", realpath(dirname(__FILE__) . '/..'))); + if ( substr($this->root_path, -1, 1) !== '/' ) + { + $this->root_path .= '/'; + } + $base_path_pcre = preg_quote($this->root_path, '|'); + + /* current directry name */ + $directory_name = preg_replace("#{$base_path_pcre}#", '', implode('/', preg_split("#{$directory_separator}#", realpath(dirname(__FILE__))))); + $directory_name_pcre = preg_quote($directory_name, '|'); + + /* root uri */ + $root_url = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']; + $this->root_url = preg_replace("|$directory_name_pcre(.*)$|", '', $root_url); + + $this->AdminPath = $this->root_path . 'nucleus/'; + $this->MediaPath = $this->root_path . 'media/'; + $this->SkinsPath = $this->root_path . 'skins/'; + + $this->IndexURL = $this->root_url; + $this->AdminURL = $this->root_url . 'nucleus/'; + $this->MediaURL = $this->root_url . 'media/'; + $this->SkinsURL = $this->root_url . 'skins/'; + $this->PluginURL = $this->root_url . 'nucleus/plugins/'; + $this->ActionURL = $this->root_url . 'action.php'; + } + + private function read_parameter($parameter) + { + foreach ( $parameter as $element ) + { + if ( array_key_exists($element, $_POST) ) + { + $this->$element = $_POST[$element]; + } + } + } + + public function set_state($state) + { + $states = array('locale', 'mysql', 'weblog', 'detail', 'install'); + if ( in_array($state, $states) ) + { + $this->state = $state; + } + } + + public function set_locale() + { + $this->read_parameter(array('locale')); + + if ( !$this->locale ) + { + /** + * default locale select simple implementation + * + * NOTE: + * RFC2616: Hypertext Transfer Protocol -- HTTP/1.1 + * http://www.ietf.org/rfc/rfc2616.txt + * + * 14.4 Accept-Language + * + * The Accept-Language request-header field is similar to Accept, but + * restricts the set of natural languages that are preferred as a + * response to the request. Language tags are defined in section 3.10. + * + * Accept-Language = "Accept-Language" ":" + * 1#( language-range [ ";" "q" "=" qvalue ] ) + * language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" ) + * + * Each language-range MAY be given an associated quality value which + * represents an estimate of the user's preference for the languages + * specified by that range. The quality value defaults to "q=1". For + * example, + * + * Accept-Language: da, en-gb;q=0.8, en;q=0.7 + * + * would mean: "I prefer Danish, but will accept British English and + * other types of English." A language-range matches a language-tag if + * it exactly equals the tag, or if it exactly equals a prefix of the + * tag such that the first tag character following the prefix is "-". + * The special range "*", if present in the Accept-Language field, + * matches every tag not matched by any other range present in the + * Accept-Language field. + * + * TODO: this is appropriate implement or not + */ + $languages = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']); + + /* retrieve language token of language tag from first token */ + $language = ''; + if ( is_array($languages) && count($languages) > 0 ) + { + $language = preg_replace('#^([\w]+).*$#', '$1', $languages[0]); + } + + $locales = i18n::get_available_locale_list(); + foreach ( $locales as $locale ) + { + if ( i18n::strpos($locale, $language) === 0 ) + { + $this->locale = $locale; + break; + } + } + } + + /* include installer translation messages */ + $translation_file = "./locales/{$this->locale}." . i18n::get_current_charset() . '.php'; + if ( !file_exists($translation_file) ) + { + $translation_file = './locales/en_Latn_US.UTF-8.php'; + } + include($translation_file); + + /* include global translation messages */ + $translation_file = "../nucleus/locales/{$this->locale}." . i18n::get_current_charset() . '.php'; + if ( !file_exists($translation_file) ) + { + $translation_file = './locales/en_Latn_US.UTF-8.php'; + } + include($translation_file); + + i18n::set_current_locale($this->locale); + + return; + } + + public function check_mysql_parameters() + { + global $MYSQL_HANDLER; + + $parameters = array('mysql_host', 'mysql_user', 'mysql_password', 'mysql_database', 'mysql_tablePrefix'); + $this->read_parameter($parameters); + + $errors = array(); + if ( $this->mysql_host == '' ) + { + $errors[] = sprintf(_VALID_ERROR1, _DB_FIELD1); + } + + if ( $this->mysql_user == '' ) + { + $errors[] = sprintf(_VALID_ERROR1, _DB_FIELD2); + } + + if ( $this->mysql_user != '' + && !preg_match('/^[a-z0-9_\-]+$/i', $this->mysql_user) ) + { + $errors[] = sprintf(_VALID_ERROR2, _DB_FIELD2); + } + + if ( $this->mysql_database == '' ) + { + $errors[] = sprintf(_VALID_ERROR1, _DB_FIELD4); + } + + if ( $this->mysql_database != '' + && !preg_match('/^[a-z0-9_\-]+$/i', $this->mysql_database) ) + { + $errors[] = sprintf(_VALID_ERROR2, _DB_FIELD4); + } + + if ( $this->mysql_tablePrefix != '' + && !preg_match('/^[a-z0-9_]+$/i', $this->mysql_tablePrefix) ) + { + $errors[] = sprintf(_VALID_ERROR3, _DB_FIELD5); + } + + if ( count($errors) == 0 ) + { + $mysql_conn = @DB::setConnectionInfo($MYSQL_HANDLER[1], $this->mysql_host, $this->mysql_user, $this->mysql_password); + if ( $mysql_conn == false ) + { + $errors[] = _DBCONNECT_ERROR; + } + else + { + @DB::disConnect(); + } + } + + return $errors; + } + + public function check_user_parameters() + { + $parameters = array('user_name', 'user_realname', 'user_password', 'user_password2', 'user_email'); + $this->read_parameter($parameters); + + $errors = array(); + if ( $this->user_realname == '' ) + { + $errors[] = sprintf(_VALID_ERROR1, _ADMIN_FIELD1); + } + + if ( $this->user_name == '' ) + { + $errors[] = sprintf(_VALID_ERROR1, _ADMIN_FIELD2); + } + elseif ( !preg_match("/^[a-z0-9]+([ a-z0-9]*[a-z0-9]+)?$/i", $this->user_name) ) + { + $errors[] = _VALID_ERROR5; + } + + if ( $this->user_password == '' || $this->user_password2 == '' ) + { + $errors[] = sprintf(_VALID_ERROR1, _ADMIN_FIELD3); + $this->user_password = ''; + } + elseif ( $this->user_password != $this->user_password2 ) + { + $errors[] = _VALID_ERROR6; + $this->user_password = ''; + } + + if ( !preg_match("/^[a-z0-9\._+\-]+@[a-z0-9\._\-]+\.[a-z]{2,6}$/i", $this->user_email) ) + { + $errors[] = _VALID_ERROR7; + } + + return $errors; + } + + public function check_weblog_parameters() + { + $parameters = array('blog_name', 'blog_shortname'); + $this->read_parameter($parameters); + + $errors = array(); + if ( $this->blog_name == '' ) + { + $errors[] = sprintf(_VALID_ERROR1, _BLOG_FIELD1); + } + + if ( $this->blog_shortname == '' ) + { + $errors[] = sprintf(_VALID_ERROR1, _BLOG_FIELD2); + } + + if ( !preg_match("/^[a-z0-9]+$/i", $this->blog_shortname) ) + { + $errors[] = _VALID_ERROR4; + } + + return $errors; + } + + public function check_uri_parameters() + { + $parameters = array('IndexURL', 'AdminURL', 'MediaURL', 'SkinsURL', 'PluginURL', 'ActionURL'); + $this->read_parameter($parameters); + + $errors = array(); + if ( substr($this->IndexURL, -1, 1) !== '/' ) + { + $errors[] = sprintf(_VALID_ERROR8, _PATH_FIELD1); + } + + if ( substr($this->AdminURL, -1, 1) !== '/' ) + { + $errors[] = sprintf(_VALID_ERROR8, _PATH_FIELD2); + } + + if ( substr($this->MediaURL, -1, 1) !== '/' ) + { + $errors[] = sprintf(_VALID_ERROR8, _PATH_FIELD4); + } + + if ( substr($this->SkinsURL, -1, 1) !== '/' ) + { + $errors[] = sprintf(_VALID_ERROR8, _PATH_FIELD6); + } + + if ( substr($this->PluginURL, -1, 1) !== '/' ) + { + $errors[] = sprintf(_VALID_ERROR8, _PATH_FIELD8); + } + + if ( strrchr($this->ActionURL, '/') != '/action.php' ) + { + $errors[] = sprintf(_VALID_ERROR9, _PATH_FIELD9); + } + + return $errors; + } + + public function check_path_parameters() + { + $parameters = array('AdminPath', 'MediaPath', 'SkinsPath'); + $this->read_parameter($parameters); + + $separators = array('/', DIRECTORY_SEPARATOR); + $errors = array(); + if ( !in_array(substr($this->AdminPath, -1, 1), $separators) ) + { + $errors[] = sprintf(_VALID_ERROR10, _PATH_FIELD3); + } + elseif ( !file_exists($this->AdminPath) ) + { + $errors[] = sprintf(_VALID_ERROR11, _PATH_FIELD3); + } + + if ( !in_array(substr($this->MediaPath, -1, 1), $separators) ) + { + $errors[] = sprintf(_VALID_ERROR10, _PATH_FIELD5); + } + elseif ( !file_exists($this->MediaPath) ) + { + $errors[] = sprintf(_VALID_ERROR11, _PATH_FIELD5); + } + + if ( !in_array(substr($this->SkinsPath, -1, 1), $separators) ) + { + $errors[] = sprintf(_VALID_ERROR10, _PATH_FIELD7); + } + elseif ( !file_exists($this->SkinsPath) ) + { + $errors[] = sprintf(_VALID_ERROR11, _PATH_FIELD7); + } + + return $errors; + } + + /** + * check all parameters + * @return bool + */ + public function check_all_parameters() + { + $this->set_locale(); + + $isValid = true; + $isValid &= (count($this->check_mysql_parameters()) == 0); + $isValid &= (count($this->check_user_parameters()) == 0); + $isValid &= (count($this->check_weblog_parameters()) == 0); + $isValid &= (count($this->check_uri_parameters()) == 0); + $isValid &= (count($this->check_path_parameters()) == 0); + + return $isValid; + } +} +>>>>>>> skinnable-master