using System; using System.Collections.Generic; using System.Data; using System.Linq; using Kreta.BusinessLogic.Classes; using Kreta.BusinessLogic.HelperClasses; using Kreta.Core; using Kreta.Core.ConnectionType; using Kreta.DataAccessManual; using Kreta.DataAccessManual.Interfaces; using Kreta.Framework; using Kreta.Framework.Security; using Kreta.Framework.Security.PasswordCrypting; using Kreta.Resources; using SDA.Kreta.Entities; namespace Kreta.BusinessLogic.Helpers { public class FelhasznaloBelepesHelper : LogicBase { public FelhasznaloBelepesHelper(IConnectionType connectionType) : base(connectionType) { } public LoginInfo AuthenticateUser(string bejelentkezesiNev, string plainPassword) { return Dal.CustomConnection.Run(ConnectionType, h => { var loginInfo = GetLoginInfo(h, bejelentkezesiNev); if (loginInfo.FelhasznaloId <= 0) { throw new UserNotFoundException(bejelentkezesiNev); } loginInfo.PasswordState = !loginInfo.JelszotKotelezoValtoztatni ? PasswordState.VALID : PasswordState.EXPIRED_BY_DATABASE; #if !DEBUG bool isInvalidPassword = string.IsNullOrWhiteSpace(plainPassword); if (!isInvalidPassword) { if (!string.IsNullOrWhiteSpace(loginInfo.NeptunNaploJelszo)) { isInvalidPassword = loginInfo.NeptunNaploJelszo != BasePasswordCrypter.EncodePasswordMD5(plainPassword); } else { isInvalidPassword = loginInfo.KodoltJelszo != BasePasswordCrypter.EncodePasswordSHA1(plainPassword, loginInfo.So); } } if (isInvalidPassword) { // Első lépés, a jelszó rossz. // Egyik algoritmus sem volt sikeres. loginInfo.MeghiusultBelepes += 1; h.FelhasznaloBelepes().UpdateMeghiusultBelepesek(loginInfo.BelepesId, loginInfo.MeghiusultBelepes); loginInfo.PasswordState = PasswordState.INVALID; } else { // Első lépes, a jelszó jó, beengedjük. h.FelhasznaloBelepes().UpdateMeghiusultBelepesek(loginInfo.BelepesId, 0); loginInfo.PasswordState = PasswordState.VALID; } #endif return loginInfo; }); } public void GrantLogin(int felhasznaloId, string bejelentkezesiNev, string plainPassword, int? gondviseloId = null, bool storedplain = false, bool kotelezoValtoztatni = false) { Dal.CustomConnection.Run(ConnectionType, h => { h.FelhasznaloBelepes().GrantLogin(felhasznaloId, bejelentkezesiNev, plainPassword, TanevId, gondviseloId, storedplain, IntezmenyId, kotelezoValtoztatni); }); } public LoginInfo GetLoginInfo(string bejelentkezesiNev, Guid? idpUniqueId = null) { return Dal.CustomConnection.Run(ConnectionType, h => { return GetLoginInfo(h, bejelentkezesiNev, idpUniqueId); }); } private LoginInfo GetLoginInfo(IDalHandler h, string bejelentkezesiNev, Guid? idpUniqueId = null) { if (idpUniqueId.HasValue) { bejelentkezesiNev = h.Felhasznalo().GetBejelentkezesiNev(idpUniqueId.Value); } var belepes = GetBelepes(h, bejelentkezesiNev); if (string.IsNullOrEmpty(belepes.Jelszo) && string.IsNullOrEmpty(belepes.NeptunNaploJelszo)) { throw new DataIntegrityException(ErrorResource.NemLetezikAFelhasznalohozJelszo); } var elsodlegesEmailCim = belepes.GondviseloId > 0 ? belepes.Gondviselo.Email.FirstOrDefault(x => !x.Torolt)?.EmailCim : belepes.Felhasznalo.Email.FirstOrDefault(x => x.Alapertelmezett && !x.Torolt)?.EmailCim; var loginInfo = new LoginInfo { UniqueIdentifier = belepes.FelhasznaloId, FelhasznaloId = belepes.FelhasznaloId, BelepesiNev = belepes.BejelentkezesiNev, KodoltJelszo = belepes.Jelszo, So = belepes.So, NeptunNaploJelszo = belepes.NeptunNaploJelszo, Vezeteknev = belepes.Felhasznalo.Vezeteknev, Utonev = belepes.Felhasznalo.Utonev, NyomtatasiNev = belepes.Felhasznalo.NyomtatasiNev, AnyjaNeve = belepes.Felhasznalo.AnyjaNeve, SzuletesiDatum = belepes.Felhasznalo.SzuletesiDatum, SzuletesiHely = belepes.Felhasznalo.SzuletesiHely ?? string.Empty, GondviseloId = belepes.GondviseloId > 0 ? belepes.GondviseloId : new int?(), GondviseloNeve = belepes.GondviseloId > 0 ? belepes.Gondviselo.Nev : string.Empty, FelhasznaloEgyediAzonosito = belepes.Felhasznalo.EgyediAzonosito, FelhasznaloIdpEgyediAzonosito = belepes.Felhasznalo.IdpEgyediAzonosito, GondviseloIdpEgyediAzonosito = belepes.GondviseloId > 0 ? (Guid?)belepes.Gondviselo.IdpEgyediAzonosito : null, GondviseloEgyediAzonosito = belepes.GondviseloId > 0 ? belepes.Gondviselo.EgyediAzonosito : null, IntezmenyId = belepes.IntezmenyId, AktivTanevId = belepes.TanevId, SelectedTanevId = belepes.TanevId, IntezmenyAzonosito = belepes.Intezmeny.Azonosito, AktivTanevEgyediAzonosito = belepes.Tanev.Sorszam, IsDeniedSzirIntezmenyUser = IsDeniedSzirIntezmenyUser(belepes), IsDeniedArchivIntezmenyUser = IsDeniedArchivIntezmenyUser(h, belepes.FelhasznaloId, belepes.IntezmenyId, belepes.TanevId), ElsodlegesEmailCim = elsodlegesEmailCim, BelepesId = belepes.ID, MeghiusultBelepes = belepes.MeghiusultBelepesek.HasValue && belepes.MeghiusultBelepesek.Value != -1 ? belepes.MeghiusultBelepesek.Value : 0 }; if (belepes.UtolsoBelepes.HasValue) { loginInfo.UtolsoBelepesIdeje = belepes.UtolsoBelepes.Value; } if (belepes.KotelezoValtoztatni.HasValue) { loginInfo.JelszotKotelezoValtoztatni = belepes.KotelezoValtoztatni.Value; } if (belepes.MeghiusultBelepesek.HasValue) { loginInfo.MeghiusultBelepes = belepes.MeghiusultBelepesek.Value; } return loginInfo; } private static bool IsDeniedSzirIntezmenyUser(FelhasznaloBelepes belepes) { return !string.Equals(belepes.BejelentkezesiNev, "admin", StringComparison.OrdinalIgnoreCase) && !string.Equals(belepes.BejelentkezesiNev, "KRETA_TECHNICAL_FORI", StringComparison.OrdinalIgnoreCase) && belepes.Intezmeny.IntezmenyAdatok.First(x => x.TanevId == belepes.TanevId && !x.Torolt).IsSzirIntezmeny; } private static bool IsDeniedArchivIntezmenyUser(IDalHandler h, int userId, int intezmenyId, int tanevId) { return h.Felhasznalo().IsTanuloOrGondviselo(userId, intezmenyId, tanevId); } public void ChangeUserPassword(string bejelentkezesiNev, string newPassword, bool kotelezoValtoztatni = false) { Dal.CustomConnection.Run(ConnectionType, h => { var felhasznaloBelepes = GetBelepes(h, bejelentkezesiNev); var salt = SaltGenerator.GenerateSalt(); var encodedPassword = BasePasswordCrypter.EncodePasswordSHA1(newPassword, salt); felhasznaloBelepes.Jelszo = encodedPassword; felhasznaloBelepes.So = salt; felhasznaloBelepes.JelszoValtoztatasIdeje = DateTime.Now; felhasznaloBelepes.KotelezoValtoztatni = kotelezoValtoztatni; felhasznaloBelepes.NeptunNaploJelszo = null; h.FelhasznaloBelepes().Update(felhasznaloBelepes); }); } private FelhasznaloBelepes GetBelepes(IDalHandler h, string bejelentkezesiNev) { var felhasznaloDal = h.Felhasznalo(); var belepesId = felhasznaloDal.GetAktualisFelhasznaloBelepesID(bejelentkezesiNev); FelhasznaloBelepes belepes = null; if (belepesId.IsEntityId()) { belepes = h.FelhasznaloBelepes().Get(belepesId.Value) as FelhasznaloBelepes; } if (belepes != null && !belepesId.IsEntityId()) { var kovBelepesId = felhasznaloDal.GetKovFelhasznaloBelepesID(bejelentkezesiNev); if (kovBelepesId.IsEntityId()) { throw new NextTanevBelepesException(bejelentkezesiNev); } throw new UserNotFoundException(bejelentkezesiNev); } if (belepes == null) { throw new UserNotFoundException(bejelentkezesiNev); } return belepes; } public FelhasznaloBelepesCo Get(string felhasznaloNev) { return Dal.CustomConnection.Run(ConnectionType, h => { var ds = h.FelhasznaloBelepes().Get(felhasznaloNev); if (ds?.Tables[0]?.Rows?.Count > 0) { var row = ds.Tables[0].Rows[0]; var co = new FelhasznaloBelepesCo(); co.Id = row.Field("ID"); co.FelhasznaloId = row.Field("C_FELHASZNALOID"); co.GondviseloId = row.Field("C_GONDVISELOID"); co.KotelezoValtoztatni = SDAConvert.ToBooleanFromTF(row.Field("C_KOTELEZOVALTOZTATNI")); co.MeghiusultBelepesek = SDAConvert.ToInt32(row.Field("C_MEGHIUSULTBELEPESEK")); co.UtolsoBelepes = row.Field("C_UTOLSOBELEPES"); co.JelszovaltoztatasIdeje = row.Field("C_JELSZOVALTOZTATASIDEJE"); co.ElfogadottGdprNyilatkozat = SDAConvert.ToBooleanFromTF(row.Field("C_ELFOGADOTTGDPRNYILATKOZAT")); co.GdprElfogadasDatuma = row.Field("C_GDPRELFOGADASDATUMA"); return co; } return null; }); } public List GetFelhasznaloBelepesCoList(int? tanevId = null) { DataSet dataSet = Dal.CustomConnection.Run(ConnectionType, dalHandler => dalHandler.FelhasznaloBelepes().GetFehasznaloBelepesDataSet(tanevId ?? TanevId)); var result = new List(); foreach (DataRow dataRow in dataSet.Tables[0].Rows) { var item = new FelhasznaloBelepesItemCo(dataRow); result.Add(item); } return result; } public bool IsUserNameExistsInTanev(string userName) { return Dal.CustomConnection.Run(ConnectionType, h => IsUserNameExistsInTanev(h, userName)); } public bool IsUserNameExistsInTanev(string userName, int felhasznaloId, bool isgondviselo) { return Dal.CustomConnection.Run(ConnectionType, h => IsUserNameExistsInTanev(h, userName, felhasznaloId, isgondviselo)); } private bool IsUserNameExistsInTanev(IDalHandler h, string userName, int? felhasznaloId = null, bool isgondviselo = false) { var dal = h.FelhasznaloBelepes(); return dal.IsUserNameExistsInTanev(userName, TanevId, felhasznaloId, isgondviselo); } } }