/** * @see wcf\system\package\plugin\IPackageInstallationPlugin::install() */ public function install() { parent::install(); // get installation path of package $sql = "SELECT packageDir FROM wcf".WCF_N."_package WHERE packageID = ?"; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute(array($this->installation->getPackageID())); $packageDir = $statement->fetchArray(); $packageDir = $packageDir['packageDir']; // get relative path of script $path = FileUtil::getRealPath(WCF_DIR.$packageDir); // reset WCF cache CacheHandler::getInstance()->flushAll(); // run script $this->run($path.$this->instruction['value']); // delete script if (@unlink($path.$this->instruction['value'])) { // delete file log entry $sql = "DELETE FROM wcf".WCF_N."_package_installation_file_log WHERE packageID = ? AND filename = ?"; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute(array( $this->installation->getPackageID(), $this->instruction['value'] )); } }
/** * @see wcf\system\package\plugin\IPackageInstallationPlugin::uninstall() */ public function uninstall() { // create ACP-templates list $templates = array(); // get ACP-templates from log $sql = "SELECT * FROM wcf".WCF_N."_acp_template WHERE packageID = ?"; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute(array($this->installation->getPackageID())); while ($row = $statement->fetchArray()) { // store acp template with suffix (_$packageID) $templates[] = 'acp/templates/'.$row['templateName'].'.tpl'; } if (!empty($templates)) { // delete template files $packageDir = FileUtil::addTrailingSlash(FileUtil::getRealPath(WCF_DIR.$this->installation->getPackage()->packageDir)); $deleteEmptyDirectories = $this->installation->getPackage()->isApplication; $this->installation->deleteFiles($packageDir, $templates, false, $deleteEmptyDirectories); // delete log entries parent::uninstall(); } }
/** * @see \wcf\system\package\plugin\IPackageInstallationPlugin::install() */ public function install() { parent::install(); $abbreviation = 'wcf'; $path = ''; if (isset($this->instruction['attributes']['application'])) { $abbreviation = $this->instruction['attributes']['application']; } else { if ($this->installation->getPackage()->isApplication) { $path = FileUtil::getRealPath(WCF_DIR . $this->installation->getPackage()->packageDir); } } if (empty($path)) { $dirConstant = strtoupper($abbreviation) . '_DIR'; if (!defined($dirConstant)) { throw new SystemException("Cannot execute script-PIP, abbreviation '" . $abbreviation . "' is unknown"); } $path = constant($dirConstant); } // reset WCF cache CacheHandler::getInstance()->flushAll(); // run script $this->run($path . $this->instruction['value']); // delete script if (@unlink($path . $this->instruction['value'])) { // delete file log entry $sql = "DELETE FROM\twcf" . WCF_N . "_package_installation_file_log\n\t\t\t\tWHERE\t\tpackageID = ?\n\t\t\t\t\t\tAND filename = ?"; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute(array($this->installation->getPackageID(), $this->instruction['value'])); } }
/** * @see \wcf\system\package\plugin\IPackageInstallationPlugin::install() */ public function install() { AbstractPackageInstallationPlugin::install(); $xml = $this->getXML($this->instruction['value']); $xpath = $xml->xpath(); if ($this->installation->getAction() == 'update') { // handle delete first $this->deleteItems($xpath); } // import or update categories $this->importCategories($xpath); // import or update options $this->importOptions($xpath); }
/** * @see wcf\system\package\plugin\IPackageInstallationPlugin::install() */ public function install() { parent::install(); // extract style tar $filename = $this->installation->getArchive()->extractTar($this->instructions['value'], 'style_'); // import style $style = StyleEditor::import($filename, $this->installation->getPackageID()); // set style as default if (isset($this->instruction['attributes']['default'])) { $style->setAsDefault(); } // remove tmp file @unlink($filename); }
/** * @see wcf\system\package\plugin\IPackageInstallationPlugin::install() */ public function install() { parent::install(); // search sql files in package archive if (($fileIndex = $this->installation->getArchive()->getTar()->getIndexByFilename($this->instruction['value'])) === false) { throw new SystemException("Package icon '" . $this->instruction['value'] . "' not found."); } // get extension $extension = substr($this->instruction['value'], strrpos($this->instruction['value'], '.')); // extract image $this->installation->getArchive()->getTar()->extract($fileIndex, WCF_DIR . 'icon/packages/' . $this->installation->getPackage()->packageID . $extension); // update package $packageEditor = new PackageEditor($this->installation->getPackage()); $packageEditor->update(array('packageIcon' => 'icon/packages/' . $packageEditor->packageID . $extension)); }
/** * @see wcf\system\package\plugin\IPackageInstallationPlugin::install() */ public function install() { parent::install(); // get xml $xml = $this->getXML($this->instruction['value']); $xpath = $xml->xpath(); // handle delete first if ($this->installation->getAction() == 'update') { $this->deleteItems($xpath); } // handle import $this->importItems($xpath); // execute cleanup after successfull import/delete/update $this->cleanup(); }
/** * @see \wcf\system\package\plugin\IPackageInstallationPlugin::uninstall() */ public function uninstall() { // fetch ACP templates from log $sql = "SELECT\ttemplateName, application\n\t\t\tFROM\twcf" . WCF_N . "_acp_template\n\t\t\tWHERE\tpackageID = ?"; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute(array($this->installation->getPackageID())); $templates = array(); while ($row = $statement->fetchArray()) { if (!isset($templates[$row['application']])) { $templates[$row['application']] = array(); } $templates[$row['application']][] = 'acp/templates/' . $row['templateName'] . '.tpl'; } foreach ($templates as $application => $templateNames) { $this->installation->deleteFiles(Application::getDirectory($application), $templateNames, false, $this->installation->getPackage()->isApplication); // delete log entries parent::uninstall(); } }
/** * Uninstalls the templates of this package. */ public function uninstall() { // create templates list $templates = array(); // get templates from log $sql = "SELECT\ttemplateName\n\t\t\tFROM\twcf" . WCF_N . "_template\n\t\t\tWHERE \tpackageID = ?"; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute(array($this->installation->getPackageID())); while ($row = $statement->fetchArray()) { $templates[] = 'templates/' . $row['templateName'] . '.tpl'; } if (count($templates) > 0) { // delete template files $packageDir = FileUtil::addTrailingSlash(FileUtil::getRealPath(WCF_DIR . $this->installation->getPackage()->packageDir)); $deleteEmptyDirectories = $this->installation->getPackage()->isApplication; $this->installation->deleteFiles($packageDir, $templates, false, $deleteEmptyDirectories); // delete log entries parent::uninstall(); } }
/** * @see wcf\system\package\plugin\IPackageInstallationPlugin::install() */ public function install() { AbstractPackageInstallationPlugin::install(); // get language files $languageFiles = array(); $multipleFiles = false; $filename = $this->instruction['value']; if (strpos($filename, '*') !== false) { // wildcard syntax; import multiple files $multipleFiles = true; $files = $this->installation->getArchive()->getTar()->getContentList(); $pattern = str_replace("\\*", ".*", preg_quote($filename)); foreach ($files as $file) { if (preg_match('!' . $pattern . '!i', $file['filename'])) { if (preg_match('~([a-z-]+)\\.xml$~i', $file['filename'], $match)) { $languageFiles[$match[1]] = $file['filename']; } else { throw new SystemException("Can not determine language code of language file '" . $file['filename'] . "'"); } } } } else { if (!empty($this->instruction['attributes']['languagecode'])) { $languageCode = $this->instruction['attributes']['languagecode']; } else { if (!empty($this->instruction['attributes']['language'])) { $languageCode = $this->instruction['attributes']['language']; } else { if (preg_match('~([a-z-]+)\\.xml$~i', $filename, $match)) { $languageCode = $match[1]; } else { throw new SystemException("Can not determine language code of language file '" . $filename . "'"); } } } $languageFiles[$languageCode] = $filename; } // get installed languages $installedLanguages = array(); $sql = "SELECT\t\t*\n\t\t\tFROM\t\twcf" . WCF_N . "_language\n\t\t\tORDER BY\tisDefault DESC"; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute(); while ($row = $statement->fetchArray()) { $installedLanguages[] = $row; } // install language $addedLanguageIDArray = array(); foreach ($installedLanguages as $installedLanguage) { $languageFile = null; if (isset($languageFiles[$installedLanguage['languageCode']])) { $languageFile = $languageFiles[$installedLanguage['languageCode']]; } else { if ($multipleFiles) { // use default language if (isset($languageFiles[$installedLanguages[0]['languageCode']])) { $languageFile = $languageFiles[$installedLanguages[0]['languageCode']]; } else { if (isset($languageFiles['en'])) { foreach ($installedLanguages as $installedLanguage2) { if ($installedLanguage2['languageCode'] == 'en') { $languageFile = $languageFiles['en']; break; } } } } // use any installed language if ($languageFile === null) { foreach ($installedLanguages as $installedLanguage2) { if (isset($languageFiles[$installedLanguage2['languageCode']])) { $languageFile = $languageFiles[$installedLanguage2['languageCode']]; break; } } } // use first delivered language if ($languageFile === null) { foreach ($languageFiles as $languageFile) { break; } } } } // save language if ($languageFile !== null) { if ($xml = $this->readLanguage($languageFile)) { // get language object $language = LanguageFactory::getInstance()->getLanguageByCode($installedLanguage['languageCode']); $languageEditor = new LanguageEditor($language); // import xml // don't update language files if package is an application $languageEditor->updateFromXML($xml, $this->installation->getPackageID(), !$this->installation->getPackage()->isApplication); // add language to this package $addedLanguageIDArray[] = $language->languageID; } } } // save package to language if (count($addedLanguageIDArray)) { $condition = ''; $statementParameters = array($this->installation->getPackageID()); foreach ($addedLanguageIDArray as $languageID) { if (!empty($condition)) { $condition .= ','; } $condition .= '?'; $statementParameters[] = $languageID; } $statementParameters[] = $this->installation->getPackageID(); $sql = "INSERT INTO\twcf" . WCF_N . "_language_to_package\n\t\t\t\t\t\t(languageID, packageID)\n\t\t\t\tSELECT\t\tlanguageID, ?\n\t\t\t\tFROM\t\twcf" . WCF_N . "_language\n\t\t\t\tWHERE\t\tlanguageID IN (" . $condition . ")\n\t\t\t\t\t\tAND languageID NOT IN (\n\t\t\t\t\t\t\tSELECT\tlanguageID\n\t\t\t\t\t\t\tFROM\twcf" . WCF_N . "_language_to_package\n\t\t\t\t\t\t\tWHERE\tpackageID = ?\n\t\t\t\t\t\t)"; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute($statementParameters); } }
/** * Deletes the sql tables or columns which where installed by the package. */ public function uninstall() { // get logged sql tables/columns $sql = "SELECT\t\t*\n\t\t\tFROM\t\twcf" . WCF_N . "_package_installation_sql_log\n\t\t\tWHERE\t\tpackageID = ?\n\t\t\tORDER BY \tsqlIndex DESC, sqlColumn DESC"; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute(array($this->installation->getPackageID())); $entries = array(); while ($row = $statement->fetchArray()) { $entries[] = $row; } // get all tablenames from database $existingTableNames = WCF::getDB()->getEditor()->getTablenames(); // delete or alter tables foreach ($entries as $entry) { // don't alter table if it should be dropped if (!empty($entry['sqlColumn'])) { $isDropped = false; foreach ($entries as $entry2) { if ($entry['sqlTable'] == $entry2['sqlTable'] && empty($entry2['sqlColumn']) && empty($entry2['sqlIndex'])) { $isDropped = true; } } if ($isDropped) { continue; } } // drop table if (!empty($entry['sqlTable']) && empty($entry['sqlColumn']) && empty($entry['sqlIndex'])) { WCF::getDB()->getEditor()->dropTable($entry['sqlTable']); } else { if (in_array($entry['sqlTable'], $existingTableNames) && !empty($entry['sqlColumn'])) { WCF::getDB()->getEditor()->dropColumn($entry['sqlTable'], $entry['sqlColumn']); } else { if (in_array($entry['sqlTable'], $existingTableNames) && !empty($entry['sqlIndex'])) { if (substr($entry['sqlIndex'], -3) == '_fk') { WCF::getDB()->getEditor()->dropForeignKey($entry['sqlTable'], $entry['sqlIndex']); } else { WCF::getDB()->getEditor()->dropIndex($entry['sqlTable'], $entry['sqlIndex']); } } } } } // delete from log table parent::uninstall(); }
/** * @see \wcf\system\package\plugin\IPackageInstallationPlugin::uninstall() */ public function uninstall() { // fetch files from log $sql = "SELECT\tfilename, application\n\t\t\tFROM\twcf" . WCF_N . "_package_installation_file_log\n\t\t\tWHERE\tpackageID = ?"; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute(array($this->installation->getPackageID())); $files = array(); while ($row = $statement->fetchArray()) { if (!isset($files[$row['application']])) { $files[$row['application']] = array(); } $files[$row['application']][] = $row['filename']; } foreach ($files as $application => $filenames) { $this->installation->deleteFiles(Application::getDirectory($application), $filenames); // delete log entries parent::uninstall(); } }
/** * @see wcf\system\package\plugin\IPackageInstallationPlugin::uninstall() */ public function uninstall() { parent::uninstall(); // execute cleanup $this->cleanup(); }
/** * Uninstalls the files of this package. */ public function uninstall() { // get absolute package dir $packageDir = FileUtil::addTrailingSlash(FileUtil::unifyDirSeperator(realpath(WCF_DIR . $this->installation->getPackage()->packageDir))); // create file list $files = array(); // get files from log $sql = "SELECT\t*\n\t\t\tFROM\twcf" . WCF_N . "_package_installation_file_log\n\t\t\tWHERE \tpackageID = ?"; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute(array($this->installation->getPackageID())); while ($row = $statement->fetchArray()) { $files[] = $row['filename']; } if (count($files) > 0) { // delete files $this->installation->deleteFiles($packageDir, $files); // delete log entries parent::uninstall(); } }
/** * @see wcf\system\package\plugin\IPackageInstallationPlugin::install() */ public function install() { AbstractPackageInstallationPlugin::install(); // get language files $languageFiles = array(); $multipleFiles = false; $filename = $this->instruction['value']; if (strpos($filename, '*') !== false) { // wildcard syntax; import multiple files $multipleFiles = true; $files = $this->installation->getArchive()->getTar()->getContentList(); $pattern = str_replace("\*", ".*", preg_quote($filename)); foreach ($files as $file) { if (preg_match('!'.$pattern.'!i', $file['filename'])) { if (preg_match('~([a-z-]+)\.xml$~i', $file['filename'], $match)) { $languageFiles[$match[1]] = $file['filename']; } else { throw new SystemException("Can not determine language code of language file '".$file['filename']."'"); } } } } else { if (!empty($this->instruction['attributes']['languagecode'])) { $languageCode = $this->instruction['attributes']['languagecode']; } else if (!empty($this->instruction['attributes']['language'])) { $languageCode = $this->instruction['attributes']['language']; } else if (preg_match('~([a-z-]+)\.xml$~i', $filename, $match)) { $languageCode = $match[1]; } else { throw new SystemException("Can not determine language code of language file '".$filename."'"); } $languageFiles[$languageCode] = $filename; } // get installed languages $installedLanguages = array(); $sql = "SELECT * FROM wcf".WCF_N."_language ORDER BY isDefault DESC"; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute(); while ($row = $statement->fetchArray()) { $installedLanguages[] = $row; } // install language foreach ($installedLanguages as $installedLanguage) { $languageFile = null; if (isset($languageFiles[$installedLanguage['languageCode']])) { $languageFile = $languageFiles[$installedLanguage['languageCode']]; } else if ($multipleFiles) { // use default language if (isset($languageFiles[$installedLanguages[0]['languageCode']])) { $languageFile = $languageFiles[$installedLanguages[0]['languageCode']]; } // use english (if installed) else if (isset($languageFiles['en'])) { foreach ($installedLanguages as $installedLanguage2) { if ($installedLanguage2['languageCode'] == 'en') { $languageFile = $languageFiles['en']; break; } } } // use any installed language if ($languageFile === null) { foreach ($installedLanguages as $installedLanguage2) { if (isset($languageFiles[$installedLanguage2['languageCode']])) { $languageFile = $languageFiles[$installedLanguage2['languageCode']]; break; } } } // use first delivered language if ($languageFile === null) { foreach ($languageFiles as $languageFile) break; } } // save language if ($languageFile !== null) { if ($xml = $this->readLanguage($languageFile)) { // get language object $language = LanguageFactory::getInstance()->getLanguageByCode($installedLanguage['languageCode']); $languageEditor = new LanguageEditor($language); // import xml // don't update language files if package is an application $languageEditor->updateFromXML($xml, $this->installation->getPackageID(), !$this->installation->getPackage()->isApplication); } } } }