Upload   A
last analyzed

Complexity

Total Complexity 16

Size/Duplication

Total Lines 141
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 0

Importance

Changes 0
Metric Value
wmc 16
lcom 1
cbo 0
dl 0
loc 141
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A validateUpload() 0 10 1
C validateLimitsUpload() 0 48 11
A validateFileUpload() 0 21 3
A __construct() 0 9 1
1
<?php
2
3
/**
4
 * @package File manager
5
 * @author Iurii Makukh <[email protected]>
6
 * @copyright Copyright (c) 2017, Iurii Makukh <[email protected]>
7
 * @license https://www.gnu.org/licenses/gpl-3.0.en.html GPL-3.0+
8
 */
9
10
namespace gplcart\modules\file_manager\handlers\validators;
11
12
use gplcart\core\handlers\validator\Element;
13
use gplcart\core\helpers\Request;
14
use gplcart\core\models\FileTransfer;
15
use gplcart\core\models\User;
16
use gplcart\core\Module;
17
18
/**
19
 * Provides methods to validate "upload" command
20
 */
21
class Upload extends Element
22
{
23
24
    /**
25
     * Request helper class instance
26
     * @var \gplcart\core\helpers\Request $request
27
     */
28
    protected $request;
29
30
    /**
31
     * User model instance
32
     * @var \gplcart\core\models\User $user
33
     */
34
    protected $user;
35
36
    /**
37
     * Module class instance
38
     * @var \gplcart\core\Module $module
39
     */
40
    protected $module;
41
42
    /**
43
     * File transfer model instance
44
     * @var \gplcart\core\models\FileTransfer $file_transfer
45
     */
46
    protected $file_transfer;
47
48
    /**
49
     * Upload constructor.
50
     * @param Module $module
51
     * @param FileTransfer $file_transfer
52
     * @param User $user
53
     * @param Request $request
54
     */
55
    public function __construct(Module $module, FileTransfer $file_transfer, User $user, Request $request)
56
    {
57
        parent::__construct();
58
59
        $this->user = $user;
60
        $this->module = $module;
61
        $this->request = $request;
62
        $this->file_transfer = $file_transfer;
63
    }
64
65
    /**
66
     * Validates an array of submitted command data
67
     * @param array $submitted
68
     * @param array $options
69
     * @return mixed
70
     */
71
    public function validateUpload(array &$submitted, array $options = array())
72
    {
73
        $this->options = $options;
74
        $this->submitted = &$submitted;
75
76
        $this->validateLimitsUpload();
77
        $this->validateFileUpload();
78
79
        return $this->getResult();
80
    }
81
82
    /**
83
     * Validates file limits
84
     * @return boolean
85
     */
86
    protected function validateLimitsUpload()
87
    {
88
        $files = $this->request->file('files');
89
90
        if (!gplcart_file_multi_upload($files)) {
91
            return false;
92
        }
93
94
        if ($this->user->isSuperadmin()) {
95
            return true;
96
        }
97
98
        $role_id = $this->user->getRoleId();
99
        $settings = $this->module->getSettings('file_manager');
100
101
        $maxfilesize = 0;
102
        $extensions = array();
103
104
        if (!empty($settings['filesize_limit'][$role_id])) {
105
            $maxfilesize = $settings['filesize_limit'][$role_id];
106
        }
107
108
        if (!empty($settings['extension_limit'][$role_id])) {
109
            $extensions = $settings['extension_limit'][$role_id];
110
        }
111
112
        $errors = array();
113
        foreach ($files as $file) {
114
115
            if ($maxfilesize && filesize($file['tmp_name']) > $maxfilesize) {
116
                unlink($file['tmp_name']);
117
                $errors[] = "{$file['name']}: " . $this->translation->text('File size exceeds %num bytes', array('%num' => $maxfilesize));
118
                continue;
119
            }
120
121
            if ($extensions && !in_array(pathinfo($file['name'], PATHINFO_EXTENSION), $extensions)) {
122
                unlink($file['tmp_name']);
123
                $errors[] = "{$file['name']}: " . $this->translation->text('Unsupported file extension');
124
            }
125
        }
126
127
        if (empty($errors)) {
128
            return true;
129
        }
130
131
        $this->setError('files', implode('<br>', $errors));
132
        return false;
133
    }
134
135
    /**
136
     * Validates uploaded files
137
     * @return boolean
138
     */
139
    protected function validateFileUpload()
140
    {
141
        if ($this->isError()) {
142
            return null;
143
        }
144
145
        $submitted_files = $this->getSubmitted('files');
146
147
        /* @var $file \SplFileInfo */
148
        $file = reset($submitted_files);
149
        $request_files = $this->request->file('files');
150
151
        if (empty($request_files['name'][0])) {
152
            $this->setErrorRequired('files', $this->translation->text('Files'));
153
            return false;
154
        }
155
156
        $result = $this->file_transfer->uploadMultiple($request_files, false, $file->getRealPath());
157
        $this->setSubmitted('uploaded', $result);
158
        return true;
159
    }
160
161
}
162