Skip to content

Commit 79cf2ba

Browse files
committed
feat: spostata la verifica dei permessi di upload/eliminazione allegati su classe
1 parent 6b63035 commit 79cf2ba

2 files changed

Lines changed: 216 additions & 124 deletions

File tree

actions.php

Lines changed: 93 additions & 124 deletions
Original file line numberDiff line numberDiff line change
@@ -40,156 +40,125 @@
4040

4141
// Upload allegati e rimozione
4242
if (filter('op') == 'aggiungi-allegato' || filter('op') == 'rimuovi-allegato') {
43-
// Controllo sui permessi di scrittura per il modulo
44-
$has_write_permission = false;
45-
46-
// Verifica permessi in base al tipo di accesso
47-
if (Permissions::isTokenAccess()) {
48-
// Per accesso tramite token, verifica i permessi del token
49-
$token_info = $_SESSION['token_access'];
50-
$token_permission = $token_info['permessi'] ?? 'r';
51-
52-
// Per gli allegati, verifica i permessi specifici del token
53-
if (filter('op') == 'aggiungi-allegato') {
54-
// Caricamento allegati: permessi 'ra', 'rwa' o 'rw'
55-
$has_write_permission = in_array($token_permission, ['ra', 'rwa', 'rw']);
56-
} elseif (filter('op') == 'rimuovi-allegato') {
57-
// Rimozione allegati: solo permessi 'rwa' o 'rw'
58-
$has_write_permission = in_array($token_permission, ['rwa', 'rw']);
59-
}
60-
} else {
61-
// Per accesso normale, usa i permessi standard del modulo
62-
$has_write_permission = (Modules::getPermission($id_module) == 'rw');
63-
}
43+
// UPLOAD PER CKEDITOR
44+
if (filter('op') == 'aggiungi-allegato' && !empty($_FILES) && !empty($_FILES['upload']['name'])) {
45+
$CKEditor = get('CKEditor');
46+
$funcNum = get('CKEditorFuncNum');
6447

65-
if (!$has_write_permission) {
66-
flash()->error(tr('Non hai permessi di scrittura per il modulo _MODULE_', [
67-
'_MODULE_' => '"'.Module::find($id_module)->getTranslation('title').'"',
68-
]));
69-
}
48+
$allowed_extension = [
49+
'png', 'jpg', 'jpeg',
50+
];
51+
52+
// Maximum file limit (unit: byte)
53+
$max_size = '2097152'; // 2MB
7054

71-
// Gestione delle operazioni
72-
else {
73-
// UPLOAD PER CKEDITOR
74-
if (filter('op') == 'aggiungi-allegato' && !empty($_FILES) && !empty($_FILES['upload']['name'])) {
75-
$CKEditor = get('CKEditor');
76-
$funcNum = get('CKEditorFuncNum');
55+
// Get image file extension
56+
$file_extension = pathinfo($_FILES['upload']['name'], PATHINFO_EXTENSION);
57+
58+
if (in_array(strtolower($file_extension), $allowed_extension) && $_FILES['upload']['size'] < $max_size) {
59+
$upload = Uploads::upload($_FILES['upload'], [
60+
'name' => filter('nome_allegato'),
61+
'id_category' => filter('id_category') ?: null,
62+
'id_module' => Module::where('name', 'Gestione documentale')->first()->id,
63+
'id_record' => $id_record,
64+
]);
7765

78-
$allowed_extension = [
79-
'png', 'jpg', 'jpeg',
80-
];
66+
// Upload da form
67+
if (!empty($funcNum)) {
68+
echo '
69+
<link rel="stylesheet" type="text/css" href="'.$baseurl.'/assets/dist/css/app.min.css" />
70+
<script src="'.$baseurl.'/assets/dist/js/app.min.js"></script>';
71+
}
8172

82-
// Maximum file limit (unit: byte)
83-
$max_size = '2097152'; // 2MB
73+
// Creazione file fisico
74+
if (!empty($upload)) {
75+
// flash()->info(tr('File caricato correttamente!'));
8476

85-
// Get image file extension
86-
$file_extension = pathinfo($_FILES['upload']['name'], PATHINFO_EXTENSION);
77+
$id_allegato = $dbo->lastInsertedID();
78+
$upload = Upload::find($id_allegato);
8779

88-
if (in_array(strtolower($file_extension), $allowed_extension) && $_FILES['upload']['size'] < $max_size) {
89-
$upload = Uploads::upload($_FILES['upload'], [
90-
'name' => filter('nome_allegato'),
91-
'id_category' => filter('id_category') ?: null,
92-
'id_module' => Module::where('name', 'Gestione documentale')->first()->id,
93-
'id_record' => $id_record,
94-
]);
80+
$response = [
81+
'fileName' => base_path().'/files/gestione_documentale/'.basename($upload->filename),
82+
'uploaded' => 1,
83+
'url' => base_path().'/files/gestione_documentale/'.$upload->filename,
84+
];
9585

9686
// Upload da form
9787
if (!empty($funcNum)) {
9888
echo '
99-
<link rel="stylesheet" type="text/css" href="'.$baseurl.'/assets/dist/css/app.min.css" />
100-
<script src="'.$baseurl.'/assets/dist/js/app.min.js"></script>';
89+
<script type="text/javascript">
90+
$(document).ready(function() {
91+
window.parent.toastr.success("'.tr('Caricamento riuscito').'");
92+
window.parent.CKEDITOR.tools.callFunction('.$funcNum.', "'.$baseurl.'/files/gestione_documentale/'.$upload->filename.'");
93+
});
94+
</script>';
10195
}
10296

103-
// Creazione file fisico
104-
if (!empty($upload)) {
105-
// flash()->info(tr('File caricato correttamente!'));
106-
107-
$id_allegato = $dbo->lastInsertedID();
108-
$upload = Upload::find($id_allegato);
109-
110-
$response = [
111-
'fileName' => base_path().'/files/gestione_documentale/'.basename($upload->filename),
112-
'uploaded' => 1,
113-
'url' => base_path().'/files/gestione_documentale/'.$upload->filename,
114-
];
115-
116-
// Upload da form
117-
if (!empty($funcNum)) {
118-
echo '
119-
<script type="text/javascript">
120-
$(document).ready(function() {
121-
window.parent.toastr.success("'.tr('Caricamento riuscito').'");
122-
window.parent.CKEDITOR.tools.callFunction('.$funcNum.', "'.$baseurl.'/files/gestione_documentale/'.$upload->filename.'");
123-
});
124-
</script>';
125-
}
126-
127-
// Copia-incolla
128-
else {
129-
echo json_encode($response);
130-
}
131-
} else {
132-
// flash()->error(tr('Errore durante il caricamento del file!'));
133-
echo '<script type="text/javascript"> window.parent.toastr.error("'.tr('Errore durante il caricamento del file!').'"); </script>';
97+
// Copia-incolla
98+
else {
99+
echo json_encode($response);
134100
}
135101
} else {
136-
// flash()->error(tr('Estensione non permessa!'));
137-
echo '<script type="text/javascript"> window.parent.toastr.error("'.tr('Estensione non permessa').'"); </script>';
138-
}
139-
140-
exit;
141-
}
142-
143-
// UPLOAD
144-
if (filter('op') == 'aggiungi-allegato' && !empty($_FILES) && !empty($_FILES['file']['name'])) {
145-
$upload = Uploads::upload($_FILES['file'], [
146-
'name' => filter('nome_allegato'),
147-
'id_category' => filter('id_category') ?: null,
148-
'id_module' => $id_module,
149-
'id_plugin' => $id_plugin,
150-
'id_record' => $id_record,
151-
'key' => filter('key') ?: null,
152-
]);
153-
154-
// Creazione file fisico
155-
if (!empty($upload)) {
156-
flash()->info(tr('File caricato correttamente!'));
157-
} else {
158-
flash()->error(tr('Errore durante il caricamento del file!'));
102+
// flash()->error(tr('Errore durante il caricamento del file!'));
103+
echo '<script type="text/javascript"> window.parent.toastr.error("'.tr('Errore durante il caricamento del file!').'"); </script>';
159104
}
105+
} else {
106+
// flash()->error(tr('Estensione non permessa!'));
107+
echo '<script type="text/javascript"> window.parent.toastr.error("'.tr('Estensione non permessa').'"); </script>';
160108
}
161109

162-
// DELETE
163-
elseif (filter('op') == 'rimuovi-allegato' && filter('filename') !== null) {
164-
$name = Uploads::delete(filter('filename'), [
165-
'id_module' => $id_module,
166-
'id_plugin' => $id_plugin,
167-
'id_record' => $id_record,
168-
'key' => filter('key') ?: null,
169-
]);
110+
exit;
111+
}
170112

171-
if (!empty($name)) {
172-
flash()->info(tr('File _FILE_ eliminato!', [
173-
'_FILE_' => '"'.$name.'"',
174-
]));
175-
} else {
176-
flash()->error(tr("Errore durante l'eliminazione del file!"));
177-
}
113+
// UPLOAD
114+
if (filter('op') == 'aggiungi-allegato' && !empty($_FILES) && !empty($_FILES['file']['name'])) {
115+
$upload = Uploads::upload($_FILES['file'], [
116+
'name' => filter('nome_allegato'),
117+
'id_category' => filter('id_category') ?: null,
118+
'id_module' => $id_module,
119+
'id_plugin' => $id_plugin,
120+
'id_record' => $id_record,
121+
'key' => filter('key') ?: null,
122+
]);
123+
124+
// Creazione file fisico
125+
if (!empty($upload)) {
126+
flash()->info(tr('File caricato correttamente!'));
127+
} else {
128+
flash()->error(tr('Errore durante il caricamento del file!'));
178129
}
130+
}
179131

180-
// Determina il redirect appropriato in base al tipo di accesso
181-
if (Permissions::isTokenAccess() && !empty($_SESSION['token_access']['id_module_target']) && !empty($_SESSION['token_access']['id_record_target'])) {
182-
// Per accesso tramite token, redirect a shared_editor.php
183-
redirect(base_path().'/shared_editor.php?id_module='.$id_module.'&id_record='.$id_record.((!empty($options['id_plugin'])) ? '#tab_'.$options['id_plugin'] : ''));
132+
// DELETE
133+
if (filter('op') == 'rimuovi-allegato' && filter('filename') !== null) {
134+
$name = Uploads::delete(filter('filename'), [
135+
'id_module' => $id_module,
136+
'id_plugin' => $id_plugin,
137+
'id_record' => $id_record,
138+
'key' => filter('key') ?: null,
139+
]);
140+
141+
if (!empty($name)) {
142+
flash()->info(tr('File _FILE_ eliminato!', [
143+
'_FILE_' => '"'.$name.'"',
144+
]));
184145
} else {
185-
// Per accesso normale, redirect a editor.php
186-
redirect(base_path().'/editor.php?id_module='.$id_module.'&id_record='.$id_record.((!empty($options['id_plugin'])) ? '#tab_'.$options['id_plugin'] : ''));
146+
flash()->error(tr("Errore durante l'eliminazione del file!"));
187147
}
188148
}
149+
150+
// Determina il redirect appropriato in base al tipo di accesso
151+
if (Permissions::isTokenAccess() && !empty($_SESSION['token_access']['id_module_target']) && !empty($_SESSION['token_access']['id_record_target'])) {
152+
// Per accesso tramite token, redirect a shared_editor.php
153+
redirect(base_path().'/shared_editor.php?id_module='.$id_module.'&id_record='.$id_record.((!empty($options['id_plugin'])) ? '#tab_'.$options['id_plugin'] : ''));
154+
} else {
155+
// Per accesso normale, redirect a editor.php
156+
redirect(base_path().'/editor.php?id_module='.$id_module.'&id_record='.$id_record.((!empty($options['id_plugin'])) ? '#tab_'.$options['id_plugin'] : ''));
157+
}
189158
}
190159

191160
// Download allegati
192-
elseif (filter('op') == 'download-allegato') {
161+
if (filter('op') == 'download-allegato') {
193162
$rs = $dbo->fetchArray('SELECT * FROM zz_files WHERE id_module='.prepare($id_module).' AND id='.prepare(filter('id')).' AND filename='.prepare(filter('filename')));
194163

195164
// download($upload_dir.'/'.$rs[0]['filename'], $rs[0]['original']);

src/Models/Upload.php

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,11 @@ public function setCategoryAttribute($value)
8484
*/
8585
public static function build($source = null, $data = null, $name = null, $category = null)
8686
{
87+
// Verifica permessi prima del caricamento
88+
if (!self::checkUploadPermissions($data)) {
89+
return false;
90+
}
91+
8792
$model = new static();
8893

8994
// Informazioni di base
@@ -251,6 +256,18 @@ public function hasPreview()
251256

252257
public function delete()
253258
{
259+
// Verifica permessi prima dell'eliminazione
260+
$data = [
261+
'id_module' => $this->id_module,
262+
'id_plugin' => $this->id_plugin,
263+
'id_record' => $this->id_record,
264+
'key' => $this->key,
265+
];
266+
267+
if (!self::checkDeletePermissions($data)) {
268+
return false;
269+
}
270+
254271
$adapter_config = FileAdapter::find($this->id_adapter);
255272
$class = $adapter_config->class;
256273

@@ -442,6 +459,112 @@ protected function deleteThumbnails($filesystem)
442459
}
443460
}
444461

462+
/**
463+
* Verifica i permessi per il caricamento degli allegati.
464+
*
465+
* @param array $data Dati del file da caricare
466+
* @return bool True se l'utente ha i permessi, false altrimenti
467+
*/
468+
protected static function checkUploadPermissions($data)
469+
{
470+
// Se non ci sono dati del modulo, permetti il caricamento (per compatibilità)
471+
if (empty($data['id_module']) && empty($data['id_plugin'])) {
472+
return true;
473+
}
474+
475+
$id_module = $data['id_module'] ?? null;
476+
if (!empty($data['id_plugin'])) {
477+
$plugin = \Models\Plugin::find($data['id_plugin']);
478+
$id_module = $plugin ? $plugin->idmodule_to : null;
479+
}
480+
481+
if (!$id_module) {
482+
return true; // Se non riusciamo a determinare il modulo, permetti per compatibilità
483+
}
484+
485+
// Verifica permessi in base al tipo di accesso
486+
if (\Permissions::isTokenAccess()) {
487+
// Per accesso tramite token, verifica i permessi del token
488+
$token_info = $_SESSION['token_access'];
489+
$token_permission = $token_info['permessi'] ?? 'r';
490+
491+
// Caricamento allegati: permessi 'ra', 'rwa' o 'rw'
492+
$has_permission = in_array($token_permission, ['ra', 'rwa', 'rw']);
493+
494+
if (!$has_permission) {
495+
flash()->error(tr('Non hai permessi di caricamento per il modulo _MODULE_', [
496+
'_MODULE_' => '"'.\Models\Module::find($id_module)->getTranslation('title').'"',
497+
]));
498+
}
499+
500+
return $has_permission;
501+
} else {
502+
// Per accesso normale, usa i permessi standard del modulo
503+
$has_permission = (\Modules::getPermission($id_module) == 'rw');
504+
505+
if (!$has_permission) {
506+
flash()->error(tr('Non hai permessi di scrittura per il modulo _MODULE_', [
507+
'_MODULE_' => '"'.\Models\Module::find($id_module)->getTranslation('title').'"',
508+
]));
509+
}
510+
511+
return $has_permission;
512+
}
513+
}
514+
515+
/**
516+
* Verifica i permessi per l'eliminazione degli allegati.
517+
*
518+
* @param array $data Dati del file da eliminare
519+
* @return bool True se l'utente ha i permessi, false altrimenti
520+
*/
521+
protected static function checkDeletePermissions($data)
522+
{
523+
// Se non ci sono dati del modulo, permetti l'eliminazione (per compatibilità)
524+
if (empty($data['id_module']) && empty($data['id_plugin'])) {
525+
return true;
526+
}
527+
528+
$id_module = $data['id_module'] ?? null;
529+
if (!empty($data['id_plugin'])) {
530+
$plugin = \Models\Plugin::find($data['id_plugin']);
531+
$id_module = $plugin ? $plugin->idmodule_to : null;
532+
}
533+
534+
if (!$id_module) {
535+
return true; // Se non riusciamo a determinare il modulo, permetti per compatibilità
536+
}
537+
538+
// Verifica permessi in base al tipo di accesso
539+
if (\Permissions::isTokenAccess()) {
540+
// Per accesso tramite token, verifica i permessi del token
541+
$token_info = $_SESSION['token_access'];
542+
$token_permission = $token_info['permessi'] ?? 'r';
543+
544+
// Rimozione allegati: solo permessi 'rwa' o 'rw'
545+
$has_permission = in_array($token_permission, ['rwa', 'rw']);
546+
547+
if (!$has_permission) {
548+
flash()->error(tr('Non hai permessi di eliminazione per il modulo _MODULE_', [
549+
'_MODULE_' => '"'.\Models\Module::find($id_module)->getTranslation('title').'"',
550+
]));
551+
}
552+
553+
return $has_permission;
554+
} else {
555+
// Per accesso normale, usa i permessi standard del modulo
556+
$has_permission = (\Modules::getPermission($id_module) == 'rw');
557+
558+
if (!$has_permission) {
559+
flash()->error(tr('Non hai permessi di scrittura per il modulo _MODULE_', [
560+
'_MODULE_' => '"'.\Models\Module::find($id_module)->getTranslation('title').'"',
561+
]));
562+
}
563+
564+
return $has_permission;
565+
}
566+
}
567+
445568
/**
446569
* Genera le thumbnails per le immagini.
447570
*/

0 commit comments

Comments
 (0)