using System; using System.Collections.Specialized; using System.Linq; using System.Net; using System.Web; using System.Web.Mvc; using System.Web.Security; using BeWoPlanerMobil.Models; using BeWoPlanerMobil.Service; using BeWoPlanerMobil.Util; using BS.Shared; using BS.Shared.DataContracts; using DevExpress.XtraPrinting; using HttpCookie = System.Web.HttpCookie; namespace BeWoPlanerMobil.Controllers { public class LoginController : AbstractBaseController { private static readonly string GetServerUrl = "https://support.bewoplaner.de/api/getserver.php?k={0}&type=1"; public static string LoginErrorIndex => "LoginErrorIndex"; [HttpPost] public ActionResult Index() { try { var url = GetRedirectUrlFromTenant(MobileSessionFacade.Tenant); if (!string.IsNullOrEmpty(url)) { return Redirect(url); } ViewData[LoginErrorIndex] = null; //string.Empty; TempData[LoginErrorIndex] = null; //string.Empty; var isUserLoggedIn = MobileSessionFacade.IsUserLoggedIn(); if(isUserLoggedIn && !Request.Browser.Browser.Equals("InternetExplorer")) { var loginState = MobileUtils.GetLoginState(MobileSessionFacade.Tenant); if(loginState.Message != null && loginState.State > -1) { TempData[MobileUtils.TempDataLoginStateKey] = loginState; if(loginState.State == 0) { ViewData[LoginErrorIndex] = loginState.Message; return Logout(); } } var user = LoggedInUser; Log.Info($"LoginController.Index(): Loggedin User: {user.LoginName}"); MobileSessionFacade.Mandator = DcToMokMapper.CreateMandator(OperationsService.GetMandator()); var viewServiceRecords = user.HasRight(UserRightType.ServiceRecordView_View) && user.HasRight(UserRightType.ServiceRecordView_Create); var viewAll = user.HasRight(UserRightType.ViewAll); //if(!MobileSessionFacade.LoggedInUser.UserGroups.Any(a => a.Rights.Any(f => f.RightType.Equals(UserRightType.ServiceRecordView_View))) && // !MobileSessionFacade.LoggedInUser.UserGroups.Any(a => a.Rights.Any(f => f.RightType.Equals(UserRightType.ViewAll)))) if(!viewServiceRecords && !viewAll) { ViewData[LoginErrorIndex] = HttpUtility.HtmlDecode("Sie haben keine ausreichenden Berechtigungen, um die Zeiterfassung anzeigen zu lassen."); MobileSessionFacade.LogUserOut(); FormsAuthentication.SignOut(); return View("Index"); } FormsAuthentication.SetAuthCookie(LoggedInUser.LoginName, true); ViewData[LoginErrorIndex] = string.Empty; var keks = new HttpCookie(MobileSessionFacade.CookieName) { Value = MobileSessionFacade.Tenant, Expires = DateTime.Now.AddDays(1) }; HttpContext.Response.SetCookie(keks); var brauser = Request.Browser; var brauserInfoDC = new BeWoMobilBrowserInfoDC { Type = brauser.Type, Name = brauser.Browser, BrowserVersion = brauser.Version, Platform = brauser.Platform, Tenant = MobileSessionFacade.Tenant }; // TODO: Führt manchmal zu Exception try { OperationsService.InsertBeWoMobilBrowserInfo(brauserInfoDC); } catch(Exception exception) { Log.Error("Fehler beim Speichern der BrowserInfo: " + exception); } AbstractModel.TimeOfLastAction = $"{DateTime.Now:yyyy-MM-dd}T{DateTime.Now:HH:mm:ss}"; return RedirectToActionPermanent("Main", "Main"); } if(isUserLoggedIn && Request.Browser.Browser.Equals("InternetExplorer")) { MobileSessionFacade.LogUserOut(); FormsAuthentication.SignOut(); } var beWoCookie = HttpContext.Response.Cookies[MobileSessionFacade.CookieName]; if(beWoCookie != null) { var newCookie = new HttpCookie(MobileSessionFacade.CookieName) { Expires = DateTime.Now.AddDays(-1), SameSite = SameSiteMode.Strict }; Response.Cookies.Add(newCookie); } Log.Info($"LoginController.Index(): Login failed! Tenant = {MobileSessionFacade.Tenant}"); ViewData[LoginErrorIndex] = Request.Browser.Browser.Equals("InternetExplorer") ? "Dieser Browser ist nicht mit dem mobilen BeWoPlaner kompatibel. Bitte benutzen Sie einen anderen Browser als den Internet Explorer." : "Die Anmeldung ist fehlgeschlagen. Bitte überprüfen Sie Benutzername und Passwort."; return View("Index"); } catch(Exception e) { Log.Info($"Exception: " + e.Message + "\n" + e.StackTrace); if(e.InnerException != null) { Log.Info($"\n\nInnerException: " + e.InnerException.Message + "\n" + e.InnerException.StackTrace); } return View("Index"); } } public ActionResult Index(string tenant, string returnUrl) { if(returnUrl != null) { return RedirectToAction("Index", new {tenant = MobileSessionFacade.Tenant}); } var queryString = HttpContext.Request.QueryString; if(queryString != null && queryString.HasKeys() && queryString.AllKeys.Contains("isSessionTimedOut")) { ViewData[IsSessionTimedOut] = "Sie wurden automatisch abgemeldet, da Ihre Session abgelaufen ist."; } var errorMessage = TempData[TempDataConstants.ErrorMessageKey]; if(tenant is null) { var keks = HttpContext.Request.Cookies.Get(MobileSessionFacade.CookieName); if(keks != null) { tenant = keks.Value; } } if(MobileSessionFacade.IsUserLoggedIn()) { return RedirectToActionPermanent("Main", "Main"); } var url = GetRedirectUrlFromTenant(tenant); if (!string.IsNullOrEmpty(url)) { return Redirect(url); } MobileSessionFacade.Tenant = tenant; return View("Index"); } private String GetRedirectUrlFromTenant(String tenant) { #if DEBUG return null; #endif if (!String.IsNullOrWhiteSpace(tenant)) { Log.Info($"Check Tenant " + tenant); var server = GetServerFromTenant(tenant); if (!String.IsNullOrEmpty(server) && server.Contains("bewoplaner.de")) { if (Request.Url.Host != server) { var newurl = String.Format("https://{0}/mobil/login/{1}", server, tenant); Log.Info($"Wrong Server... Redirect to : " + newurl); return newurl; } } } return null; } public static string GetServerFromTenant(string tenant) { try { if(tenant == "demo") { return "app1.bewoplaner.de"; } var url = string.Format(GetServerUrl, tenant); using(var client = new WebClient()) { var response = client.UploadValues(url, "POST", new NameValueCollection()); return System.Text.Encoding.ASCII.GetString(response); } } catch(Exception ex) { return null; } } [Authorize] public override string SaveCollapsibleStatus(bool isOpen, string identifier) { throw new NotImplementedException("Der Login-Controller hat keine einklappbaren Elemente!"); } } }