using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Security.Authentication; using System.Web.Http; using Tango.BL.Builders; using Tango.BL.Entities; using Tango.Core; using Tango.Core.Cryptography; using Tango.FSE.Web.Messages; using Tango.Web.Controllers; using Tango.Web.Helpers; using Tango.Web.Security; using Tango.Web.SQLServer; namespace Tango.MachineService.Controllers { public class FSEController : TangoController { public class TokenObject { public String UserGuid { get; set; } } /// /// Login to the service. /// /// The request. /// /// [HttpPost] public LoginResponse Login(LoginRequest request) { User user = null; DataSource dataSource = null; IHashGenerator hash = new BasicHashGenerator(); Version client_version; if (!Version.TryParse(request.Version, out client_version)) { client_version = new Version("1.0.0.0"); } var password = hash.Encrypt(request.Password); using (var db = ObservablesContextHelper.CreateContext()) { user = new UserBuilder(db).Set(x => x.Email.ToLower() == request.Email.ToLower() && x.Password == password).WithRolesAndPermissions().WithDeleted().Build(); if (user == null) { throw new AuthenticationException("Invalid email or password."); } if (user.Deleted) { throw new AuthenticationException("Your account has been disabled. Please contact your administrator."); } user.LastLogin = DateTime.UtcNow; db.SaveChanges(); } SQLServerManager sqlServer = new SQLServerManager(); var accessToken = sqlServer.GetAccessToken(); dataSource = new DataSource() { Address = MachineServiceConfig.DB_ADDRESS, Catalog = MachineServiceConfig.DB_CATALOG, Type = DataSourceType.AccessToken, IntegratedSecurity = false, AccessToken = accessToken.AccessToken, AccessTokenExpiration = accessToken.ExpiresOn.UtcDateTime }; //Enforce Machine Studio Version ? //if (MachineServiceConfig.ENFORCE_MACHINE_STUDIO_VERSION) //{ // using (var db = ObservablesContextHelper.CreateContext()) // { // var latest_version = db.MachineStudioVersions.ToList().OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault(); // if (latest_version != null && Version.Parse(latest_version.Version) != client_version) // { // versionChangeRequired = true; // requiredVersion = latest_version.Version; // } // } //} //Return data source return new LoginResponse() { DataSource = dataSource, AccessToken = WebToken.CreateNew(MachineServiceConfig.JWT_TOKEN_SECRET, new TokenObject() { UserGuid = user.Guid, }, DateTime.UtcNow.AddDays(1)).AccessToken, PasswordChangeRequired = user.PasswordChangeRequired }; } } }