/** * 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' => '' )); }
/** * 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 stored auth data of given update server. * * @param array $updateServer * @return array $authData */ protected function getAuthData(array $data) { $updateServer = new PackageUpdateServer(null, $data); return $updateServer->getAuthData(); }
/** * @see wcf\page\IPage::readData() */ public function readData() { parent::readData(); // extract realm if (preg_match('/realm="(.*?)"/i', $this->header, $match)) { $this->realm = $match[1]; } // get existing auth data if ($this->packageUpdateServerID) { $updateServer = new PackageUpdateServer($this->packageUpdateServerID); $authData = $updateServer->getAuthData(); if (isset($authData['loginUsername'])) { $this->loginUsername = $authData['loginUsername']; } if (isset($authData['loginPassword'])) { $this->loginPassword = $authData['loginPassword']; } if (isset($authData['loginUsername']) || isset($authData['loginPassword'])) { $this->errorField = 'loginPassword'; $this->errorType = 'invalid'; } } $this->buildPostParameters(); $this->buildGetParameters(); }