/** * @see wcf\page\IPage::show() */ public function show() { // use detailed view if accessing WCF ACP directly if (PACKAGE_ID == 1) { // base tag is determined on runtime $host = RouteHandler::getHost(); $path = RouteHandler::getPath(); HeaderUtil::redirect($host . $path . 'index.php/PackageListDetailed/' . SID_ARG_1ST, false); exit; } // enable menu item ACPMenu::getInstance()->setActiveMenuItem('wcf.acp.menu.link.package.list'); parent::show(); }
/** * Installs current package. * * @param array $nodeData */ protected function installPackage(array $nodeData) { $installationStep = new PackageInstallationStep(); // check requirements if (!empty($nodeData['requirements'])) { foreach ($nodeData['requirements'] as $package => $requirementData) { // get existing package if ($requirementData['packageID']) { $sql = "SELECT packageName, packageVersion FROM wcf".WCF_N."_package WHERE packageID = ?"; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute(array($requirementData['packageID'])); } else { // try to find matching package $sql = "SELECT packageName, packageVersion FROM wcf".WCF_N."_package WHERE package = ?"; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute(array($package)); } $row = $statement->fetchArray(); // package is required but not available if ($row === false) { throw new SystemException("Package '".$package."' is required by '".$nodeData['packageName']."', but is neither installed nor shipped."); } // check version requirements if ($requirementData['minVersion']) { if (Package::compareVersion($row['packageVersion'], $requirementData['minVersion']) < 0) { throw new SystemException("Package '".$nodeData['packageName']."' requires the package '".$row['packageName']."' in version '".$requirementData['minVersion']."', but version '".$row['packageVersion']."'"); } } } } unset($nodeData['requirements']); if (!$this->queue->packageID) { // create package entry $package = PackageEditor::create($nodeData); // update package id for current queue $queueEditor = new PackageInstallationQueueEditor($this->queue); $queueEditor->update(array( 'packageID' => $package->packageID )); // save excluded packages if (count($this->getArchive()->getExcludedPackages()) > 0) { $sql = "INSERT INTO wcf".WCF_N."_package_exclusion (packageID, excludedPackage, excludedPackageVersion) VALUES (?, ?, ?)"; $statement = WCF::getDB()->prepareStatement($sql); foreach ($this->getArchive()->getExcludedPackages() as $excludedPackage) { $statement->execute(array($package->packageID, $excludedPackage['name'], (!empty($excludedPackage['version']) ? $excludedPackage['version'] : ''))); } } // if package is plugin to com.woltlab.wcf it must not have any other requirement $requirements = $this->getArchive()->getRequirements(); // insert requirements and dependencies $requirements = $this->getArchive()->getAllExistingRequirements(); if (!empty($requirements)) { $sql = "INSERT INTO wcf".WCF_N."_package_requirement (packageID, requirement) VALUES (?, ?)"; $statement = WCF::getDB()->prepareStatement($sql); foreach ($requirements as $identifier => $possibleRequirements) { if (count($possibleRequirements) == 1) { $requirement = array_shift($possibleRequirements); } else { $requirement = $possibleRequirements[$this->selectedRequirements[$identifier]]; } $statement->execute(array($package->packageID, $requirement['packageID'])); } } // reload queue $this->queue = new PackageInstallationQueue($this->queue->queueID); $this->package = null; if ($package->isApplication) { $host = StringUtil::replace(RouteHandler::getProtocol(), '', RouteHandler::getHost()); $path = RouteHandler::getPath(array('acp')); // insert as application ApplicationEditor::create(array( 'domainName' => $host, 'domainPath' => $path, 'cookieDomain' => $host, 'cookiePath' => $path, 'packageID' => $package->packageID )); } } if ($this->getPackage()->isApplication && $this->getPackage()->package != 'com.woltlab.wcf' && $this->getAction() == 'install') { if (empty($this->getPackage()->packageDir)) { $document = $this->promptPackageDir(); if ($document !== null && $document instanceof FormDocument) { $installationStep->setDocument($document); } $installationStep->setSplitNode(); } } return $installationStep; }
/** * Returns a relative link. * * @param string $controller * @param array $parameters * @param string $url * @return string */ public function getLink($controller = null, array $parameters = array(), $url = '') { $abbreviation = 'wcf'; $anchor = ''; $isACP = $originIsACP = RequestHandler::getInstance()->isACPRequest(); $forceWCF = $isRaw = false; $appendSession = $encodeTitle = true; // enforce a certain level of sanitation and protection for links embedded in emails if (isset($parameters['isEmail']) && (bool) $parameters['isEmail']) { $parameters['forceFrontend'] = true; $parameters['appendSession'] = false; unset($parameters['isEmail']); } if (isset($parameters['application'])) { $abbreviation = $parameters['application']; } if (isset($parameters['isRaw'])) { $isRaw = $parameters['isRaw']; unset($parameters['isRaw']); } if (isset($parameters['appendSession'])) { $appendSession = $parameters['appendSession']; unset($parameters['appendSession']); } if (isset($parameters['isACP'])) { $isACP = (bool) $parameters['isACP']; unset($parameters['isACP']); // drop session id if link leads to ACP from frontend or vice versa if ($originIsACP != $isACP) { $appendSession = false; } } if (isset($parameters['forceFrontend'])) { if ($parameters['forceFrontend'] && $isACP) { $isACP = false; $appendSession = false; } unset($parameters['forceFrontend']); } if (isset($parameters['forceWCF'])) { if ($parameters['forceWCF'] && $isACP) { $forceWCF = true; } unset($parameters['forceWCF']); } if (isset($parameters['encodeTitle'])) { $encodeTitle = $parameters['encodeTitle']; unset($parameters['encodeTitle']); } // remove anchor before parsing if (($pos = strpos($url, '#')) !== false) { $anchor = substr($url, $pos); $url = substr($url, 0, $pos); } // build route if ($controller === null) { if ($isACP) { $controller = 'Index'; } else { return PageMenu::getInstance()->getLandingPage()->getProcessor()->getLink(); } } // handle object if (isset($parameters['object'])) { if (!$parameters['object'] instanceof IRouteController && $parameters['object'] instanceof DatabaseObjectDecorator && $parameters['object']->getDecoratedObject() instanceof IRouteController) { $parameters['object'] = $parameters['object']->getDecoratedObject(); } if ($parameters['object'] instanceof IRouteController) { $parameters['id'] = $parameters['object']->getObjectID(); $parameters['title'] = $parameters['object']->getTitle(); } } unset($parameters['object']); if (isset($parameters['title'])) { // component replacement if (!empty($this->titleSearch)) { $parameters['title'] = str_replace($this->titleSearch, $this->titleReplace, $parameters['title']); } // remove illegal characters $parameters['title'] = trim($this->titleRegex->replace($parameters['title'], '-'), '-'); // trim to 80 characters $parameters['title'] = rtrim(mb_substr($parameters['title'], 0, 80), '-'); if (!URL_LEGACY_MODE) { $parameters['title'] = mb_strtolower($parameters['title']); } // encode title if ($encodeTitle) { $parameters['title'] = rawurlencode($parameters['title']); } } $parameters['controller'] = $controller; $routeURL = RouteHandler::getInstance()->buildRoute($parameters, $isACP); if (!$isRaw && !empty($url)) { $routeURL .= strpos($routeURL, '?') === false ? '?' : '&'; } // encode certain characters if (!empty($url)) { $url = str_replace(array('[', ']'), array('%5B', '%5D'), $url); } $url = $routeURL . $url; // append session id if ($appendSession) { $url .= strpos($url, '?') === false ? SID_ARG_1ST : SID_ARG_2ND_NOT_ENCODED; } // handle applications if (!PACKAGE_ID) { $url = RouteHandler::getHost() . RouteHandler::getPath(array('acp')) . ($isACP ? 'acp/' : '') . $url; } else { if (RequestHandler::getInstance()->inRescueMode()) { $pageURL = RouteHandler::getHost() . str_replace('//', '/', RouteHandler::getPath(array('acp'))); } else { // try to resolve abbreviation $application = null; if ($abbreviation != 'wcf') { $application = ApplicationHandler::getInstance()->getApplication($abbreviation); } // fallback to primary application if abbreviation is 'wcf' or unknown if ($forceWCF) { $application = ApplicationHandler::getInstance()->getWCF(); } else { if ($application === null) { $application = ApplicationHandler::getInstance()->getPrimaryApplication(); } } $pageURL = $application->getPageURL(); } $url = $pageURL . ($isACP ? 'acp/' : '') . $url; } // append previously removed anchor $url .= $anchor; return $url; }
/** * Builds a new request. * * @param string $application */ protected function buildRequest($application) { try { $routeData = RouteHandler::getInstance()->getRouteData(); // handle landing page for frontend requests if (!$this->isACPRequest()) { $landingPage = PageMenu::getInstance()->getLandingPage(); if ($landingPage !== null && RouteHandler::getInstance()->isDefaultController()) { // check if redirect URL matches current URL $redirectURL = $landingPage->getLink(); if (StringUtil::replace(RouteHandler::getHost(), '', $redirectURL) == $_SERVER['REQUEST_URI']) { $routeData['controller'] = $landingPage->getController(); } else { // redirect to landing page HeaderUtil::redirect($landingPage->getLink(), true); exit; } } } $controller = $routeData['controller']; // validate class name if (!preg_match('~^[a-z0-9_]+$~i', $controller)) { throw new SystemException("Illegal class name '".$controller."'"); } // find class $classData = $this->getClassData($controller, 'page', $application); if ($classData === null) $classData = $this->getClassData($controller, 'form', $application); if ($classData === null) $classData = $this->getClassData($controller, 'action', $application); if ($classData === null) { throw new SystemException("unable to find class for controller '".$controller."'"); } else if (!class_exists($classData['className'])) { throw new SystemException("unable to find class '".$classData['className']."'"); } $this->activeRequest = new Request($classData['className'], $classData['controller'], $classData['pageType']); } catch (SystemException $e) { throw new IllegalLinkException(); } }
/** * @see wcf\system\WCF::assignDefaultTemplateVariables() */ protected function assignDefaultTemplateVariables() { parent::assignDefaultTemplateVariables(); // base tag is determined on runtime $host = RouteHandler::getHost(); $path = RouteHandler::getPath(); self::getTPL()->assign(array( 'baseHref' => $host . $path, 'quickAccessPackages' => $this->getQuickAccessPackages(), // todo: 'timezone' => \wcf\util\DateUtil::getTimezone() )); }
/** * @see \wcf\form\IForm::save() */ public function save() { parent::save(); // change user WCF::getSession()->changeUser($this->user); $this->saved(); if (!empty($this->url)) { // append session if (mb_strpos($this->url, '?') !== false) { $this->url .= SID_ARG_2ND_NOT_ENCODED; } else { $this->url .= SID_ARG_1ST; } HeaderUtil::redirect($this->url); } else { if (RequestHandler::getInstance()->inRescueMode()) { $path = RouteHandler::getHost() . RouteHandler::getPath() . SID_ARG_1ST; } else { $application = ApplicationHandler::getInstance()->getActiveApplication(); $path = $application->getPageURL() . 'acp/' . SID_ARG_1ST; } HeaderUtil::redirect($path); } exit; }
/** * @see \wcf\system\WCF::assignDefaultTemplateVariables() */ protected function assignDefaultTemplateVariables() { parent::assignDefaultTemplateVariables(); // base tag is determined on runtime $host = RouteHandler::getHost(); $path = RouteHandler::getPath(); self::getTPL()->assign(array('baseHref' => $host . $path)); }
/** * Returns a relative link. * * @param string $controller * @param array $parameters * @param string $url * @return string */ public function getLink($controller = null, array $parameters = array(), $url = '') { $abbreviation = 'wcf'; $anchor = ''; $isACP = $originIsACP = RequestHandler::getInstance()->isACPRequest(); $isRaw = false; $appendSession = true; if (isset($parameters['application'])) { $abbreviation = $parameters['application']; unset($parameters['application']); } if (isset($parameters['isRaw'])) { $isRaw = $parameters['isRaw']; unset($parameters['isRaw']); } if (isset($parameters['appendSession'])) { $appendSession = $parameters['appendSession']; unset($parameters['appendSession']); } if (isset($parameters['isACP'])) { $isACP = (bool) $parameters['isACP']; unset($parameters['isACP']); // drop session id if link leads to ACP from frontend or vice versa if ($originIsACP != $isACP) { $appendSession = false; } } // remove anchor before parsing if (($pos = strpos($url, '#')) !== false) { $anchor = substr($url, $pos); $url = substr($url, 0, $pos); } // build route if ($controller === null) { // build link to landing page $landingPage = PageMenu::getInstance()->getLandingPage(); $controller = $landingPage->getController(); $abbreviation = $landingPage->getApplication(); $url = $landingPage->menuItemLink; } // handle object if (isset($parameters['object'])) { if (!($parameters['object'] instanceof IRouteController) && $parameters['object'] instanceof DatabaseObjectDecorator && $parameters['object']->getDecoratedObject() instanceof IRouteController) { $parameters['object'] = $parameters['object']->getDecoratedObject(); } if ($parameters['object'] instanceof IRouteController) { $parameters['id'] = $parameters['object']->getObjectID(); $parameters['title'] = $parameters['object']->getTitle(); } unset($parameters['object']); } if (isset($parameters['title'])) { // remove illegal characters $parameters['title'] = trim($this->titleRegex->replace($parameters['title'], '-'), '-'); } $parameters['controller'] = $controller; $routeURL = RouteHandler::getInstance()->buildRoute($parameters); if (!$isRaw && !empty($url)) { $routeURL .= (strpos($routeURL, '?') === false) ? '?' : '&'; } $url = $routeURL . $url; // append session id if ($appendSession) { $url .= (strpos($url, '?') === false) ? SID_ARG_1ST : SID_ARG_2ND_NOT_ENCODED; } // handle applications if (!PACKAGE_ID) { $url = RouteHandler::getHost() . RouteHandler::getPath(array('acp')) . ($isACP ? 'acp/' : '') . $url; } else { // try to resolve abbreviation $application = null; if ($abbreviation != 'wcf') { $application = ApplicationHandler::getInstance()->getApplication($abbreviation); } // fallback to primary application if abbreviation is 'wcf' or unknown if ($application === null) { $application = ApplicationHandler::getInstance()->getPrimaryApplication(); } $url = $application->getPageURL() . ($isACP ? 'acp/' : '') . $url; } // append previously removed anchor $url .= $anchor; return $url; }