/** * Gets the package_update.xml from an update server. * * @param wcf\data\package\update\server\PackageUpdateServer $updateServer */ protected static function getPackageUpdateXML(PackageUpdateServer $updateServer) { // send request $response = self::sendRequest($updateServer->serverURL, array('lastUpdateTime' => $updateServer->lastUpdateTime), $updateServer->getAuthData()); // check response // check http code if ($response['httpStatusCode'] == 401) { throw new PackageUpdateAuthorizationRequiredException($updateServer['packageUpdateServerID'], $updateServer['server'], $response); } if ($response['httpStatusCode'] != 200) { throw new SystemException(WCF::getLanguage()->get('wcf.acp.packageUpdate.error.listNotFound') . ' (' . $response['httpStatusLine'] . ')'); } // parse given package update xml $allNewPackages = self::parsePackageUpdateXML($response['content']); unset($response); // save packages if (count($allNewPackages)) { self::savePackageUpdates($allNewPackages, $updateServer->packageUpdateServerID); } unset($allNewPackages); // update server status $updateServerEditor = new PackageUpdateServerEditor($updateServer); $updateServerEditor->update(array('lastUpdateTime' => TIME_NOW, 'status' => 'online', 'errorMessage' => '')); }
/** * Gets the package_update.xml from an update server. * * @param \wcf\data\package\update\server\PackageUpdateServer $updateServer * @param boolean $forceHTTP */ protected function getPackageUpdateXML(PackageUpdateServer $updateServer, $forceHTTP = false) { $settings = array(); $authData = $updateServer->getAuthData(); if ($authData) { $settings['auth'] = $authData; } $secureConnection = $updateServer->attemptSecureConnection(); if ($secureConnection && !$forceHTTP) { $settings['timeout'] = 5; } $request = new HTTPRequest($updateServer->getListURL($forceHTTP), $settings); if ($updateServer->apiVersion == '2.1') { $metaData = $updateServer->getMetaData(); if (isset($metaData['list']['etag'])) { $request->addHeader('if-none-match', $metaData['list']['etag']); } if (isset($metaData['list']['lastModified'])) { $request->addHeader('if-modified-since', $metaData['list']['lastModified']); } } try { $request->execute(); $reply = $request->getReply(); } catch (HTTPUnauthorizedException $e) { throw new PackageUpdateUnauthorizedException($request, $updateServer); } catch (SystemException $e) { $reply = $request->getReply(); $statusCode = is_array($reply['statusCode']) ? reset($reply['statusCode']) : $reply['statusCode']; // status code 0 is a connection timeout if (!$statusCode && $secureConnection) { if (preg_match('~https?://(?:update|store)\\.woltlab\\.com~', $updateServer->serverURL)) { // woltlab.com servers are most likely to be available, thus we assume that SSL connections are dropped RemoteFile::disableSSL(); } // retry via http $this->getPackageUpdateXML($updateServer, true); return; } throw new SystemException(WCF::getLanguage()->get('wcf.acp.package.update.error.listNotFound') . ' (' . $statusCode . ')'); } // parse given package update xml $allNewPackages = false; if ($updateServer->apiVersion == '2.0' || $reply['statusCode'] != 304) { $allNewPackages = $this->parsePackageUpdateXML($reply['body']); } $data = array('lastUpdateTime' => TIME_NOW, 'status' => 'online', 'errorMessage' => ''); // check if server indicates support for a newer API if ($updateServer->apiVersion == '2.0' && !empty($reply['httpHeaders']['wcf-update-server-api'])) { $apiVersions = explode(' ', reset($reply['httpHeaders']['wcf-update-server-api'])); if (in_array('2.1', $apiVersions)) { $data['apiVersion'] = '2.1'; } } $metaData = array(); if ($updateServer->apiVersion == '2.1' || isset($data['apiVersion']) && $data['apiVersion'] == '2.1') { if (empty($reply['httpHeaders']['etag']) && empty($reply['httpHeaders']['last-modified'])) { throw new SystemException("Missing required HTTP headers 'etag' and 'last-modified'."); } else { if (empty($reply['httpHeaders']['wcf-update-server-ssl'])) { throw new SystemException("Missing required HTTP header 'wcf-update-server-ssl'."); } } $metaData['list'] = array(); if (!empty($reply['httpHeaders']['etag'])) { $metaData['list']['etag'] = reset($reply['httpHeaders']['etag']); } if (!empty($reply['httpHeaders']['last-modified'])) { $metaData['list']['lastModified'] = reset($reply['httpHeaders']['last-modified']); } $metaData['ssl'] = reset($reply['httpHeaders']['wcf-update-server-ssl']) == 'true' ? true : false; } $data['metaData'] = serialize($metaData); unset($request, $reply); if ($allNewPackages !== false) { // purge package list $sql = "DELETE FROM\twcf" . WCF_N . "_package_update\n\t\t\t\tWHERE\t\tpackageUpdateServerID = ?"; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute(array($updateServer->packageUpdateServerID)); // save packages if (!empty($allNewPackages)) { $this->savePackageUpdates($allNewPackages, $updateServer->packageUpdateServerID); } unset($allNewPackages); } // update server status $updateServerEditor = new PackageUpdateServerEditor($updateServer); $updateServerEditor->update($data); }
/** * Gets the package_update.xml from an update server. * * @param wcf\data\package\update\server\PackageUpdateServer $updateServer */ protected function getPackageUpdateXML(PackageUpdateServer $updateServer) { $authData = $updateServer->getAuthData(); $settings = array(); if ($authData) $settings['auth'] = $authData; $postData = array( 'lastUpdateTime' => $updateServer->lastUpdateTime ); // append auth code if set and update server resolves to woltlab.com if (PACKAGE_SERVER_AUTH_CODE && Regex::compile('^https?://[a-z]+.woltlab.com/')->match($updateServer->serverURL)) { $postData['authCode'] = PACKAGE_SERVER_AUTH_CODE; } $request = new HTTPRequest($updateServer->serverURL, $settings, $postData); try { $request->execute(); $reply = $request->getReply(); } catch (SystemException $e) { $reply = $request->getReply(); if ($reply['statusCode'] == 401) { throw new PackageUpdateAuthorizationRequiredException($updateServer['packageUpdateServerID'], $updateServer['server'], $reply); } throw new SystemException(WCF::getLanguage()->get('wcf.acp.packageUpdate.error.listNotFound') . ' ('.reset($reply['headers']).')'); } // parse given package update xml $allNewPackages = $this->parsePackageUpdateXML($reply['body']); unset($request, $reply); // save packages if (!empty($allNewPackages)) { $this->savePackageUpdates($allNewPackages, $updateServer->packageUpdateServerID); } unset($allNewPackages); // update server status $updateServerEditor = new PackageUpdateServerEditor($updateServer); $updateServerEditor->update(array( 'lastUpdateTime' => TIME_NOW, 'status' => 'online', 'errorMessage' => '' )); }
/** * @todo This whole page is carzy, it's manipulating the requested page, but RequestHandler does not work this way * @see wcf\page\IPage::readParameters() */ public function readParameters() { parent::readParameters(); if (isset($_REQUEST['loginUsername'])) { $this->loginUsername = $_REQUEST['loginUsername']; } if (isset($_REQUEST['loginPassword'])) { $this->loginPassword = $_REQUEST['loginPassword']; } if (isset($_REQUEST['saveAuthData'])) { $this->saveAuthData = intval($_REQUEST['saveAuthData']); } if ($this->packageUpdateServerID == 0 && isset($_REQUEST['packageUpdateServerID'])) { $this->packageUpdateServerID = intval($_REQUEST['packageUpdateServerID']); } if (!empty($_REQUEST['requestedPage']) || !empty($_REQUEST['requestedForm']) || !empty($_REQUEST['requestedAction'])) { // get update server $updateServer = new PackageUpdateServer($this->packageUpdateServerID); if (!$updateServer->packageUpdateServerID) { throw new IllegalLinkException(); } // update update server if ($this->saveAuthData) { $updateServerEditor = new PackageUpdateServerEditor($updateServer); $updateServerEditor->update(array('loginUsername' => $this->loginUsername, 'loginPassword' => $this->loginPassword)); } // save auth data in session $authData = array('authType' => 'Basic', 'loginUsername' => $this->loginUsername, 'loginPassword' => $this->loginPassword); // session data $packageUpdateAuthData = WCF::getSession()->getVar('packageUpdateAuthData'); if ($packageUpdateAuthData === null) { $packageUpdateAuthData = array(); } $packageUpdateAuthData[$this->packageUpdateServerID] = $authData; WCF::getSession()->register('packageUpdateAuthData', $packageUpdateAuthData); // remove form=PackageUpdateAuth unset($_REQUEST['form'], $_GET['form'], $_POST['form']); // set page/form/action if (!empty($_REQUEST['requestedPage'])) { $_POST['page'] = $_REQUEST['requestedPage']; } else { if (!empty($_REQUEST['requestedForm'])) { $_POST['form'] = $_REQUEST['requestedForm']; } else { $_POST['action'] = $_REQUEST['requestedAction']; } } // remove requestedPage... unset($_REQUEST['requestedPage'], $_REQUEST['requestedForm'], $_REQUEST['requestedAction']); // start request handler /** * TODO: This is not working anymore, find a solution! */ global $packageDirs; RequestHandler::handle(ArrayUtil::appendSuffix(!empty($packageDirs) ? $packageDirs : array(WCF_DIR), 'lib/acp/')); exit; } }