Sei sulla pagina 1di 21

package it.sapienza.pwd.

ejb;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.annotation.Resource;
import javax.ejb.EJB;
import javax.ejb.EJBContext;
import javax.ejb.Stateless;
import javax.mail.Session;
import javax.sql.DataSource;
import javax.validation.executable.ValidateOnExecution;

import org.apache.log4j.Logger;

import it.sapienza.common.dto.AutenticazioneDTO;
import it.sapienza.common.dto.DomandaSicurezzaDTO;
import it.sapienza.common.dto.PwdDTO;
import it.sapienza.common.dto.RecupwdDTO;
import it.sapienza.common.dto.SimpleElementDTO;
import it.sapienza.common.util.CryptoUtil;
import it.sapienza.common.util.EsitoEJB;
import it.sapienza.common.util.RisultatoLista;
import it.sapienza.common.util.TipoErrore;
import it.sapienza.comunicazione.ejb.ComunicazioneEJBRemote;
import it.sapienza.comunicazione.ejb.util.MailEnum;
import it.sapienza.pwd.ejb.dao.PwdServiceDao;
import it.sapienza.pwd.util.PasswordUtil;

@Stateless
@ValidateOnExecution
public class PwdEJB implements PwdEJBRemote, PwdEJBLocal {

private static final Logger _logger =


Logger.getLogger(PwdEJB.class.getName());

private static final String msg_segreteria = "segreteria studenti.";


private static final String msg_recupero_imposs = "Impossibile recuperare la
password per email. Rivolgersi alla " + msg_segreteria;
private static final String msg_mail_inesistente = "Mail di recupero password
non esistente. Impossibile recuperare la password per email. "
+ "Rivolgersi alla " + msg_segreteria;

@Resource
private EJBContext context;

@Resource(mappedName = "java:/oracleDBJTA")
private DataSource dataSource;

//@Resource(mappedName = "java:jboss/UserTransaction")
//private UserTransaction transaction;

@Resource(mappedName = "java:/Dev01")
private Session mailSession;

@EJB(lookup = "java:global/ComunicazioneEJB/ComunicazioneEJB!
it.sapienza.comunicazione.ejb.ComunicazioneEJBRemote")
private ComunicazioneEJBRemote comunicazioneEJB;

@Override
public EsitoEJB<RecupwdDTO> getDatiAccesso(String codiSogg) throws Exception
{
_logger.debug("[PwdEJB] - Inizio getDatiAccesso");

PwdServiceDao dao = new PwdServiceDao(dataSource);


EsitoEJB<RecupwdDTO> esito = new EsitoEJB<RecupwdDTO>();
RecupwdDTO recuPwd = dao.getDatiAccesso(codiSogg);

// non mostro la precedente risposta (è comunque hashata)


recuPwd.setRisposta("");
esito.setRisultato(recuPwd);

_logger.debug("[PwdEJB] - Fine getDatiAccesso");

return esito;
}

@Override
public EsitoEJB<Boolean> checkResetPwd(String codiSogg, String email) throws
Exception {
_logger.debug("[PwdEJB] - Inizio checkResetPwd");

PwdServiceDao dDao = new PwdServiceDao(dataSource);


Boolean checkReset = dDao.checkResetPwd(codiSogg, email);
EsitoEJB<Boolean> esito = new EsitoEJB<Boolean>();
esito.setRisultato(checkReset);

_logger.debug("[PwdEJB] - Fine checkResetPwd");

return esito;
}

@Override
public EsitoEJB<Boolean> aggiornaDatiAccesso(String codiSogg, String email,
String codiDomanda, String risposta)
throws Exception {
_logger.debug("[PwdEJB] - Inizio aggiornaDatiAccesso");

EsitoEJB<Boolean> esito = new EsitoEJB<Boolean>();


PwdServiceDao dDao = new PwdServiceDao(dataSource);
Boolean reset = false;
boolean mailHasChanged = false;
String oldMail = "";
String rispostaHash = "";
boolean emailSpidCie = false;

try {
rispostaHash = CryptoUtil.getBase64Sha1(risposta.toUpperCase());

// verifica che la risposta hashata sia di lunghezza inferiore a


100 caratteri
if(rispostaHash != null && rispostaHash.length() > 100) {
esito.setDescrizioneErrore("La risposta alla domanda
segreta è troppo lunga");

esito.setLivelloErrore(TipoErrore.ERRORE_GENERICO.getLivelloErrore());
esito.setCodiceErrore(TipoErrore.ERRORE_GENERICO.getCodiceErrore());

return esito;
}

//cerco email in sest_recu_pswd

Long idSogg = dDao.recuCodiSogg(email);


//issue 307
if(idSogg.longValue()>0 && !codiSogg.equals(idSogg.toString())) {
esito.setDescrizioneErrore("Email non valida");

esito.setLivelloErrore(TipoErrore.ERRORE_GENERICO.getLivelloErrore());

esito.setCodiceErrore(TipoErrore.ERRORE_GENERICO.getCodiceErrore());

return esito;
}

//cerco email in sest_indi_sogg

Long idSoggIndiSogg = dDao.recuCodiSoggIndiSogg(email);


//issue 307
if(idSoggIndiSogg.longValue()>0 && !
codiSogg.equals(idSogg.toString())) {
esito.setDescrizioneErrore("Email non valida");

esito.setLivelloErrore(TipoErrore.ERRORE_GENERICO.getLivelloErrore());

esito.setCodiceErrore(TipoErrore.ERRORE_GENERICO.getCodiceErrore());

return esito;
}

oldMail = dDao.recuIndiMail(codiSogg);

if(!oldMail.equalsIgnoreCase(email))
mailHasChanged = true;

reset = dDao.aggiornaDomandaRisposta(codiSogg, codiDomanda,


rispostaHash);

if (reset == false) {
context.setRollbackOnly();
} else {
if(mailHasChanged)
reset = dDao.aggiornaIndiMailRecapiti(codiSogg,
email);
}

if (reset == false)
context.setRollbackOnly();
else {
if(mailHasChanged) {
if(dDao.existMailForUser(codiSogg)) {
// se già esiste una mail, effettua
l'aggiornamento
reset =
dDao.updateMailPerRecuPswdAdeguamento(Long.parseLong(codiSogg), email, "");
//reset =
dDao.aggiornaIndiMailRecuPswd(codiSogg, email);
} else {
// se non esiste una mail, effettua
l'inserimento
reset =
dDao.insertMailPerRecuPswdAdeguamento(Long.parseLong(codiSogg), email,
"",emailSpidCie);
}
}
}

if (reset == false)
context.setRollbackOnly();

} catch (Exception e) {
context.setRollbackOnly();
throw e;
}

esito.setRisultato(reset);

_logger.debug("[PwdEJB] - Fine aggiornaDatiAccesso");

return esito;
}

@Override
public EsitoEJB<Boolean> aggiornaEmailAccesso(String codiSogg, String email)
throws Exception {
_logger.debug("[PwdEJB] - Inizio aggiornaEmailAccesso");

EsitoEJB<Boolean> esito = new EsitoEJB<Boolean>();


PwdServiceDao dDao = new PwdServiceDao(dataSource);
Boolean reset = false;
boolean mailHasChanged = false;
String oldMail = "";
boolean emailSpidCie = false;//issue2424
boolean doppiaIscrizione = dDao.checkDoppiaIscrizione(codiSogg);
//Issue4599
_logger.debug("Doppia iscrizione: " + doppiaIscrizione);

try {
_logger.debug("Cerco email in sest_recu_pswd");
Long idSogg = dDao.recuCodiSogg(email);
_logger.debug("cerco email in sest_indi_sogg");
Long idSoggIndiSogg = dDao.recuCodiSoggIndiSogg(email);

if(!doppiaIscrizione) {

_logger.debug("Matricola unica");

if(idSogg.longValue()>0 && (!
codiSogg.equals(idSogg.toString()))) {
esito.setDescrizioneErrore("Email non valida");

esito.setLivelloErrore(TipoErrore.ERRORE_GENERICO.getLivelloErrore());
esito.setCodiceErrore(TipoErrore.ERRORE_GENERICO.getCodiceErrore());
_logger.debug("Esito: " + esito);
return esito;
}

if(idSoggIndiSogg.longValue()>0 && !
codiSogg.equals(idSogg.toString())) {
esito.setDescrizioneErrore("Email non valida");

esito.setLivelloErrore(TipoErrore.ERRORE_GENERICO.getLivelloErrore());

esito.setCodiceErrore(TipoErrore.ERRORE_GENERICO.getCodiceErrore());
_logger.debug("Esito: " + esito);
return esito;
}

oldMail = dDao.recuIndiMail(codiSogg);
_logger.debug("Old email: " + oldMail);

if(!oldMail.equalsIgnoreCase(email))

mailHasChanged = true;
_logger.debug("mailHasChanged = " + mailHasChanged);

reset = true;

if (reset == false) {
_logger.debug("mailHasChanged = " + mailHasChanged);
context.setRollbackOnly();
} else {
if(mailHasChanged)
_logger.debug("Aggiorna
aggiornaIndiMailRecapiti(codiSogg, email) ");
reset = dDao.aggiornaIndiMailRecapiti(codiSogg,
email);
}

if (reset == false)
context.setRollbackOnly();
else {
if(mailHasChanged) {
if(dDao.existMailForUser(codiSogg)) {
_logger.debug("se già esiste una mail,
effettua l'aggiornamento");
reset =
dDao.updateMailPerRecuPswdAdeguamento(Long.parseLong(codiSogg), email, "");
//reset =
dDao.aggiornaIndiMailRecuPswd(codiSogg, email);
} else {
_logger.debug("se non esiste una mail,
effettua l'inserimento");
reset =
dDao.insertMailPerRecuPswdAdeguamento(Long.parseLong(codiSogg), email, "",
emailSpidCie);
}
}
}
if (reset == false)
context.setRollbackOnly();
}
else {
_logger.debug("Matricola doppia");
String matricolaPadre = dDao.getMatricolaPadre(codiSogg);
_logger.debug("Matricola padre: " + matricolaPadre);
String matricolaFiglia = dDao.getMatricolaFiglia(codiSogg);
_logger.debug("Matricola figlia: "+ matricolaFiglia);

if(idSogg.longValue()>0 && (!
matricolaPadre.equals(idSogg.toString()) || !
matricolaFiglia.equals(idSogg.toString()))){
esito.setDescrizioneErrore("Email non valida");

esito.setLivelloErrore(TipoErrore.ERRORE_GENERICO.getLivelloErrore());

esito.setCodiceErrore(TipoErrore.ERRORE_GENERICO.getCodiceErrore());
_logger.debug("Esito: " + esito);
return esito;
}
}
} catch (Exception e) {
context.setRollbackOnly();
throw e;
}

esito.setRisultato(reset);

_logger.debug("[PwdEJB] - Fine aggiornaEmailAccesso");

return esito;
}

@Override
public EsitoEJB<Boolean> resetPwd(String codiSogg, String oldPwd, String
newPwd) throws Exception {
_logger.debug("[PwdEJB] - Inizio resetPwd");

PwdServiceDao dDao = new PwdServiceDao(dataSource);


int ggAllaScad = new PasswordUtil().getGiorniAllaScad("");
Boolean reset = dDao.resetPwd(codiSogg, oldPwd, newPwd, ggAllaScad);
EsitoEJB<Boolean> esito = new EsitoEJB<Boolean>();
if (!reset)
esito.setDescrizioneErrore("La vecchia password è errata!!!");
esito.setRisultato(reset);

_logger.debug("[PwdEJB] - Fine resetPwd");

return esito;
}

//issue1780
/**
* recupera l'hash della password dell'utente
*/
@Override
public EsitoEJB<?> recuperaHashedPwd(Long matricola){
_logger.debug("[PwdEJB] - Inizio recuperaHashedPwd");

EsitoEJB<?> esito = new EsitoEJB<>();


PwdServiceDao dao = new PwdServiceDao(dataSource);
String pwd = null;
try {
pwd = dao.recuperaHashedPwd(matricola);
esito.setRisultato(pwd);

} catch (SQLException e) {
_logger.error(e);
return new
EsitoEJB<>(TipoErrore.ERRORE_ACCESSO_DATI.getLivelloErrore(),
TipoErrore.ERRORE_ACCESSO_DATI.getCodiceErrore(),

TipoErrore.ERRORE_ACCESSO_DATI.getDescrizioneErrore(), null);
}
_logger.debug("[PwdEJB] - Fine recuperaHashedPwd");

return esito;
}

@Override
public EsitoEJB<String> recuperaPwd(Long codiSogg, String email, String
risposta) throws Exception {
_logger.debug("[PwdEJB] - Inizio recuperaPwd");

EsitoEJB<String> esito = new EsitoEJB<String>();


int ggAllaScad = 0;
String recuMail = "", warning = "";
String msg = "";
String rispostaHash = "";
boolean isDoneCheckAdeguamentoPswd = false;

try {

PwdServiceDao dDao = new PwdServiceDao(dataSource);


PasswordUtil pwdUtil = new PasswordUtil();
ggAllaScad = pwdUtil.getGiorniAllaScad("temp");
rispostaHash = CryptoUtil.getBase64Sha1(risposta.toUpperCase());

if (codiSogg != null) {

// verifica se è stato effettuato l'adeguamento password (e


quindi se è settata una domanda/risposta)
esito = checkAdeguamentoPwd(""+codiSogg, null);

if(esito != null && esito.getDescrizioneErrore() != null &&


!esito.getDescrizioneErrore().equalsIgnoreCase("")) {
return esito;
} else if(esito != null && esito.getRisultato() != null &&
((String)esito.getRisultato()).equalsIgnoreCase("1")) {
warning = msg_recupero_imposs;
_logger.debug("[PwdEJB] - " + warning);

esito.setCodiceErrore(TipoErrore.ERRORE_GENERICO.getCodiceErrore());
esito.setDescrizioneErrore(warning);
esito.setLivelloErrore(TipoErrore.ERRORE_GENERICO.getLivelloErrore());
esito.setRisultato(null);

return esito;
}

isDoneCheckAdeguamentoPswd = true;

boolean existsCodiSogg = false;

// verifica se il codiSogg esiste


existsCodiSogg = dDao.existsCodiSogg("" + codiSogg);
if (!existsCodiSogg) {
warning = "la matricola " + codiSogg + " inserita non
è valida.";
_logger.debug("[PwdEJB] - " + warning);

esito.setCodiceErrore(TipoErrore.ERRORE_GENERICO.getCodiceErrore());
esito.setDescrizioneErrore(warning);

esito.setLivelloErrore(TipoErrore.ERRORE_GENERICO.getLivelloErrore());
esito.setRisultato(null);

return esito;
}

// valorizza recuMail
recuMail = dDao.recuIndiMail("" + codiSogg);
if (recuMail != null && !recuMail.equalsIgnoreCase("")) {
warning = "E' stata inviata una mail all'indirizzo "
+ hiddenMail(recuMail);
} else {
warning = msg_mail_inesistente;
_logger.debug("[PwdEJB] - " + warning);

esito.setCodiceErrore(TipoErrore.ERRORE_GENERICO.getCodiceErrore());
esito.setDescrizioneErrore(warning);

esito.setLivelloErrore(TipoErrore.ERRORE_GENERICO.getLivelloErrore());
esito.setRisultato(null);

return esito;
}

} else if (email != null && !email.equalsIgnoreCase("")) {


// valorizza codiSogg
codiSogg = dDao.recuCodiSogg(email);
if (codiSogg != null && codiSogg > 0) {
warning = "E' stata inviata una mail all'indirizzo "
+ hiddenMail(recuMail);
} else {
warning = "La mail " + hiddenMail(email) + " inserita
non è valida.";
_logger.debug("[PwdEJB] - " + warning);
esito.setCodiceErrore(TipoErrore.ERRORE_GENERICO.getCodiceErrore());
esito.setDescrizioneErrore(warning);

esito.setLivelloErrore(TipoErrore.ERRORE_GENERICO.getLivelloErrore());
esito.setRisultato(null);

return esito;
}

recuMail = email;
}

// verifica se la mail è stata confermata


boolean isMailConfermata = dDao.isMailConfermata(""+codiSogg,
recuMail);

if(!isMailConfermata) {
warning = "la mail " + hiddenMail(recuMail) + " non è stata
confermata. Contatta la " + msg_segreteria;
_logger.debug("[PwdEJB] - " + warning);

esito.setCodiceErrore(TipoErrore.ERRORE_GENERICO.getCodiceErrore());
esito.setDescrizioneErrore(warning);

esito.setLivelloErrore(TipoErrore.WARNING_REQUISITI_NON_RISPETTATI.getLivelloErrore
());
esito.setRisultato(null);

return esito;
}

// verifica se l'utente è bloccato a sistema


boolean isUtenteBloccato = dDao.isUtenteBloccato(""+codiSogg);

if(isUtenteBloccato) {
warning = "la matricola " + codiSogg + " è stata bloccata.
Rivolgersi alla " + msg_segreteria;
_logger.debug("[PwdEJB] - " + warning);

esito.setCodiceErrore(TipoErrore.ERRORE_GENERICO.getCodiceErrore());
esito.setDescrizioneErrore(warning);

esito.setLivelloErrore(TipoErrore.ERRORE_GENERICO.getLivelloErrore());
esito.setRisultato(null);

return esito;
}

if(!isDoneCheckAdeguamentoPswd) {

// verifica se è stato effettuato l'adeguamento password (e


quindi se è settata una domanda/risposta)
esito = checkAdeguamentoPwd(""+codiSogg, null);

if(esito != null && esito.getDescrizioneErrore() != null &&


!esito.getDescrizioneErrore().equalsIgnoreCase("")) {
return esito;
} else if(esito != null && esito.getRisultato() != null &&
((String)esito.getRisultato()).equalsIgnoreCase("1")) {
warning = msg_recupero_imposs;
_logger.debug("[PwdEJB] - " + warning);

esito.setCodiceErrore(TipoErrore.ERRORE_GENERICO.getCodiceErrore());
esito.setDescrizioneErrore(warning);

esito.setLivelloErrore(TipoErrore.ERRORE_GENERICO.getLivelloErrore());
esito.setRisultato(null);

return esito;
}
}

// verifica domanda/risposta
boolean isRispostaCorretta = dDao.isRispostaCorretta(""+codiSogg,
rispostaHash);

if(!isRispostaCorretta) {
warning = "la risposta alla domanda per il recupero
password non è corretta.";
_logger.debug("[PwdEJB] - " + warning);

esito.setCodiceErrore(TipoErrore.ERRORE_GENERICO.getCodiceErrore());
esito.setDescrizioneErrore(warning);

esito.setLivelloErrore(TipoErrore.ERRORE_GENERICO.getLivelloErrore());
esito.setRisultato(null);

return esito;
}

String tempPwd = pwdUtil.generateRandomPassword();


if (tempPwd != null && !tempPwd.equalsIgnoreCase(""))
dDao.aggiornaPwd(codiSogg, tempPwd, ggAllaScad);

String initialPath =
System.getProperty("initial_path_for_email_link");

msg += "Matricola: " + codiSogg


+ "<br>La password temporanea è: "
+ tempPwd
+ " e avrà validità "
+ ggAllaScad
+ " giorni dalla ricezione della presente.<br>"
+ "Se accedi con SPID/CIE, dopo avere effettuato il
login, devi impostare la tua nuova password da IMPOSTAZIONI -> DATI DI
ACCESSO.<br>"
+ "Se NON accedi con SPID/CIE dopo il login sarai
automaticamente reindirizzato al FORM di reset della password. <br>"
+ "<br>In entrambi i casi, nel campo \"Vecchia
password\", dovrà essere inserita la password temporanea inclusa in questa e-
mail.<br>"
+ "<br>Qualora si voglia accedere alla casella di
posta istituzionale, una volta modificata la password, occorre attendere circa
un'ora per permettere ai sistemi di aggiornarsi.<br>"
+ "<a href='" + initialPath + "login'>Accedi ad
infostud!</a>";

EsitoEJB<Boolean> esitoInvio =
comunicazioneEJB.inviaMailCompleta(null, new String[] { recuMail },
MailEnum.MailSubject.FORGOT_PWD.getCode(), msg);

Boolean inviata = (Boolean) esitoInvio.getRisultato();


if (!inviata) {
warning = "Email non inviata, riprovare.";
//throw new IllegalStateException(warning);
_logger.debug("[PwdEJB] - " + warning);

esito.setCodiceErrore(TipoErrore.ERRORE_GENERICO.getCodiceErrore());
esito.setDescrizioneErrore(warning);

esito.setLivelloErrore(TipoErrore.ERRORE_GENERICO.getLivelloErrore());
esito.setRisultato(null);

return esito;
}

esito.setDescrizioneErrore(null);
esito.setCodiceErrore(null);
esito.setRisultato(warning);

} catch (Exception ex) {

esito.setCodiceErrore(TipoErrore.ERRORE_GENERICO.getCodiceErrore());
esito.setDescrizioneErrore(ex.getMessage());

esito.setLivelloErrore(TipoErrore.ERRORE_GENERICO.getLivelloErrore());
esito.setRisultato(null);

return esito;

}
_logger.debug("[PwdEJB] - Fine recuperaPwd");

return esito;
}

@Override
public EsitoEJB<String> recuperaDomanda(Long codiSogg, String email) throws
Exception {
_logger.debug("[PwdEJB] - Inizio recuperaDomanda");

EsitoEJB<String> esito = new EsitoEJB<String>();

try {

PwdServiceDao dDao = new PwdServiceDao(dataSource);


String recuMail = "", warning = "", codiDomanda="";
boolean isDoneCheckAdeguamentoPswd = false;
if (codiSogg != null) {

// check adeguamento password


esito = checkAdeguamentoPwd(""+codiSogg, null);

if(esito != null && esito.getDescrizioneErrore() != null &&


!esito.getDescrizioneErrore().equalsIgnoreCase("")) {
return esito;
} else if(esito != null && esito.getRisultato() != null &&
((String)esito.getRisultato()).equalsIgnoreCase("1")) {
warning = msg_recupero_imposs;
_logger.debug("[PwdEJB] - " + warning);

esito.setCodiceErrore(TipoErrore.ERRORE_GENERICO.getCodiceErrore());
esito.setDescrizioneErrore(warning);

esito.setLivelloErrore(TipoErrore.ERRORE_GENERICO.getLivelloErrore());
esito.setRisultato(null);

return esito;
}

isDoneCheckAdeguamentoPswd = true;

boolean existsCodiSogg = false;

// verifica se il codiSogg esiste


existsCodiSogg = dDao.existsCodiSogg("" + codiSogg);
if (!existsCodiSogg) {
warning = "la matricola " + codiSogg + " inserita non
è valida.";
_logger.debug("[PwdEJB] - " + warning);

esito.setCodiceErrore(TipoErrore.ERRORE_GENERICO.getCodiceErrore());
esito.setDescrizioneErrore(warning);

esito.setLivelloErrore(TipoErrore.ERRORE_GENERICO.getLivelloErrore());
esito.setRisultato(null);

return esito;
}

recuMail = dDao.recuIndiMail("" + codiSogg);


if (recuMail != null && !recuMail.equalsIgnoreCase("")) {
warning = "E' stata inviata una mail all'indirizzo "
+ hiddenMail(recuMail);
} else {
warning = msg_mail_inesistente;
_logger.debug("[PwdEJB] - " + warning);

esito.setCodiceErrore(TipoErrore.ERRORE_GENERICO.getCodiceErrore());
esito.setDescrizioneErrore(warning);

esito.setLivelloErrore(TipoErrore.ERRORE_GENERICO.getLivelloErrore());
esito.setRisultato(null);

return esito;
}

} else if (email != null && !email.equalsIgnoreCase("")) {


codiSogg = dDao.recuCodiSogg(email);
if (codiSogg != null && codiSogg > 0) {
warning = "E' stata inviata una mail all'indirizzo "
+ hiddenMail(recuMail);
} else {
warning = "La mail " + email + " inserita non è
valida.";
_logger.debug("[PwdEJB] - " + warning);

esito.setCodiceErrore(TipoErrore.ERRORE_GENERICO.getCodiceErrore());
esito.setDescrizioneErrore(warning);

esito.setLivelloErrore(TipoErrore.ERRORE_GENERICO.getLivelloErrore());
esito.setRisultato(null);

return esito;
}

recuMail = email;
}

if(!isDoneCheckAdeguamentoPswd) {

// check adeguamento password


esito = checkAdeguamentoPwd(""+codiSogg, null);

if(esito != null && esito.getDescrizioneErrore() != null &&


!esito.getDescrizioneErrore().equalsIgnoreCase("")) {
return esito;
} else if(esito != null && esito.getRisultato() != null &&
((String)esito.getRisultato()).equalsIgnoreCase("1")) {
warning = msg_recupero_imposs;
_logger.debug("[PwdEJB] - " + warning);

esito.setCodiceErrore(TipoErrore.ERRORE_GENERICO.getCodiceErrore());
esito.setDescrizioneErrore(warning);

esito.setLivelloErrore(TipoErrore.ERRORE_GENERICO.getLivelloErrore());
esito.setRisultato(null);

return esito;
}
}

// recupera il codice domanda


codiDomanda = dDao.getCodiceDomanda(""+codiSogg);

// recupera il testo della domanda


esito = getTestoDomanda(codiDomanda);

} catch (Exception ex) {


esito.setCodiceErrore(TipoErrore.ERRORE_GENERICO.getCodiceErrore());
esito.setDescrizioneErrore(ex.getMessage());

esito.setLivelloErrore(TipoErrore.ERRORE_GENERICO.getLivelloErrore());
esito.setRisultato(null);

return esito;

}
_logger.debug("[PwdEJB] - Fine recuperaDomanda");

return esito;
}

@Override
public EsitoEJB<SimpleElementDTO<String>> tentativiLoginSuperati(String
codiSogg) throws Exception {
_logger.debug("[PwdEJB] - Inizio getTentativiLogin");

boolean tentativiSuperati = false;


PasswordUtil pwdUtil = new PasswordUtil();
int tentativiLogin = pwdUtil.getNumeroTentativi();
int minutiPerTentativi = pwdUtil.getMinutiDiBloccoPerAccessoFallito();
String msg = "";

EsitoEJB<SimpleElementDTO<String>> esito = new


EsitoEJB<SimpleElementDTO<String>>();
PwdServiceDao dDao = new PwdServiceDao(dataSource);

int tentativi = dDao.getTentativiLogin(codiSogg);

if (tentativi > tentativiLogin) {


msg = "Hai superato i " + tentativiLogin + " tentativi di accesso
nell'arco di " + minutiPerTentativi + " minuti."
+ "Il tuo account utente è stato bloccato per ragioni
di sicurezza. " + "Ci scusiamo per l'inconveniente."
+ "\nPotrai sbloccarlo recandoti alla tua " +
msg_segreteria;
tentativiSuperati = true;
} else
msg = "Matricola o password errata!\nTentativo " + tentativi +
"/" + tentativiLogin + " effettuato";

esito.setDescrizioneErrore(msg);
esito.setRisultato(tentativiSuperati);

ArrayList<SimpleElementDTO<String>> listaTentativiObj =new


ArrayList<SimpleElementDTO<String>>();
SimpleElementDTO simpleElementDTO=new SimpleElementDTO();
simpleElementDTO.setCodice(String.valueOf(tentativi));
simpleElementDTO.setDescrizione("");
listaTentativiObj.add(simpleElementDTO);
RisultatoLista<SimpleElementDTO<String>> listaRisultati = new
RisultatoLista<SimpleElementDTO<String>>();
listaRisultati.setRisultati(listaTentativiObj);
esito.setRisultatoLista(listaRisultati);

_logger.debug("[PwdEJB] - Fine getTentativiLogin");


return esito;
}

@Override
public EsitoEJB<AutenticazioneDTO> pwdSacduta(String codiSogg, String pwd)
throws Exception {
_logger.debug("[PwdEJB] - Inizio pwdSacduta");

EsitoEJB<AutenticazioneDTO> esito = new EsitoEJB<AutenticazioneDTO>();


esito.setRisultato(new PwdServiceDao(dataSource).pwdScaduta(codiSogg,
pwd));

_logger.debug("[PwdEJB] - Fine pwdSacduta");

return esito;
}

/**
* Effettua le singole operazioni di adeguamento password
*
* @param codiSogg la matricola dello studente richiedente
* @param oldPwd vecchia password
* @return un esito stringa che può assumere valore "0" (adeguamento
effettuato), "1" (adeguamento da effettuare), "2"
* (reset della password da effettuare)
* @throws SQLException
*/
@Override
public EsitoEJB<String> checkAdeguamentoPwd(String codiSogg, String oldPwd)
throws Exception {
_logger.debug("[PwdEJB] - Inizio checkAdeguamentoPwd");

String flagAdeguamento = "1";

PwdServiceDao dDao = new PwdServiceDao(dataSource);


PwdDTO dto = dDao.checkAdeguamentoPwd(codiSogg, oldPwd);

String recuIndiMail = dDao.recuIndiMail(codiSogg);


String codiPwdOld = dto.getCodiPwdOld();
String testModiPwd = dto.getTestModiPwd();

boolean userHasMail = false;


if(recuIndiMail != null && !recuIndiMail.equalsIgnoreCase(""))
userHasMail = true;

if (codiPwdOld.equalsIgnoreCase("OK")) {
if(!userHasMail || testModiPwd == null ||
testModiPwd.equalsIgnoreCase("0")) {
flagAdeguamento = "1"; // adeguamento
} else {
flagAdeguamento = "0"; // accesso
}
} else if (codiPwdOld.equalsIgnoreCase("NON CONFERMATA") ||
codiPwdOld.equalsIgnoreCase("NON VALIDA")) {
flagAdeguamento = "1"; // adeguamento
} else if (codiPwdOld.equalsIgnoreCase("RESET") ||
codiPwdOld.equalsIgnoreCase("ASSEGNATA")) {
if (!userHasMail || testModiPwd == null ||
testModiPwd.equalsIgnoreCase("0")) {
flagAdeguamento = "1"; // adeguamento
} else
flagAdeguamento = "2"; // reset
}

EsitoEJB<String> esito = new EsitoEJB<String>();


esito.setRisultato(flagAdeguamento);

_logger.debug("[PwdEJB] - Fine checkAdeguamentoPwd");

return esito;
}

/* METODO ORIGINALE
@Override
public EsitoEJB<String> checkAdeguamentoPwd(String codiSogg, String oldPwd)
throws Exception {
_logger.debug("[PwdEJB] - Inizio checkAdeguamentoPwd");

String flagAdeguamento = "1";

PwdServiceDao dDao = new PwdServiceDao(dataSource);


PwdDTO dto = dDao.checkAdeguamentoPwd(codiSogg, oldPwd);
String codiPwdOld = dto.getCodiPwdOld(), testModiPwd =
dto.getTestModiPwd();
if (codiPwdOld.equalsIgnoreCase("OK"))
flagAdeguamento = "0";
else if (codiPwdOld.equalsIgnoreCase("NON CONFERMATA") ||
codiPwdOld.equalsIgnoreCase("NON VALIDA"))
flagAdeguamento = "1";
else if (codiPwdOld.equalsIgnoreCase("RESET") ||
codiPwdOld.equalsIgnoreCase("ASSEGNATA"))
if (testModiPwd.equalsIgnoreCase("0")) {
flagAdeguamento = "1";
} else
flagAdeguamento = "2";

EsitoEJB<String> esito = new EsitoEJB<String>();


esito.setRisultato(flagAdeguamento);

_logger.debug("[PwdEJB] - Fine checkAdeguamentoPwd");

return esito;
}*/

/**
* Recupera lo status della password
*
* @param codiSogg la matricola dello studente richiedente
* @return un esito stringa che può assumere valore "OK", "NON CONFERMATA",
"RESET"
* @throws SQLException
*/
@Override
public EsitoEJB<String> getStatusPwdOld(String codiSogg) throws Exception {
_logger.debug("[PwdEJB] - Inizio getStatusPwdOld");

EsitoEJB<String> esito = new EsitoEJB<String>();


PwdServiceDao dDao = new PwdServiceDao(dataSource);
PwdDTO dto = dDao.getStatusPwd(codiSogg);

_logger.debug("[PwdEJB] - status pwd : " + dto.getCodiPwdOld());

esito.setRisultato(dto.getCodiPwdOld());

_logger.debug("[PwdEJB] - Fine getStatusPwdOld");

return esito;
}

/**
* Effettua le singole operazioni di adeguamento password
*
* @param codiSogg la matricola dello studente richiedente
* @param email la mail di recupero password
* @param codiDomanda codice della domanda
* @param risposta risposta
* @param oldPwd vecchia password
* @param newPwd nuova password
* @return un esito true se l'operazione di adeguamento è andata a buon fine,
false altrimenti
* @throws SQLException
*/
@Override
public EsitoEJB<Boolean> effettuaAdeguamentoPwd(Long codiSogg, String email,
String codiDomanda, String risposta,
String oldPwd, String newPwd, String token,Boolean emailSpidCie)
throws Exception {
_logger.debug("[PwdEJB] - Inizio effettuaAdeguamentoPwd");
_logger.info("[PwdEJB] - boolean emailSpidCie : "+ emailSpidCie);

EsitoEJB<Boolean> esito = new EsitoEJB<Boolean>();

PwdServiceDao dDao = new PwdServiceDao(dataSource);


Boolean reset = false;
boolean existMail = false;

String rispostaHash = "";

try {

rispostaHash = CryptoUtil.getBase64Sha1(risposta.toUpperCase());

// verifica che la risposta hashata sia di lunghezza inferiore a


100 caratteri
if(rispostaHash != null && rispostaHash.length() > 100) {
esito.setDescrizioneErrore("La risposta alla domanda
segreta è troppo lunga");

esito.setLivelloErrore(TipoErrore.ERRORE_GENERICO.getLivelloErrore());

esito.setCodiceErrore(TipoErrore.ERRORE_GENERICO.getCodiceErrore());

return esito;
}
existMail = dDao.existMailForUser(""+codiSogg);

// SALVA o AGGIORNA EMAIL


if(!existMail) {
// se la mail non esiste, effettua insert
reset = dDao.insertMailPerRecuPswdAdeguamento(codiSogg,
email, token,emailSpidCie);
} else {
// se esiste già una mail per questo utente, effettua
update
reset = dDao.updateMailPerRecuPswdAdeguamento(codiSogg,
email, token);
}

if (reset == false)
context.setRollbackOnly();
else {
// recupera i giorni di validità della password
PasswordUtil pwdUtil = new PasswordUtil();
int ggAllaScadenza = pwdUtil.getGiorniAllaScad("");

// AGGIORNA UTENTE
reset = dDao.updateUtenteAdeguamento(codiSogg, newPwd,
codiDomanda, rispostaHash, ggAllaScadenza);
}

if (reset == false)
context.setRollbackOnly();
else {
// AGGIORNA EMAIL RECAPITI
reset = dDao.aggiornaIndiMailRecapiti("" + codiSogg,
email);
}

if (reset == false) {
long codiIndi = dDao.getCodiIndi();

// INSERISCI EMAIL RECAPITI


reset = dDao.insertIndiMail(codiSogg, codiIndi, email);
}

if (reset == false)
context.setRollbackOnly();

} catch (Exception e) {
context.setRollbackOnly();
throw e;
}

esito.setRisultato(reset);

_logger.debug("[PwdEJB] - Fine effettuaAdeguamentoPwd");

return esito;
}

/**
* recupera tutte le domande di sicurezza da tabella
*
*
* @return un esito contenente la stringa relativa, una stringa vuota e
messaggio d'errore altrimenti
*/
@Override
public EsitoEJB<List<DomandaSicurezzaDTO>> recuperaDomande() {

_logger.debug("[PwdEJB] - Inizio getTestoDomande");


PwdServiceDao dao = new PwdServiceDao(dataSource);
EsitoEJB<List<DomandaSicurezzaDTO>> esito = new
EsitoEJB<List<DomandaSicurezzaDTO>>();
int codiDomandaInt = 0;
List<DomandaSicurezzaDTO> result = new
ArrayList<DomandaSicurezzaDTO>();

try {

result = dao.getDomande();// issue 1593

esito.setRisultato(result);

} catch (Exception e) {

esito.setDescrizioneErrore("Il formato del codice domanda non è


valido.");

esito.setLivelloErrore(TipoErrore.ERRORE_GENERICO.getLivelloErrore());

esito.setCodiceErrore(TipoErrore.ERRORE_GENERICO.getCodiceErrore());

return esito;

} finally {

_logger.debug("[PwdEJB] - Fine getTestoDomande");


}

return esito;
}

/**
* recupera il testo di uno specifico codiDomanda (la domanda per il recupero
della password)
*
* @param codiDomanda il codice domanda da recuperare
* @return un esito contenente la stringa relativa, una stringa vuota e
messaggio d'errore altrimenti
*/
@Override
public EsitoEJB<String> getTestoDomanda(String codiDomanda) {

_logger.debug("[PwdEJB] - Inizio getTestoDomanda");


PwdServiceDao dao = new PwdServiceDao(dataSource);
EsitoEJB<String> esito = new EsitoEJB<String>();
int codiDomandaInt = 0;
String result = "";

try {
codiDomandaInt = Integer.parseInt(codiDomanda);

result = dao.getDomandaByCodice(codiDomandaInt);//issue 1593

if (result != null && !result.equalsIgnoreCase("")) {


esito.setRisultato(result);

} else {
esito.setDescrizioneErrore("Nessuna domanda correlata a
questo codice");

esito.setLivelloErrore(TipoErrore.ERRORE_GENERICO.getLivelloErrore());

esito.setCodiceErrore(TipoErrore.ERRORE_GENERICO.getCodiceErrore());

return esito;
}

} catch (Exception e) {

esito.setDescrizioneErrore("Il formato del codice domanda non è


valido.");

esito.setLivelloErrore(TipoErrore.ERRORE_GENERICO.getLivelloErrore());

esito.setCodiceErrore(TipoErrore.ERRORE_GENERICO.getCodiceErrore());

return esito;

} finally {

_logger.debug("[PwdEJB] - Fine getTestoDomanda");


}

return esito;
}

private String hiddenMail(String mail) {


_logger.debug("[PwdEJB] - Inizio hiddenMail " + mail);

String[] tokens =mail.split("@");


String indiHiddenMail="";
if(tokens.length>0){
for(int tokenIndex=0;tokenIndex<tokens.length;tokenIndex++) {
for (int i = 0; i < tokens[tokenIndex].length() / 2; i++){
int replaceIndex=(int) Math.floor((Math.random() *
tokens[tokenIndex].length()));
if(!tokens[tokenIndex].equals(".")) {
StringBuilder tmpTokens = new
StringBuilder(tokens[tokenIndex]);
tmpTokens.setCharAt(replaceIndex, '*');
tokens[tokenIndex] = tmpTokens.toString();

}
}
}
if(tokens.length==2){
indiHiddenMail=tokens[0]+'@'+tokens[1];
}
}
_logger.debug("[PwdEJB] - Fine hiddenMail " + indiHiddenMail);

return indiHiddenMail;
}

/*
* @Override public EsitoEJB<Boolean> forgotPwd(String codiSogg, String
newPwd) throws Exception{
* _logger.debug("[PwdEJB] - Inizio forgotPwd");
*
* PwdServiceDao dDao = new PwdServiceDao(dataSource); Boolean reset =
dDao.forgotPwd(codiSogg, newPwd); EsitoEJB<Boolean>
* esito = new EsitoEJB<Boolean>(); esito.setRisultato(reset);
*
* _logger.debug("[PwdEJB] - Fine forgotPwd");
*
* return esito; }
*
* @Override public EsitoEJB<Boolean> notificaScadenzaPwd(String codiSogg)
throws Exception{
* _logger.debug("[PwdEJB] - Inizio notificaScadenzaPwd");
*
* PwdServiceDao dDao = new PwdServiceDao(dataSource); Boolean reset =
dDao.resetPwd(codiSogg, email, newPwd);
* EsitoEJB<Boolean> esito = new EsitoEJB<Boolean>();
esito.setRisultato(reset);
*
* _logger.debug("[PwdEJB] - Fine notificaScadenzaPwd");
*
* return esito; }
*/
}

Potrebbero piacerti anche