/** * Extract style package to demo board. * * @return null */ public function extract_package() { $this->package->ensure_extracted(); $package_root = $this->package->find_directory(array('files' => array('required' => 'style.cfg'))); $style_root = $this->get_style_dir(); $filesystem = new \Symfony\Component\Filesystem\Filesystem(); $filesystem->remove($style_root); $filesystem->rename($this->package->get_temp_path() . '/' . $package_root, $style_root); }
/** * Get composer.json contents from a zip file. * * @param string $file Path to the zip file * @return string Returns the content of the composer.json */ protected function get_composer_json($file) { $path = $this->package->set_source($file)->set_temp_path($this->ext_config->__get('contrib_temp_path'), true)->extract()->find_directory(array('files' => array('required' => 'composer.json')), 'vendor'); $composer_json = ''; if ($path !== null) { $composer_json = file_get_contents($this->package->get_temp_path() . '/' . $path . '/composer.json'); } $this->package->cleanup(); return $composer_json; }
/** * Run Extension PreValidator. * * @return \Symfony\Component\HttpFoundation\Response */ protected function epv() { if (!$this->contrib->type->epv_test) { return $this->helper->error('INVALID_TOOL'); } $this->package->ensure_extracted(); $results = $this->contrib->type->get_prevalidator()->run_epv($this->package->get_temp_path()); $results = $this->get_result_post('VALIDATION_PV', $results); $post = $this->queue->topic_reply($results); $this->package->cleanup(); redirect($post->get_url()); }
/** * Extract style package to demo board. * * @return null */ public function extract_package() { $this->package->ensure_extracted(); $package_root = $this->package->find_directory(array('files' => array('required' => 'style.cfg'))); $style_root = $this->get_style_dir(); $filesystem = new \Symfony\Component\Filesystem\Filesystem(); $filesystem->remove($style_root); // Only copy necessary files $finder = new Finder(); $finder->ignoreVCS(false)->ignoreDotFiles(false)->files()->notName('/\\.(svg|png|jpe?g|gif|html|js|css|cfg)$/i')->in($this->package->get_temp_path()); $filesystem->remove($finder); $filesystem->rename($this->package->get_temp_path() . '/' . $package_root, $style_root); }
/** * Repack extension to add version check info and match * correct directory structure to given ext name. * * @param package $package * @param \titania_contribution $contrib * @pram \titania_revision $revision * @throws \Exception if an error occurred */ protected function repack(package $package, \titania_contribution $contrib, \titania_revision $revision) { $package->ensure_extracted(); $ext_base_path = $package->find_directory(array('files' => array('required' => 'composer.json', 'optional' => 'ext.php')), 'vendor'); if ($ext_base_path === null) { throw new \Exception($this->root_not_found_key); } $composer_file = $package->get_temp_path() . '/' . $ext_base_path . '/composer.json'; $data = $this->get_composer_data($composer_file); if (!is_array($data) || empty($data['name']) || !$this->validate_ext_name($data['name'])) { throw new \Exception('INVALID_EXT_NAME'); } $ext_name = $data['name']; $data = $this->update_phpbb_requirement($data); $data = $this->set_version_check($data, $contrib); $data = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); file_put_contents($composer_file, $data); $package->restore_root($ext_base_path, $ext_name); $package->repack($this->clean_package); $revision->revision_composer_json = $data; $contrib->contrib_package_name = $ext_name; $contrib->submit(); }
/** * Run AutoMOD test. * * @param \phpbb\titania\entity\package $package * @param string $phpbb_path Path to phpBB files we run the test on * @param string $details Will hold the details of the mod * @param string $results Will hold the results for output * @param string $bbcode_results Will hold the results for storage * @return bool true on success, false on failure */ public function run_automod_test($package, $phpbb_path, &$details, &$results, &$bbcode_results) { require $this->phpbb_root_path . 'includes/functions_transfer.' . $this->php_ext; require $this->phpbb_root_path . 'includes/functions_admin.' . $this->php_ext; require $this->ext_root_path . 'includes/library/automod/acp_mods.' . $this->php_ext; require $this->ext_root_path . 'includes/library/automod/editor.' . $this->php_ext; require $this->ext_root_path . 'includes/library/automod/mod_parser.' . $this->php_ext; require $this->ext_root_path . 'includes/library/automod/functions_mods.' . $this->php_ext; $this->user->add_lang_ext('phpbb/titania', 'automod'); // Find the main modx file $modx_root = $package->find_directory(array('files' => array('required' => 'install*.xml'))); if ($modx_root === null) { $this->user->add_lang_ext('phpbb/titania', 'contributions'); $this->errors[] = $this->user->lang['COULD_NOT_FIND_ROOT']; return false; } $modx_root = $package->get_temp_path() . '/' . $modx_root . '/'; $modx_file = false; if (file_exists($modx_root . 'install.xml')) { $modx_file = $modx_root . 'install.xml'; } else { $finder = new \Symfony\Component\Finder\Finder(); $finder->name('install*.xml')->depth(0)->in($modx_root); if ($finder->count()) { foreach ($finder as $file) { $modx_file = $file->getPathname(); break; } } } if (!$modx_file) { $this->user->add_lang_ext('phpbb/titania', 'contributions'); $this->errors[] = $this->user->lang['COULD_NOT_FIND_ROOT']; return false; } // HAX global $phpbb_root_path; $phpbb_root_path = $phpbb_path; // The real stuff $acp_mods = new \acp_mods(); $acp_mods->mods_dir = $this->ext_config->__get('contrib_temp_path'); $acp_mods->mod_root = $modx_root; $editor = new \editor_direct(); $details = $acp_mods->mod_details($modx_file, false); $actions = $acp_mods->mod_actions($modx_file); $installed = $acp_mods->process_edits($editor, $actions, $details, false, true, false); // Reverse HAX $phpbb_root_path = $this->phpbb_root_path; $this->template->set_filenames(array('automod' => 'contributions/automod.html', 'automod_bbcode' => 'contributions/automod_bbcode.html')); $this->template->assign_var('S_AUTOMOD_SUCCESS', $installed); $results = $this->template->assign_display('automod'); $bbcode_results = $this->template->assign_display('automod_bbcode'); return $installed; }
/** * Checks the file for the array contents * Make sure it has all the keys present in the newest version * * @param \phpbb\titania\entity\package $package * @param string $reference_filepath The path to the files against I want to validate the uploaded package * @return array Returns an array of error messages encountered */ public function check_package($package, $reference_filepath) { $package->ensure_extracted(); $error = $missing_keys = array(); // Basically the individual parts of the translation, we check them separately, because they have colliding filenames $types = array('language' => 'language/', 'prosilver' => 'styles/prosilver/imageset/en', 'subsilver2' => 'styles/subsilver2/imageset/en'); // Do the check for all types foreach ($types as $type => $path) { // Get all the files present in the uploaded package for the currently iterated type $uploaded_files = $this->lang_filelist($package->get_temp_path()); $reference_files = $this->lang_filelist($reference_filepath); ksort($uploaded_files); ksort($reference_files); switch ($type) { case 'language': // The uploaded files array has keys prefixed with the upload path of the contribution // Have it stored in the variable so we can work with it $uploaded_files_prefix = explode('/', key($uploaded_files)); $iso_code = $uploaded_files_prefix[2]; $uploaded_files_prefix = $package->get_temp_path() . '/' . $uploaded_files_prefix[0]; // This goes directly to the root of the uploaded language pack, like /upload_path/language/cs/ $uploaded_lang_root = $uploaded_files_prefix . '/language/' . $iso_code . '/'; // Just perform a basic check if the common file is there if (!is_file($uploaded_lang_root . 'common.php')) { return array($this->user->lang('NO_TRANSLATION')); } // Loop through the reference files foreach ($reference_files as $dir => $files) { // Do not loop through files which are in non-language directories if (strpos($dir, $path) === 0) { // Loop through the files in the language/, language/adm etc. directories foreach ($files as $file) { $exists = true; $uploaded_file_path = str_replace('/en/', '/' . $iso_code . '/', $uploaded_files_prefix . '/' . $dir . $file); $ext = strtolower(substr($file, -3)); // Require php and txt files if ($ext == 'php' || $ext == 'txt') { if (!is_file($uploaded_file_path)) { $error[] = $this->user->lang('MISSING_FILE', str_replace('/en/', '/' . $iso_code . '/', $dir . $file)); // report a missing file $exists = false; } } // If the file is a php file and actually exists, no point in checking keys in a nonexistent one if ($ext == 'php' && $exists) { $missing_keys[$dir . $file] = $this->check_missing_keys($reference_filepath . '' . $dir . $file, $uploaded_file_path); } // In the last step we have removed the license and index files if there were any. We'll just put a new one instead $this->add_license_files($uploaded_lang_root . '/LICENSE', $reference_filepath); $this->add_htm_files($uploaded_lang_root, $reference_filepath); } } } if (sizeof($missing_keys)) { foreach ($missing_keys as $file => $keys) { if (sizeof($keys)) { $error[] = $this->user->lang('MISSING_KEYS', $file, implode('<br />', $keys)); } } } break; case 'prosilver': case 'subsilver2': // just let them go through atm... break; } } // We are going to check if all files included in the language pack are allowed // Before we need some stuff // We construct a list of all reference files with complete structure foreach ($reference_files as $dir => $files) { if (strpos($dir, $types['language']) === 0 || strpos($dir, $types['prosilver']) === 0 || strpos($dir, $types['subsilver2']) === 0) { foreach ($files as $file) { $list_reference_files[] = $dir . $file; } } } // We construct a list of all uploaded file with complete structure foreach ($uploaded_files as $dir => $files) { // We need to clean our directory path according the type and replace iso_code package by en if (strpos($dir, $types['language']) != 0) { $dir_prefix = explode($types['language'], $dir); } else { if (strpos($dir, $types['prosilver']) != 0) { $dir_prefix = explode($types['prosilver'], $dir); } else { if (strpos($dir, $types['subsilver2']) != 0) { $dir_prefix = explode($types['subsilver2'], $dir); } } } $dir_clean = str_replace('/' . $iso_code . '/', '/en/', str_replace($dir_prefix[0], '', $dir)); foreach ($files as $file) { $list_uploaded_files[] = $dir_clean . $file; } } // It's time to check if each file uploaded in the package is allowed foreach ($list_uploaded_files as $file) { if (!in_array($file, $list_reference_files) && !in_array($file, $this->ignore_files)) { $error[] = $this->user->lang('WRONG_FILE', str_replace('/en/', '/' . $iso_code . '/', $file)); // report a wrong file } } if (!sizeof($error)) { $package->repack(); // we have made changes to the package, so replace the original zip file } return $error; }