Skip to content

Commit c412dfa

Browse files
committed
On file upload fail display error message based on error code for media, plugins and themes
1 parent f49f669 commit c412dfa

File tree

4 files changed

+79
-55
lines changed

4 files changed

+79
-55
lines changed

admin/controller/media/media.php

+18-47
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@
2424

2525
use function Vvveb\__;
2626
use Vvveb\Controller\Base;
27+
use function Vvveb\fileUploadErrMessage;
2728
use function Vvveb\sanitizeFileName;
28-
use Vvveb\System\Core\View;
2929

3030
class Media extends Base {
3131
protected $uploadDenyExtensions = ['php', 'svg', 'js'];
@@ -70,55 +70,27 @@ function upload() {
7070
$path = sanitizeFileName($this->request->post['mediaPath']);
7171
$file = $this->request->files['file'] ?? [];
7272
$fileName = sanitizeFileName($file['name']);
73-
$path = preg_replace('@^/public/media|^/media|^/public@', '', $path);
73+
$path = preg_replace('@^[\\\/]public[\\\/]media|^[\\\/]media|^[\\\/]public@', '', $path);
7474
$extension = strtolower(substr($fileName, strrpos($fileName, '.') + 1));
75-
$success = false;
76-
$return = '';
77-
$message = '';
78-
75+
$success = false;
76+
$return = '';
77+
$message = '';
78+
7979
if ($file) {
80-
switch ($file['error']) {
81-
case UPLOAD_ERR_OK:
82-
$success = true;
83-
break;
84-
85-
case UPLOAD_ERR_NO_FILE:
86-
$message = __('No file sent');
87-
break;
88-
89-
case UPLOAD_ERR_PARTIAL:
90-
$message = __('The uploaded file was only partially uploaded');
91-
break;
92-
93-
case UPLOAD_ERR_NO_TMP_DIR:
94-
$message = __('Missing a temporary folder');
95-
break;
96-
97-
case UPLOAD_ERR_CANT_WRITE:
98-
$message = __('Failed to write file to disk');
99-
break;
100-
101-
case UPLOAD_ERR_EXTENSION:
102-
$message = __('A PHP extension stopped the file upload');
103-
break;
104-
105-
case UPLOAD_ERR_INI_SIZE:
106-
case UPLOAD_ERR_FORM_SIZE:
107-
$message = __('Exceeded filesize limit');
108-
break;
109-
110-
default:
111-
$message = __('Unknown errors');
80+
if ($file['error'] == UPLOAD_ERR_OK) {
81+
$success = true;
82+
} else {
83+
$message = fileUploadErrMessage($file['error']);
11284
}
113-
85+
11486
if (in_array($extension, $this->uploadDenyExtensions)) {
11587
$message = __('File type not allowed!');
11688
$success = false;
11789
}
11890

11991
$origFilename = $fileName;
12092
$i = 1;
121-
93+
12294
if ($success) {
12395
while (file_exists($destination = DIR_MEDIA . $path . DS . $fileName) && ($i++ < 5)) {
12496
$fileName = rand(0, 10000) . '-' . $origFilename;
@@ -133,9 +105,9 @@ function upload() {
133105
$message = __('File uploaded successfully!');
134106
} else {
135107
$destination = DIR_MEDIA . $path . DS;
136-
$success = false;
137-
138-
if (!is_writable($destination)) {
108+
$success = false;
109+
110+
if (! is_writable($destination)) {
139111
$message = sprintf(__('%s not writable!'), $destination);
140112
} else {
141113
$message = __('Error moving uploaded file!');
@@ -145,9 +117,9 @@ function upload() {
145117
} else {
146118
$message = __('Invalid upload!');
147119
}
148-
149-
$message = ['success' => true, 'message' => $message, 'file' => $return];
150-
120+
121+
$message = ['success' => $success, 'message' => $message, 'file' => $return];
122+
151123
$this->response->setType('json');
152124
$this->response->output($message);
153125
}
@@ -192,7 +164,6 @@ function rename() {
192164
}
193165
}
194166

195-
196167
$this->response->setType('json');
197168
$this->response->output($message);
198169
}

admin/controller/plugin/plugins.php

+11-6
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,14 @@
2424

2525
use function Vvveb\__;
2626
use Vvveb\Controller\Base;
27+
use function Vvveb\fileUploadErrMessage;
2728
use function Vvveb\rrmdir;
29+
use Vvveb\System\CacheManager;
2830
use function Vvveb\System\Core\exceptionToArray;
2931
use Vvveb\System\Core\FrontController;
3032
use Vvveb\System\Core\View;
3133
use Vvveb\System\Extensions\Plugins as PluginsList;
3234
use Vvveb\System\User\Admin;
33-
use Vvveb\System\CacheManager;
3435

3536
class Plugins extends Base {
3637
function init() {
@@ -99,14 +100,18 @@ function upload() {
99100
$error = false;
100101

101102
foreach ($files as $file) {
102-
if ($file) {
103+
if ($file && $file['error'] == UPLOAD_ERR_OK) {
103104
try {
104105
// use temorary file, php cleans temporary files on request finish.
105106
$this->pluginSlug = PluginsList :: install($file['tmp_name'], str_replace('.zip', '', strtolower($file['name'])));
106107
} catch (\Exception $e) {
107108
$error = $e->getMessage();
108109
$this->view->errors[] = $error;
109110
}
111+
} else {
112+
$error = true;
113+
$this->view->errors[] = sprintf(__('Error uploading %s!'), $file['name']);
114+
$this->view->warning[] = sprintf(fileUploadErrMessage($file['error']));
110115
}
111116

112117
if (! $error) {
@@ -116,10 +121,10 @@ function upload() {
116121
$this->pluginActivateUrl = \Vvveb\url(['module' => 'plugin/plugins', 'action'=> 'activate', 'plugin' => $this->pluginSlug]);
117122
$successMessage = sprintf(__('Plugin %s was successfully installed!'), $this->pluginName, $this->pluginActivateUrl);
118123
$successMessage .= "<p><a class='btn btn-primary btn-sm m-2' href='{$this->pluginActivateUrl}'>" . __('Activate plugin') . '</a></p>';
119-
$this->view->success[] = $successMessage;
124+
$this->view->success[] = $successMessage;
120125
} else {
121-
$errorMessage = sprintf(__('Failed to install %s plugin!'), $this->pluginName);
122-
$this->view->error[] = $errorMessage;
126+
$errorMessage = sprintf(__('Failed to install %s plugin!'), $this->pluginName);
127+
$this->view->error[] = $errorMessage;
123128
}
124129
}
125130
}
@@ -162,7 +167,7 @@ function checkPluginAndActivate() {
162167

163168
ignore_user_abort(1);
164169
clearstatcache(true);
165-
170+
166171
CacheManager::clearCompiledFiles();
167172

168173
if (defined('CLI')) {

admin/controller/theme/themes.php

+7-2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
use function Vvveb\__;
2626
use Vvveb\Controller\Base;
27+
use function Vvveb\fileUploadErrMessage;
2728
use function Vvveb\rcopy;
2829
use function Vvveb\rrmdir;
2930
use function Vvveb\sanitizeFileName;
@@ -95,14 +96,18 @@ function upload() {
9596
foreach ($files as $file) {
9697
$this->themeSlug = str_replace('.zip', '', strtolower($file['name']));
9798

98-
if ($file) {
99+
if ($file && $file['error'] == UPLOAD_ERR_OK) {
99100
try {
100101
// use temorary file, php cleans temporary files on request finish.
101102
$this->themeSlug = ThemesList :: install($file['tmp_name'], $this->themeSlug, false);
102103
} catch (\Exception $e) {
103104
$error = $e->getMessage();
104105
$this->view->errors[] = $error;
105106
}
107+
} else {
108+
$error = true;
109+
$this->view->errors[] = sprintf(__('Error uploading %s!'), $this->themeSlug);
110+
$this->view->warning[] = sprintf(fileUploadErrMessage($file['error']));
106111
}
107112

108113
if (! $error && $this->themeSlug) {
@@ -111,7 +116,7 @@ function upload() {
111116
$this->themeActivateUrl = \Vvveb\url(['module' => 'theme/themes', 'action'=> 'activate', 'theme' => $this->themeSlug]);
112117
$successMessage = sprintf(__('Theme %s was successfully installed!'), $this->themeSlug);
113118
$successMessage .= "<p><a href='{$this->themeActivateUrl}'>" . __('Activate theme') . '</a></p>';
114-
$this->view->success[] = $successMessage;
119+
$this->view->success[] = $successMessage;
115120
}
116121
}
117122

system/functions.php

+43
Original file line numberDiff line numberDiff line change
@@ -1828,3 +1828,46 @@ function reconstructJson($array) {
18281828

18291829
return $helper;
18301830
}
1831+
1832+
function fileUploadErrMessage($errorCode) {
1833+
switch ($errorCode) {
1834+
case UPLOAD_ERR_OK:
1835+
return __('No file sent');
1836+
1837+
break;
1838+
1839+
case UPLOAD_ERR_NO_FILE:
1840+
return __('No file sent');
1841+
1842+
break;
1843+
1844+
case UPLOAD_ERR_PARTIAL:
1845+
return __('The uploaded file was only partially uploaded');
1846+
1847+
break;
1848+
1849+
case UPLOAD_ERR_NO_TMP_DIR:
1850+
return __('Missing a temporary folder');
1851+
1852+
break;
1853+
1854+
case UPLOAD_ERR_CANT_WRITE:
1855+
return __('Failed to write file to disk');
1856+
1857+
break;
1858+
1859+
case UPLOAD_ERR_EXTENSION:
1860+
return __('A PHP extension stopped the file upload');
1861+
1862+
break;
1863+
1864+
case UPLOAD_ERR_INI_SIZE:
1865+
case UPLOAD_ERR_FORM_SIZE:
1866+
return __('Exceeded filesize limit');
1867+
1868+
break;
1869+
1870+
default:
1871+
return __('Unknown errors');
1872+
}
1873+
}

0 commit comments

Comments
 (0)