/**
  * 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;
     }
 }