Mostrare agli Amministratori solo i gruppi che gli sono stati assegnati

Moduli esterni, funzionalità sviluppate dagli utenti, patch, fix...
Post Reply
barlasd
Newbie
Posts: 10
Joined: Wed Jan 24, 2018 8:53 am

Mostrare agli Amministratori solo i gruppi che gli sono stati assegnati

Post by barlasd » Thu Feb 01, 2018 1:52 pm

Dopo aver creato un profilo amministratore e averlo assegnato ad un Utente amministratore mi sono accorto che nonostante l'assegnazione di Gruppi di utenti specifici, l'admin ha comunque accesso a tutti i gruppi disponibili dalla Gestione gruppi.
E' molto grave perché, se gli vengono abilitati i permessi, l'admin in questione può rimuovere o modificare gruppi e aggiungere utenti a gruppi non a lui assegnati.

La stessa situazione si propone anche durante la sottoscrizione di un Gruppo di utenti ad un corso . In questo caso nonostante appaiano tutti i gruppi disponibili (anche quelli non assegnati all'amministratore) la sottoscrizione del gruppo scelto (all'infuori di quelli assegnati) non va a buon fine e appare un messaggio di errore che riporta "Selezione vuota".

Studiando un po' il codice (per capire quale funzione si occupasse di mostrare i gruppi) sono riuscito a trovare una soluzione per evitare che amministratori "non autorizzati" possano visualizzare e agire su gruppi non a loro assegnati.

Il file da modificare è il seguente appCore/models/GroupmanagementAdm.php

E' necessario sostituire le righe che vanno dalla 63 alla 65 con la seguente porzione di codice:

Code: Select all

$idstLogged = Docebo::user()->getIdSt();
		$user_level = Docebo::user()->getUserLevelId();
		
		if ($user_level == ADMIN_GROUP_ADMIN){
			$query = "SELECT g.idst, g.groupid, g.description, COUNT(*) as usercount "
				." FROM %adm_group as g LEFT JOIN (%adm_group_members AS gm ) ON (gm.idst = g.idst) "
				." LEFT JOIN %adm_admin_tree AS tree ON (g.idst=tree.idst) "
				." WHERE tree.idstAdmin='".$idstLogged."' AND g.hidden = 'false' ".($learning_filter === 'none' ? "AND g.type <> 'course' " : '');
		}
		else{
			$query = "SELECT g.idst, g.groupid, g.description, COUNT(*) as usercount "
				." FROM %adm_group as g LEFT JOIN (%adm_group_members AS gm ) ON (gm.idst = g.idst) "
				." WHERE g.hidden = 'false' ".($learning_filter === 'none' ? "AND g.type <> 'course' " : '');
		}

alfa24
FormaLms User
Posts: 56
Joined: Fri Nov 24, 2017 8:45 am
Version: forma.lms 1.4.2

Re: Mostrare agli Amministratori solo i gruppi che gli sono stati assegnati

Post by alfa24 » Thu Feb 01, 2018 4:32 pm

$user_level e $idstLogged le devi definire però... In teoria sarebbe più pulito utilizzare lib.preference.php:

Code: Select all

$query = "SELECT g.idst, g.groupid, g.description, COUNT(*) as usercount "
			." FROM %adm_group as g LEFT JOIN (%adm_group_members AS gm ) ON (gm.idst = g.idst) "
			." WHERE g.hidden = 'false' ".($learning_filter === 'none' ? "AND g.type <> 'course' " : '');
			
$ulevel = Docebo::user()->getUserLevelId();
if ($ulevel != ADMIN_GROUP_GODADMIN) {
				require_once(_base_.'/lib/lib.preference.php');
				$adminManager = new AdminPreference();
				$admin_tree = $adminManager->getAdminTree(Docebo::user()->getIdST());
				$query .= " AND g.idst IN (".implode(",", $admin_tree).") ";
			}
Dimmi se funziona;)

barlasd
Newbie
Posts: 10
Joined: Wed Jan 24, 2018 8:53 am

Re: Mostrare agli Amministratori solo i gruppi che gli sono stati assegnati

Post by barlasd » Thu Feb 01, 2018 4:53 pm

alfa24 wrote:$user_level e $idstLogged le devi definire però... In teoria sarebbe più pulito utilizzare lib.preference.php:

Code: Select all

$query = "SELECT g.idst, g.groupid, g.description, COUNT(*) as usercount "
			." FROM %adm_group as g LEFT JOIN (%adm_group_members AS gm ) ON (gm.idst = g.idst) "
			." WHERE g.hidden = 'false' ".($learning_filter === 'none' ? "AND g.type <> 'course' " : '');
			
$ulevel = Docebo::user()->getUserLevelId();
if ($ulevel != ADMIN_GROUP_GODADMIN) {
				require_once(_base_.'/lib/lib.preference.php');
				$adminManager = new AdminPreference();
				$admin_tree = $adminManager->getAdminTree(Docebo::user()->getIdST());
				$query .= " AND g.idst IN (".implode(",", $admin_tree).") ";
			}
Dimmi se funziona;)
Non sapevo ci fosse già una funzione dedicata al recupero dei gruppi associati agli admin, ma ci sto giocando solo da qualche giorno e non ho avuto tempo di approfondire proprio tutto :)
E' sicuramente più pulito da vedere il tuo codice, però teoricamente dovrebbe essere meno performante in quanto in quel modo sei costretto ad eseguire due query quando con una LEFT JOIN puoi fare tutto in un'unica query.

alfa24
FormaLms User
Posts: 56
Joined: Fri Nov 24, 2017 8:45 am
Version: forma.lms 1.4.2

Re: Mostrare agli Amministratori solo i gruppi che gli sono stati assegnati

Post by alfa24 » Sat Feb 03, 2018 10:45 am

in generale una left non è più performante, ma se tenti una explain delle due query, ti renderai conto che in questo caso (come in molti altri su forma) una left è criticamente più lenta

Post Reply