Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Service/AddOnArchive/InstallBatchCreator.php
<?php

namespace XF\Service\AddOnArchive;

use
XF\Service\AbstractService;
use
XF\Service\ValidateAndSavableTrait;

class
InstallBatchCreator extends AbstractService
{
    use
ValidateAndSavableTrait;

    protected
$errors = [];

   
/**
     * @var \XF\AddOn\Manager
     */
   
protected $addOnManager;

   
/**
     * @var \XF\Entity\AddOnInstallBatch
     */
   
protected $installBatch;

    public function
__construct(\XF\App $app, \XF\AddOn\Manager $manager)
    {
       
parent::__construct($app);

       
$this->addOnManager = $manager;
       
$this->installBatch = $this->em()->create('XF:AddOnInstallBatch');
    }

    public function
addUpload(\XF\Http\Upload $upload)
    {
       
$fileName = $upload->getFileName();
       
$upload->setAllowedExtensions(['zip']);

        if (!
$upload->isValid($errors))
        {
           
$this->errors[] = \XF::phrase('could_not_process_x_y', ['fileName' => $fileName, 'errors' => reset($errors)]);
            return
false;
        }

       
$tempFile = $upload->getTempFile();
        return
$this->addArchive($tempFile, $fileName);
    }

    public function
addArchive($tempFile, $fileName = null)
    {
        if (!
$fileName)
        {
           
$fileName = basename($tempFile);
        }

        if (!
file_exists($tempFile))
        {
           
$this->errors[] = \XF::phrase('could_not_open_x', ['fileName' => $fileName]);
            return
false;
        }

       
$indexBuilt = $this->setupAddOnZip($tempFile, $error);
        if (!
$indexBuilt)
        {
           
$this->errors[] = \XF::phrase('could_not_process_x_y', ['fileName' => $fileName, 'errors' => $error]);
            return
false;
        }

        return
true;
    }

    protected function
setupAddOnZip($tempFile, &$error)
    {
       
/** @var \XF\Service\AddOnArchive\Validator $validator */
       
$validator = $this->service('XF:AddOnArchive\Validator', $tempFile);
        if (!
$validator->validate($error))
        {
            return
false;
        }

       
$addOnId = $validator->getAddOnId();
       
$json = $validator->getAddOnJson();

       
$this->installBatch->addAddOn($addOnId, $json['title'], $json['version_id'], $json['version_string'], $tempFile);

        return
true;
    }

    protected function
_validate()
    {
        if (
$this->errors)
        {
            return
$this->errors;
        }

       
$batch = $this->installBatch;
       
$batch->preSave();

       
// errors being triggered here likely indicates a bug on our part
       
return $batch->getErrors();
    }

    protected function
_save()
    {
       
$batch = $this->installBatch;
       
$batch->save();

        return
$batch;
    }
}