ZOD

Bug e problemi con i gruppi e i permessi sui file

Recommended Posts

ZOD    2

Ho un problema da risolvere, sto lavorando in Contao 3.5.28.

Obiettivo: un gruppo di utenti deve avere questa facoltà con i file:

  1. "z01" = cartella del proprio sito, in cui caricano, scaricano, modificano, eliminano, spostano, file e cartelle.
  2. "repository" = cartella condivisa con altri gruppi utente (l'installazione è pure multidominio). Sono file in sola lettura, possono usarli ma NON modificarli, NON cancellarli, NON spostarli. In pratica li possono solo usare come risorse nel fare contenuti, gallerie foto prodotti ecc...

Soluzione pensata: l'utente "gestore sito z01" fa parte di 2 gruppi e usa esclusivamente i permessi di questi.

  • Il gruppo "Gestione z01" ha pieno accesso alla cartella "z01".
  • Il gruppo "Repository" non ha alcun permesso se non l'accesso in lettura alla cartella "repository", togliendo quindi tutti i flag per la modifica.

Risulato: l'utente accede ma nel file manager ha pieno controllo di tutti i file compreso quelli in "repository". Questo è un bug, non dovrebbero essere ereditati i permessi dal gruppo "Gestione z01".

Test 1: ho dato all'utente apparteneneza a solo "Repository", i file e certelle sono non editabili come inteso.

Test 2: ho aggiunto ora anche il gruppo "Gestione z01" togliendo però la cartella del punto di partenza "z01". E' tornato l'effetto iniziale sulla cartella "repository", tutto è editabile.

Test 3: ho alterato il gruppo "Gestione z01" togliendo i flag dei permessi sui file. Ora "repository" funziona come inteso, ma non posso allora aggiungere una cartella che possa dare pieno accesso ai file, all'utente serve anche questa.

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti
PaoloB    0

I permessi si sommano, per cui quello che sta succedendo è corretto.

Non vedo una soluzione immediata, provo a ragionarci un attimo.

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti
ZOD    2

Ho trovato un post dell'anno scorso che spiega esattamente la mia stessa situazione.

https://github.com/contao/core/issues/8357

Leo ha flaggato come "feature" ma non vedo altre evoluzioni. Mi sembra molto strano che a nessuno interessi. Ho anche aggiunto un commento per sollecitare perché secondo me aggiungere va bene, ma in questo caso è un bug. Il comportamento corretto sarebbe aggiungere i permessi dei due gruppi ma per le cartelle che definiscono in modo separato. Non ha senso che i permessi definiti in un gruppo per un set di cartelle, vengano ereditati anche in un altro gruppo in cui è definito che non ci siano permessi su altre cartelle.

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti
PaoloB    0

Non lo ritengo un bug.
nel 99% dei casi mi serve che i permessi si vadano ad aggiungere.

Ho un'installazione nella quale ho creato innumerevoli gruppi a seconda delle sezioni del sito. Quando un utente ha bisogno di una funzione aggiuntiva lo associo al gruppo corrispondente e i permessi si sommano.

La tua è senza dubbio un'esigenza reale, ma non molto frequente.
Vediamo se viene colta la segnalazione.

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti
ZOD    2

Boh, secondo me se in Gruppo A definisco che la cartella X ha permessi in scrittura, e in Gruppo B definisco che in cartella Y ha solo lettura.
Se aggiungo entrambi i gruppi a un utente, dovrebbero attivarsi entrambe le direttive senza mescolarsi.
Per quale motivo dovrei trovare i permessi della cartella X anche nella cartella Y, secondo me è un errore. Avviene perché i flag dei permessi sui file non sono legati al "filemount" come lo chiama il tizo di Github. Io sono d'accordo con lui, dovrebbero essere legate le due cose.

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti
Andrea B.    1

Hai provato a "giocare" con i permessi a livello di Utente, oltre a quelli a livello di Gruppo?
Intendo dire a dare i permessi più comuni al gruppo, e quelli più particolari utente per utente, per quanto più macchinoso

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti
ZOD    2

 

8 minuti fa, Andrea B. dice:

Hai provato a "giocare" con i permessi a livello di Utente, oltre a quelli a livello di Gruppo?

Da lo stesso effetto, i permessi appena sono accessibili a un utente, si diffondono a tuttii gruppi e quindi cartelle a cui ha accesso.
Credo sia inutilmente macchinoso l'accesso per singolo utente, inoltre non credo possa andarmi bene, perché il sito multidominio deve ottimizzare alcuni processi, e devo per forza ricorrere ai gruppi, senza creare confusione con gli utenti, dato che saranno presumibilmente decine e centinaia. L'idea di un gruppo con cartella in sola lettura da assegnare o meno agli utenti è perfetta come soluzione. Anche perché ho un gruppo di super manager che invece in quella cartella possono caricare, editare ecc...

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti
ZOD    2

Sto cercando una soluzione via modulo custom, solo che non so come fare, come al solito mi impantano nella "odiosa difficoltà di sviluppare Contao".

Sto cercando di:
- Sapere quale funzione usa Contao per costruire la DCA del File Manager, quindi le icone, quindi mostrarle in base agli User Group.
- Sapere quali callback sono usabili per riconfigurare le icone del File manager, quindi aggiungere un controllo per farle Attivate o Disattivate in base a qualcosa che dica "Se gruppo utente ha cartella settata allora applica permessi file Gruppo utente".

 

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti
ZOD    2

Ho trovato il punto dove si fanno i controlli, è nel file system\modules\core\dca\tl_files.php

checkPermission() è a riga 245.

Bisognerebbe fare in modo che il pezzetto con le variabili $canUpload, $canEdit, $canDelete ecc... fosse limitato alle folder elencate in  $this->User->filemounts;

Come si può fare un override di questa parte senza toccare il core?

 

	/**
	 * Check permissions to edit the file system
	 */
	public function checkPermission()
	{
		if ($this->User->isAdmin)
		{
			return;
		}

		// Permissions
		if (!is_array($this->User->fop))
		{
			$this->User->fop = array();
		}

		$canUpload = $this->User->hasAccess('f1', 'fop');
		$canEdit = $this->User->hasAccess('f2', 'fop');
		$canDeleteOne = $this->User->hasAccess('f3', 'fop');
		$canDeleteRecursive = $this->User->hasAccess('f4', 'fop');

		// Set the filemounts
		$GLOBALS['TL_DCA']['tl_files']['list']['sorting']['root'] = $this->User->filemounts;

		// Disable the upload button if uploads are not allowed
		if (!$canUpload)
		{
			$GLOBALS['TL_DCA']['tl_files']['config']['closed'] = true;
		}

		// Disable the edit_all button
		if (!$canEdit)
		{
			$GLOBALS['TL_DCA']['tl_files']['config']['notEditable'] = true;
		}

		// Disable the delete_all button
		if (!$canDeleteOne && !$canDeleteRecursive)
		{
			$GLOBALS['TL_DCA']['tl_files']['config']['notDeletable'] = true;
		}

		$session = $this->Session->getData();

		// Set allowed page IDs (edit multiple)
		if (is_array($session['CURRENT']['IDS']))
		{
			if (Input::get('act') == 'editAll')
			{
				if (!$canEdit)
				{
					$session['CURRENT']['IDS'] = array();
				}
			}

			// Check delete permissions
			else
			{
				$folders = array();
				$delete_all = array();

				foreach ($session['CURRENT']['IDS'] as $id)
				{
					if (is_dir(TL_ROOT . '/' . $id))
					{
						$folders[] = $id;

						if ($canDeleteRecursive || ($canDeleteOne && count(scan(TL_ROOT . '/' . $id)) < 1))
						{
							$delete_all[] = $id;
						}
					}
					else
					{
						if (($canDeleteOne || $canDeleteRecursive) && !in_array(dirname($id), $folders))
						{
							$delete_all[] = $id;
						}
					}
				}

				$session['CURRENT']['IDS'] = $delete_all;
			}
		}

		// Set allowed clipboard IDs
		if (isset($session['CLIPBOARD']['tl_files']) && !$canEdit)
		{
			$session['CLIPBOARD']['tl_files'] = array();
		}

		// Overwrite session
		$this->Session->setData($session);

		// Check current action
		if (Input::get('act') && Input::get('act') != 'paste')
		{
			switch (Input::get('act'))
			{
				case 'move':
					if (!$canUpload)
					{
						$this->log('No permission to upload files', __METHOD__, TL_ERROR);
						$this->redirect('contao/main.php?act=error');
					}
					break;

				case 'edit':
				case 'create':
				case 'copy':
				case 'copyAll':
				case 'cut':
				case 'cutAll':
					if (!$canEdit)
					{
						$this->log('No permission to create, edit, copy or move files', __METHOD__, TL_ERROR);
						$this->redirect('contao/main.php?act=error');
					}
					break;

				case 'delete':
					$strFile = Input::get('id', true);
					if (is_dir(TL_ROOT . '/' . $strFile))
					{
						$files = scan(TL_ROOT . '/' . $strFile);
						if (!empty($files) && !$canDeleteRecursive)
						{
							$this->log('No permission to delete folder "'.$strFile.'" recursively', __METHOD__, TL_ERROR);
							$this->redirect('contao/main.php?act=error');
						}
						elseif (!$canDeleteOne)
						{
							$this->log('No permission to delete folder "'.$strFile.'"', __METHOD__, TL_ERROR);
							$this->redirect('contao/main.php?act=error');
						}
					}
					elseif (!$canDeleteOne)
					{
						$this->log('No permission to delete file "'.$strFile.'"', __METHOD__, TL_ERROR);
						$this->redirect('contao/main.php?act=error');
					}
					break;

				default:
					if (empty($this->User->fop))
					{
						$this->log('No permission to manipulate files', __METHOD__, TL_ERROR);
						$this->redirect('contao/main.php?act=error');
					}
					break;
			}
		}
	}

 

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti
PaoloB    0
Il 21/7/2017 at 12:03, ZOD dice:

Bisognerebbe fare in modo che il pezzetto con le variabili $canUpload, $canEdit, $canDelete ecc... fosse limitato alle folder elencate in  $this->User->filemounts;

Come si può fare un override di questa parte senza toccare il core?

Per questa parte non mi risulta esserci nessun hook da poter invocare.
Se hai trovato il punto, io modificherei il core brutalmente in modo da avere la funzione desiderata. Poi se in futuro dovessi aggiornare il sito, tieni documentata la modifica per poi riapplicarla.
 

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti
ZOD    2

Ciao Paolo, avevo provato a fare un modulo che creasse un override della classe, e dell'intero metodo, seguendo le istruzioni riportate qui:
https://docs.contao.org/books/manual/3.2/en/07-customizing-contao/overriding-class-methods.html

Ho anche cercato di scopiazzare come fa un altro modulo (ImageCrop, modulo che ho contribuito a migliorare aggiungendo il supporto file a PNG e GIF e la traduzione IT).
Quindi ho anche messo il file config, provato con l'autoload, ho messo la classe in "/dca/tl_files.php" invece che nel php iniziale del modulo... niente da fare, è come se il mio modulo fosse ignorato da Contao. O forse non sto facendo bene i file, ma è davvero difficile sapere come fare non avendo documentazione esatta e demo funzionanti.

Per ora ho perso troppo tempo in questo, e ho parcheggiato la questione, ma sono giunto a una considerazione: l'accesso alle cartelle di file è sbagliato come fa Contao, cioè nella gestione permessi utente. Questa dovrebbe essere implementata nel file manager, cioè controllabile per file e cartelle, come avviene nella maggioranza dei sistemi operativi, e già è così per la struttura del sito di Contao. Un gruppo utenti potrebbe avere più di una cartella a cui accedere e ognuna con permessi differenti in lettura, modifica, elimina, copia, sposta (infatti i file dovrebbero essere read only, ma copiabili altrove per utilizzi e modifiche personali). Non ho trovato un modulo che migliori il file manager aggiungendo la parte di ACL. Qualcuno sa qualcosa a riguardo?

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti
PaoloB    0
2 ore fa, ZOD dice:

O forse non sto facendo bene i file, ma è davvero difficile sapere come fare non avendo documentazione esatta e demo funzionanti.

Hai ricreato la cache o indicato di bypassarla?!

2 ore fa, ZOD dice:

Un gruppo utenti potrebbe avere più di una cartella a cui accedere e ognuna con permessi differenti

La gestione file come è impostata ora non è sbagliata. Come detto sopra, la tua esigenza è lecita, ma in tanti anni che utilizziamo Contao è la prima volta che esce tale richiesta.
Sollecito anche io una revisione della gestione file.

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti
ZOD    2

Nemmeno a me è mai servito fare questo, finché i siti sono "normali" non esce come esigenza. Questa volta però i file devono essere utilizzati in modo restrittivo e particolare in base ai gruppi che ci lavorano, il caso specifico riguarda un repository condiviso in sola lettura, da cui prelevare eventualmente file. Spostare l'accesso sul pannello della folder o del file, credo sia la cosa più sensata, e aprirebbe a molti altri usi il CMS, tipo per condividere file tra gruppi di utenti. Nel repository c'è un modulo che si chiama "file-access" ma riguarda i Members e non fa proprio quel che dico io.

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti
ZOD    2

Aggiornamento: forse avevi ragione, ho abilitato bypass della cache.

Il file viene preso (ho rotto un po' il codice e sono usciti gli errori), solo che non so bene come agire per controllare le icone, sto scervellandomi su come potrei modificare il codice sopra riportato. Cmq forse è la strada giusta.

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Crea un account o accedi per lasciare un commento

You need to be a member in order to leave a comment

Crea un account

Iscriviti per un nuovo account nella nostra comunità. È facile!

Registra un nuovo account

Accedi

Sei già registrato? Accedi qui.

Accedi Ora