/** * Handle form upload of an addon zip archive. * * @return array */ protected function handleAddonUpload() { $Upload = new Gdn_Upload(); $Upload->allowFileExtension(null); $Upload->allowFileExtension('zip'); $AnalyzedAddon = []; try { // Validate the upload. $TmpFile = $Upload->validateUpload('File'); $Extension = pathinfo($Upload->getUploadedFileName(), PATHINFO_EXTENSION); // Generate the target name. $TargetFile = $Upload->generateTargetName('addons', $Extension); $TargetPath = PATH_UPLOADS . '/' . $TargetFile; if (!file_exists(dirname($TargetPath))) { mkdir(dirname($TargetPath), 0777, true); } // Save the file to a temporary location for parsing. if (!move_uploaded_file($TmpFile, $TargetPath)) { throw new Exception("We couldn't save the file you uploaded. Please try again later.", 400); } $AnalyzedAddon = UpdateModel::analyzeAddon($TargetPath, true); // If the long description is blank, load up the readme if it exists $formDescription = $this->Form->getFormValue('Description2', ''); if ($formDescription == '') { $Readme = $this->parseReadme($TargetPath); if ($Readme) { $AnalyzedAddon['Description2'] = $Readme; } } else { $AnalyzedAddon['Description2'] = $formDescription; } // Get an icon if one exists. $Icon = $this->extractIcon($TargetPath, val('Icon', $AnalyzedAddon, '')); if ($Icon) { // Overwrite info array value with the path to the saved file. $AnalyzedAddon['Icon'] = $Icon; } // Set the filename for the CDN. $Upload->EventArguments['OriginalFilename'] = AddonModel::slug($AnalyzedAddon, true) . '.zip'; // Save the uploaded file. After this, we no longer have a local copy to analyze. $Parsed = $Upload->saveAs($TargetPath, $TargetFile); $AnalyzedAddon['File'] = $Parsed['SaveName']; unset($AnalyzedAddon['Path']); trace($AnalyzedAddon, 'Analyzed Addon'); $this->Form->formValues($AnalyzedAddon); } catch (Exception $ex) { $this->Form->addError($ex); // Delete the erroneous file. try { if (isset($AnalyzedAddon) && isset($AnalyzedAddon['File'])) { $Upload->delete($AnalyzedAddon['File']); } } catch (Exception $Ex2) { } } if (isset($TargetPath) && file_exists($TargetPath)) { unlink($TargetPath); } return $AnalyzedAddon; }