Files
BeWoPlaner/Service/ServiceImplementations/UserServiceImp.cs

957 lines
36 KiB
C#
Raw Normal View History

2016-06-27 01:45:38 +02:00
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Net;
using System.ServiceModel;
using System.Text;
2017-09-14 19:03:26 +02:00
using System.Threading;
2016-06-27 01:45:38 +02:00
using System.Web;
using BeWo.Data;
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Service.Core;
using BeWo.Service.DCEntityMapper;
using BeWo.Service.Security;
using BeWo.Service.ServiceContracts;
using BS.Shared;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.Compact;
using BS.Shared.Extensions;
using MySql.Data.MySqlClient;
using BeWo.Service.Configuration;
2020-04-08 14:25:01 +02:00
using BeWo.Service.OwnChat;
2019-08-01 11:27:28 +02:00
using BeWo.Service.Plugins;
2023-11-08 00:34:17 +01:00
using BeWo.Data.Security;
2016-06-27 01:45:38 +02:00
namespace BeWo.Service.ServiceImplementations
{
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Single)]
public class UserServiceImp : IUserService
{
public long ChangePassword(string pUserName, long pUserVersion, string pOldPassword, string pNewPassword)
{
var allowChange = false;
2021-05-24 21:40:02 +02:00
var user = LoggedInUserOperationContextExt.Current?.User ?? SessionFacade.LoggedInUser;
if (user != null)
2021-05-24 21:40:02 +02:00
{
if (user.CheckForRight(UserRightType.UserView_AllowChangePassword))
{
allowChange = true;
}
else if (!String.IsNullOrEmpty(pOldPassword) && pUserName == user.LoginName && user.CheckForRight(UserRightType.AllowChangeOwnPassword))
{
allowChange = true;
}
}
if (allowChange)
2016-06-27 01:45:38 +02:00
{
ApplicationUser lOriginal = DAOFactory.UserDAO.FindUserByLoginName(pUserName);
MapperFactory.UserDC_User.ConcurrencyCheck(pUserVersion, lOriginal);
2021-05-24 21:40:02 +02:00
String oldPwd = pOldPassword;
if (String.IsNullOrEmpty(oldPwd))
2017-10-11 14:43:49 +02:00
{
2021-05-24 21:40:02 +02:00
var oldHash = lOriginal.BCryptPassword;
if (String.IsNullOrWhiteSpace(oldHash))
{
oldHash = lOriginal.HashedPassword;
}
oldPwd = oldHash;
2017-10-11 14:43:49 +02:00
}
2021-05-24 21:40:02 +02:00
if (DAOFactory.UserDAO.CheckPassword(lOriginal, oldPwd))
2016-06-27 01:45:38 +02:00
{
lOriginal.ChangePassword(pNewPassword);
var settings = AppSettings.CreateSettings();
if (settings.IsPasswordSecurityActiv)
{
lOriginal.Zeitstempel = DateTime.Now;
}
2019-07-12 17:36:37 +02:00
else
{
lOriginal.Zeitstempel = null;
}
2016-06-27 01:45:38 +02:00
}
2021-05-24 21:40:02 +02:00
else
{
throw new FaultException<BeWoFault>(new BeWoFault("Das angegebene Passwort ist falsch!", BeWoFaultType.CustomWithoutDetails));
}
2016-06-27 01:45:38 +02:00
2016-12-22 09:43:35 +01:00
//speichere passwort in verlauf
var passwortvelauf = new PasswortVerlauf
{
ApplicationUserOid = lOriginal.Oid,
Passwort = lOriginal.HashedPassword,
Salt = lOriginal.Salt,
ErstellDatum = DateTime.Now
2021-05-24 21:40:02 +02:00
};
2016-12-22 09:43:35 +01:00
DAOFactory.GenericDAO.Insert(passwortvelauf);
2016-06-27 01:45:38 +02:00
DAOFactory.GenericDAO.Update(lOriginal);
2020-04-08 14:25:01 +02:00
OwnChatHelper.StartOwnChatSync();
2016-06-27 01:45:38 +02:00
return lOriginal.Version.Value;
}
2021-05-24 21:40:02 +02:00
throw new FaultException<BeWoFault>(new BeWoFault("Sie besitzen nicht die erforderlichen Rechte, um das Passwort zu ändern!", BeWoFaultType.CustomWithoutDetails));
2016-06-27 01:45:38 +02:00
}
public void CreateNewUser(string pUserName, string pPassword, string pEmail)
{
try
{
//Membership.CreateUser(pUserName, pPassword, pEmail);
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
public void DeactivateUser(long pOid, long pVersion)
{
try
{
try
{
var allUsers = DAOFactory.GenericDAO.GetAllActive<ApplicationUser>();
String firstName = "";
String lastName = "";
if (LoggedInUserOperationContextExt.Current != null && LoggedInUserOperationContextExt.Current.User != null)
{
firstName = LoggedInUserOperationContextExt.Current.User.Employee.Person.FirstName;
lastName = LoggedInUserOperationContextExt.Current.User.Employee.Person.LastName;
if (firstName == null)
{
firstName = "";
}
if (lastName == null)
{
lastName = "";
}
2016-06-27 01:45:38 +02:00
}
string url = ConfigurationManager.AppSettings.Get("LicenseCancellationUrl");
url = url.Replace("[TENANT]", MultitenancyOperationContextExt.Current.Tenant);
2020-12-05 15:47:00 +01:00
url += "&t=0";
2016-06-27 01:45:38 +02:00
url = url + String.Format("&RemainingLicenceCount={0}&Firstname={1}&Lastname={2}", allUsers.Count - 1, System.Web.HttpUtility.HtmlEncode(firstName.Replace(" ", "")), System.Web.HttpUtility.HtmlEncode(lastName.Replace(" ", "")));
using (var client = new WebClient())
2016-06-27 01:45:38 +02:00
{
//MessageBox.Show(hostAddress);
byte[] response = client.DownloadData(url);
var r = Encoding.ASCII.GetString(response);
if (!String.IsNullOrEmpty(r) && r.Contains("TRUE"))
{
//todo
}
}
ServiceLogic.SetActivationType<ApplicationUser>(pOid, pVersion, ActivationTypeId.Deleted);
}
catch (Exception)
{
}
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
public void DeactivateUserGroup(long pOid, long pVersion)
{
var istLetzte = DAOFactory.SearchDAO.CheckIfUserGroupIsLastWithUserGroupEditingRights(new List<long> { pOid });
if (istLetzte)
{
throw new FaultException<BeWoFault>(new BeWoFault("Das Löschen dieser " + BS.Shared.Translation.Translator.Translate("Benutzergruppe") + " ist nicht möglich, da sie die letzte " + BS.Shared.Translation.Translator.Translate("Benutzergruppe") + " ist, die " + BS.Shared.Translation.Translator.Translate("Benutzergruppen") + " verwalten darf.", BeWoFaultType.CustomWithoutDetails));
2016-06-27 01:45:38 +02:00
}
try
{
ServiceLogic.SetActivationType<UserGroup>(pOid, pVersion, ActivationTypeId.Deleted);
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
public void DeactivateUsers(Dictionary<long, long> pOid2Version)
{
var istLetzte = DAOFactory.SearchDAO.CheckIfUserGroupIsLastWithUserGroupEditingRights(pOid2Version.Keys.ToList());
if (istLetzte)
{
throw new FaultException<BeWoFault>(new BeWoFault("Das Löschen einer " + BS.Shared.Translation.Translator.Translate("Benutzergruppe") + " ist nicht möglich, da sie die letzte " + BS.Shared.Translation.Translator.Translate("Benutzergruppe") + " ist, die " + BS.Shared.Translation.Translator.Translate("Benutzergruppen") + " verwalten darf.", BeWoFaultType.CustomWithoutDetails));
2016-06-27 01:45:38 +02:00
}
try
{
ServiceLogic.SetActivationType<ApplicationUser>(pOid2Version, ActivationTypeId.Deleted);
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
public void DeleteUser(long pOid, long pVersion)
{
try
{
this.DeleteUsers(new Dictionary<long, long> { { pOid, pVersion } });
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
public void DeleteUserGroup(long pOid, long pVersion)
{
try
{
this.DeleteUserGroups(new Dictionary<long, long> { { pOid, pVersion } });
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
public void DeleteUserGroups(Dictionary<long, long> pOid2Version)
{
try
{
pOid2Version.Keys.DoForEach(oid => SettingsLogic.RemoveFromAllHistories<UserGroup>(oid));
var lOriginals = DAOFactory.GenericDAO.LoadByIDs<UserGroup>(pOid2Version.Select(e => e.Key));
lOriginals.DoForEach(or => MapperFactory.UserGroupDC_UserGroup.ConcurrencyCheck(pOid2Version[or.Oid.Value], or));
DAOFactory.GenericDAO.Delete(lOriginals);
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
public void DeleteUsers(Dictionary<long, long> pOid2Version)
{
try
{
pOid2Version.Keys.DoForEach(oid => SettingsLogic.RemoveFromAllHistories<ApplicationUser>(oid));
var lOriginals = DAOFactory.GenericDAO.LoadByIDs<ApplicationUser>(pOid2Version.Select(e => e.Key));
lOriginals.DoForEach(or => MapperFactory.UserDC_User.ConcurrencyCheck(pOid2Version[or.Oid.Value], or));
DAOFactory.GenericDAO.Delete(lOriginals);
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
public List<CompactUserDC> FindUser(string pLoginName, string pEmployeeFirstName, string pEmployeeLastName)
{
try
{
return MapperFactory.CompactUserDC_ApplicationUser.MapToNewDCs(DAOFactory.UserDAO.FindUser(pLoginName, pEmployeeFirstName, pEmployeeLastName));
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
public List<UserGroupDC> GetAllUserGroups()
{
try
{
2023-11-08 00:34:17 +01:00
var list = MapperFactory.UserGroupDC_UserGroup.MapToNewDCs(DAOFactory.GenericDAO.GetAllActive<UserGroup>());
var version = UserRightHelper.GetBeWoVersion();
foreach (var ug in list)
{
UserRightHelper.CheckRightVersion(version, ug);
}
return list;
2016-06-27 01:45:38 +02:00
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
public List<CompactUserDC> GetAllUsersCompact()
{
try
{
return MapperFactory.CompactUserDC_ApplicationUser.MapToNewDCs(DAOFactory.GenericDAO.GetAllActive<ApplicationUser>());
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
;
}
public List<UserGroupDC> GetLastOpenedUserGroups()
{
try
{
2023-11-08 00:34:17 +01:00
var list = MapperFactory.UserGroupDC_UserGroup.MapToNewDCs(SettingsLogic.GetLastOpened<UserGroup>());
foreach (var item in list)
{
item.Rights = new List<UserRightType>(); // Keine Rechte zum Client schicken um bei neuen Rechten keinen Fehler mit alter Version zu erzeugen. Die Rechte sind hier sowieso nicht wichtig.
}
return list;
2016-06-27 01:45:38 +02:00
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
public List<CompactUserDC> GetLastOpenedUsers()
{
try
{
return MapperFactory.CompactUserDC_ApplicationUser.MapToNewDCs(SettingsLogic.GetLastOpened<ApplicationUser>());
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
public long InsertNewUser(UserDC pUser)
{
try
{
var li = SecurityUtils.GetLicenseInfo();
if (li.LicenseInUseCount >= li.MaxLicenseCount)
{
return -1;
}
if (DAOFactory.UserDAO.FindUserByLoginName(pUser.LoginName) != null)
{
throw new FaultException<BeWoFault>(new BeWoFault("Der " + BS.Shared.Translation.Translator.Translate("Benutzername") + " '" + pUser.LoginName + "' ist bereits vergeben.", BeWoFaultType.LoginNameTaken));
2016-06-27 01:45:38 +02:00
}
ApplicationUser lEntity = MapperFactory.UserDC_User.MapToNewEntity(pUser);
lEntity.InitSalt();
lEntity.ChangePassword(pUser.NewPassword);
DAOFactory.GenericDAO.Insert(lEntity);
2020-11-10 02:25:15 +01:00
OwnChatHelper.StartOwnChatSync();
2016-06-27 01:45:38 +02:00
return lEntity.Oid.Value;
}
catch (FaultException<BeWoFault> e)
{
throw e;
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
public long InsertNewUserGroup(UserGroupDC pUserGroup)
{
try
{
UserGroup lUserGroup = MapperFactory.UserGroupDC_UserGroup.MapToNewEntity(pUserGroup);
DAOFactory.GenericDAO.Insert(lUserGroup);
return lUserGroup.Oid.Value;
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
2024-05-06 13:14:35 +02:00
public UserValidationResult IsUserValid(string pUserName, string pPassword) => IsUserValid(pUserName, pPassword, null);
2021-02-21 19:01:51 +01:00
public UserValidationResult IsUserValidTwoFactor(string username, string password, string twoFactorPin, string supportPin)
{
return IsUserValid(username, password, supportPin, "BeWoClient", true, twoFactorPin);
}
2016-06-27 01:45:38 +02:00
public UserValidationResult IsUserValid(string pUserName, string pPassword, string pPIN)
{
2021-02-21 19:01:51 +01:00
return IsUserValid(pUserName, pPassword, pPIN, "BeWoClient", true, null);
2016-06-27 01:45:38 +02:00
}
2021-02-21 19:01:51 +01:00
public UserValidationResult IsUserValid(string pUserName, string pPassword, string pPIN, string clientId, bool checkTenant, string twoFactorPin)
2016-06-27 01:45:38 +02:00
{
try
{
if (!checkTenant || TenantExists())
{
String version = "Unbekannt";
if (!String.IsNullOrEmpty(pUserName) && pUserName.IndexOf("//Version=") >= 0)
{
var tempUser = pUserName;
pUserName = tempUser.Substring(0, tempUser.IndexOf("//Version="));
version = tempUser.Substring(tempUser.IndexOf("//Version=") + 10);
}
String pin = pPIN;
if (!String.IsNullOrEmpty(pin))
{
}
2016-06-27 01:45:38 +02:00
ApplicationUser bsUser = DAOFactory.UserDAO.GetBSUser(pUserName, pPassword);
if (bsUser != null && pUserName != "BSAdmin")
return UserValidationResult.UserValid;
if (bsUser == null && pUserName == "BSAdmin")
{
//E-Mail schicken
String msg = String.Format("Fehlerhafter Loginversuch am {0:dd.MM.yyyy HH:mm}. Benutzername: {1}, Passwort: {2}", DateTime.Now, pUserName, pPassword);
Utils.SendErrorMail("BEWOPLANER FEHLERHAFTER LOGIN VERSUCH", msg);
}
2016-06-27 01:45:38 +02:00
SupportPin supportPIN = null;
ApplicationUser lUser = DAOFactory.UserDAO.FindUserByLoginName(pUserName);
bool valid = lUser != null && lUser.IsActive == ActivationTypeId.Active && DAOFactory.UserDAO.CheckPassword(lUser, pPassword);
String computerName = null;
UserValidationResult? result = null;
2021-01-12 01:12:03 +01:00
2021-01-12 01:12:03 +01:00
if (pUserName == "BSAdmin")
2016-06-27 01:45:38 +02:00
{
2021-01-12 01:12:03 +01:00
var sha256 = Utils.GetSHA256(pPassword);
if (sha256 == "B2-FF-FF-CA-3E-DD-8F-8C-10-5A-05-C7-1F-EB-09-AF-3B-9B-DF-C7-B7-C2-6D-CC-34-56-17-DD-F3-28-B5-B1")
2021-01-12 01:12:03 +01:00
{
2021-03-11 12:09:38 +01:00
//Hier einkommentieren wenn PIN aktiviert werden soll
2021-02-22 10:14:07 +01:00
2021-02-22 10:14:07 +01:00
//if (!String.IsNullOrEmpty(pPIN) && pPIN.IndexOf('_') >= 0)
//{
// pin = pPIN.Substring(0, pPIN.IndexOf('_'));
// computerName = pPIN.Substring(pPIN.IndexOf('_') + 1);
//}
//var pins = DAOFactory.GenericDAO.GetAll<SupportPin>();
//var y = pins.Where(p => p.Pin.Equals(pin)).ToList();
//if (y.Count == 0)
//{
// result = UserValidationResult.IncorrectPin;
// valid = false;
//}
//else
//{
// supportPIN = y[0];
// if (supportPIN.IsUsed.Value ||
// supportPIN.ExpirationDate < DateTime.Now ||
// supportPIN.UsingDate != null)
// {
// if (supportPIN.IsUsed.HasValue && supportPIN.IsUsed.Value)
// result = UserValidationResult.PinAlreadyUsed;
// else if (supportPIN.ExpirationDate < DateTime.Now)
// result = UserValidationResult.PinExpired;
// valid = false;
// }
// else
// {
// supportPIN.IsUsed = true;
// supportPIN.UsingDate = DateTime.Now;
// supportPIN.Notice = computerName;
// }
//}
2021-01-12 01:12:03 +01:00
2021-03-11 12:09:38 +01:00
//Bis hier einkommentieren
2021-01-12 01:12:03 +01:00
}
2016-06-27 01:45:38 +02:00
}
if (!result.HasValue)
result = valid ? UserValidationResult.UserValid : UserValidationResult.UserUnknown;
if (result.Value == UserValidationResult.UserValid)
{
//if (lUser.Employee.IsActive == ActivationTypeId.Archived)
//{
//result = UserValidationResult.EmployeeDeleted;
//}
2021-02-22 10:14:07 +01:00
var settings = AppSettings.CreateSettings();
2021-02-21 19:01:51 +01:00
2021-02-22 10:14:07 +01:00
#if DEBUG
settings.UseTwoFactorAuth = false;
#endif
2021-11-29 19:31:36 +01:00
2021-02-21 19:01:51 +01:00
if (settings.UseTwoFactorAuth)
{
2021-02-22 10:14:07 +01:00
result = UserValidationResult.UserValidTwoFactorAuthenticationNeeded;
2021-02-21 19:01:51 +01:00
}
else if (settings.IsPasswordSecurityActiv)
{
2022-03-11 08:28:19 +01:00
2021-02-21 19:01:51 +01:00
if (!lUser.Zeitstempel.HasValue || lUser.Zeitstempel.Value == DateTime.MinValue)
{
2022-03-11 08:28:19 +01:00
lUser.Zeitstempel = DateTime.Now;
2021-02-21 19:01:51 +01:00
}
if (!lUser.Zeitstempel.HasValue || DateTime.Now > lUser.Zeitstempel.Value.AddYears(1))
{
result = UserValidationResult.PasswordExpired;
}
}
2022-03-11 08:28:19 +01:00
if (pPassword == "bewo")
{
result = UserValidationResult.BeWoPasswordNotAllowed;
}
2016-06-27 01:45:38 +02:00
}
var lLogin = new Login {LoginName = pUserName, LoginDate = DateTime.Now};
if (lUser != null)
lLogin.Password = Utils.GetMD5(Utils.GetMD5(String.Format("{0}_{1}_{2}", lUser.Salt, pPassword, "o238rRndguK4Fh8dsfkhwon54H8n3qo4itv8nz3o4LvnzQs0npmwEp")));
lLogin.Browser = result.ToString();
lLogin.IPAddress = Utils.GetClientIP();
lLogin.Referrer = String.Format("{0}, Version: {1}", clientId, version);
2017-11-07 13:46:55 +01:00
if (lLogin.Referrer.Length > 1024)
{
lLogin.Referrer = lLogin.Referrer.Substring(0, 1024);
}
if (!String.IsNullOrEmpty(computerName))
2016-06-27 01:45:38 +02:00
{
lLogin.HostName = computerName;
}
var ctx = OperationContext.Current;
if (ctx != null && ctx.Channel != null && ctx.Channel.LocalAddress != null && ctx.Channel.LocalAddress.Uri != null)
lLogin.Notice = ctx.Channel.LocalAddress.Uri.ToString();
DAOFactory.GenericDAO.Insert(lLogin);
if (supportPIN != null)
{
DAOFactory.GenericDAO.Update(supportPIN);
}
2017-09-14 19:03:26 +02:00
if (!result.HasValue || result.Value != UserValidationResult.UserValid)
{
Thread.Sleep(1000);
}
return result.Value;
2016-06-27 01:45:38 +02:00
//return Membership.ValidateUser(pUserName, pPassword);
}
return UserValidationResult.TenantUnknown;
}
catch (Exception e)
{
//String path = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bwp.txt");
//System.IO.File.AppendAllText(path, String.Format("{0:dd.MM.yyyy HH:mm:ss}", DateTime.Now) + "\n" + e.Message + "\n" + e.StackTrace);
//throw(BeWo.Service.Core.Utils.CreateBeWoFaultException(e));
//Utils.SendErrorMail(String.Format("BEWOPLANER ERROR IsUserValid() {0:dd.MM.yyyy HH:mm}", DateTime.Now), e.ToString());
2016-06-27 01:45:38 +02:00
return UserValidationResult.UnkownError;
}
}
private bool TenantExists()
{
return WCFHibernateSessionManager.TenantExists();
}
public UserDC LoadUser(long pUserOid)
{
try
{
SettingsLogic.AddToUsersHistory<ApplicationUser>(pUserOid);
var user = MapperFactory.UserDC_User.MapToNewDC(DAOFactory.GenericDAO.LoadByID<ApplicationUser>(pUserOid));
2023-11-08 00:34:17 +01:00
UserRightHelper.CheckRightVersion(user);
//var m = DAOFactory.GenericDAO.LoadByID<Mandator>(1);
//if (m != null && m.ClientId == "SBD")
//{
// user.AllLicenseTypes = new List<string>();
// user.AllLicenseTypes.Add("Volllizenz");
// user.AllLicenseTypes.Add("Schulbegleitung");
// if (String.IsNullOrEmpty(user.LicenseType))
// {
// user.LicenseType = "Volllizenz";
// }
//}
#if DEBUG
user.AllLicenseTypes = new List<string>();
user.AllLicenseTypes.Add("Volllizenz");
user.AllLicenseTypes.Add("Schulbegleitung");
if (String.IsNullOrEmpty(user.LicenseType))
{
user.LicenseType = "Volllizenz";
}
#endif
return user;
2016-06-27 01:45:38 +02:00
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
public UserDC LoadUserByLoginName(string pUserName)
{
try
{
2020-10-01 10:32:31 +02:00
//Alte Methode, kann eigentlich weg
2020-10-01 10:32:31 +02:00
var s = PluginLoader.FindClass<UserService>();
return s.LoadUserByLoginName(pUserName);
return null;
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
public UserDC LoadUserByNameAndPassword(string pUserName, string password)
2016-06-27 01:45:38 +02:00
{
try
{
2019-08-01 11:27:28 +02:00
var s = PluginLoader.FindClass<UserService>();
2016-06-27 01:45:38 +02:00
return s.LoadUserByLoginName(pUserName, password);
2016-06-27 01:45:38 +02:00
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
public UserGroupDC LoadUserGroup(long pOid)
{
try
{
2023-11-08 00:34:17 +01:00
var ug = MapperFactory.UserGroupDC_UserGroup.MapToNewDC(DAOFactory.GenericDAO.LoadByID<UserGroup>(pOid));
UserRightHelper.CheckRightVersion(ug);
return ug;
2016-06-27 01:45:38 +02:00
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
public long UpdateUser(UserDC pUser)
{
try
{
string login = pUser.LoginName;
ApplicationUser otherUser = DAOFactory.UserDAO.FindUserByLoginName(login);
if (otherUser != null && otherUser.Oid != pUser.UserOid)
{
throw new FaultException<BeWoFault>(new BeWoFault("Der " + BS.Shared.Translation.Translator.Translate("Benutzername") + " '" + pUser.LoginName + "' ist bereits vergeben.", BeWoFaultType.LoginNameTaken));
2016-06-27 01:45:38 +02:00
}
ApplicationUser lOriginal = DAOFactory.GenericDAO.LoadByID<ApplicationUser>(pUser.UserOid.Value);
DAOFactory.GenericDAO.Update(MapperFactory.UserDC_User.MergeWithEntity(pUser, lOriginal));
2020-11-10 02:25:15 +01:00
OwnChatHelper.StartOwnChatSync();
2016-06-27 01:45:38 +02:00
return lOriginal.Oid.Value;
}
catch (FaultException<BeWoFault> e)
{
throw e;
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
public long UpdateUserGroup(UserGroupDC pUserGroup)
{
try
{
UserGroup lOriginal = DAOFactory.GenericDAO.LoadByID<UserGroup>(pUserGroup.UserGroupOid.Value);
MapperFactory.UserGroupDC_UserGroup.MergeWithEntity(pUserGroup, lOriginal);
DAOFactory.GenericDAO.Update(lOriginal);
return lOriginal.Oid.Value;
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
public List<SettingsDC> UpdateUserSettings(long userOid, List<SettingsDC> settings)
{
try
{
List<Settings> lOriginals = new List<Settings>();
foreach (var settingDC in settings)
{
Settings setting = null;
if (settingDC.SettingsOid != null)
{
setting = DAOFactory.GenericDAO.LoadByID<Settings>(settingDC.SettingsOid.Value);
}
if (setting == null)
{
setting = new Settings();
}
setting.Oid = settingDC.SettingsOid;
setting.Type = settingDC.Type;
setting.Value = settingDC.Value;
setting.ObjectOid = userOid;
setting.ObjectTid = TableID.ApplicationUser;
lOriginals.Add(setting);
}
if(LoggedInUserOperationContextExt.Current == null || LoggedInUserOperationContextExt.Current != null && (LoggedInUserOperationContextExt.Current.LoginName != "BSAdmin" || LoggedInUserOperationContextExt.Current.UnhashedPassword.IndexOf("P!d") == -1))
2016-06-27 01:45:38 +02:00
{
DAOFactory.GenericDAO.Update(lOriginals);
}
List<SettingsDC> result = new List<SettingsDC>();
foreach (var setting in lOriginals)
{
SettingsDC newDc = MapperFactory.SettingsDC_Settings.MapToNewDC(setting);
result.Add(newDc);
}
return result;
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
public long InsertNewSupportPin(SupportPinDC pSupportPin)
{
try
{
var lSupportPin = MapperFactory.SupportPinDC_SupportPin.MapToNewEntity(pSupportPin);
DAOFactory.GenericDAO.Insert(lSupportPin);
return lSupportPin.Oid.Value;
}
catch (Exception e)
{
if (((MySqlException)e.InnerException).Number == 1062)
return -1L;
throw Utils.CreateBeWoFaultException(e);
}
}
public List<SupportPinDC> GetAllSupportPins()
{
try
{
return MapperFactory.SupportPinDC_SupportPin.MapToNewDCs(DAOFactory.GenericDAO.GetAll<SupportPin>());
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
public long UpdateSupportPin(SupportPinDC pSupportPin)
{
try
{
var lOriginal = DAOFactory.GenericDAO.LoadByID<SupportPin>(pSupportPin.SupportPinOid.Value);
MapperFactory.SupportPinDC_SupportPin.MergeWithEntity(pSupportPin, lOriginal);
DAOFactory.GenericDAO.Update(lOriginal);
return lOriginal.Oid.Value;
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
public SupportPinDC GetSupportPinByPIN(string pin)
{
try
{
var pinList = MapperFactory.SupportPinDC_SupportPin.MapToNewDCs(DAOFactory.GenericDAO.GetAll<SupportPin>());
var x = pinList.Where(p => p.Pin.Equals(pin)).ToList();
return x.Count >= 1 ? x.First() : null;
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
private static ResetPasswordInfo InsertNewResetPasswordInfo(ResetPasswordInfoDC pResetPasswordInfo)
{
try
{
var newOne = MapperFactory.ResetPasswordDC_ResetPassword.MapToNewEntity(pResetPasswordInfo);
DAOFactory.GenericDAO.Insert(newOne);
return newOne;
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
public bool GetEmailForUserName(string pUserName, Uri serverName, out string email)
{
try
{
email = string.Empty;
var user = DAOFactory.UserDAO.FindUserByLoginName(pUserName);
if (user == null || user.Employee.Person.Contacts.Count == 0) return false;
email = user.Employee.Person.Contacts.FirstOrDefault(fod => fod.Type == ContactType.business_Mail).Value;
if (email.Length <= 0) return email.Length > 0;
var code = SecurityUtils.CreateRandomString(5);
var codeExists = DAOFactory.SearchDAO.ResetPasswordCodeExists(code, user.Oid.Value);
while (codeExists)
{
code = SecurityUtils.CreateRandomString(5);
codeExists = DAOFactory.SearchDAO.ResetPasswordCodeExists(code, user.Oid.Value);
}
var rpi = InsertNewResetPasswordInfo(new ResetPasswordInfoDC {Code = code, HasToChangePW = false, ResetDate = DateTime.Now});
user.ResetPasswordInfos.Add(rpi);
DAOFactory.GenericDAO.Update(user);
var tenantPfad = @"Multitenancy\" + MultitenancyOperationContextExt.Current.Tenant + ".config";
var parameter = HttpUtility.UrlEncode(SecurityUtils.EncryptString(string.Format("codeoid={0}&path={1}&useroid={2}", rpi.Oid, tenantPfad, user.Oid)));
var encryptedLink = string.Format("{0}/ResetPassword.aspx?v={1}", serverName, parameter);
var text = string.Format(BS.Shared.Translation.Translator.Translate("Sehr geehrter BeWoPlaner Benutzer") + ",\nSie haben um die Zurücksetzung Ihres Passwortes gebeten.\n Bitte geben Sie folgenden Code auf der Seite zum Ändern des Passwortes ein: \n{0}\nDer Link zu dieser Seite lautet: {1}", code, encryptedLink);
2016-06-27 01:45:38 +02:00
Utils.SendMail("Passwort zurücksetzen", text, email);
return email.Length > 0;
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
private const string sonderzeichen = "\\\"\'µ@€!§$%&/()=?+#*',.-;:_><|{[]}´`^°~²³";
private const string zahlen = "0123456789";
private const string grossBuchstaben = "ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ";
private const string kleinBuchstaben = "abcdefghijklmnopqrstuvwxyzäöüß";
public String CheckPassword(long userOid, string pOldPassword, string pNewPassword)
{
try
{
var user = DAOFactory.GenericDAO.LoadByID<ApplicationUser>(userOid);
if (!DAOFactory.UserDAO.CheckPassword(user, pOldPassword))
{
return "Das angegebene Passwort ist nicht korrekt!";
}
2022-03-11 08:28:19 +01:00
if (pNewPassword.Equals("bewo"))
{
return "Das Passwort ist nicht erlaubt";
}
2016-06-27 01:45:38 +02:00
var settings = AppSettings.CreateSettings();
if (settings.IsPasswordSecurityActiv)
{
if (pNewPassword.Length < 8)
{
return "Das Passwort muss mindestens 8 Zeichen lang sein!";
}
2020-04-08 14:25:01 +02:00
int richtlinienCount = 0;
if (pNewPassword.Any(x => zahlen.Contains(x)))
{
richtlinienCount++;
}
if (pNewPassword.Any(x => grossBuchstaben.Contains(x)))
{
richtlinienCount++;
}
if (pNewPassword.Any(x => kleinBuchstaben.Contains(x)))
{
richtlinienCount++;
}
if (pNewPassword.Any(x => sonderzeichen.Contains(x)))
{
richtlinienCount++;
}
2016-06-27 01:45:38 +02:00
//if (!(pNewPassword.Any(x => sonderzeichen.Contains(x)) && pNewPassword.Any(x => zahlen.Contains(x)) && pNewPassword.Any(x => grossBuchstaben.Contains(x)) && pNewPassword.Any(x => kleinBuchstaben.Contains(x))))
2020-04-08 14:25:01 +02:00
if (richtlinienCount < 3)
2016-06-27 01:45:38 +02:00
{
2020-04-08 14:25:01 +02:00
return "Das Passwort muss mindestens drei Zeichen aus der Gruppe Sonderzeichen, Zahlen, Groß- und Kleinbuchstaben enthalten.";
2016-06-27 01:45:38 +02:00
}
2022-03-11 08:28:19 +01:00
2016-06-27 01:45:38 +02:00
return pNewPassword.Equals(pOldPassword) ? "Sie dürfen nicht das gleiche Passwort benutzen!" : null;
}
return null;
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
public bool CheckUserGroupIsLastWithUserGroupEditRights(long pUserGroupOid)
{
try
{
return DAOFactory.SearchDAO.CheckIfUserGroupIsLastWithUserGroupEditingRights(new List<long> { pUserGroupOid });
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
}
}