Example #1
0
 function upgrade_board($step)
 {
     switch ($step) {
         default:
             echo "<form action='{$this->self}' method='get'>\n\t\t\t    <table border='0' cellpadding='4' cellspacing='0'>\n";
             check_writeable_files();
             echo "<tr><td colspan='2' align='center'><b>Upgrade from what version?</b></td></tr>";
             include 'templates/upgradefromversion.php';
             echo "    </table>\n\t\t\t    </form>\n";
             break;
             // Step 1.5 simply updates the database info
         // Step 1.5 simply updates the database info
         case 15:
             $this->sets['db_host'] = $this->post['db_host'];
             $this->sets['db_name'] = $this->post['db_name'];
             $this->sets['db_user'] = $this->post['db_user'];
             $this->sets['db_pass'] = $this->post['db_pass'];
             $this->sets['db_port'] = $this->post['db_port'];
             $this->sets['db_socket'] = $this->post['db_socket'];
             $this->sets['prefix'] = trim(preg_replace('/[^a-zA-Z0-9_]/', '', $this->post['prefix']));
             if (!$this->write_db_sets('../settings.php')) {
                 echo 'settings.php could not be updated.<br /><br />CHMOD settings.php to 0666.';
                 break;
             }
             // Fall through to the next case
         // Fall through to the next case
         case 2:
             @set_time_limit(300);
             // Check to see if all upgrade files are intact
             $check = $this->get['from'];
             while ($check <= LATEST) {
                 if (!is_readable("./upgrade_{$check}.php")) {
                     echo "A file required for upgrading was not found: upgrade_{$check}.php";
                     break 2;
                 }
                 $check++;
             }
             $db = new $this->modules['database']($this->sets['db_host'], $this->sets['db_user'], $this->sets['db_pass'], $this->sets['db_name'], $this->sets['db_port'], $this->sets['db_socket'], $this->sets['prefix']);
             if (!$db->connection) {
                 if ($this->get['step'] == 15) {
                     $sets_error = '<br />Could not connect with the specified information.';
                 } else {
                     $sets_error = null;
                 }
                 include 'templates/upgradefromdatabase.php';
                 break;
             }
             $queries = array();
             $pre = $this->sets['prefix'];
             $full_template_list = false;
             $template_list = array();
             $new_permissions = array();
             $this->sets['installed'] = 1;
             $this->pre = $this->sets['prefix'];
             $this->db = $db;
             // We can't get settings from the database unless we're already running >= 1.1.0
             if ($this->get['from'] >= 10) {
                 $this->sets = $this->get_settings($this->sets);
             }
             $this->perms = new $this->modules['permissions']($this);
             while ($this->get['from'] <= LATEST) {
                 include "./upgrade_{$this->get['from']}.php";
                 $this->get['from']++;
                 // This gets really complicated so be careful
                 if (is_bool($need_templates)) {
                     if ($need_templates) {
                         $full_template_list = true;
                     }
                 } else {
                     $template_list = array_unique(array_merge($template_list, $need_templates));
                 }
             }
             /**
              * The order this next block executes is important.
              * 1. Verify we can upgrade templates
              * 2. Upgrade board
              * 3. Upgrade templates
              *
              * Because the query used to upgrade templates is for
              * the most recent version of the board, we must run
              * it after the board is fully upgraded.
              **/
             if ($need_templates && !is_readable(SKIN_FILE)) {
                 echo 'No templates could be loaded from ' . SKIN_FILE;
                 break;
             }
             execute_queries($queries, $this->db);
             $queries = array();
             // Check the default skin still exists
             $result = $this->db->fetch("SELECT * FROM %pskins WHERE skin_dir='default'");
             if (!$result) {
                 $this->db->query("INSERT INTO %pskins (skin_name, skin_dir) VALUES ('QSF Comet', 'default')");
                 $full_template_list = true;
             }
             $skinsupdated = "The following templates were upgraded:<br /><br /><span class='tiny'>";
             $didsomething = false;
             $result = $this->db->query("SELECT * FROM %pskins");
             while ($row = $this->db->nqfetch($result)) {
                 $skin = $row['skin_dir'];
                 // QSF or MB default skin in default location
                 if (($row['skin_name'] == 'QSF Comet' || $row['skin_name'] == 'Candy Corn') && $skin == 'default') {
                     if ($full_template_list || $template_list) {
                         if ($full_template_list) {
                             $template_list = null;
                             $this->db->query("DELETE FROM %ptemplates WHERE template_skin='default'");
                             $skinsupdated .= $row['skin_name'] . ": Full Template Replacement<br />";
                         } else {
                             $template_list_string = '';
                             foreach ($template_list as $temp_name) {
                                 $template_list_string .= "'{$temp_name}',";
                                 $skinsupdated .= $row['skin_name'] . ": " . $temp_name . "<br />";
                             }
                             $template_list_string = substr($template_list_string, 0, -1);
                             $this->db->query("DELETE FROM %ptemplates WHERE template_name IN ({$template_list_string}) AND template_skin='default'");
                         }
                         // Create template
                         $xmlInfo = new xmlparser();
                         $xmlInfo->parse(SKIN_FILE);
                         $templatesNode = $xmlInfo->GetNodeByPath('QSFMOD/TEMPLATES');
                         packageutil::insert_templates('default', $this->db, $templatesNode, $template_list);
                         unset($templatesNode);
                         $xmlInfo = null;
                         $didsomething = true;
                     }
                     if ($row['skin_name'] == 'Candy Corn') {
                         $this->db->query("UPDATE %pskins SET skin_name='QSF Comet' WHERE skin_dir='%s'", $skin);
                     }
                 } else {
                     // Other skins
                     $xmlInfo = new xmlparser();
                     $xmlInfo->parse(SKIN_FILE);
                     $templatesNode = $xmlInfo->GetNodeByPath('QSFMOD/TEMPLATES');
                     $temp_names = packageutil::list_templates($templatesNode);
                     $temps_to_insert = array();
                     foreach ($temp_names as $temp_name) {
                         $miss = $this->db->query("SELECT template_name FROM %ptemplates WHERE template_skin='%s' AND template_name='%s'", $skin, $temp_name);
                         if ($this->db->num_rows($miss) < 1) {
                             $skinsupdated .= $row['skin_name'] . ": Added: " . $temp_name . "<br />";
                             $temps_to_insert[] = $temp_name;
                         }
                     }
                     if ($temps_to_insert) {
                         $templatesNode = $xmlInfo->GetNodeByPath('QSFMOD/TEMPLATES');
                         packageutil::insert_templates($skin, $this->db, $templatesNode, $temps_to_insert);
                         $didsomething = true;
                     }
                     $xmlInfo = null;
                 }
                 /* Iterate over all our templates. This is excessive, but only needs to be done once anyway. */
                 $sql = "SELECT template_html, template_name FROM {$this->pre}templates WHERE template_skin='{$skin}'";
                 $query = $this->db->query($sql);
                 while ($row2 = $this->db->nqfetch($query)) {
                     if (strstr($row2['template_html'], '{$messageclass}')) {
                         $didsomething = true;
                         $row2['template_html'] = str_replace('{$messageclass}', '<MODLET messagelink(class)>', $row2['template_html']);
                         $updated_temps[] = $row['template_name'];
                         $this->db->query("UPDATE %ptemplates SET template_html='%s' WHERE template_skin='%s' AND template_name='%s'", $row2['template_html'], $skin, $row2['template_name']);
                     }
                     if (strstr($row2['template_html'], '{$MessageLink}')) {
                         $didsomething = true;
                         $row2['template_html'] = str_replace('{$MessageLink}', '<MODLET messagelink(text)>', $row2['template_html']);
                         $skinsupdated .= $row['skin_name'] . " Modified: " . $row2['template_name'] . "<br />";
                         $this->db->query("UPDATE %ptemplates SET template_html='%s' WHERE template_skin='%s' AND template_name='%s'", $row2['template_html'], $skin, $row2['template_name']);
                     }
                     if (strstr($row2['template_html'], '$mercury')) {
                         $didsomething = true;
                         $row2['template_html'] = str_replace('$mercury', '$qsf', $row2['template_html']);
                         $skinsupdated .= $row['skin_name'] . " Modified: " . $row2['template_name'] . "<br />";
                         $this->db->query("UPDATE %ptemplates SET template_html='%s' WHERE template_skin='%s' AND template_name='%s'", $row2['template_html'], $skin, $row2['template_name']);
                     }
                     if (strstr($row2['template_html'], '$qsfboard')) {
                         $didsomething = true;
                         $row2['template_html'] = str_replace('$qsfboard', '$quicksilverforums', $row2['template_html']);
                         $skinsupdated .= $row['skin_name'] . " Modified: " . $row2['template_name'] . "<br />";
                         $this->db->query("UPDATE %ptemplates SET template_html='%s' WHERE template_skin='%s' AND template_name='%s'", $row2['template_html'], $skin, $row2['template_name']);
                     }
                     if (strstr($row2['template_html'], '$qsf->lang->main_powered')) {
                         $didsomething = true;
                         $row2['template_html'] = str_replace('$qsf->lang->main_powered', '$qsf->lang->powered', $row2['template_html']);
                         $skinsupdated .= $row['skin_name'] . " Modified: " . $row2['template_name'] . "<br />";
                         $this->db->query("UPDATE %ptemplates SET template_html='%s' WHERE template_skin='%s' AND template_name='%s'", $row2['template_html'], $skin, $row2['template_name']);
                     }
                     if (strstr($row2['template_html'], '$qsf->lang->main_seconds')) {
                         $didsomething = true;
                         $row2['template_html'] = str_replace('$qsf->lang->main_seconds', '$qsf->lang->seconds', $row2['template_html']);
                         $skinsupdated .= $row['skin_name'] . " Modified: " . $row2['template_name'] . "<br />";
                         $this->db->query("UPDATE %ptemplates SET template_html='%s' WHERE template_skin='%s' AND template_name='%s'", $row2['template_html'], $skin, $row2['template_name']);
                     }
                     if (strstr($row2['template_html'], '$this->lang->pm_inbox')) {
                         $didsomething = true;
                         $row2['template_html'] = str_replace('$this->lang->pm_inbox', '$foldername', $row2['template_html']);
                         $skinsupdated .= $row['skin_name'] . " Modified: " . $row2['template_name'] . "<br />";
                         $this->db->query("UPDATE %ptemplates SET template_html='%s' WHERE template_skin='%s' AND template_name='%s'", $row2['template_html'], $skin, $row2['template_name']);
                     }
                     if (strstr($row2['template_html'], '$this->lang->board_topics_new')) {
                         $didsomething = true;
                         $row2['template_html'] = str_replace('$this->lang->board_topics_new', '$this->lang->main_topics_new', $row2['template_html']);
                         $skinsupdated .= $row['skin_name'] . " Modified: " . $row2['template_name'] . "<br />";
                         $this->db->query("UPDATE %ptemplates SET template_html='%s' WHERE template_skin='%s' AND template_name='%s'", $row2['template_html'], $skin, $row2['template_name']);
                     }
                     if (strstr($row2['template_html'], '$this->lang->forum_topics_new')) {
                         $didsomething = true;
                         $row2['template_html'] = str_replace('$this->lang->forum_topics_new', '$this->lang->main_topics_new', $row2['template_html']);
                         $skinsupdated .= $row['skin_name'] . " Modified: " . $row2['template_name'] . "<br />";
                         $this->db->query("UPDATE %ptemplates SET template_html='%s' WHERE template_skin='%s' AND template_name='%s'", $row2['template_html'], $skin, $row2['template_name']);
                     }
                     if (strstr($row2['template_html'], '$this->lang->recent_topics_new')) {
                         $didsomething = true;
                         $row2['template_html'] = str_replace('$this->lang->recent_topics_new', '$this->lang->main_topics_new', $row2['template_html']);
                         $skinsupdated .= $row['skin_name'] . " Modified: " . $row2['template_name'] . "<br />";
                         $this->db->query("UPDATE %ptemplates SET template_html='%s' WHERE template_skin='%s' AND template_name='%s'", $row2['template_html'], $skin, $row2['template_name']);
                     }
                     if (strstr($row2['template_html'], 'post_mbcode_')) {
                         $didsomething = true;
                         $row2['template_html'] = str_replace('post_mbcode_', 'mbcode_', $row2['template_html']);
                         $skinsupdated .= $row['skin_name'] . " Modified: " . $row2['template_name'] . "<br />";
                         $this->db->query("UPDATE %ptemplates SET template_html='%s' WHERE template_skin='%s' AND template_name='%s'", $row2['template_html'], $skin, $row2['template_name']);
                     }
                     if (strstr($row2['template_html'], '$qsf->tree')) {
                         $didsomething = true;
                         $row2['template_html'] = str_replace('$qsf->tree', '$qsf->htmlwidgets->tree', $row2['template_html']);
                         $skinsupdated .= $row['skin_name'] . " Modified: " . $row2['template_name'] . "<br />";
                         $this->db->query("UPDATE %ptemplates SET template_html='%s' WHERE template_skin='%s' AND template_name='%s'", $row2['template_html'], $skin, $row2['template_name']);
                     }
                     if (strstr($row2['template_html'], '$admin->tree')) {
                         $didsomething = true;
                         $row2['template_html'] = str_replace('$admin->tree', '$admin->htmlwidgets->tree', $row2['template_html']);
                         $skinsupdated .= $row['skin_name'] . " Modified: " . $row2['template_name'] . "<br />";
                         $this->db->query("UPDATE %ptemplates SET template_html='%s' WHERE template_skin='%s' AND template_name='%s'", $row2['template_html'], $skin, $row2['template_name']);
                     }
                     if (strstr($row2['template_html'], '$this->tree')) {
                         $didsomething = true;
                         $row2['template_html'] = str_replace('$this->tree', '$this->htmlwidgets->tree', $row2['template_html']);
                         $skinsupdated .= $row['skin_name'] . " Modified: " . $row2['template_name'] . "<br />";
                         $this->db->query("UPDATE %ptemplates SET template_html='%s' WHERE template_skin='%s' AND template_name='%s'", $row2['template_html'], $skin, $row2['template_name']);
                     }
                     if (strstr($row2['template_html'], '{$active[\'TOTALCOUNT\']}')) {
                         $didsomething = true;
                         $row2['template_html'] = str_replace('{$active[\'TOTALCOUNT\']}', 'Skin Update Required', $row2['template_html']);
                         $skinsupdated .= $row['skin_name'] . " Modified: " . $row2['template_name'] . "<br />";
                         $this->db->query("UPDATE %ptemplates SET template_html='%s' WHERE template_skin='%s' AND template_name='%s'", $row2['template_html'], $skin, $row2['template_name']);
                     }
                     if (strstr($row2['template_html'], '{$active[\'MEMBERCOUNT\']}')) {
                         $didsomething = true;
                         $row2['template_html'] = str_replace('{$active[\'MEMBERCOUNT\']}', 'Skin Update Required', $row2['template_html']);
                         $skinsupdated .= $row['skin_name'] . " Modified: " . $row2['template_name'] . "<br />";
                         $this->db->query("UPDATE %ptemplates SET template_html='%s' WHERE template_skin='%s' AND template_name='%s'", $row2['template_html'], $skin, $row2['template_name']);
                     }
                     if (strstr($row2['template_html'], '{$active[\'GUESTCOUNT\']}')) {
                         $didsomething = true;
                         $row2['template_html'] = str_replace('{$active[\'GUESTCOUNT\']}', 'Skin Update Required', $row2['template_html']);
                         $skinsupdated .= $row['skin_name'] . " Modified: " . $row2['template_name'] . "<br />";
                         $this->db->query("UPDATE %ptemplates SET template_html='%s' WHERE template_skin='%s' AND template_name='%s'", $row2['template_html'], $skin, $row2['template_name']);
                     }
                     if (strstr($row2['template_html'], '{$active[\'USERS\']}')) {
                         $didsomething = true;
                         $row2['template_html'] = str_replace('{$active[\'USERS\']}', 'Skin Update Required', $row2['template_html']);
                         $skinsupdated .= $row['skin_name'] . " Modified: " . $row2['template_name'] . "<br />";
                         $this->db->query("UPDATE %ptemplates SET template_html='%s' WHERE template_skin='%s' AND template_name='%s'", $row2['template_html'], $skin, $row2['template_name']);
                     }
                 }
             }
             $this->write_sets();
             // New fields in forum tables need to be fixed in case the old install was a conversion
             $this->updateForumTrees();
             $this->RecountForums();
             // Check if new permissions need to be added
             if (!empty($new_permissions)) {
                 foreach ($new_permissions as $id => $default) {
                     // Groups
                     while ($this->perms->get_group()) {
                         $perm_on = $default;
                         if ($this->perms->auth('is_admin')) {
                             $perm_on = true;
                         }
                         if (!$this->perms->auth('do_anything')) {
                             $perm_on = false;
                         }
                         if ($this->perms->is_guest) {
                             $perm_on = false;
                         }
                         $this->perms->add_perm($id, $perm_on);
                         $this->perms->update();
                     }
                     // Users
                     while ($this->perms->get_group(true)) {
                         $perm_on = $default;
                         if ($this->perms->auth('is_admin')) {
                             $perm_on = true;
                         }
                         if (!$this->perms->auth('do_anything')) {
                             $perm_on = false;
                         }
                         if ($this->perms->is_guest) {
                             $perm_on = false;
                         }
                         $this->perms->add_perm($id, $perm_on);
                         $this->perms->update();
                     }
                 }
             }
             $message = '';
             if ($didsomething) {
                 $message = $skinsupdated . "</span>";
             }
             echo $message . "<br />Upgrade successful.<br />";
             echo "<a href='../index.php'>To the board</a>";
             break;
     }
 }