UtentiChange.java

/*
 * GovWay - A customizable API Gateway 
 * https://govway.org
 * 
 * Copyright (c) 2005-2024 Link.it srl (https://link.it). 
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 3, as published by
 * the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */


package org.openspcoop2.web.ctrlstat.servlet.utenti;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.openspcoop2.core.commons.Liste;
import org.openspcoop2.utils.crypt.PasswordVerifier;
import org.openspcoop2.web.ctrlstat.core.ControlStationCore;
import org.openspcoop2.web.ctrlstat.core.ConsoleSearch;
import org.openspcoop2.web.ctrlstat.costanti.CostantiControlStation;
import org.openspcoop2.web.ctrlstat.servlet.GeneralHelper;
import org.openspcoop2.web.ctrlstat.servlet.OggettoDialogEnum;
import org.openspcoop2.web.ctrlstat.servlet.connettori.ConnettoriCostanti;
import org.openspcoop2.web.ctrlstat.servlet.login.LoginSessionUtilities;
import org.openspcoop2.web.ctrlstat.servlet.soggetti.SoggettiCore;
import org.openspcoop2.web.lib.mvc.Costanti;
import org.openspcoop2.web.lib.mvc.DataElement;
import org.openspcoop2.web.lib.mvc.ForwardParams;
import org.openspcoop2.web.lib.mvc.GeneralData;
import org.openspcoop2.web.lib.mvc.MessageType;
import org.openspcoop2.web.lib.mvc.PageData;
import org.openspcoop2.web.lib.mvc.Parameter;
import org.openspcoop2.web.lib.mvc.ServletUtils;
import org.openspcoop2.web.lib.mvc.TipoOperazione;
import org.openspcoop2.web.lib.users.dao.InterfaceType;
import org.openspcoop2.web.lib.users.dao.Permessi;
import org.openspcoop2.web.lib.users.dao.PermessiUtente;
import org.openspcoop2.web.lib.users.dao.Stato;
import org.openspcoop2.web.lib.users.dao.User;
import org.openspcoop2.web.lib.users.dao.UserObjects;

/**
 * suChange
 * 
 * @author Andrea Poli (apoli@link.it)
 * @author Stefano Corallo (corallo@link.it)
 * @author Sandra Giangrandi (sandra@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 * 
 */
public final class UtentiChange extends Action {

	@Override
	public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {

		HttpSession session = request.getSession(true);

		// Inizializzo PageData
		PageData pd = new PageData();

		GeneralHelper generalHelper = new GeneralHelper(session);

		// Inizializzo GeneralData
		GeneralData gd = generalHelper.initGeneralData(request);

		String userLogin = ServletUtils.getUserLoginFromSession(session);

		try {
			UtentiHelper utentiHelper = new UtentiHelper(request, pd, session);

			UtentiCore utentiCore = new UtentiCore();
			SoggettiCore soggettiCore = new SoggettiCore(utentiCore);
			
			String nomesu = utentiHelper.getParameter(UtentiCostanti.PARAMETRO_UTENTI_USERNAME);
			String pwsu = utentiHelper.getParameter(UtentiCostanti.PARAMETRO_UTENTI_PW);
			String confpwsu = null; 
			String tipoGui = utentiHelper.getParameter(UtentiCostanti.PARAMETRO_UTENTI_TIPO_GUI);

			String isServizi = utentiHelper.getParameter(UtentiCostanti.PARAMETRO_UTENTI_IS_SERVIZI);
			String isDiagnostica = utentiHelper.getParameter(UtentiCostanti.PARAMETRO_UTENTI_IS_DIAGNOSTICA);
			String isReportistica = utentiHelper.getParameter(UtentiCostanti.PARAMETRO_UTENTI_IS_REPORTISTICA);
			String isSistema = utentiHelper.getParameter(UtentiCostanti.PARAMETRO_UTENTI_IS_SISTEMA);
			String isMessaggi = utentiHelper.getParameter(UtentiCostanti.PARAMETRO_UTENTI_IS_MESSAGGI);
			String isUtenti = utentiHelper.getParameter(UtentiCostanti.PARAMETRO_UTENTI_IS_UTENTI);
			String isAuditing = utentiHelper.getParameter(UtentiCostanti.PARAMETRO_UTENTI_IS_AUDITING);
			String isAccordiCooperazione = utentiHelper.getParameter(UtentiCostanti.PARAMETRO_UTENTI_IS_ACCORDI_COOPERAZIONE);

			String singleSuServizi = utentiHelper.getParameter(UtentiCostanti.PARAMETRO_UTENTI_SINGLE_SU_SERVIZI);
			String singleSuAccordiCooperazione = utentiHelper.getParameter(UtentiCostanti.PARAMETRO_UTENTI_SINGLE_SU_ACCORDI_COOPERAZIONE);
			String changepwd = utentiHelper.getParameter(UtentiCostanti.PARAMETRO_UTENTI_CHANGE_PW);

			String isSoggettiAll = utentiHelper.getParameter(UtentiCostanti.PARAMETRO_UTENTI_ABILITAZIONI_SOGGETTI_ALL);
			String isServiziAll = utentiHelper.getParameter(UtentiCostanti.PARAMETRO_UTENTI_ABILITAZIONI_SERVIZI_ALL);
			
			String tipoModalitaConsoleGestione = utentiHelper.getParameter(UtentiCostanti.PARAMETRO_UTENTE_TIPO_MODALITA);
			String idSoggettoConsoleGestione = utentiHelper.getParameter(UtentiCostanti.PARAMETRO_UTENTE_ID_SOGGETTO);
			
			String tipoModalitaConsoleMonitoraggio = utentiHelper.getParameter(UtentiCostanti.PARAMETRO_UTENTE_TIPO_MODALITA_MONITOR);
			String idSoggettoConsoleMonitoraggio = utentiHelper.getParameter(UtentiCostanti.PARAMETRO_UTENTE_ID_SOGGETTO_MONITOR);
			
			String homePageMonitoraggio = utentiHelper.getParameter(UtentiCostanti.PARAMETRO_UTENTI_HOME_PAGE_MONITORAGGIO);
			String intervalloTemporaleHomePageConsoleMonitoraggio = utentiHelper.getParameter(UtentiCostanti.PARAMETRO_UTENTI_INTERVALLO_TEMPORALE_HOME_PAGE_MONITORAGGIO);
			
			String scadenza = utentiHelper.getParameter(UtentiCostanti.PARAMETRO_UTENTI_SCADENZA);
			
			Boolean singlePdD = ServletUtils.getBooleanAttributeFromSession(CostantiControlStation.SESSION_PARAMETRO_SINGLE_PDD, session, request).getValue();
			
			List<String> protocolliRegistratiConsole = utentiCore.getProtocolli();
			
			String [] modalitaScelte = new String[protocolliRegistratiConsole.size()]; 
			for (int i = 0; i < protocolliRegistratiConsole.size() ; i++) {
				String protocolloName = protocolliRegistratiConsole.get(i);
				modalitaScelte[i] = utentiHelper.getParameter(UtentiCostanti.PARAMETRO_UTENTI_MODALITA_PREFIX + protocolloName);
			}
			
			// Prendo l'utente
			User user = utentiCore.getUser(nomesu);
			Date dataUltimoAggiornamentoPassword = user.getLastUpdatePassword();
			boolean oldScadenza = user.isCheckLastUpdatePassword();
			//Prendo i vecchi dati dell'utente
			
			// Check multitenant
						
			List<String> oldProtocolliSupportati = user.getProtocolliSupportati();
			boolean oldHasOnlyPermessiUtenti = user.hasOnlyPermessiUtenti();
			List<String> protocolliSupportati = null;
			boolean first = false;
			if(tipoGui == null) {
				tipoGui = user.getInterfaceType().toString();
				
				if(!oldHasOnlyPermessiUtenti) {
					oldProtocolliSupportati = user.getProtocolliSupportati();
					// dal db ho letto un utente che non ha associato nessun protocollo, glieli associo tutti di default
					if(oldProtocolliSupportati == null) {
						oldProtocolliSupportati = new ArrayList<>();
						for (int i = 0; i < protocolliRegistratiConsole.size() ; i++) {
							String protocolloName = protocolliRegistratiConsole.get(i);
							oldProtocolliSupportati.add(protocolloName);
							modalitaScelte[i] = Costanti.CHECK_BOX_ENABLED;
						}
					}
				} else {
					// utente configurato solo per gestire gli utenti
					oldProtocolliSupportati = new ArrayList<>();
				}
				protocolliSupportati  = oldProtocolliSupportati;
				first = true;
				
				if(tipoModalitaConsoleGestione == null) {
					tipoModalitaConsoleGestione =  user.getProtocolloSelezionatoPddConsole();
				}
				
				// nessun profilo selezionato imposto all
				if(tipoModalitaConsoleGestione == null) {
					tipoModalitaConsoleGestione = UtentiCostanti.VALORE_PARAMETRO_MODALITA_ALL;
				}
				
				
				if(idSoggettoConsoleGestione == null) {
					idSoggettoConsoleGestione = user.getSoggettoSelezionatoPddConsole();
				}
				
				// nessun soggetto selezionato imposto all
				if(idSoggettoConsoleGestione == null) {
					idSoggettoConsoleGestione = UtentiCostanti.VALORE_PARAMETRO_MODALITA_ALL;
				}
				
				if(tipoModalitaConsoleMonitoraggio == null) {
					tipoModalitaConsoleMonitoraggio =  user.getProtocolloSelezionatoPddMonitor();
				}
				
				// nessun profilo selezionato imposto all
				if(tipoModalitaConsoleMonitoraggio == null) {
					tipoModalitaConsoleMonitoraggio = UtentiCostanti.VALORE_PARAMETRO_MODALITA_ALL;
				}
				
				
				if(idSoggettoConsoleMonitoraggio == null) {
					idSoggettoConsoleMonitoraggio = user.getSoggettoSelezionatoPddMonitor();
				}
				
				// nessun soggetto selezionato imposto all
				if(idSoggettoConsoleMonitoraggio == null) {
					idSoggettoConsoleMonitoraggio = UtentiCostanti.VALORE_PARAMETRO_MODALITA_ALL;
				}
				
				List<Stato> stati = user.getStati();
				
				if(homePageMonitoraggio == null) {
					for (Stato stato : stati) {
						if(stato.getOggetto().equals(UtentiCostanti.OGGETTO_STATO_UTENTE_HOME_PAGE)) {
							homePageMonitoraggio = utentiHelper.extractValoreStato(stato.getStato());
							break;
						}
					}
				}
				
				// nessuna home page selezionata imposto transazioni
				if(homePageMonitoraggio == null) {
					homePageMonitoraggio = UtentiCostanti.VALUE_PARAMETRO_UTENTI_HOME_PAGE_MONITORAGGIO_TRANSAZIONI;
				}
				
				if(intervalloTemporaleHomePageConsoleMonitoraggio == null) {
					for (Stato stato : stati) {
						if(stato.getOggetto().equals(UtentiCostanti.OGGETTO_STATO_UTENTE_INTERVALLO_TEMPORALE_HOME_PAGE)) {
							intervalloTemporaleHomePageConsoleMonitoraggio = utentiHelper.extractValoreStato(stato.getStato());
							break;
						}
					}
				}
				
				// nessuna home page selezionata imposto transazioni
				if(intervalloTemporaleHomePageConsoleMonitoraggio == null) {
					intervalloTemporaleHomePageConsoleMonitoraggio = UtentiCostanti.VALUE_PARAMETRO_UTENTI_INTERVALLO_TEMPORALE_HOME_PAGE_MONITORAGGIO_ULTIMI_7_GIORNI;
				}
			}
			
			InterfaceType interfaceType = InterfaceType.convert(tipoGui, true);
			
			String postBackElementName = utentiHelper.getPostBackElementName();
			
			if (postBackElementName != null) {
				
				// selezione modalita'
				if(postBackElementName.startsWith(UtentiCostanti.PARAMETRO_UTENTI_MODALITA_PREFIX)) {
					tipoModalitaConsoleGestione = UtentiCostanti.VALORE_PARAMETRO_MODALITA_ALL;
					idSoggettoConsoleGestione = UtentiCostanti.VALORE_PARAMETRO_MODALITA_ALL;
					tipoModalitaConsoleMonitoraggio = UtentiCostanti.VALORE_PARAMETRO_MODALITA_ALL;
					idSoggettoConsoleMonitoraggio = UtentiCostanti.VALORE_PARAMETRO_MODALITA_ALL;
				}
				
				// cambio del profilo, reset del valore del soggetto
				if(postBackElementName.equals(UtentiCostanti.PARAMETRO_UTENTE_TIPO_MODALITA)) {
					idSoggettoConsoleGestione = UtentiCostanti.VALORE_PARAMETRO_MODALITA_ALL;
				}
				
				// cambio del profilo, reset del valore del soggetto
				if(postBackElementName.equals(UtentiCostanti.PARAMETRO_UTENTE_TIPO_MODALITA_MONITOR)) {
					idSoggettoConsoleMonitoraggio = UtentiCostanti.VALORE_PARAMETRO_MODALITA_ALL;
				}
				
				// cambio della home page, reset del valore del grafico
				if(postBackElementName.equals(UtentiCostanti.PARAMETRO_UTENTI_HOME_PAGE_MONITORAGGIO)) {
					intervalloTemporaleHomePageConsoleMonitoraggio = UtentiCostanti.VALUE_PARAMETRO_UTENTI_INTERVALLO_TEMPORALE_HOME_PAGE_MONITORAGGIO_ULTIMI_7_GIORNI;
				}
			}
			
			// Preparo il menu
			utentiHelper.makeMenu();

			// Se nomehid = null, devo visualizzare la pagina per l'inserimento dati
			if(utentiHelper.isEditModeInProgress()){

				// setto la barra del titolo

				ServletUtils.setPageDataTitle(pd, 
						new Parameter(UtentiCostanti.LABEL_UTENTI ,UtentiCostanti.SERVLET_NAME_UTENTI_LIST),
						new Parameter(nomesu,null));


				PermessiUtente pu = user.getPermessi();

				isServizi = (isServizi==null) ? (pu.isServizi() ? Costanti.CHECK_BOX_ENABLED : Costanti.CHECK_BOX_DISABLED) : isServizi;
				isDiagnostica = (isDiagnostica==null) ? (pu.isDiagnostica() ? Costanti.CHECK_BOX_ENABLED : Costanti.CHECK_BOX_DISABLED) : isDiagnostica;
				isReportistica = (isReportistica==null) ? (pu.isReportistica() ? Costanti.CHECK_BOX_ENABLED : Costanti.CHECK_BOX_DISABLED) : isReportistica;
				isSistema = (isSistema==null) ? (pu.isSistema() ? Costanti.CHECK_BOX_ENABLED : Costanti.CHECK_BOX_DISABLED) : isSistema;
				isMessaggi = (isMessaggi==null) ? (pu.isCodeMessaggi() ? Costanti.CHECK_BOX_ENABLED : Costanti.CHECK_BOX_DISABLED) : isMessaggi;
				isUtenti = (isUtenti==null) ? (pu.isUtenti() ? Costanti.CHECK_BOX_ENABLED : Costanti.CHECK_BOX_DISABLED) : isUtenti;
				isAuditing = (isAuditing==null) ? (pu.isAuditing() ? Costanti.CHECK_BOX_ENABLED : Costanti.CHECK_BOX_DISABLED) : isAuditing;
				isAccordiCooperazione = (isAccordiCooperazione==null) ? (pu.isAccordiCooperazione() ? Costanti.CHECK_BOX_ENABLED : Costanti.CHECK_BOX_DISABLED) : isAccordiCooperazione;
				
				isSoggettiAll = (isSoggettiAll==null) ? (user.isPermitAllSoggetti() ? Costanti.CHECK_BOX_ENABLED : Costanti.CHECK_BOX_DISABLED) : isSoggettiAll;
				isServiziAll = (isServiziAll==null) ? (user.isPermitAllServizi() ? Costanti.CHECK_BOX_ENABLED : Costanti.CHECK_BOX_DISABLED) : isServiziAll;
								
				scadenza = (scadenza == null) ? (user.isCheckLastUpdatePassword() ? Costanti.CHECK_BOX_ENABLED : Costanti.CHECK_BOX_DISABLED) : scadenza;
				
				if(first) {
					for (int i = 0; i < protocolliRegistratiConsole.size() ; i++) {
						String protocolloName = protocolliRegistratiConsole.get(i);
						if(modalitaScelte[i] == null &&
							protocolliSupportati.contains(protocolloName)) {
							modalitaScelte[i] = Costanti.CHECK_BOX_ENABLED;
						} 
					}
				}


				// preparo i campi
				List<DataElement> dati = new ArrayList<>();

				dati.add(ServletUtils.getDataElementForEditModeFinished());

				utentiHelper.addUtentiToDati(dati, TipoOperazione.CHANGE, singlePdD,
						nomesu,pwsu,confpwsu,interfaceType,
						isServizi,isDiagnostica,isReportistica,isSistema,isMessaggi,isUtenti,isAuditing,isAccordiCooperazione,
						changepwd,modalitaScelte, isSoggettiAll, isServiziAll, user, scadenza, dataUltimoAggiornamentoPassword, oldScadenza, 
						tipoModalitaConsoleGestione, idSoggettoConsoleGestione, tipoModalitaConsoleMonitoraggio, idSoggettoConsoleMonitoraggio,
						homePageMonitoraggio, intervalloTemporaleHomePageConsoleMonitoraggio);

				pd.setDati(dati);

				if(first &&
					!user.isConfigurazioneValidaAbilitazioni()) {
					if(!user.isConfigurazioneValidaSoggettiAbilitati()) {
						pd.setMessage(UtentiCostanti.LABEL_ABILITAZIONI_PUNTUALI_SOGGETTI_DEFINIZIONE_UPDATE_NOTE,MessageType.INFO);
					}
					else if(!user.isConfigurazioneValidaServiziAbilitati()) {
						pd.setMessage(UtentiCostanti.LABEL_ABILITAZIONI_PUNTUALI_SERVIZI_DEFINIZIONE_UPDATE_NOTE,MessageType.INFO);
					}
				}
				
				ServletUtils.setGeneralAndPageDataIntoSession(request, session, gd, pd);

				return ServletUtils.getStrutsForwardEditModeInProgress(mapping, UtentiCostanti.OBJECT_NAME_UTENTI, ForwardParams.CHANGE());

			}

			// Controlli sui campi immessi
			boolean isOk = utentiHelper.utentiCheckData(TipoOperazione.CHANGE,singlePdD,oldProtocolliSupportati,oldHasOnlyPermessiUtenti);
			if (!isOk) {

				// setto la barra del titolo

				ServletUtils.setPageDataTitle(pd, 
						new Parameter(UtentiCostanti.LABEL_UTENTI, UtentiCostanti.SERVLET_NAME_UTENTI_LIST),
						new Parameter(nomesu,null));

				// preparo i campi
				List<DataElement> dati = new ArrayList<>();

				dati.add(ServletUtils.getDataElementForEditModeFinished());

				utentiHelper.addUtentiToDati(dati, TipoOperazione.CHANGE, singlePdD,
						nomesu,pwsu,confpwsu,interfaceType,
						isServizi,isDiagnostica,isReportistica,isSistema,isMessaggi,isUtenti,isAuditing,isAccordiCooperazione,
						changepwd,modalitaScelte, isSoggettiAll, isServiziAll, user, scadenza, dataUltimoAggiornamentoPassword, oldScadenza, 
						tipoModalitaConsoleGestione, idSoggettoConsoleGestione, tipoModalitaConsoleMonitoraggio, idSoggettoConsoleMonitoraggio,
						homePageMonitoraggio, intervalloTemporaleHomePageConsoleMonitoraggio);

				pd.setDati(dati);

				ServletUtils.setGeneralAndPageDataIntoSession(request, session, gd, pd);

				return ServletUtils.getStrutsForwardEditModeCheckError(mapping, UtentiCostanti.OBJECT_NAME_UTENTI, ForwardParams.CHANGE());
			}
			

			// Se singleSuServizi != null, controllo che il superutente non sia
			// quello che sto modificando
			// Se singleSu = null, controllo se l'utente aveva permessi S
			List<String> usersWithS = utentiCore.getUsersWithType(Permessi.SERVIZI.toString());

			String[] uws = null;
			if (usersWithS != null && !usersWithS.isEmpty()) {
				List<String> usersWithPermessoS = new ArrayList<>();
				Iterator<String> itUWS = usersWithS.iterator();
				while (itUWS.hasNext()) {
					String singleUWS = itUWS.next();
					if (!nomesu.equals(singleUWS)) {
						usersWithPermessoS.add(singleUWS);
					}
				}
				if(!usersWithPermessoS.isEmpty()){
					uws = new String[1];
					uws = usersWithPermessoS.toArray(uws);
				}
			}

			// Se singleSuAccordi = null, controllo se l'utente aveva permessi P
			List<String> usersWithP = utentiCore.getUsersWithType(Permessi.ACCORDI_COOPERAZIONE.toString());

			String[] uwp = null;
			if (usersWithP != null && !usersWithP.isEmpty()) {
				List<String> usersWithPermessoP = new ArrayList<>();
				Iterator<String> itUWS = usersWithP.iterator();
				while (itUWS.hasNext()) {
					String singleUWP = itUWS.next();
					if (!nomesu.equals(singleUWP)) {
						usersWithPermessoP.add(singleUWP);
					}
				}
				if(!usersWithPermessoP.isEmpty()){
					uwp = new String[1];
					uwp = usersWithPermessoP.toArray(uwp);
				}
			}

			// check input relativo ai servizi
			String msgServizi = "";
			boolean paginaSuServizi = false;

			if(!utentiCore.isVisioneOggettiGlobaleIndipendenteUtente()) {
				if (singleSuServizi != null) {
					if (nomesu.equals(singleSuServizi)) {
						paginaSuServizi = true;
						msgServizi = "Scegliere un utente con il permesso 'Servizi' che non sia quello che sto modificando<br>";
					}
				} else {
					if ((isServizi == null || !isServizi.equals("yes")) &&
							usersWithS.contains(nomesu)) {
						if(uws==null){
	
							List<DataElement> dati = new ArrayList<>();
	
							dati.add(ServletUtils.getDataElementForEditModeFinished());
	
							pd.disableEditMode();
	
							pd.setDati(dati);
	
							// Preparo il menu
							pd.setMessage("Non è possibile eliminare il permesso 'Servizi', poichè non esistono altri utenti con tale permesso");
	
							ServletUtils.setGeneralAndPageDataIntoSession(request, session, gd, pd);
	
							return ServletUtils.getStrutsForwardGeneralError(mapping, UtentiCostanti.OBJECT_NAME_UTENTI, ForwardParams.CHANGE());	
	
						}else{
							paginaSuServizi = true;
							msgServizi = "Scegliere un utente a cui verranno assegnati tutti gli oggetti appartenenti all'utente '"+nomesu+
									"'.<br>L'operazione si è resa necessaria in seguito all'eliminazione del permesso di gestione 'Servizi' (S).<br>";
						}
					}
				}
			}

			String msgAccordi = "";
			boolean paginaSuAccordi = false;
			boolean checkOggettiAccordi = false;
			if(!utentiCore.isVisioneOggettiGlobaleIndipendenteUtente()) {
				if (singleSuAccordiCooperazione != null) {
					if (nomesu.equals(singleSuAccordiCooperazione)) {
						paginaSuAccordi = true;
						msgAccordi = "Scegliere un utente con il permesso 'Accordi Cooperazione' che non sia quello che sto modificando<br>";
					}
				} else {
					if ((isAccordiCooperazione == null || !isAccordiCooperazione.equals("yes")) &&
							usersWithP.contains(nomesu)) {
						if(uwp==null){
							// controllare che l'utente possieda degli oggetti
							checkOggettiAccordi = true;
						}else{
							paginaSuAccordi = true;
							msgAccordi = (!msgServizi.contains("Scegliere un utente")
									? ("Scegliere un utente a cui verranno assegnati tutti gli oggetti appartenenti all'utente '"+nomesu+	"'.<br>") : "")
									+"L'operazione si è resa necessaria in seguito all'eliminazione del permesso di gestione 'Accordi Cooperazione' (P).<br>";
						}
					}
				}
			}


			boolean paginaSu = paginaSuAccordi || paginaSuServizi;
			// CHECK
			String msg = msgServizi + msgAccordi;

			// Se paginaSu = true, propongo una pagina in cui faccio scegliere
			// un superutente con permessi S e/o P a cui assegnare gli oggetti
			// dell'utente che sto modificando
			// In caso contrario, modifico l'utente, assegnando gli eventuali
			// oggetti a singleSu
			if (paginaSu) {
				// Faccio scegliere il superutente a cui assegnare gli oggetti

				// Preparo il menu
				utentiHelper.makeMenu();

				// setto la barra del titolo

				ServletUtils.setPageDataTitle(pd, 
						new Parameter(UtentiCostanti.LABEL_UTENTI, UtentiCostanti.SERVLET_NAME_UTENTI_LIST),
						new Parameter(nomesu,null));

				// preparo i campi
				List<DataElement> dati = new ArrayList<>();

				dati.add(ServletUtils.getDataElementForEditModeFinished());

				utentiHelper.addChangeUtenteInfoToDati(dati, nomesu, changepwd, pwsu, confpwsu, interfaceType, 
						isServizi, isDiagnostica, isReportistica, isSistema, isMessaggi, isUtenti, isAuditing,isAccordiCooperazione,paginaSuServizi, 
						uws, paginaSuAccordi, uwp,modalitaScelte, tipoModalitaConsoleGestione, idSoggettoConsoleGestione, tipoModalitaConsoleMonitoraggio, idSoggettoConsoleMonitoraggio,
						homePageMonitoraggio, intervalloTemporaleHomePageConsoleMonitoraggio);

				pd.setDati(dati);
				pd.setMessage(msg,Costanti.MESSAGE_TYPE_INFO);

				ServletUtils.setGeneralAndPageDataIntoSession(request, session, gd, pd);

				return ServletUtils.getStrutsForward(mapping, UtentiCostanti.OBJECT_NAME_UTENTI, ForwardParams.CHANGE(),UtentiCostanti.STRUTS_FORWARD_INFO);	

			} else {

				boolean secret = false;
				String secretPassword  = pwsu;
				String secretUser = nomesu;
				boolean secretAppId = false;
				
				// Modifico l'utente
				PasswordVerifier passwordVerifier = utentiCore.getUtenzePasswordVerifier();
				if(utentiCore.isCheckPasswordExpire(passwordVerifier)) {
					user.setCheckLastUpdatePassword(ServletUtils.isCheckBoxEnabled(scadenza));
				} else {
					user.setCheckLastUpdatePassword(false);
				}
				
				// Cripto la password
				boolean cpwd = ServletUtils.isCheckBoxEnabled(changepwd);
				if(cpwd && !"".equals(pwsu)){
					if(utentiCore.isUtenzePasswordEncryptEnabled()) {
						secret = true;
						pwsu = utentiCore.getUtenzePasswordManager().crypt(pwsu);
					}
					
					user.setLastUpdatePassword(new Date());
					user.setPassword(pwsu);
				}

				// Modifico i dati dell'utente
				user.setInterfaceType(InterfaceType.valueOf(tipoGui));
				user.setProtocolloSelezionatoPddConsole(!tipoModalitaConsoleGestione.equals(UtentiCostanti.VALORE_PARAMETRO_MODALITA_ALL) ? tipoModalitaConsoleGestione : null);
				user.setSoggettoSelezionatoPddConsole(!idSoggettoConsoleGestione.equals(UtentiCostanti.VALORE_PARAMETRO_MODALITA_ALL) ? idSoggettoConsoleGestione : null);
				user.setProtocolloSelezionatoPddMonitor(!tipoModalitaConsoleMonitoraggio.equals(UtentiCostanti.VALORE_PARAMETRO_MODALITA_ALL) ? tipoModalitaConsoleMonitoraggio : null);
				user.setSoggettoSelezionatoPddMonitor(!idSoggettoConsoleMonitoraggio.equals(UtentiCostanti.VALORE_PARAMETRO_MODALITA_ALL) ? idSoggettoConsoleMonitoraggio : null);
					
				String puString = "";

				if (isServizi != null && ServletUtils.isCheckBoxEnabled(isServizi))
					puString = Permessi.SERVIZI.toString();

				if (isDiagnostica != null && ServletUtils.isCheckBoxEnabled(isDiagnostica)) {
					if (puString.equals(""))
						puString = Permessi.DIAGNOSTICA.toString();
					else
						puString = puString+","+Permessi.DIAGNOSTICA.toString();
				}
				
				if (isReportistica != null && ServletUtils.isCheckBoxEnabled(isReportistica)) {
					if (puString.equals(""))
						puString = Permessi.REPORTISTICA.toString();
					else
						puString = puString+","+Permessi.REPORTISTICA.toString();
				}

				if (isSistema != null && ServletUtils.isCheckBoxEnabled(isSistema)) {
					if (puString.equals(""))
						puString = Permessi.SISTEMA.toString();
					else
						puString = puString+","+Permessi.SISTEMA.toString();
				}

				if (isMessaggi != null && ServletUtils.isCheckBoxEnabled(isMessaggi)) {
					if (puString.equals(""))
						puString = Permessi.CODE_MESSAGGI.toString();
					else
						puString = puString+","+Permessi.CODE_MESSAGGI.toString();
				}

				if (isUtenti != null && ServletUtils.isCheckBoxEnabled(isUtenti)) {
					if (puString.equals(""))
						puString = Permessi.UTENTI.toString();
					else
						puString = puString+","+Permessi.UTENTI.toString();
				}

				if (isAuditing != null && ServletUtils.isCheckBoxEnabled(isAuditing)) {
					if (puString.equals(""))
						puString = Permessi.AUDITING.toString();
					else
						puString = puString+","+Permessi.AUDITING.toString();
				}
				if (isAccordiCooperazione != null && ServletUtils.isCheckBoxEnabled(isAccordiCooperazione)) {
					if (puString.equals(""))
						puString = Permessi.ACCORDI_COOPERAZIONE.toString();
					else
						puString = puString+","+Permessi.ACCORDI_COOPERAZIONE.toString();
				}

				user.setPermessi(PermessiUtente.toPermessiUtente(puString));
				
				user.clearProtocolliSupportati();
				if(user.hasOnlyPermessiUtenti()) {
					user.setProtocolloSelezionatoPddConsole(null); 
					user.setInterfaceType(InterfaceType.STANDARD);
				}
				else {
					// modalita gateway
					for (int i = 0; i < protocolliRegistratiConsole.size() ; i++) {
						String protocolloName = protocolliRegistratiConsole.get(i);
						if(ServletUtils.isCheckBoxEnabled(modalitaScelte[i])) {
							user.addProtocolloSupportato(protocolloName);
						} 
					}
					if(user.getProtocolloSelezionatoPddConsole() != null &&
						!user.getProtocolliSupportati().contains(user.getProtocolloSelezionatoPddConsole())) {
						user.setProtocolloSelezionatoPddConsole(null); 
					}
				}
				
				if (ServletUtils.isCheckBoxEnabled(isDiagnostica) || ServletUtils.isCheckBoxEnabled(isReportistica)) {
					user.setPermitAllSoggetti(ServletUtils.isCheckBoxEnabled(isSoggettiAll));
					// se seleziono il permitall devo cancellare i soggetti selezionati
					if(user.isPermitAllSoggetti() &&
						user.getSoggetti() != null && !user.getSoggetti().isEmpty()) {
						user.getSoggetti().clear();
					}
					user.setPermitAllServizi(ServletUtils.isCheckBoxEnabled(isServiziAll));
					// se seleziono il permitall devo cancellare i servizi selezionati
					if(user.isPermitAllServizi() &&
						user.getServizi() != null && !user.getServizi().isEmpty()) {
						user.getServizi().clear();
					}
					
					// salvataggio homepage e grafico della console di monitoraggio
					boolean homePageFound = false;
					for (Stato stato : user.getStati()) {
						if(stato.getOggetto().equals(UtentiCostanti.OGGETTO_STATO_UTENTE_HOME_PAGE)) {
							stato.setStato(utentiHelper.incapsulaValoreStato(homePageMonitoraggio));
							homePageFound = true;
							break;
						}
					}
					
					if(!homePageFound) {
						Stato statoHomePage = new Stato();
						statoHomePage.setOggetto(UtentiCostanti.OGGETTO_STATO_UTENTE_HOME_PAGE);
						statoHomePage.setStato(utentiHelper.incapsulaValoreStato(homePageMonitoraggio));
						
						user.getStati().add(statoHomePage);
					}
					
					boolean statoIntevalloTemporaleHomePageFound = false;
					
					for (Stato stato : user.getStati()) {
						if(stato.getOggetto().equals(UtentiCostanti.OGGETTO_STATO_UTENTE_INTERVALLO_TEMPORALE_HOME_PAGE)) {
							stato.setStato(utentiHelper.incapsulaValoreStato(intervalloTemporaleHomePageConsoleMonitoraggio));
							statoIntevalloTemporaleHomePageFound = true;
							break;
						}
					}
					
					if(!statoIntevalloTemporaleHomePageFound) {
						Stato statoIntevalloTemporaleHomePage = new Stato();
						statoIntevalloTemporaleHomePage.setOggetto(UtentiCostanti.OGGETTO_STATO_UTENTE_INTERVALLO_TEMPORALE_HOME_PAGE);
						statoIntevalloTemporaleHomePage.setStato(utentiHelper.incapsulaValoreStato(intervalloTemporaleHomePageConsoleMonitoraggio));
						
						user.getStati().add(statoIntevalloTemporaleHomePage);
					}
				}

				// Se singleSu != null, devo recuperare gli oggetti
				// dell'utente ed assegnarli a singleSu
				List<Object> oggetti = new ArrayList<>();
				List<Integer> tipoModifica = new ArrayList<>();
				if(soggettiCore.isRegistroServiziLocale() &&
					singleSuServizi != null && !singleSuServizi.equals("")) {
					UserObjects results = utentiCore.updateUserServizi(nomesu, singleSuServizi);
					ControlStationCore.logInfo("Modificata utenza ["+nomesu+"]->["+singleSuServizi+"] per permesso relativo ai servizi (L'utenza '"+nomesu+"' verrà modificata per non avere più la gestione dei servizi). Risultati modifica: "+results.toString(false));
				}

				if(soggettiCore.isRegistroServiziLocale() &&
					(singleSuAccordiCooperazione != null && !singleSuAccordiCooperazione.equals("")) || checkOggettiAccordi) {
						
					if(checkOggettiAccordi){
						UserObjects results = utentiCore.countUserCooperazione(nomesu);
						if(results.accordi_accoperazione>0 || results.accordi_parte_comune>0) {
							List<DataElement> dati = new ArrayList<>();
							
							dati.add(ServletUtils.getDataElementForEditModeFinished());

							pd.disableEditMode();

							pd.setDati(dati);

							// Preparo il menu
							pd.setMessage("Non è possibile eliminare il permesso 'Accordi Cooperazione', poichè non esistono altri utenti con tale permesso");

							ServletUtils.setGeneralAndPageDataIntoSession(request, session, gd, pd);

							return ServletUtils.getStrutsForwardGeneralError(mapping, UtentiCostanti.OBJECT_NAME_UTENTI, ForwardParams.CHANGE());
						}
					}
					
					UserObjects results = utentiCore.updateUserCooperazione(nomesu, singleSuAccordiCooperazione);
					ControlStationCore.logInfo("Modificata utenza ["+nomesu+"]->["+singleSuAccordiCooperazione+"] per permesso relativo agli accordi di cooperazione (L'utenza '"+nomesu+"' verrà modificata per non avere più la gestione degli accordi di cooperazione). Risultati modifica: "+results.toString(true));
				}

				// Alla fine, modifico l'utente
				oggetti.add(user);
				tipoModifica.add(org.openspcoop2.web.ctrlstat.costanti.CostantiControlStation.PERFORM_OPERATION_UPDATE);
				int[] operationTypes = new int[tipoModifica.size()];
				for (int cO = 0; cO < tipoModifica.size(); cO++)
					operationTypes[cO] = tipoModifica.get(cO);
				utentiCore.performOperationMultiTypes(userLogin, utentiHelper.smista(), operationTypes, oggetti.toArray());



				// Se sto modificando l'utente che è anche quello connesso
				if(userLogin.equals(user.getLogin())){

					if(utentiCore.isUtenzeModificaProfiloUtenteDaFormAggiornaSessione()) {
						LoginSessionUtilities.cleanLoginParametersSession(request, session);

						ServletUtils.setUserIntoSession(request, session, user); // update in sessione.
//						utentiHelper.setTipoInterfaccia(user.getInterfaceType()); // update InterfaceType
						LoginSessionUtilities.setLoginParametersSession(request, session, utentiCore, userLogin);
					} else {
						ServletUtils.setUserIntoSession(request, session, user); // update in sessione.
					}
				}

				boolean isLoggedUser = userLogin.equals(user.getLogin());
				
				// Messaggio 'Please Copy'
				if(!isLoggedUser && secret) {
					utentiHelper.setSecretPleaseCopy(secretPassword, secretUser, secretAppId, ConnettoriCostanti.AUTENTICAZIONE_TIPO_BASIC, OggettoDialogEnum.UTENTE, nomesu);
				}

				// Se ho modificato l'utente loggato non faccio caricare la lista, degli utente ma una
				// pagina di info che indica che l'utente e' stato modificato con successo
				// MOTIVO: Viene effettuato il refresh della colonna a sinistra, se per caso sono cambiati i diritti
				if (isLoggedUser){

					// Reinit general data per aggiornare lo stato della barra dell'header a dx.
					gd = generalHelper.initGeneralData(request);
					
					utentiHelper.makeMenu();

					pd.setMessage("Utente '"+userLogin+"' modificato con successo", Costanti.MESSAGE_TYPE_INFO);
					
					ServletUtils.setGeneralAndPageDataIntoSession(request, session, gd, pd);

					return ServletUtils.getStrutsForward(mapping, UtentiCostanti.OBJECT_NAME_UTENTI, ForwardParams.CHANGE(),UtentiCostanti.STRUTS_FORWARD_PERMESSI_OK);	

				} else {

					if(!user.isConfigurazioneValidaSoggettiAbilitati()) {
						pd.setMessage(UtentiCostanti.LABEL_ABILITAZIONI_PUNTUALI_SOGGETTI_DEFINIZIONE_UPDATE_NOTE, MessageType.INFO);
					}
					else if(!user.isConfigurazioneValidaServiziAbilitati()) {
						pd.setMessage(UtentiCostanti.LABEL_ABILITAZIONI_PUNTUALI_SERVIZI_DEFINIZIONE_UPDATE_NOTE, MessageType.INFO);
					}
					
					// Preparo la lista
					int idLista = Liste.SU;

					ConsoleSearch ricerca = (ConsoleSearch) ServletUtils.getSearchObjectFromSession(request, session,ConsoleSearch.class);

					ricerca = utentiHelper.checkSearchParameters(idLista, ricerca);

					List<User> lista = utentiCore.userList(ricerca);

					utentiHelper.prepareUtentiList(ricerca, lista, singlePdD);

					ServletUtils.setGeneralAndPageDataIntoSession(request, session, gd, pd);

					return ServletUtils.getStrutsForwardEditModeFinished(mapping, UtentiCostanti.OBJECT_NAME_UTENTI, ForwardParams.CHANGE());
				}
			}
		} catch (Exception e) {
			return ServletUtils.getStrutsForwardError(ControlStationCore.getLog(), e, pd, request, session, gd, mapping, 
					UtentiCostanti.OBJECT_NAME_UTENTI, ForwardParams.CHANGE());
		}
	}
}