From 7bb0ade5081b7807f17e3750db4bedafe6a833b7 Mon Sep 17 00:00:00 2001 From: rurban Date: Thu, 4 Jan 2007 16:43:09 +0000 Subject: [PATCH] Changed to class Upgrade: Do not pollute our namespace with global functions. Less arguments needed. Fix missing permissions on wrong DBADMIN_USER. Let user input override the wrong constant. git-svn-id: svn://svn.code.sf.net/p/phpwiki/code/trunk@5390 96ab9672-09ca-45d6-a79d-3d69d39ca109 --- lib/upgrade.php | 1600 ++++++++++++++++++++++++----------------------- 1 file changed, 809 insertions(+), 791 deletions(-) diff --git a/lib/upgrade.php b/lib/upgrade.php index 5a5a5c529..d9f1c653a 100644 --- a/lib/upgrade.php +++ b/lib/upgrade.php @@ -1,7 +1,7 @@ getDbh(); - $page = $dbi->getPage($pagename); - if ($page->exists()) { - // check mtime: update automatically if pgsrc is newer - $rev = $page->getCurrentRevision(); - $page_mtime = $rev->get('mtime'); - $data = implode("", file($path."/".$filename)); - if (($parts = ParseMimeifiedPages($data))) { - usort($parts, 'SortByPageVersion'); - reset($parts); - $pageinfo = $parts[0]; - $stat = stat($path."/".$filename); - $new_mtime = @$pageinfo['versiondata']['mtime']; - if (!$new_mtime) - $new_mtime = @$pageinfo['versiondata']['lastmodified']; - if (!$new_mtime) - $new_mtime = @$pageinfo['pagedata']['date']; - if (!$new_mtime) - $new_mtime = $stat[9]; - if ($new_mtime > $page_mtime) { - echo "$path/$pagename: ",_("newer than the existing page."), - _(" replace "),"($new_mtime > $page_mtime)","
\n"; - LoadAny($request,$path."/".$filename); - echo "
\n"; - } else { - echo "$path/$pagename: ",_("older than the existing page."), - _(" skipped"),".
\n"; - } - } else { - echo "$path/$pagename: ",("unknown format."), +class Upgrade { + + function Upgrade (&$request) { + $this->request =& $request; + $this->dbi =& $request->_dbi; // no reference for dbadmin ? + } + + /** + * TODO: check for the pgsrc_version number, not the revision mtime only + */ + function doPgsrcUpdate($pagename,$path,$filename) { + $page = $this->dbi->getPage($pagename); + if ($page->exists()) { + // check mtime: update automatically if pgsrc is newer + $rev = $page->getCurrentRevision(); + $page_mtime = $rev->get('mtime'); + $data = implode("", file($path."/".$filename)); + if (($parts = ParseMimeifiedPages($data))) { + usort($parts, 'SortByPageVersion'); + reset($parts); + $pageinfo = $parts[0]; + $stat = stat($path."/".$filename); + $new_mtime = @$pageinfo['versiondata']['mtime']; + if (!$new_mtime) + $new_mtime = @$pageinfo['versiondata']['lastmodified']; + if (!$new_mtime) + $new_mtime = @$pageinfo['pagedata']['date']; + if (!$new_mtime) + $new_mtime = $stat[9]; + if ($new_mtime > $page_mtime) { + echo "$path/$pagename: ",_("newer than the existing page."), + _(" replace "),"($new_mtime > $page_mtime)","
\n"; + LoadAny($this->request, $path."/".$filename); + echo "
\n"; + } else { + echo "$path/$pagename: ",_("older than the existing page."), + _(" skipped"),".
\n"; + } + } else { + echo "$path/$pagename: ",("unknown format."), _(" skipped"),".
\n"; - } - } else { - echo sprintf(_("%s does not exist"),$pagename),"
\n"; - LoadAny($request,$path."/".$filename); - echo "
\n"; + } + } else { + echo sprintf(_("%s does not exist"),$pagename),"
\n"; + LoadAny($this->request, $path."/".$filename); + echo "
\n"; + } } -} -/** Need the english filename (required precondition: urlencode == urldecode). - * Returns the plugin name. - */ -function isActionPage($filename) { - static $special = array("DebugInfo" => "_BackendInfo", - "PhpWikiRecentChanges" => "RssFeed", - "ProjectSummary" => "RssFeed", - "RecentReleases" => "RssFeed", - "InterWikiMap" => "InterWikiMap", - ); - $base = preg_replace("/\..{1,4}$/","",basename($filename)); - if (isset($special[$base])) return $special[$base]; - if (FindFile("lib/plugin/".$base.".php",true)) return $base; - else return false; -} + /** + * If a matching pgsrc => pluginname exists + * Need the english filename (required precondition: urlencode == urldecode). + * Returns the plugin name. + */ + function isActionPage($filename) { + static $special = array("DebugInfo" => "_BackendInfo", + "PhpWikiRecentChanges" => "RssFeed", + "ProjectSummary" => "RssFeed", + "RecentReleases" => "RssFeed", + "InterWikiMap" => "InterWikiMap", + ); + $base = preg_replace("/\..{1,4}$/","",basename($filename)); + if (isset($special[$base])) return $special[$base]; + if (FindFile("lib/plugin/".$base.".php",true)) return $base; + else return false; + } -function CheckActionPageUpdate(&$request) { - echo "

",sprintf(_("check for necessary %s updates"), - _("ActionPage")),"

\n"; - $dbi = $request->getDbh(); - // 1.3.13 before we pull in all missing pages, we rename existing ones - _rename_page_helper($dbi, _("_AuthInfo"), _("DebugAuthInfo")); - // this is in some templates. so we keep the old name - //_rename_page_helper($dbi, _("DebugInfo"), _("DebugBackendInfo")); - _rename_page_helper($dbi, _("_GroupInfo"), _("GroupAuthInfo")); //never officially existed - _rename_page_helper($dbi, "InterWikiKarte", "InterWikiListe"); // german only + function CheckActionPageUpdate() { + echo "

",sprintf(_("check for necessary %s updates"), + _("ActionPage")),"

\n"; + // 1.3.13 before we pull in all missing pages, we rename existing ones + $this->_rename_page_helper(_("_AuthInfo"), _("DebugAuthInfo")); + // this is in some templates. so we keep the old name + //$this->_rename_page_helper($this->dbi, _("DebugInfo"), _("DebugBackendInfo")); + $this->_rename_page_helper(_("_GroupInfo"), _("GroupAuthInfo")); //never officially existed + $this->_rename_page_helper("InterWikiKarte", "InterWikiListe"); // german only - $path = FindFile('pgsrc'); - $pgsrc = new fileSet($path); - // most actionpages have the same name as the plugin - $loc_path = FindLocalizedFile('pgsrc'); - foreach ($pgsrc->getFiles() as $filename) { - if (substr($filename,-1,1) == '~') continue; - if (substr($filename,-5,5) == '.orig') continue; - $pagename = urldecode($filename); - if (isActionPage($filename)) { - $translation = gettext($pagename); - if ($translation == $pagename) - doPgsrcUpdate($request, $pagename, $path, $filename); - elseif (FindLocalizedFile('pgsrc/'.urlencode($translation),1)) - doPgsrcUpdate($request, $translation, $loc_path, - urlencode($translation)); - else - doPgsrcUpdate($request, $pagename, $path, $filename); - } + $path = FindFile('pgsrc'); + $pgsrc = new fileSet($path); + // most actionpages have the same name as the plugin + $loc_path = FindLocalizedFile('pgsrc'); + foreach ($pgsrc->getFiles() as $filename) { + if (substr($filename,-1,1) == '~') continue; + if (substr($filename,-5,5) == '.orig') continue; + $pagename = urldecode($filename); + if ($this->isActionPage($filename)) { + $translation = gettext($pagename); + if ($translation == $pagename) + $this->doPgsrcUpdate($pagename, $path, $filename); + elseif (FindLocalizedFile('pgsrc/'.urlencode($translation),1)) + $this->doPgsrcUpdate($translation, $loc_path, urlencode($translation)); + else + $this->doPgsrcUpdate($pagename, $path, $filename); + } + } } -} -// see loadsave.php for saving new pages. -function CheckPgsrcUpdate(&$request) { - echo "

",sprintf(_("check for necessary %s updates"), - "pgsrc"),"

\n"; - $dbi = $request->getDbh(); - if ($dbi->get_db_version() < 1030.12200612) { - echo "

",_("rename to Help: pages"),"

\n"; - } - $path = FindLocalizedFile(WIKI_PGSRC); - $pgsrc = new fileSet($path); - // fixme: verification, ... - $isHomePage = false; - foreach ($pgsrc->getFiles() as $filename) { - if (substr($filename,-1,1) == '~') continue; - if (substr($filename,-5,5) == '.orig') continue; - $pagename = urldecode($filename); - // don't ever update the HomePage - if (defined(HOME_PAGE)) - if ($pagename == HOME_PAGE) $isHomePage = true; - else - if ($pagename == _("HomePage")) $isHomePage = true; - if ($pagename == "HomePage") $isHomePage = true; - if ($isHomePage) { - echo "$path/$pagename: ",_("always skip the HomePage."), - _(" skipped"),".
\n"; - $isHomePage = false; - continue; - } - if (!isActionPage($filename)) { - // There're a lot of now unneeded pages around. - // At first rename the BlaPlugin pages to Help/ and then to the update. - if ($dbi->get_db_version() < 1030.12200612) { - _rename_to_help_page($dbi, $pagename); - } - doPgsrcUpdate($request,$pagename,$path,$filename); - } + // see loadsave.php for saving new pages. + function CheckPgsrcUpdate() { + echo "

",sprintf(_("check for necessary %s updates"), + "pgsrc"),"

\n"; + if ($this->dbi->get_db_version() < 1030.12200612) { + echo "

",_("rename to Help: pages"),"

\n"; + } + $path = FindLocalizedFile(WIKI_PGSRC); + $pgsrc = new fileSet($path); + // fixme: verification, ... + $isHomePage = false; + foreach ($pgsrc->getFiles() as $filename) { + if (substr($filename,-1,1) == '~') continue; + if (substr($filename,-5,5) == '.orig') continue; + $pagename = urldecode($filename); + // don't ever update the HomePage + if (defined(HOME_PAGE)) + if ($pagename == HOME_PAGE) $isHomePage = true; + else + if ($pagename == _("HomePage")) $isHomePage = true; + if ($pagename == "HomePage") $isHomePage = true; + if ($isHomePage) { + echo "$path/$pagename: ",_("always skip the HomePage."), + _(" skipped"),".
\n"; + $isHomePage = false; + continue; + } + if (!$this->isActionPage($filename)) { + // There're a lot of now unneeded pages around. + // At first rename the BlaPlugin pages to Help/ and then to the update. + if ($this->dbi->get_db_version() < 1030.12200612) { + $this->_rename_to_help_page($pagename); + } + $this->doPgsrcUpdate($pagename,$path,$filename); + } + } + return; } - return; -} -function _rename_page_helper(&$dbi, $oldname, $pagename) { - echo sprintf(_("rename %s to %s"), $oldname, $pagename)," ..."; - if ($dbi->isWikiPage($oldname) and !$dbi->isWikiPage($pagename)) { - if ($dbi->_backend->rename_page($oldname, $pagename)) - echo _("OK"),"
\n"; - else - echo " ", _("FAILED"), "", - "
\n"; - } else { - echo _(" skipped"),"
\n"; + function _rename_page_helper($oldname, $pagename) { + echo sprintf(_("rename %s to %s"), $oldname, $pagename)," ..."; + if ($this->dbi->isWikiPage($oldname) and !$this->dbi->isWikiPage($pagename)) { + if ($this->dbi->_backend->rename_page($oldname, $pagename)) + echo _("OK"),"
\n"; + else + echo " ", _("FAILED"), "", + "
\n"; + } else { + echo _(" skipped"),"
\n"; + } } -} -function _rename_to_help_page($dbi, $pagename) { - $newprefix = _("Help") . "/"; - if (substr($pagename,0,strlen($newprefix)) != $newprefix) return; - $oldname = substr($pagename,strlen($newprefix)); - _rename_page_helper($dbi, $oldname, $pagename); -} - -/** - * TODO: Search table definition in appropriate schema - * and create it. - * Supported: mysql and generic SQL, for ADODB and PearDB. - */ -function installTable(&$dbh, $table, $backend_type) { - global $DBParams; - if (!$dbh->_backend->isSQL()) return; - echo _("MISSING")," ... \n"; - $backend = &$dbh->_backend->_dbh; - /* - $schema = findFile("schemas/${backend_type}.sql"); - if (!$schema) { - echo " ",_("FAILED"),": ",sprintf(_("no schema %s found"), - "schemas/${backend_type}.sql")," ...
\n"; - return false; + function _rename_to_help_page($pagename) { + $newprefix = _("Help") . "/"; + if (substr($pagename,0,strlen($newprefix)) != $newprefix) return; + $oldname = substr($pagename,strlen($newprefix)); + $this->_rename_page_helper($oldname, $pagename); } - */ - extract($dbh->_backend->_table_names); - $prefix = isset($DBParams['prefix']) ? $DBParams['prefix'] : ''; - switch ($table) { - case 'session': - assert($session_tbl); - if ($backend_type == 'mysql') { - $dbh->genericSqlQuery(" + + /** + * TODO: Search table definition in appropriate schema + * and create it. + * Supported: mysql and generic SQL, for ADODB and PearDB. + */ + function installTable($table, $backend_type) { + global $DBParams; + if (!$this->dbi->_backend->isSQL()) return; + echo _("MISSING")," ... \n"; + $backend = &$this->dbi->_backend->_dbh; + /* + $schema = findFile("schemas/${backend_type}.sql"); + if (!$schema) { + echo " ",_("FAILED"),": ",sprintf(_("no schema %s found"), + "schemas/${backend_type}.sql")," ...
\n"; + return false; + } + */ + extract($this->dbi->_backend->_table_names); + $prefix = isset($DBParams['prefix']) ? $DBParams['prefix'] : ''; + switch ($table) { + case 'session': + assert($session_tbl); + if ($backend_type == 'mysql') { + $this->dbi->genericSqlQuery(" CREATE TABLE $session_tbl ( sess_id CHAR(32) NOT NULL DEFAULT '', sess_data BLOB NOT NULL, @@ -233,63 +238,63 @@ CREATE TABLE $session_tbl ( PRIMARY KEY (sess_id), INDEX (sess_date) )"); - } else { - $dbh->genericSqlQuery(" + } else { + $this->dbi->genericSqlQuery(" CREATE TABLE $session_tbl ( sess_id CHAR(32) NOT NULL DEFAULT '', sess_data ".($backend_type == 'pgsql'?'TEXT':'BLOB')." NOT NULL, sess_date INT, sess_ip CHAR(15) NOT NULL )"); - $dbh->genericSqlQuery("CREATE UNIQUE INDEX sess_id ON $session_tbl (sess_id)"); - } - $dbh->genericSqlQuery("CREATE INDEX sess_date on session (sess_date)"); - echo " ",_("CREATED"); - break; - case 'pref': - $pref_tbl = $prefix.'pref'; - if ($backend_type == 'mysql') { - $dbh->genericSqlQuery(" + $this->dbi->genericSqlQuery("CREATE UNIQUE INDEX sess_id ON $session_tbl (sess_id)"); + } + $this->dbi->genericSqlQuery("CREATE INDEX sess_date on session (sess_date)"); + echo " ",_("CREATED"); + break; + case 'pref': + $pref_tbl = $prefix.'pref'; + if ($backend_type == 'mysql') { + $this->dbi->genericSqlQuery(" CREATE TABLE $pref_tbl ( userid CHAR(48) BINARY NOT NULL UNIQUE, prefs TEXT NULL DEFAULT '', PRIMARY KEY (userid) )"); - } else { - $dbh->genericSqlQuery(" + } else { + $this->dbi->genericSqlQuery(" CREATE TABLE $pref_tbl ( userid CHAR(48) NOT NULL, prefs TEXT NULL DEFAULT '' )"); - $dbh->genericSqlQuery("CREATE UNIQUE INDEX userid ON $pref_tbl (userid)"); - } - echo " ",_("CREATED"); - break; - case 'member': - $member_tbl = $prefix.'member'; - if ($backend_type == 'mysql') { - $dbh->genericSqlQuery(" + $this->dbi->genericSqlQuery("CREATE UNIQUE INDEX userid ON $pref_tbl (userid)"); + } + echo " ",_("CREATED"); + break; + case 'member': + $member_tbl = $prefix.'member'; + if ($backend_type == 'mysql') { + $this->dbi->genericSqlQuery(" CREATE TABLE $member_tbl ( userid CHAR(48) BINARY NOT NULL, groupname CHAR(48) BINARY NOT NULL DEFAULT 'users', INDEX (userid), INDEX (groupname) )"); - } else { - $dbh->genericSqlQuery(" + } else { + $this->dbi->genericSqlQuery(" CREATE TABLE $member_tbl ( userid CHAR(48) NOT NULL, groupname CHAR(48) NOT NULL DEFAULT 'users' )"); - $dbh->genericSqlQuery("CREATE INDEX userid ON $member_tbl (userid)"); - $dbh->genericSqlQuery("CREATE INDEX groupname ON $member_tbl (groupname)"); - } - echo " ",_("CREATED"); - break; - case 'rating': - $rating_tbl = $prefix.'rating'; - if ($backend_type == 'mysql') { - $dbh->genericSqlQuery(" + $this->dbi->genericSqlQuery("CREATE INDEX userid ON $member_tbl (userid)"); + $this->dbi->genericSqlQuery("CREATE INDEX groupname ON $member_tbl (groupname)"); + } + echo " ",_("CREATED"); + break; + case 'rating': + $rating_tbl = $prefix.'rating'; + if ($backend_type == 'mysql') { + $this->dbi->genericSqlQuery(" CREATE TABLE $rating_tbl ( dimension INT(4) NOT NULL, raterpage INT(11) NOT NULL, @@ -299,8 +304,8 @@ CREATE TABLE $rating_tbl ( tstamp TIMESTAMP(14) NOT NULL, PRIMARY KEY (dimension, raterpage, rateepage) )"); - } else { - $dbh->genericSqlQuery(" + } else { + $this->dbi->genericSqlQuery(" CREATE TABLE $rating_tbl ( dimension INT(4) NOT NULL, raterpage INT(11) NOT NULL, @@ -309,38 +314,38 @@ CREATE TABLE $rating_tbl ( rateeversion INT(11) NOT NULL, tstamp TIMESTAMP(14) NOT NULL )"); - $dbh->genericSqlQuery("CREATE UNIQUE INDEX rating" - ." ON $rating_tbl (dimension, raterpage, rateepage)"); - } - echo " ",_("CREATED"); - break; - case 'accesslog': - $log_tbl = $prefix.'accesslog'; - // fields according to http://www.outoforder.cc/projects/apache/mod_log_sql/docs-2.0/#id2756178 - /* -A User Agent agent varchar(255) Mozilla/4.0 (compat; MSIE 6.0; Windows) -a CGi request arguments request_args varchar(255) user=Smith&cart=1231&item=532 -b Bytes transfered bytes_sent int unsigned 32561 -c??? Text of cookie cookie varchar(255) Apache=sdyn.fooonline.net 1300102700823 -f Local filename requested request_file varchar(255) /var/www/html/books-cycroad.html -H HTTP request_protocol request_protocol varchar(10) HTTP/1.1 -h Name of remote host remote_host varchar(50) blah.foobar.com -I Request ID (from modd_unique_id) id char(19) POlFcUBRH30AAALdBG8 -l Ident user info remote_logname varcgar(50) bobby -M Machine ID??? machine_id varchar(25) web01 -m HTTP request method request_method varchar(10) GET -P httpd cchild PID child_pid smallint unsigned 3215 -p http port server_port smallint unsigned 80 -R Referer referer varchar(255) http://www.biglinks4u.com/linkpage.html -r Request in full form request_line varchar(255) GET /books-cycroad.html HTTP/1.1 -S Time of request in UNIX time_t format time_stamp int unsigned 1005598029 -T Seconds to service request request_duration smallint unsigned 2 -t Time of request in human format request_time char(28) [02/Dec/2001:15:01:26 -0800] -U Request in simple form request_uri varchar(255) /books-cycroad.html -u User info from HTTP auth remote_user varchar(50) bobby -v Virtual host servicing the request virtual_host varchar(255) - */ - $dbh->genericSqlQuery(" + $this->dbi->genericSqlQuery("CREATE UNIQUE INDEX rating" + ." ON $rating_tbl (dimension, raterpage, rateepage)"); + } + echo " ",_("CREATED"); + break; + case 'accesslog': + $log_tbl = $prefix.'accesslog'; + // fields according to http://www.outoforder.cc/projects/apache/mod_log_sql/docs-2.0/#id2756178 + /* + A User Agent agent varchar(255) Mozilla/4.0 (compat; MSIE 6.0; Windows) + a CGi request arguments request_args varchar(255) user=Smith&cart=1231&item=532 + b Bytes transfered bytes_sent int unsigned 32561 + c??? Text of cookie cookie varchar(255) Apache=sdyn.fooonline.net 1300102700823 + f Local filename requested request_file varchar(255) /var/www/html/books-cycroad.html + H HTTP request_protocol request_protocol varchar(10) HTTP/1.1 + h Name of remote host remote_host varchar(50) blah.foobar.com + I Request ID (from modd_unique_id) id char(19) POlFcUBRH30AAALdBG8 + l Ident user info remote_logname varcgar(50) bobby + M Machine ID??? machine_id varchar(25) web01 + m HTTP request method request_method varchar(10) GET + P httpd cchild PID child_pid smallint unsigned 3215 + p http port server_port smallint unsigned 80 + R Referer referer varchar(255) http://www.biglinks4u.com/linkpage.html + r Request in full form request_line varchar(255) GET /books-cycroad.html HTTP/1.1 + S Time of request in UNIX time_t format time_stamp int unsigned 1005598029 + T Seconds to service request request_duration smallint unsigned 2 + t Time of request in human format request_time char(28) [02/Dec/2001:15:01:26 -0800] + U Request in simple form request_uri varchar(255) /books-cycroad.html + u User info from HTTP auth remote_user varchar(50) bobby + v Virtual host servicing the request virtual_host varchar(255) + */ + $this->dbi->genericSqlQuery(" CREATE TABLE $log_tbl ( time_stamp int unsigned, remote_host varchar(100), @@ -356,589 +361,606 @@ CREATE TABLE $log_tbl ( agent varchar(255), request_duration float )"); - $dbh->genericSqlQuery("CREATE INDEX log_time ON $log_tbl (time_stamp)"); - $dbh->genericSqlQuery("CREATE INDEX log_host ON $log_tbl (remote_host)"); - echo " ",_("CREATED"); - break; + $this->dbi->genericSqlQuery("CREATE INDEX log_time ON $log_tbl (time_stamp)"); + $this->dbi->genericSqlQuery("CREATE INDEX log_host ON $log_tbl (remote_host)"); + echo " ",_("CREATED"); + break; + } + echo "
\n"; } - echo "
\n"; -} -/** - * Update from ~1.3.4 to current. - * tables: Only session, user, pref and member - * jeffs-hacks database api (around 1.3.2) later: - * people should export/import their pages if using that old versions. - */ -function CheckDatabaseUpdate(&$request) { - global $DBAuthParams; - $dbh = $request->getDbh(); - - echo "

",sprintf(_("check for necessary %s updates"), - _("database")), - " - ", DATABASE_TYPE,"

\n"; - $dbadmin = $request->getArg('dbadmin'); - if ($dbh->_backend->isSQL()) { - _upgrade_db_init($dbh); - if (isset($dbadmin['cancel'])) { - echo _("CANCEL"),"
\n"; - return; + /** + * Update from ~1.3.4 to current. + * tables: Only session, user, pref and member + * jeffs-hacks database api (around 1.3.2) later: + * people should export/import their pages if using that old versions. + */ + function CheckDatabaseUpdate() { + global $DBAuthParams; + + echo "

",sprintf(_("check for necessary %s updates"), + _("database")), + " - ", DATABASE_TYPE,"

\n"; + $dbadmin = $this->request->getArg('dbadmin'); + if ($this->dbi->_backend->isSQL()) { + $this->_db_init(); + if (isset($dbadmin['cancel'])) { + echo _("CANCEL"),"
\n"; + return; + } + } + + if ($this->dbi->_backend->isSQL()) { + $backend_type = $this->dbi->_backend->backendType(); + echo "

",_("Backend type: "),$backend_type,"

\n"; + $prefix = isset($DBParams['prefix']) ? $DBParams['prefix'] : ''; + $tables = $this->dbi->_backend->listOfTables(); + foreach (explode(':','session:pref:member') as $table) { + echo sprintf(_("check for table %s"), $table)," ..."; + if (!in_array($prefix.$table, $tables)) { + $this->installTable($table, $backend_type); + } else { + echo _("OK"),"
\n"; + } + } + } + + if (phpwiki_version() >= 1030.12200612 and $this->dbi->get_db_version() < 1030.13) { + //if ($this->dbi->_backend->isSQL() and preg_match("/(pgsql|postgres)/", $backend_type)) + // $this->_upgrade_psql_tsearch2(); + $this->_upgrade_relation_links(); } - } - if ($dbh->_backend->isSQL()) { - $backend_type = $dbh->_backend->backendType(); - echo "

",_("Backend type: "),$backend_type,"

\n"; - $prefix = isset($DBParams['prefix']) ? $DBParams['prefix'] : ''; - $tables = $dbh->_backend->listOfTables(); - foreach (explode(':','session:pref:member') as $table) { + if (!$this->dbi->_backend->isSQL()) return; + + if (ACCESS_LOG_SQL) { + $table = "accesslog"; echo sprintf(_("check for table %s"), $table)," ..."; if (!in_array($prefix.$table, $tables)) { - installTable($dbh, $table, $backend_type); + $this->installTable($table, $backend_type); } else { echo _("OK"),"
\n"; } } - } + if ((class_exists("RatingsUserFactory") or $this->dbi->isWikiPage(_("RateIt")))) { + $table = "rating"; + echo sprintf(_("check for table %s"), $table)," ..."; + if (!in_array($prefix.$table, $tables)) { + $this->installTable($table, $backend_type); + } else { + echo _("OK"),"
\n"; + } + } + $backend = &$this->dbi->_backend->_dbh; + extract($this->dbi->_backend->_table_names); + + // 1.3.8 added session.sess_ip + if (phpwiki_version() >= 1030.08 and USE_DB_SESSION and isset($this->request->_dbsession)) { + echo _("check for new session.sess_ip column")," ... "; + $database = $this->dbi->_backend->database(); + assert(!empty($DBParams['db_session_table'])); + $session_tbl = $prefix . $DBParams['db_session_table']; + $sess_fields = $this->dbi->_backend->listOfFields($database, $session_tbl); + if (!$sess_fields) { + echo _("SKIP"); + } elseif (!strstr(strtolower(join(':', $sess_fields)), "sess_ip")) { + // TODO: postgres test (should be able to add columns at the end, but not in between) + echo "",_("ADDING"),""," ... "; + $this->dbi->genericSqlQuery("ALTER TABLE $session_tbl ADD sess_ip CHAR(15) NOT NULL"); + $this->dbi->genericSqlQuery("CREATE INDEX sess_date ON $session_tbl (sess_date)"); + } else { + echo _("OK"); + } + echo "
\n"; + if (substr($backend_type,0,5) == 'mysql') { + // upgrade to 4.1.8 destroyed my session table: + // sess_id => varchar(10), sess_data => varchar(5). For others obviously also. + echo _("check for mysql session.sess_id sanity")," ... "; + $result = $this->dbi->genericSqlQuery("DESCRIBE $session_tbl"); + if (DATABASE_TYPE == 'SQL') { + $iter = new WikiDB_backend_PearDB_generic_iter($backend, $result); + } elseif (DATABASE_TYPE == 'ADODB') { + $iter = new WikiDB_backend_ADODB_generic_iter($backend, $result, + array("Field", "Type", "Null", "Key", "Default", "Extra")); + } elseif (DATABASE_TYPE == 'PDO') { + $iter = new WikiDB_backend_PDO_generic_iter($backend, $result); + } + while ($col = $iter->next()) { + if ($col["Field"] == 'sess_id' and !strstr(strtolower($col["Type"]), 'char(32)')) { + $this->dbi->genericSqlQuery("ALTER TABLE $session_tbl CHANGE sess_id" + ." sess_id CHAR(32) NOT NULL"); + echo "sess_id ", $col["Type"], " ", _("fixed"), " => CHAR(32) "; + } + if ($col["Field"] == 'sess_ip' and !strstr(strtolower($col["Type"]), 'char(15)')) { + $this->dbi->genericSqlQuery("ALTER TABLE $session_tbl CHANGE sess_ip" + ." sess_ip CHAR(15) NOT NULL"); + echo "sess_ip ", $col["Type"], " ", _("fixed"), " => CHAR(15) "; + } + } + echo _("OK"), "
\n"; + } + } - if (phpwiki_version() >= 1030.12200612 and $dbh->get_db_version() < 1030.13) { - if ($dbh->_backend->isSQL() - and preg_match("/(pgsql|postgres)/", $backend_type)) - _upgrade_psql_tsearch2($dbh); - _upgrade_relation_links($dbh); - } + /* TODO: + ALTER TABLE link ADD relation INT DEFAULT 0; + CREATE INDEX linkrelation ON link (relation); + */ + + // mysql >= 4.0.4 requires LOCK TABLE privileges + if (substr($backend_type,0,5) == 'mysql') { + echo _("check for mysql LOCK TABLE privilege")," ..."; + $mysql_version = $this->dbi->_backend->_serverinfo['version']; + if ($mysql_version > 400.40) { + if (!empty($this->dbi->_backend->_parsedDSN)) + $parseDSN = $this->dbi->_backend->_parsedDSN; + elseif (function_exists('parseDSN')) // ADODB or PDO + $parseDSN = parseDSN($DBParams['dsn']); + else // pear + $parseDSN = DB::parseDSN($DBParams['dsn']); + $username = $this->dbi->_backend->qstr($parseDSN['username']); + // on db level + $query = "SELECT lock_tables_priv FROM mysql.db WHERE user='$username'"; + //mysql_select_db("mysql", $this->dbi->_backend->connection()); + $db_fields = $this->dbi->_backend->listOfFields("mysql", "db"); + if (!strstr(strtolower(join(':', $db_fields)), "lock_tables_priv")) { + echo join(':', $db_fields); + die("lock_tables_priv missing. The DB Admin must run mysql_fix_privilege_tables"); + } + $row = $this->dbi->_backend->getRow($query); + if (isset($row[0]) and $row[0] == 'N') { + $this->dbi->genericSqlQuery("UPDATE mysql.db SET lock_tables_priv='Y'" + ." WHERE mysql.user='$username'"); + $this->dbi->genericSqlQuery("FLUSH PRIVILEGES"); + echo "mysql.db user='$username'", _("fixed"), "
\n"; + } elseif (!$row) { + // or on user level + $query = "SELECT lock_tables_priv FROM mysql.user WHERE user='$username'"; + $row = $this->dbi->_backend->getRow($query); + if ($row and $row[0] == 'N') { + $this->dbi->genericSqlQuery("UPDATE mysql.user SET lock_tables_priv='Y'" + ." WHERE mysql.user='$username'"); + $this->dbi->genericSqlQuery("FLUSH PRIVILEGES"); + echo "mysql.user user='$username'", _("fixed"), "
\n"; + } elseif (!$row) { + echo " ", _("FAILED"), ": ", + "Neither mysql.db nor mysql.user has a user='$username'" + ." or the lock_tables_priv field", + "
\n"; + } else { + echo _("OK"), "
\n"; + } + } else { + echo _("OK"), "
\n"; + } + //mysql_select_db($this->dbi->_backend->database(), $this->dbi->_backend->connection()); + } else { + echo sprintf(_("version %s not affected"), $mysql_version),"
\n"; + } + } - if (!$dbh->_backend->isSQL()) return; + // 1.3.10 mysql requires page.id auto_increment + // mysql, mysqli or mysqlt + if (phpwiki_version() >= 1030.099 and substr($backend_type,0,5) == 'mysql' + and DATABASE_TYPE != 'PDO') + { + echo _("check for mysql page.id auto_increment flag")," ..."; + assert(!empty($page_tbl)); + $database = $this->dbi->_backend->database(); + $fields = mysql_list_fields($database, $page_tbl, $this->dbi->_backend->connection()); + $columns = mysql_num_fields($fields); + for ($i = 0; $i < $columns; $i++) { + if (mysql_field_name($fields, $i) == 'id') { + $flags = mysql_field_flags($fields, $i); + //DONE: something was wrong with ADODB here. + if (!strstr(strtolower($flags), "auto_increment")) { + echo "",_("ADDING"),""," ... "; + // MODIFY col_def valid since mysql 3.22.16, + // older mysql's need CHANGE old_col col_def + $this->dbi->genericSqlQuery("ALTER TABLE $page_tbl CHANGE id" + ." id INT NOT NULL AUTO_INCREMENT"); + $fields = mysql_list_fields($database, $page_tbl); + if (!strstr(strtolower(mysql_field_flags($fields, $i)), "auto_increment")) + echo " ", _("FAILED"), "
\n"; + else + echo _("OK"), "
\n"; + } else { + echo _("OK"), "
\n"; + } + break; + } + } + mysql_free_result($fields); + } - if (ACCESS_LOG_SQL) { - $table = "accesslog"; - echo sprintf(_("check for table %s"), $table)," ..."; - if (!in_array($prefix.$table, $tables)) { - installTable($dbh, $table, $backend_type); - } else { - echo _("OK"),"
\n"; - } - } - if ((class_exists("RatingsUserFactory") or $dbh->isWikiPage(_("RateIt")))) { - $table = "rating"; - echo sprintf(_("check for table %s"), $table)," ..."; - if (!in_array($prefix.$table, $tables)) { - installTable($dbh, $table, $backend_type); - } else { - echo _("OK"),"
\n"; - } - } - $backend = &$dbh->_backend->_dbh; - extract($dbh->_backend->_table_names); - - // 1.3.8 added session.sess_ip - if (phpwiki_version() >= 1030.08 and USE_DB_SESSION and isset($request->_dbsession)) { - echo _("check for new session.sess_ip column")," ... "; - $database = $dbh->_backend->database(); - assert(!empty($DBParams['db_session_table'])); - $session_tbl = $prefix . $DBParams['db_session_table']; - $sess_fields = $dbh->_backend->listOfFields($database, $session_tbl); - if (!$sess_fields) { - echo _("SKIP"); - } elseif (!strstr(strtolower(join(':', $sess_fields)), "sess_ip")) { - // TODO: postgres test (should be able to add columns at the end, but not in between) - echo "",_("ADDING"),""," ... "; - $dbh->genericSqlQuery("ALTER TABLE $session_tbl ADD sess_ip CHAR(15) NOT NULL"); - $dbh->genericSqlQuery("CREATE INDEX sess_date ON $session_tbl (sess_date)"); - } else { - echo _("OK"); - } - echo "
\n"; - if (substr($backend_type,0,5) == 'mysql') { - // upgrade to 4.1.8 destroyed my session table: - // sess_id => varchar(10), sess_data => varchar(5). For others obviously also. - echo _("check for mysql session.sess_id sanity")," ... "; - $result = $dbh->genericSqlQuery("DESCRIBE $session_tbl"); - if (DATABASE_TYPE == 'SQL') { - $iter = new WikiDB_backend_PearDB_generic_iter($backend, $result); - } elseif (DATABASE_TYPE == 'ADODB') { - $iter = new WikiDB_backend_ADODB_generic_iter($backend, $result, - array("Field", "Type", "Null", "Key", "Default", "Extra")); - } elseif (DATABASE_TYPE == 'PDO') { - $iter = new WikiDB_backend_PDO_generic_iter($backend, $result); - } - while ($col = $iter->next()) { - if ($col["Field"] == 'sess_id' and !strstr(strtolower($col["Type"]), 'char(32)')) { - $dbh->genericSqlQuery("ALTER TABLE $session_tbl CHANGE sess_id" - ." sess_id CHAR(32) NOT NULL"); - echo "sess_id ", $col["Type"], " ", _("fixed"), " => CHAR(32) "; - } - if ($col["Field"] == 'sess_ip' and !strstr(strtolower($col["Type"]), 'char(15)')) { - $dbh->genericSqlQuery("ALTER TABLE $session_tbl CHANGE sess_ip" - ." sess_ip CHAR(15) NOT NULL"); - echo "sess_ip ", $col["Type"], " ", _("fixed"), " => CHAR(15) "; - } - } - echo _("OK"), "
\n"; - } - } + // Check for mysql 4.1.x/5.0.0a binary search problem. + // http://bugs.mysql.com/bug.php?id=4398 + // "select * from page where LOWER(pagename) like '%search%'" does not apply LOWER! + // Confirmed for 4.1.0alpha,4.1.3-beta,5.0.0a; not yet tested for 4.1.2alpha, + // On windows only, though utf8 would be useful elsewhere also. + // Illegal mix of collations (latin1_bin,IMPLICIT) and + // (utf8_general_ci, COERCIBLE) for operation '=']) + if (isWindows() and substr($backend_type,0,5) == 'mysql') { + echo _("check for mysql 4.1.x/5.0.0 binary search on windows problem")," ..."; + $mysql_version = $this->dbi->_backend->_serverinfo['version']; + if ($mysql_version < 401.0) { + echo sprintf(_("version %s"), $mysql_version)," ", + _("not affected"),"
\n"; + } elseif ($mysql_version >= 401.6) { // FIXME: since which version? + $row = $this->dbi->_backend->getRow("SHOW CREATE TABLE $page_tbl"); + $result = join(" ", $row); + if (strstr(strtolower($result), "character set") + and strstr(strtolower($result), "collate")) + { + echo _("OK"), "
\n"; + } else { + //SET CHARACTER SET latin1 + $charset = CHARSET; + if ($charset == 'iso-8859-1') $charset = 'latin1'; + $this->dbi->genericSqlQuery("ALTER TABLE $page_tbl CHANGE pagename " + ."pagename VARCHAR(100) " + ."CHARACTER SET '$charset' COLLATE '$charset"."_bin' NOT NULL"); + echo sprintf(_("version %s"), $mysql_version), + " ",_("FIXED"),"", + "
\n"; + } + } elseif (DATABASE_TYPE != 'PDO') { + // check if already fixed + extract($this->dbi->_backend->_table_names); + assert(!empty($page_tbl)); + $database = $this->dbi->_backend->database(); + $fields = mysql_list_fields($database, $page_tbl, $this->dbi->_backend->connection()); + $columns = mysql_num_fields($fields); + for ($i = 0; $i < $columns; $i++) { + if (mysql_field_name($fields, $i) == 'pagename') { + $flags = mysql_field_flags($fields, $i); + // I think it was fixed with 4.1.6, but I tested it only with 4.1.8 + if ($mysql_version > 401.0 and $mysql_version < 401.6) { + // remove the binary flag + if (strstr(strtolower($flags), "binary")) { + // FIXME: on duplicate pagenames this will fail! + $this->dbi->genericSqlQuery("ALTER TABLE $page_tbl CHANGE pagename" + ." pagename VARCHAR(100) NOT NULL"); + echo sprintf(_("version %s"), $mysql_version), + "",_("FIXED"),"" + ,"
\n"; + } + } + break; + } + } + } + } + if (ACCESS_LOG_SQL & 2) { + echo _("check for ACCESS_LOG_SQL passwords in POST requests")," ..."; + // Don't display passwords in POST requests (up to 2005-02-04 12:03:20) + $res = $this->dbi->genericSqlIter("SELECT time_stamp, remote_host, " . + "request_args FROM ${prefix}accesslog WHERE request_args LIKE " . + "'%s:6:\"passwd\"%' AND request_args NOT LIKE '%s:6:\"passwd\";" . + "s:15:\"\"%'"); + $count = 0; + while ($row = $res->next()) { + $args = preg_replace("/(s:6:\"passwd\";s:15:\").*(\")/", + "$1$2", $row["request_args"]); + $ts = $row["time_stamp"]; + $rh = $row["remote_host"]; + $this->dbi->genericSqlQuery("UPDATE ${prefix}accesslog SET " . + "request_args='$args' WHERE time_stamp=$ts AND " . + "remote_host='$rh'"); + $count++; + } + if ($count > 0) + echo "",_("FIXED"),"", "
\n"; + else + echo _("OK"),"
\n"; + + if (phpwiki_version() >= 1030.13) { + echo _("check for ACCESS_LOG_SQL remote_host varchar(50)")," ..."; + $database = $this->dbi->_backend->database(); + $accesslog_tbl = $prefix . 'accesslog'; + $fields = $this->dbi->_backend->listOfFields($database, $accesslog_tbl); + if (!$fields) { + echo _("SKIP"); + } elseif (strstr(strtolower(join(':', $sess_fields)), "remote_host")) { + // TODO: how to check size, already done? + echo "",_("FIXING"),"remote_host"," ... "; + $this->dbi->genericSqlQuery("ALTER TABLE $accesslog_tbl CHANGE remote_host VARCHAR(100)"); + } else { + echo _("FAIL"); + } + echo "
\n"; + } + } + $this->_upgrade_cached_html(); - /* TODO: - ALTER TABLE link ADD relation INT DEFAULT 0; - CREATE INDEX linkrelation ON link (relation); - */ - - // mysql >= 4.0.4 requires LOCK TABLE privileges - if (0 and substr($backend_type,0,5) == 'mysql') { - echo _("check for mysql LOCK TABLE privilege")," ..."; - $mysql_version = $dbh->_backend->_serverinfo['version']; - if ($mysql_version > 400.40) { - if (!empty($dbh->_backend->_parsedDSN)) - $parseDSN = $dbh->_backend->_parsedDSN; - elseif (function_exists('parseDSN')) // ADODB or PDO - $parseDSN = parseDSN($DBParams['dsn']); - else // pear - $parseDSN = DB::parseDSN($DBParams['dsn']); - $username = $dbh->_backend->qstr($parseDSN['username']); - // on db level - $query = "SELECT lock_tables_priv FROM mysql.db WHERE user='$username'"; - //mysql_select_db("mysql", $dbh->_backend->connection()); - $db_fields = $dbh->_backend->listOfFields("mysql", "db"); - if (!strstr(strtolower(join(':', $db_fields)), "lock_tables_priv")) { - echo join(':', $db_fields); - die("lock_tables_priv missing. The DB Admin must run mysql_fix_privilege_tables"); - } - $row = $dbh->_backend->getRow($query); - if (isset($row[0]) and $row[0] == 'N') { - $dbh->genericSqlQuery("UPDATE mysql.db SET lock_tables_priv='Y'" - ." WHERE mysql.user='$username'"); - $dbh->genericSqlQuery("FLUSH PRIVILEGES"); - echo "mysql.db user='$username'", _("fixed"), "
\n"; - } elseif (!$row) { - // or on user level - $query = "SELECT lock_tables_priv FROM mysql.user WHERE user='$username'"; - $row = $dbh->_backend->getRow($query); - if ($row and $row[0] == 'N') { - $dbh->genericSqlQuery("UPDATE mysql.user SET lock_tables_priv='Y'" - ." WHERE mysql.user='$username'"); - $dbh->genericSqlQuery("FLUSH PRIVILEGES"); - echo "mysql.user user='$username'", _("fixed"), "
\n"; - } elseif (!$row) { - echo " ", _("FAILED"), ": ", - "Neither mysql.db nor mysql.user has a user='$username'" - ." or the lock_tables_priv field", - "
\n"; - } else { - echo _("OK"), "
\n"; - } - } else { - echo _("OK"), "
\n"; - } - //mysql_select_db($dbh->_backend->database(), $dbh->_backend->connection()); - } else { - echo sprintf(_("version %s not affected"), $mysql_version),"
\n"; - } - } + if (phpwiki_version() >= 1030.122006 and $this->dbi->get_db_version() < 1030.13) { + $this->dbi->set_db_version(1030.13); + } - // 1.3.10 mysql requires page.id auto_increment - // mysql, mysqli or mysqlt - if (phpwiki_version() >= 1030.099 and substr($backend_type,0,5) == 'mysql' - and DATABASE_TYPE != 'PDO') - { - echo _("check for mysql page.id auto_increment flag")," ..."; - assert(!empty($page_tbl)); - $database = $dbh->_backend->database(); - $fields = mysql_list_fields($database, $page_tbl, $dbh->_backend->connection()); - $columns = mysql_num_fields($fields); - for ($i = 0; $i < $columns; $i++) { - if (mysql_field_name($fields, $i) == 'id') { - $flags = mysql_field_flags($fields, $i); - //DONE: something was wrong with ADODB here. - if (!strstr(strtolower($flags), "auto_increment")) { - echo "",_("ADDING"),""," ... "; - // MODIFY col_def valid since mysql 3.22.16, - // older mysql's need CHANGE old_col col_def - $dbh->genericSqlQuery("ALTER TABLE $page_tbl CHANGE id" - ." id INT NOT NULL AUTO_INCREMENT"); - $fields = mysql_list_fields($database, $page_tbl); - if (!strstr(strtolower(mysql_field_flags($fields, $i)), "auto_increment")) - echo " ", _("FAILED"), "
\n"; - else - echo _("OK"), "
\n"; - } else { - echo _("OK"), "
\n"; - } - break; - } - } - mysql_free_result($fields); + return; } - // Check for mysql 4.1.x/5.0.0a binary search problem. - // http://bugs.mysql.com/bug.php?id=4398 - // "select * from page where LOWER(pagename) like '%search%'" does not apply LOWER! - // Confirmed for 4.1.0alpha,4.1.3-beta,5.0.0a; not yet tested for 4.1.2alpha, - // On windows only, though utf8 would be useful elsewhere also. - // Illegal mix of collations (latin1_bin,IMPLICIT) and - // (utf8_general_ci, COERCIBLE) for operation '=']) - if (isWindows() and substr($backend_type,0,5) == 'mysql') { - echo _("check for mysql 4.1.x/5.0.0 binary search on windows problem")," ..."; - $mysql_version = $dbh->_backend->_serverinfo['version']; - if ($mysql_version < 401.0) { - echo sprintf(_("version %s"), $mysql_version)," ", - _("not affected"),"
\n"; - } elseif ($mysql_version >= 401.6) { // FIXME: since which version? - $row = $dbh->_backend->getRow("SHOW CREATE TABLE $page_tbl"); - $result = join(" ", $row); - if (strstr(strtolower($result), "character set") - and strstr(strtolower($result), "collate")) - { - echo _("OK"), "
\n"; - } else { - //SET CHARACTER SET latin1 - $charset = CHARSET; - if ($charset == 'iso-8859-1') $charset = 'latin1'; - $dbh->genericSqlQuery("ALTER TABLE $page_tbl CHANGE pagename " - ."pagename VARCHAR(100) " - ."CHARACTER SET '$charset' COLLATE '$charset"."_bin' NOT NULL"); - echo sprintf(_("version %s"), $mysql_version), - " ",_("FIXED"),"", - "
\n"; - } - } elseif (DATABASE_TYPE != 'PDO') { - // check if already fixed - extract($dbh->_backend->_table_names); - assert(!empty($page_tbl)); - $database = $dbh->_backend->database(); - $fields = mysql_list_fields($database, $page_tbl, $dbh->_backend->connection()); - $columns = mysql_num_fields($fields); - for ($i = 0; $i < $columns; $i++) { - if (mysql_field_name($fields, $i) == 'pagename') { - $flags = mysql_field_flags($fields, $i); - // I think it was fixed with 4.1.6, but I tested it only with 4.1.8 - if ($mysql_version > 401.0 and $mysql_version < 401.6) { - // remove the binary flag - if (strstr(strtolower($flags), "binary")) { - // FIXME: on duplicate pagenames this will fail! - $dbh->genericSqlQuery("ALTER TABLE $page_tbl CHANGE pagename" - ." pagename VARCHAR(100) NOT NULL"); - echo sprintf(_("version %s"), $mysql_version), - "",_("FIXED"),"" - ,"
\n"; - } - } - break; - } - } - } - } - if ((ACCESS_LOG_SQL & 2)) { - echo _("check for ACCESS_LOG_SQL passwords in POST requests")," ..."; - // Don't display passwords in POST requests (up to 2005-02-04 12:03:20) - $res = $dbh->genericSqlIter("SELECT time_stamp, remote_host, " . - "request_args FROM ${prefix}accesslog WHERE request_args LIKE " . - "'%s:6:\"passwd\"%' AND request_args NOT LIKE '%s:6:\"passwd\";" . - "s:15:\"\"%'"); - $count = 0; - while ($row = $res->next()) { - $args = preg_replace("/(s:6:\"passwd\";s:15:\").*(\")/", - "$1$2", $row["request_args"]); - $ts = $row["time_stamp"]; - $rh = $row["remote_host"]; - $dbh->genericSqlQuery("UPDATE ${prefix}accesslog SET " . - "request_args='$args' WHERE time_stamp=$ts AND " . - "remote_host='$rh'"); - $count++; - } - if ($count > 0) - echo "",_("FIXED"),"", "
\n"; - else - echo _("OK"),"
\n"; - - if (phpwiki_version() >= 1030.13) { - echo _("check for ACCESS_LOG_SQL remote_host varchar(50)")," ..."; - $database = $dbh->_backend->database(); - $accesslog_tbl = $prefix . 'accesslog'; - $fields = $dbh->_backend->listOfFields($database, $accesslog_tbl); - if (!$fields) { - echo _("SKIP"); - } elseif (strstr(strtolower(join(':', $sess_fields)), "remote_host")) { - // TODO: how to check size, already done? - echo "",_("FIXING"),"remote_host"," ... "; - $dbh->genericSqlQuery("ALTER TABLE $accesslog_tbl CHANGE remote_host VARCHAR(100)"); - } else { - echo _("FAIL"); - } - echo "
\n"; + /** + * Filter SQL missing permissions errors. + * + * A wrong DBADMIN user will not be able to connect + * @see _is_false_error, ErrorManager + * @access private + */ + function _dbpermission_filter($err) { + if ( $err->isWarning() ) { + global $ErrorManager; + $this->error_caught = 1; + $ErrorManager->_postponed_errors[] = $err; + return true; } + return false; } - _upgrade_cached_html($dbh); - if (phpwiki_version() >= 1030.122006 and $dbh->get_db_version() < 1030.13) { - $dbh->set_db_version(1030.13); + function _try_dbadmin_user ($user, $passwd) { + global $DBParams, $DBAuthParams; + $AdminParams = $DBParams; + if (DATABASE_TYPE == 'SQL') + $dsn = DB::parseDSN($AdminParams['dsn']); + else { + $dsn = parseDSN($AdminParams['dsn']); + } + $AdminParams['dsn'] = sprintf("%s://%s:%s@%s/%s", + $dsn['phptype'], + $user, + $passwd, + $dsn['hostspec'], + $dsn['database']); + $AdminParams['_tryroot_from_upgrade'] = 1; + // add error handler to warn about missing permissions for DBADMIN_USER + global $ErrorManager; + $ErrorManager->pushErrorHandler(new WikiMethodCb($this, '_dbpermission_filter')); + $this->error_caught = 0; + $this->dbi = WikiDB::open($AdminParams); + if (!$this->error_caught) return true; + // FAILED: redo our connection with the wikiuser + $this->dbi = WikiDB::open($DBParams); + $ErrorManager->flushPostponedErrors(); + $ErrorManager->popErrorHandler(); + return false; } - return; -} + function _db_init () { + if (!$this->dbi->_backend->isSQL()) return; -function _upgrade_db_init (&$dbh) { - global $request, $DBParams, $DBAuthParams; - if (!$dbh->_backend->isSQL()) return; - - /* SQLite never needs admin params */ - $backend_type = $dbh->_backend->backendType(); - if (substr($backend_type,0,6)=="sqlite") { - return; + /* SQLite never needs admin params */ + $backend_type = $this->dbi->_backend->backendType(); + if (substr($backend_type,0,6)=="sqlite") { + return; + } + $dbadmin_user = 'root'; + if ($dbadmin = $this->request->getArg('dbadmin')) { + $dbadmin_user = $dbadmin['user']; + if (isset($dbadmin['cancel'])) { + return; + } elseif (!empty($dbadmin_user)) { + if ($this->_try_dbadmin_user($dbadmin['user'], $dbadmin['passwd'])) + return; + } + } elseif (DBADMIN_USER) { + if ($this->_try_dbadmin_user(DBADMIN_USER, DBADMIN_PASSWD)) + return true; + } + // Check if the privileges are enough. Need CREATE and ALTER perms. + // And on windows: SELECT FROM mysql, possibly: UPDATE mysql. + $form = HTML::form(array("method" => "post", + "action" => $this->request->getPostURL(), + "accept-charset"=>$GLOBALS['charset']), + HTML::p(_("Upgrade requires database privileges to CREATE and ALTER the phpwiki database."), + HTML::br(), + _("And on windows at least the privilege to SELECT FROM mysql, and possibly UPDATE mysql")), + HiddenInputs(array('action' => 'upgrade', + 'overwrite' => $this->request->getArg('overwrite'))), + HTML::table(array("cellspacing"=>4), + HTML::tr(HTML::td(array('align'=>'right'), + _("DB admin user:")), + HTML::td(HTML::input(array('name'=>"dbadmin[user]", + 'size'=>12, + 'maxlength'=>256, + 'value'=>$dbadmin_user)))), + HTML::tr(HTML::td(array('align'=>'right'), + _("DB admin password:")), + HTML::td(HTML::input(array('name'=>"dbadmin[passwd]", + 'type'=>'password', + 'size'=>12, + 'maxlength'=>256)))), + HTML::tr(HTML::td(array('align'=>'center', 'colspan' => 2), + Button("submit:", _("Submit"), 'wikiaction'), + HTML::raw(' '), + Button("submit:dbadmin[cancel]", _("Cancel"), + 'button'))))); + $form->printXml(); + echo "\n"; + echo asXML(Template("bottom")); + echo "\n"; + $this->request->finish(); + exit(); } - if (DBADMIN_USER) { - // if need to connect as the root user, for CREATE and ALTER privileges - $AdminParams = $DBParams; - if (DATABASE_TYPE == 'SQL') - $dsn = DB::parseDSN($AdminParams['dsn']); - else // ADODB or PDO - $dsn = parseDSN($AdminParams['dsn']); - $AdminParams['dsn'] = sprintf("%s://%s:%s@%s/%s", - $dsn['phptype'], - DBADMIN_USER, - DBADMIN_PASSWD, - $dsn['hostspec'], - $dsn['database']); - if (DEBUG & _DEBUG_SQL and DATABASE_TYPE == 'PDO') { - echo "
\nDBParams['dsn']: '", $DBParams['dsn'], "'"; - echo "
\ndsn: '", print_r($dsn), "'"; - echo "
\nAdminParams['dsn']: '", $AdminParams['dsn'], "'"; - } - $dbh = WikiDB::open($AdminParams); - } elseif ($dbadmin = $request->getArg('dbadmin')) { - if (empty($dbadmin['user']) or isset($dbadmin['cancel'])) - $dbh = &$request->_dbi; - else { - $AdminParams = $DBParams; - if (DATABASE_TYPE == 'SQL') - $dsn = DB::parseDSN($AdminParams['dsn']); - else - $dsn = parseDSN($AdminParams['dsn']); - $AdminParams['dsn'] = sprintf("%s://%s:%s@%s/%s", - $dsn['phptype'], - $dbadmin['user'], - $dbadmin['passwd'], - $dsn['hostspec'], - $dsn['database']); - $dbh = WikiDB::open($AdminParams); - } - } else { - // Check if the privileges are enough. Need CREATE and ALTER perms. - // And on windows: SELECT FROM mysql, possibly: UPDATE mysql. - $form = HTML::form(array("method" => "post", - "action" => $request->getPostURL(), - "accept-charset"=>$GLOBALS['charset']), -HTML::p(_("Upgrade requires database privileges to CREATE and ALTER the phpwiki database."), - HTML::br(), -_("And on windows at least the privilege to SELECT FROM mysql, and possibly UPDATE mysql")), - HiddenInputs(array('action' => 'upgrade', - 'overwrite' => $request->getArg('overwrite'))), - HTML::table(array("cellspacing"=>4), - HTML::tr(HTML::td(array('align'=>'right'), - _("DB admin user:")), - HTML::td(HTML::input(array('name'=>"dbadmin[user]", - 'size'=>12, - 'maxlength'=>256, - 'value'=>'root')))), - HTML::tr(HTML::td(array('align'=>'right'), - _("DB admin password:")), - HTML::td(HTML::input(array('name'=>"dbadmin[passwd]", - 'type'=>'password', - 'size'=>12, - 'maxlength'=>256)))), - HTML::tr(HTML::td(array('align'=>'center', 'colspan' => 2), - Button("submit:", _("Submit"), 'wikiaction'), - HTML::raw(' '), - Button("submit:dbadmin[cancel]", _("Cancel"), - 'button'))))); - $form->printXml(); - echo "\n"; - echo asXML(Template("bottom")); - echo "\n"; - $request->finish(); - exit(); + /** + * if page.cached_html does not exists: + * put _cached_html from pagedata into a new seperate blob, + * not into the huge serialized string. + * + * It is only rarelely needed: for current page only, if-not-modified, + * but was extracetd for every simple page iteration. + */ + function _upgrade_cached_html ( $verbose=true ) { + global $DBParams; + if (!$this->dbi->_backend->isSQL()) return; + $count = 0; + if (phpwiki_version() >= 1030.10) { + if ($verbose) + echo _("check for extra page.cached_html column")," ... "; + $database = $this->dbi->_backend->database(); + extract($this->dbi->_backend->_table_names); + $fields = $this->dbi->_backend->listOfFields($database, $page_tbl); + if (!$fields) { + echo _("SKIP"), "
\n"; + return 0; + } + if (!strstr(strtolower(join(':', $fields)), "cached_html")) { + if ($verbose) + echo "",_("ADDING"),""," ... "; + $backend_type = $this->dbi->_backend->backendType(); + if (substr($backend_type,0,5) == 'mysql') + $this->dbi->genericSqlQuery("ALTER TABLE $page_tbl ADD cached_html MEDIUMBLOB"); + else + $this->dbi->genericSqlQuery("ALTER TABLE $page_tbl ADD cached_html BLOB"); + if ($verbose) + echo "",_("CONVERTING"),""," ... "; + $count = _convert_cached_html(); + if ($verbose) + echo $count, " ", _("OK"), "
\n"; + } else { + if ($verbose) + echo _("OK"), "
\n"; + } + } + return $count; } -} -/** - * if page.cached_html does not exists: - * put _cached_html from pagedata into a new seperate blob, - * not into the huge serialized string. - * - * It is only rarelely needed: for current page only, if-not-modified, - * but was extracetd for every simple page iteration. - */ -function _upgrade_cached_html (&$dbh, $verbose=true) { - global $DBParams; - if (!$dbh->_backend->isSQL()) return; - $count = 0; - if (phpwiki_version() >= 1030.10) { - if ($verbose) - echo _("check for extra page.cached_html column")," ... "; - $database = $dbh->_backend->database(); - extract($dbh->_backend->_table_names); - $fields = $dbh->_backend->listOfFields($database, $page_tbl); - if (!$fields) { - echo _("SKIP"), "
\n"; - return 0; - } - if (!strstr(strtolower(join(':', $fields)), "cached_html")) { - if ($verbose) - echo "",_("ADDING"),""," ... "; - $backend_type = $dbh->_backend->backendType(); - if (substr($backend_type,0,5) == 'mysql') - $dbh->genericSqlQuery("ALTER TABLE $page_tbl ADD cached_html MEDIUMBLOB"); - else - $dbh->genericSqlQuery("ALTER TABLE $page_tbl ADD cached_html BLOB"); - if ($verbose) - echo "",_("CONVERTING"),""," ... "; - $count = _convert_cached_html($dbh); - if ($verbose) - echo $count, " ", _("OK"), "
\n"; - } else { - if ($verbose) - echo _("OK"), "
\n"; - } + /** + * move _cached_html for all pages from pagedata into a new seperate blob. + * decoupled from action=upgrade, so that it can be used by a WikiAdminUtils button also. + */ + function _convert_cached_html () { + global $DBParams; + if (!$this->dbi->_backend->isSQL()) return; + //if (!in_array(DATABASE_TYPE, array('SQL','ADODB'))) return; + + $pages = $this->dbi->getAllPages(); + $cache =& $this->dbi->_cache; + $count = 0; + extract($this->dbi->_backend->_table_names); + while ($page = $pages->next()) { + $pagename = $page->getName(); + $data = $this->dbi->_backend->get_pagedata($pagename); + if (!empty($data['_cached_html'])) { + $cached_html = $data['_cached_html']; + $data['_cached_html'] = ''; + $cache->update_pagedata($pagename, $data); + // store as blob, not serialized + $this->dbi->genericSqlQuery("UPDATE $page_tbl SET cached_html=? WHERE pagename=?", + array($cached_html, $pagename)); + $count++; + } + } + return $count; } - return $count; -} -/** - * move _cached_html for all pages from pagedata into a new seperate blob. - * decoupled from action=upgrade, so that it can be used by a WikiAdminUtils button also. - */ -function _convert_cached_html (&$dbh) { - global $DBParams; - if (!$dbh->_backend->isSQL()) return; - //if (!in_array(DATABASE_TYPE, array('SQL','ADODB'))) return; - - $pages = $dbh->getAllPages(); - $cache =& $dbh->_cache; - $count = 0; - extract($dbh->_backend->_table_names); - while ($page = $pages->next()) { - $pagename = $page->getName(); - $data = $dbh->_backend->get_pagedata($pagename); - if (!empty($data['_cached_html'])) { - $cached_html = $data['_cached_html']; - $data['_cached_html'] = ''; - $cache->update_pagedata($pagename, $data); - // store as blob, not serialized - $dbh->genericSqlQuery("UPDATE $page_tbl SET cached_html=? WHERE pagename=?", - array($cached_html, $pagename)); - $count++; - } + /** + * upgrade to 1.3.13 link structure. + */ + function _upgrade_relation_links ( $verbose=true ) { + if (phpwiki_version() >= 1030.12200610) { + echo _("Rebuild entire database to upgrade relation links")," ... "; + if (DATABASE_TYPE == 'dba') { + echo "",_("CONVERTING")," dba linktable"," ... "; + } + longer_timeout(240); + $this->dbi->_backend->rebuild(); + echo _("OK"), "
\n"; + } } - return $count; -} -/** - * upgrade to 1.3.13 link structure. - */ -function _upgrade_relation_links (&$dbh, $verbose=true) { - if (phpwiki_version() >= 1030.12200610) { - echo _("Rebuild entire database to upgrade relation links")," ... "; - if (DATABASE_TYPE == 'dba') { - echo "",_("CONVERTING")," dba linktable"," ... "; - } - longer_timeout(240); - $dbh->_backend->rebuild(); - echo _("OK"), "
\n"; + function CheckPluginUpdate () { + echo "

",sprintf(_("check for necessary %s updates"), + _("plugin argument")),"

\n"; + $process = array(array('msg' => _("change RandomPage pages => numpages"), + 'match' => "/(<\?\s*plugin\s+ RandomPage\s+)pages/", + 'replace' => "\\1numpages") + ); + $allpages = $this->dbi->getAllPages(false); + while ($page = $allpages->next()) { + $current = $page->getCurrentRevision(); + $pagetext = $current->getPackedContent(); + foreach ($process as $p) { + if (preg_match($p['match'], $pagetext)) { + echo $page->getName()," ",$p['msg']," ... "; + if ($newtext = preg_replace($p['match'], $p['replace'], $pagetext)) { + $meta = $current->_data; + $meta['summary'] = "upgrade: ".$p['msg']; + $page->save($newtext, $current->getVersion() + 1, $meta); + echo _("OK"), "
\n"; + } else { + echo " ", _("FAILED"), "
\n"; + } + } + } + } } -} -function CheckPluginUpdate(&$request) { - echo "

",sprintf(_("check for necessary %s updates"), - _("plugin argument")),"

\n"; - $process = array(array('msg' => _("change RandomPage pages => numpages"), - 'match' => "/(<\?\s*plugin\s+ RandomPage\s+)pages/", - 'replace' => "\\1numpages") - ); - $dbi = $request->getDbh(); - $allpages = $dbi->getAllPages(false); - while ($page = $allpages->next()) { - $current = $page->getCurrentRevision(); - $pagetext = $current->getPackedContent(); - foreach ($process as $p) { - if (preg_match($p['match'], $pagetext)) { - echo $page->getName()," ",$p['msg']," ... "; - if ($newtext = preg_replace($p['match'], $p['replace'], $pagetext)) { - $meta = $current->_data; - $meta['summary'] = "upgrade: ".$p['msg']; - $page->save($newtext, $current->getVersion() + 1, $meta); - echo _("OK"), "
\n"; - } else { - echo " ", _("FAILED"), "
\n"; - } - } - } + function fixConfigIni($match, $new) { + $file = FindFile("config/config.ini"); + $found = false; + if (is_writable($file)) { + $in = fopen($file,"rb"); + $out = fopen($tmp = tempnam(FindFile("uploads"),"cfg"),"wb"); + if (isWindows()) + $tmp = str_replace("/","\\",$tmp); + while ($s = fgets($in)) { + if (preg_match($match, $s)) { + $s = $new . (isWindows() ? "\r\n" : "\n"); + $found = true; + } + fputs($out, $s); + } + fclose($in); + fclose($out); + if (!$found) { + echo " ",_("FAILED"),": ", + sprintf(_("%s not found"), $match); + unlink($out); + } else { + @unlink("$file.bak"); + @rename($file,"$file.bak"); + if (rename($tmp, $file)) + echo " ",_("FIXED"),""; + else { + echo " ",_("FAILED"),": "; + sprintf(_("couldn't move %s to %s"), $tmp, $file); + return false; + } + } + return $found; + } else { + echo " ",_("FAILED"),": ", + sprintf(_("%s is not writable"), $file); + return false; + } } -} -function fixConfigIni($match, $new) { - $file = FindFile("config/config.ini"); - $found = false; - if (is_writable($file)) { - $in = fopen($file,"rb"); - $out = fopen($tmp = tempnam(FindFile("uploads"),"cfg"),"wb"); - if (isWindows()) - $tmp = str_replace("/","\\",$tmp); - while ($s = fgets($in)) { - if (preg_match($match, $s)) { - $s = $new . (isWindows() ? "\r\n" : "\n"); - $found = true; - } - fputs($out, $s); - } - fclose($in); - fclose($out); - if (!$found) { - echo " ",_("FAILED"),": ", - sprintf(_("%s not found"), $match); - unlink($out); - } else { - @unlink("$file.bak"); - @rename($file,"$file.bak"); - if (rename($tmp, $file)) - echo " ",_("FIXED"),""; - else { - echo " ",_("FAILED"),": "; - sprintf(_("couldn't move %s to %s"), $tmp, $file); - return false; - } - } - return $found; - } else { - echo " ",_("FAILED"),": ", - sprintf(_("%s is not writable"), $file); - return false; + function CheckConfigUpdate () { + echo "

",sprintf(_("check for necessary %s updates"), + "config.ini"),"

\n"; + echo _("check for old CACHE_CONTROL = NONE")," ... "; + if (defined('CACHE_CONTROL') and CACHE_CONTROL == '') { + echo "
  ", + _("CACHE_CONTROL is set to 'NONE', and must be changed to 'NO_CACHE'"), + " ..."; + fixConfigIni("/^\s*CACHE_CONTROL\s*=\s*NONE/","CACHE_CONTROL = NO_CACHE"); + } else { + echo _("OK"); + } + echo "
\n"; + echo _("check for GROUP_METHOD = NONE")," ... "; + if (defined('GROUP_METHOD') and GROUP_METHOD == '') { + echo "
  ", + _("GROUP_METHOD is set to NONE, and must be changed to \"NONE\""), + " ..."; + fixConfigIni("/^\s*GROUP_METHOD\s*=\s*NONE/","GROUP_METHOD = \"NONE\""); + } else { + echo _("OK"); + } + echo "
\n"; } -} -function CheckConfigUpdate(&$request) { - echo "

",sprintf(_("check for necessary %s updates"), - "config.ini"),"

\n"; - echo _("check for old CACHE_CONTROL = NONE")," ... "; - if (defined('CACHE_CONTROL') and CACHE_CONTROL == '') { - echo "
  ", - _("CACHE_CONTROL is set to 'NONE', and must be changed to 'NO_CACHE'"), - " ..."; - fixConfigIni("/^\s*CACHE_CONTROL\s*=\s*NONE/","CACHE_CONTROL = NO_CACHE"); - } else { - echo _("OK"); - } - echo "
\n"; - echo _("check for GROUP_METHOD = NONE")," ... "; - if (defined('GROUP_METHOD') and GROUP_METHOD == '') { - echo "
  ", - _("GROUP_METHOD is set to NONE, and must be changed to \"NONE\""), - " ..."; - fixConfigIni("/^\s*GROUP_METHOD\s*=\s*NONE/","GROUP_METHOD = \"NONE\""); - } else { - echo _("OK"); - } - echo "
\n"; -} +} // class Upgrade /** * TODO: @@ -947,14 +969,6 @@ function CheckConfigUpdate(&$request) { * identify, validate, display options, next step */ /* -class Upgrade { -} - -class Upgrade_CheckPgsrc extends Upgrade { -} - -class Upgrade_CheckDatabaseUpdate extends Upgrade { -} */ // TODO: At which step are we? @@ -973,24 +987,28 @@ function DoUpgrade($request) { } StartLoadDump($request, _("Upgrading this PhpWiki")); + $upgrade = new Upgrade($request); //CheckOldIndexUpdate($request); // to upgrade from < 1.3.10 if (!$request->getArg('nosql')) - CheckDatabaseUpdate($request); // first check cached_html and friends + $upgrade->CheckDatabaseUpdate($request); // first check cached_html and friends if (!$request->getArg('nopgsrc')) { - CheckActionPageUpdate($request); - CheckPgsrcUpdate($request); + $upgrade->CheckActionPageUpdate($request); + $upgrade->CheckPgsrcUpdate($request); } //CheckThemeUpdate($request); if (!$request->getArg('noplugin')) - CheckPluginUpdate($request); + $upgrade->CheckPluginUpdate($request); if (!$request->getArg('noconfig')) - CheckConfigUpdate($request); + $upgrade->CheckConfigUpdate($request); EndLoadDump($request); } /* $Log: not supported by cvs2svn $ + Revision 1.56 2007/01/03 21:25:34 rurban + rename InterWikiKarte to InterWikiListe. Support nosql, nopgsrc, noplugin, noconfig args. + Revision 1.55 2007/01/02 13:24:01 rurban 1.3.13 support: _rename_page_helper, _rename_to_help_page, _upgrade_relation_links, check for ACCESS_LOG_SQL remote_host varchar(50), _upgrade_psql_tsearch2 -- 2.45.2