Skip to content
Snippets Groups Projects
DocserverToolsController.php 11.9 KiB
Newer Older
  • Learn to ignore specific revisions
  • <?php
    
    /**
    * Copyright Maarch since 2008 under licence GPLv3.
    * See LICENCE.txt file at the root folder for more details.
    * This file is part of Maarch software.
    *
    */
    
    /**
    * @brief Docserver tools Controller
    * @author dev@maarch.org
    * @ingroup core
    */
    
    namespace Core\Controllers;
    
    use Psr\Http\Message\RequestInterface;
    use Psr\Http\Message\ResponseInterface;
    use Respect\Validation\Validator;
    use Core\Models\DocserverModel;
    
    class DocserverToolsController
    {
    
        /**
         * Compute the path in the docserver for a batch
         * @param $docServer docservers path
    
         * @return  array Contains 2 items : subdirectory path and error
    
         */
        public function createPathOnDocServer($aArgs)
        {
            if (empty($aArgs['path'])) {
                $datas = [
                        'errors' => 'path ' . _EMPTY,
                ];
    
                return $datas;
            }
    
            if (!is_dir($aArgs['path'])) {
                $datas = [
                        'errors' => 'path ' . _NOT_EXISTS,
                ];
    
                return $datas;
            }
    
            $pathOnDocserver = $aArgs['path'];
    
            error_reporting(0);
    
            umask(0022);
    
            if (!is_dir($pathOnDocserver . date('Y') . DIRECTORY_SEPARATOR)) {
                mkdir($pathOnDocserver . date('Y') . DIRECTORY_SEPARATOR, 0770);
                $this->setRights(['path' => $pathOnDocserver . date('Y') . DIRECTORY_SEPARATOR]);
            }
            if (!is_dir(
                $pathOnDocserver . date('Y') . DIRECTORY_SEPARATOR.date('m')
                . DIRECTORY_SEPARATOR
            )
            ) {
                mkdir(
                    $pathOnDocserver . date('Y') . DIRECTORY_SEPARATOR.date('m')
                    . DIRECTORY_SEPARATOR,
                    0770
                );
                $this->setRights(
                    ['path' => $pathOnDocserver . date('Y') . DIRECTORY_SEPARATOR.date('m') . DIRECTORY_SEPARATOR]
                );
            }
            if (isset($GLOBALS['wb']) && $GLOBALS['wb'] <> '') {
                $path = $pathOnDocserver . date('Y') . DIRECTORY_SEPARATOR.date('m')
    
                      . DIRECTORY_SEPARATOR . 'BATCH' . DIRECTORY_SEPARATOR
    
                      . $GLOBALS['wb'] . DIRECTORY_SEPARATOR;
                if (!is_dir($path)) {
                    mkdir($path, 0770, true);
                    $this->setRights(['path' => $path]);
                } else {
                    $datas = [
                        'errors' => 'Folder alreay exists, workbatch already exist:' . $path,
                    ];
    
                    return $datas;
                }
            } else {
                $path = $pathOnDocserver . date('Y') . DIRECTORY_SEPARATOR.date('m')
                      . DIRECTORY_SEPARATOR;
            }
    
    
            $datas =
    
                    'createPathOnDocServer' =>
    
                        [
                            'destinationDir' => $path
                        ]
                ];
            
            return $datas;
        }
    
         /**
         * Set Rights on resources
         * @param   string $dest path of the resource
         * @return  nothing
         */
        public function setRights($aArgs)
        {
            if (empty($aArgs['path'])) {
                $datas = [
                        'errors' => 'path ' . _EMPTY,
                ];
    
                return $datas;
            }
    
            if (!is_dir($aArgs['path'])) {
                $datas = [
                        'errors' => 'path ' . _NOT_EXISTS,
                ];
    
                return $datas;
            }
    
    
            if (DIRECTORY_SEPARATOR == '/'
    
                && (isset($GLOBALS['apacheUserAndGroup'])
                && $GLOBALS['apacheUserAndGroup'] <> '')
            ) {
    
                exec('chown '
                    . escapeshellarg($GLOBALS['apacheUserAndGroup']) . ' '
                    . escapeshellarg($aArgs['path']));
    
            }
    
            umask(0022);
            chmod($aArgs['path'], 0770);
    
            $datas = [
                'setRights' => true,
            ];
    
            return $datas;
        }
    
        /**
         * copy doc in a docserver.
         * @param   string $sourceFilePath collection resource
         * @param   array $infoFileNameInTargetDocserver infos of the doc to store,
         *          contains : subdirectory path and new filename
         * @param   string $docserverSourceFingerprint
         * @return  array of docserver data for res_x else return error
         */
        public function copyOnDocserver($aArgs)
        {
            if (empty($aArgs['destinationDir'])) {
                $datas = [
                    'errors' => 'destinationDir ' . _EMPTY,
                ];
    
                return $datas;
            }
    
            if (empty($aArgs['fileDestinationName'])) {
                $datas = [
                    'errors' => 'fileDestinationName ' . _EMPTY,
                ];
    
                return $datas;
            }
    
            if (file_exists(($aArgs['destinationDir'] . $aArgs['fileDestinationName']))) {
                $datas = [
    
                    'errors' => '' . $aArgs['destinationDir']
    
                        . $aArgs['fileDestinationName'] . ' ' . _FILE_ALREADY_EXISTS,
                ];
    
                return $datas;
            }
    
            if (empty($aArgs['sourceFilePath'])) {
                $datas = [
                    'errors' => 'sourceFilePath ' . _EMPTY,
                ];
    
                return $datas;
            }
    
            if (!file_exists($aArgs['sourceFilePath'])) {
                $datas = [
                    'errors' => 'sourceFilePath '  . _NOT_EXISTS,
                ];
    
                return $datas;
            }
    
            $destinationDir = $aArgs['destinationDir'];
            $fileDestinationName = $aArgs['fileDestinationName'];
            $sourceFilePath = str_replace('\\\\', '\\', $aArgs['sourceFilePath']);
            $docserverSourceFingerprint = $aArgs['docserverSourceFingerprint'];
    
            error_reporting(0);
    
            if (!is_dir($destinationDir)) {
                mkdir($destinationDir, 0770, true);
                $aArgs = [
                    'path'=> $destinationDir
                ];
    
                $this->setRights($aArgs);
            }
    
    
            if (!copy($sourceFilePath, $destinationDir . $fileDestinationName)) {
    
                $datas = [
                    'errors' => _DOCSERVER_COPY_ERROR . ' source : ' . $sourceFilePath
                        . ' dest : ' . $destinationDir . $fileDestinationName
                ];
    
                return $datas;
            }
            
            $aArgs = [
                'path'=> $destinationDir . $fileDestinationName
            ];
    
            $this->setRights($aArgs);
    
            $fingerprintControl = array();
    
            $aArgs = [
                'pathInit'          => $sourceFilePath,
                'pathTarget'        => $destinationDir . $fileDestinationName,
                'fingerprintMode'   => $docserverSourceFingerprint,
            ];
    
            $fingerprintControl = $this->controlFingerprint($aArgs);
    
            if (!empty($fingerprintControl['errors'])) {
                $datas = [
                    'errors' => $fingerprintControl['errors'],
                ];
    
                return $datas;
            }
    
            //for batch like life cycle
            if (isset($GLOBALS['currentStep'])) {
                $destinationDir = str_replace(
                    $GLOBALS['docservers'][$GLOBALS['currentStep']]['docserver']
                    ['path_template'],
                    '',
                    $destinationDir
                );
            }
    
            $destinationDir = str_replace(
                DIRECTORY_SEPARATOR,
                '#',
                $destinationDir
            );
    
            $datas = [
    
                'copyOnDocserver' =>
    
                    [
                        'destinationDir'        => $destinationDir,
                        'fileDestinationName'   => $fileDestinationName,
                        'fileSize'              => filesize($sourceFilePath),
                    ]
            ];
    
            if (isset($GLOBALS['TmpDirectory']) && $GLOBALS['TmpDirectory'] <> '') {
                $aArgs = [
                    'path'        => $GLOBALS['TmpDirectory'],
                    'contentOnly' => true,
                ];
                $this->washTmp($aArgs);
            }
    
            return $datas;
        }
    
        /**
         * Compute the fingerprint of a resource
         * @param   string $path path of the resource
         * @param   string $fingerprintMode (md5, sha512, ...)
         * @return  string the fingerprint
         */
        public function doFingerprint($aArgs)
        {
            if (empty($aArgs['path'])) {
                $datas = [
                        'errors' => 'path ' . _EMPTY,
                ];
    
                return $datas;
            }
    
            if (!file_exists($aArgs['path'])) {
                $datas = [
                        'errors' => 'path ' . _NOT_EXISTS,
                ];
    
                return $datas;
            }
    
    
            if ($aArgs['fingerprintMode'] == 'NONE' ||
    
                $aArgs['fingerprintMode'] == ''
            ) {
                $datas = [
                    'fingerprint' => '0',
                ];
    
                return $datas;
            } else {
                $fingerprint = hash_file(
    
                    strtolower($aArgs['fingerprintMode']),
    
                    $aArgs['path']
                );
    
                $datas = [
                    'fingerprint' => $fingerprint,
                ];
                
                return $datas;
            }
        }
    
        /**
         * Control fingerprint between two resources
         * @param   string $pathInit path of the resource 1
         * @param   string $pathTarget path of the resource 2
         * @param   string $fingerprintMode (md5, sha512, ...)
         * @return  array ok or ko with error
         */
        public function controlFingerprint($aArgs)
        {
            if (empty($aArgs['pathInit'])) {
                $datas = [
                        'errors' => 'pathInit ' . _EMPTY,
                ];
    
                return $datas;
            }
    
            if (!file_exists($aArgs['pathInit'])) {
                $datas = [
                        'errors' => 'pathInit ' . _NOT_EXISTS,
                ];
    
                return $datas;
            }
    
            if (empty($aArgs['pathTarget'])) {
                $datas = [
                        'errors' => 'pathTarget ' . _EMPTY,
                ];
    
                return $datas;
            }
    
            if (!file_exists($aArgs['pathTarget'])) {
                $datas = [
                        'errors' => 'pathTarget ' . _NOT_EXISTS,
                ];
    
                return $datas;
            }
    
            $aArgsSrc = [
                'path'            => $aArgs['pathInit'],
                'fingerprintMode' => $aArgs['fingerprintMode'],
            ];
    
            $aArgsTarget = [
                'path'            => $aArgs['pathTarget'],
                'fingerprintMode' => $aArgs['fingerprintMode'],
            ];
    
            if ($this->doFingerprint($aArgsSrc) <> $this->doFingerprint($aArgsTarget)) {
                $datas = [
                        'errors' => PB_WITH_FINGERPRINT_OF_DOCUMENT . ' ' . $aArgs['pathInit']
                            . ' '. _AND . ' ' . $aArgs['pathTarget'],
                ];
            } else {
                $datas = [
                    'controlFingerprint' => true,
                ];
            }
    
            return $datas;
        }
    
        /**
         * del tmp files
         * @param   $path dir to wash
         * @param   $contentOnly boolean true if only the content
         * @return  boolean
         */
        public function washTmp($aArgs)
        {
            if (empty($aArgs['path'])) {
                $datas = [
                        'errors' => 'path ' . _EMPTY,
                ];
    
                return $datas;
            }
    
            if (!is_dir($aArgs['path'])) {
                $datas = [
                        'errors' => 'path ' . _NOT_EXISTS,
                ];
    
                return $datas;
            }
    
            if (!is_bool($aArgs['contentOnly'])) {
                $datas = [
                        'errors' => 'contentOnly ' . _NOT . ' ' . _VALID,
                ];
    
                return $datas;
            }
    
            $objects = scandir($aArgs['path']);
            foreach ($objects as $object) {
                if ($object != '.' && $object != '..') {
                    if (filetype($aArgs['path'] . DIRECTORY_SEPARATOR . $object) == 'dir') {
                        $this->washTmp(
                            ['path' => $aArgs['path'] . DIRECTORY_SEPARATOR . $object]
                        );
                    } else {
                        unlink($aArgs['path'] . DIRECTORY_SEPARATOR . $object);
                    }
                }
            }
    
            reset($objects);
            
            if (!$aArgs['contentOnly']) {
                rmdir($aArgs['path']);
            }
    
            $datas = [
                'washTmp' => true,
            ];
    
            return $datas;
        }