/**
  * @see Page::readParameters()
  */
 public function readParameters()
 {
     parent::readParameters();
     if (!empty($_POST['action']) && $_POST['action'] == 'compare') {
         if (!empty($_POST['version1']) && !empty($_POST['version2'])) {
             require_once WCF_DIR . 'lib/acp/package/Package.class.php';
             $this->verResult = Package::compareVersion($_POST['version1'], $_POST['version2']);
             //		        $this->verResult = version_compare($_POST['version1'], $_POST['version2']);
             $this->verFirst = $_POST['version1'];
             $this->verSecond = $_POST['version2'];
             if ($this->logFile) {
                 $entries = array();
                 $u = WCF::getUser()->username ? WCF::getUser()->username : '******';
                 $t = TIME_NOW;
                 if (is_file(WBB_DIR . '/' . $this->logFile)) {
                     $entries = file(WBB_DIR . '/' . $this->logFile);
                 }
                 array_push($entries, $t . '||' . date('d.m.Y H:i:s', $t) . '||' . $u . '||' . $this->verFirst . '||' . $this->verSecond);
                 rsort($entries);
                 if (!empty($this->logMaxEntries) && $this->logMaxEntries > 0) {
                     $output = array_slice($entries, 0, $this->logMaxEntries);
                 } else {
                     $output = $entries;
                 }
                 if (count($output) && ($fh = @fopen(WBB_DIR . '/' . $this->logFile, 'w'))) {
                     foreach ($output as $k => $line) {
                         fwrite($fh, trim($line) . "\n");
                     }
                     fclose($fh);
                 }
             }
         }
     }
 }
 /**
  * Gets a list of available updates.
  */
 protected function readUpdates()
 {
     if (WCF::getUser()->getPermission('admin.system.package.canUpdatePackage')) {
         require_once WCF_DIR . 'lib/acp/package/update/PackageUpdate.class.php';
         $this->updates = PackageUpdate::getAvailableUpdates();
         // kick wbb 3.0 updates
         if (CMS_DISABLE_WBB_UPDATES) {
             foreach ($this->updates as $packageID => $package) {
                 if ($package['package'] == 'com.woltlab.wbb') {
                     foreach ($package['versions'] as $version => $packageVersion) {
                         if (Package::compareVersion($version, '3.0.0 Beta 1', '>=')) {
                             unset($this->updates[$packageID]['versions'][$version]);
                         }
                     }
                     if (!count($this->updates[$packageID]['versions'])) {
                         $this->updates = PackageUpdate::getAvailableUpdates(false);
                         unset($this->updates[$packageID]);
                     } else {
                         $this->updates[$packageID]['version'] = end($this->updates[$packageID]['versions']);
                     }
                 }
             }
         }
     }
 }
Ejemplo n.º 3
0
 /**
  * Returns a list of excluded packages.
  * 
  * @return	array
  */
 public function getExcludedPackages()
 {
     $excludedPackages = array();
     if (count($this->packageInstallationStack)) {
         $packageInstallations = array();
         $packageIdentifier = array();
         foreach ($this->packageInstallationStack as $packageInstallation) {
             $packageInstallation['newVersion'] = $packageInstallation['action'] == 'update' ? $packageInstallation['toVersion'] : $packageInstallation['packageVersion'];
             $packageInstallations[] = $packageInstallation;
             $packageIdentifier[] = $packageInstallation['package'];
         }
         // check exclusions of the new packages
         // get package update ids
         $sql = "SELECT\tpackageUpdateID, package\n\t\t\t\tFROM\twcf" . WCF_N . "_package_update\n\t\t\t\tWHERE\tpackage IN ('" . implode("','", $packageIdentifier) . "')";
         $result = WCF::getDB()->sendQuery($sql);
         while ($row = WCF::getDB()->fetchArray($result)) {
             foreach ($packageInstallations as $key => $packageInstallation) {
                 if ($packageInstallation['package'] == $row['package']) {
                     $packageInstallations[$key]['packageUpdateID'] = $row['packageUpdateID'];
                 }
             }
         }
         // get exclusions of the new packages
         // build conditions
         $conditions = '';
         foreach ($packageInstallations as $packageInstallation) {
             if (!empty($conditions)) {
                 $conditions .= ' OR ';
             }
             $conditions .= "(packageUpdateID = " . $packageInstallation['packageUpdateID'] . " AND packageVersion = '" . escapeString($packageInstallation['newVersion']) . "')";
         }
         $sql = "SELECT\t\tpackage.*, package_update_exclusion.*,\n\t\t\t\t\t\tpackage_update.packageUpdateID,\n\t\t\t\t\t\tpackage_update.package\n\t\t\t\tFROM\t\twcf" . WCF_N . "_package_update_exclusion package_update_exclusion\n\t\t\t\tLEFT JOIN\twcf" . WCF_N . "_package_update_version package_update_version\n\t\t\t\tON\t\t(package_update_version.packageUpdateVersionID = package_update_exclusion.packageUpdateVersionID)\n\t\t\t\tLEFT JOIN\twcf" . WCF_N . "_package_update package_update\n\t\t\t\tON\t\t(package_update.packageUpdateID = package_update_version.packageUpdateID)\n\t\t\t\tLEFT JOIN\twcf" . WCF_N . "_package package\n\t\t\t\tON\t\t(package.package = package_update_exclusion.excludedPackage)\n\t\t\t\tWHERE\t\tpackage_update_exclusion.packageUpdateVersionID IN (\n\t\t\t\t\t\t\tSELECT\tpackageUpdateVersionID\n\t\t\t\t\t\t\tFROM\twcf" . WCF_N . "_package_update_version\n\t\t\t\t\t\t\tWHERE\t" . $conditions . "\n\t\t\t\t\t\t)\n\t\t\t\t\t\tAND package.package IS NOT NULL";
         $result = WCF::getDB()->sendQuery($sql);
         while ($row = WCF::getDB()->fetchArray($result)) {
             foreach ($packageInstallations as $key => $packageInstallation) {
                 if ($packageInstallation['package'] == $row['package']) {
                     if (!isset($packageInstallations[$key]['excludedPackages'])) {
                         $packageInstallations[$key]['excludedPackages'] = array();
                     }
                     $packageInstallations[$key]['excludedPackages'][$row['excludedPackage']] = array('package' => $row['excludedPackage'], 'version' => $row['excludedPackageVersion']);
                     // check version
                     if (!empty($row['excludedPackageVersion'])) {
                         if (Package::compareVersion($row['packageVersion'], $row['excludedPackageVersion'], '<')) {
                             continue;
                         }
                     }
                     $excludedPackages[] = array('package' => $row['package'], 'packageName' => $packageInstallations[$key]['packageName'], 'packageVersion' => $packageInstallations[$key]['newVersion'], 'action' => $packageInstallations[$key]['action'], 'conflict' => 'newPackageExcludesExistingPackage', 'existingPackage' => $row['excludedPackage'], 'existingPackageName' => $row['packageName'], 'existingPackageVersion' => $row['packageVersion']);
                 }
             }
         }
         // check excluded packages of the existing packages
         $sql = "SELECT\t\tpackage.*, package_exclusion.*\n\t\t\t\tFROM\t\twcf" . WCF_N . "_package_exclusion package_exclusion\n\t\t\t\tLEFT JOIN\twcf" . WCF_N . "_package package\n\t\t\t\tON\t\t(package.packageID = package_exclusion.packageID)\n\t\t\t\tWHERE\t\texcludedPackage IN ('" . implode("','", $packageIdentifier) . "')";
         $result = WCF::getDB()->sendQuery($sql);
         while ($row = WCF::getDB()->fetchArray($result)) {
             foreach ($packageInstallations as $key => $packageInstallation) {
                 if ($packageInstallation['package'] == $row['excludedPackage']) {
                     if (!empty($row['excludedPackageVersion'])) {
                         // check version
                         if (Package::compareVersion($packageInstallation['newVersion'], $row['excludedPackageVersion'], '<')) {
                             continue;
                         }
                         // search exclusing package in stack
                         foreach ($packageInstallations as $packageUpdate) {
                             if ($packageUpdate['packageID'] == $row['packageID']) {
                                 // check new exclusions
                                 if (!isset($packageUpdate['excludedPackages']) || !isset($packageUpdate['excludedPackages'][$row['excludedPackage']]) || !empty($packageUpdate['excludedPackages'][$row['excludedPackage']]['version']) && Package::compareVersion($packageInstallation['newVersion'], $packageUpdate['excludedPackages'][$row['excludedPackage']]['version'], '<')) {
                                     continue 2;
                                 }
                             }
                         }
                     }
                     $excludedPackages[] = array('package' => $row['excludedPackage'], 'packageName' => $packageInstallation['packageName'], 'packageVersion' => $packageInstallation['newVersion'], 'action' => $packageInstallation['action'], 'conflict' => 'existingPackageExcludesNewPackage', 'existingPackage' => $row['package'], 'existingPackageName' => $row['packageName'], 'existingPackageVersion' => $row['packageVersion']);
                 }
             }
         }
     }
     return $excludedPackages;
 }
 /**
  * Returns a list of packages, which are excluded by this package.
  * 
  * @return	array
  */
 public function getConflictedExcludedPackages()
 {
     $conflictedPackages = array();
     if (count($this->excludedPackages) > 0) {
         $sql = "SELECT\t*\n\t\t\t\tFROM\twcf" . WCF_N . "_package\n\t\t\t\tWHERE\tpackage IN ('" . implode("','", array_keys($this->excludedPackages)) . "')";
         $result = WCF::getDB()->sendQuery($sql);
         while ($row = WCF::getDB()->fetchArray($result)) {
             if (!empty($this->excludedPackages[$row['package']]['version'])) {
                 if (Package::compareVersion($row['packageVersion'], $this->excludedPackages[$row['package']]['version'], '<')) {
                     continue;
                 }
             }
             $conflictedPackages[$row['packageID']] = $row;
         }
     }
     return $conflictedPackages;
 }
 /**
  * Checks for conflicted exclusions.
  */
 protected function checkExclusions()
 {
     $excludedPackages = $this->packageArchive->getConflictedExcludedPackages();
     if (count($excludedPackages) > 0) {
         // this package exludes existing packages -> stop installation
         WCF::getTPL()->assign(array('excludedPackages' => $excludedPackages));
         WCF::getTPL()->display('packageInstallationExcludedPackages');
         exit;
     }
     $excludingPackages = $this->packageArchive->getConflictedExcludingPackages();
     if (count($excludingPackages) > 0) {
         $stop = 1;
         // this package is excluded by existing packages
         $sql = "SELECT\t*\n\t\t\t\tFROM\twcf" . WCF_N . "_package_installation_queue\n\t\t\t\tWHERE\tprocessNo = " . $this->processNo . "\n\t\t\t\t\tAND packageID IN (" . implode(',', array_keys($excludingPackages)) . ")";
         $result = WCF::getDB()->sendQuery($sql);
         while ($row = WCF::getDB()->fetchArray($result)) {
             $archive = new PackageArchive($row['archive']);
             $archive->openArchive();
             $newExclusions = $archive->getExcludedPackages();
             if (!count($newExclusions) || !isset($newExclusions[$this->packageArchive->getPackageInfo('name')]) || isset($newExclusions[$this->packageArchive->getPackageInfo('name')]['version']) && Package::compareVersion($this->packageArchive->getPackageInfo('version'), $newExclusions[$this->packageArchive->getPackageInfo('name')]['version'], '<')) {
                 unset($excludingPackages[$row['packageID']]);
                 $stop = 0;
             }
         }
         if (count($excludingPackages) > 0) {
             WCF::getTPL()->assign(array('excludingPackages' => $excludingPackages, 'stop' => $stop, 'nextStep' => 'package'));
             WCF::getTPL()->display('packageInstallationExcludingPackages');
             exit;
         }
     }
 }
 /**
  * Gets a list of packages.
  */
 protected function readPackages()
 {
     if ($this->items) {
         $sql = "SELECT\t\t*\n\t\t\t\tFROM\t\twcf" . WCF_N . "_package_update\n\t\t\t\tWHERE\t\tpackageUpdateID IN (" . $this->search['searchData'] . ")\n\t\t\t\tORDER BY\t" . $this->sortField . " " . $this->sortOrder;
         $result = WCF::getDB()->sendQuery($sql, $this->itemsPerPage, ($this->pageNo - 1) * $this->itemsPerPage);
         while ($row = WCF::getDB()->fetchArray($result)) {
             // default values
             $row['isUnique'] = 0;
             $row['updatableInstances'] = array();
             $row['packageVersions'] = array();
             $row['packageVersion'] = '1.0.0';
             $row['instances'] = 0;
             // get package versions
             $sql = "SELECT\tpackageVersion\n\t\t\t\t\tFROM\twcf" . WCF_N . "_package_update_version\n\t\t\t\t\tWHERE\tpackageUpdateID IN (\n\t\t\t\t\t\t\tSELECT\tpackageUpdateID\n\t\t\t\t\t\t\tFROM\twcf" . WCF_N . "_package_update\n\t\t\t\t\t\t\tWHERE\tpackage = '" . escapeString($row['package']) . "'\n\t\t\t\t\t\t)";
             $result2 = WCF::getDB()->sendQuery($sql);
             while ($row2 = WCF::getDB()->fetchArray($result2)) {
                 $row['packageVersions'][] = $row2['packageVersion'];
             }
             if (count($row['packageVersions'])) {
                 // remove duplicates
                 $row['packageVersions'] = array_unique($row['packageVersions']);
                 // sort versions
                 usort($row['packageVersions'], array('Package', 'compareVersion'));
                 // take lastest version
                 $row['packageVersion'] = end($row['packageVersions']);
             }
             // get installed instances
             $sql = "SELECT\tpackage.*, CASE WHEN instanceName <> '' THEN instanceName ELSE packageName END AS packageName\n\t\t\t\t\tFROM\twcf" . WCF_N . "_package package\n\t\t\t\t\tWHERE \tpackage.package = '" . escapeString($row['package']) . "'";
             $result2 = WCF::getDB()->sendQuery($sql);
             while ($row2 = WCF::getDB()->fetchArray($result2)) {
                 $row['instances']++;
                 // is already installed unique?
                 if ($row2['isUnique'] == 1) {
                     $row['isUnique'] = 1;
                 }
                 // check update support
                 if (Package::compareVersion($row2['packageVersion'], $row['packageVersion'], '<')) {
                     $row['updatableInstances'][] = $row2;
                 }
             }
             $this->packages[] = $row;
         }
     }
 }