diff options
| author | Avi Levkovich <avi@twine-s.com> | 2019-02-20 12:22:27 +0200 |
|---|---|---|
| committer | Avi Levkovich <avi@twine-s.com> | 2019-02-20 12:22:27 +0200 |
| commit | a576283d2a9288938796491582dd9f575f3ff571 (patch) | |
| tree | bba67d4b69f337fa209b5050fb69378e28e6f4eb /Software/Visual_Studio/Web/Tango.MachineService/Controllers | |
| parent | b30e6dc276f95c9db3d500d267a273b6486e0dac (diff) | |
| parent | 9646611a494ed9e1ef0673c881ffc66b997f7bb9 (diff) | |
| download | Tango-a576283d2a9288938796491582dd9f575f3ff571.tar.gz Tango-a576283d2a9288938796491582dd9f575f3ff571.zip | |
Merge branch 'master' of https://twinetfs.visualstudio.com/_git/Tango
Diffstat (limited to 'Software/Visual_Studio/Web/Tango.MachineService/Controllers')
| -rw-r--r-- | Software/Visual_Studio/Web/Tango.MachineService/Controllers/MachineStudioController.cs | 143 | ||||
| -rw-r--r-- | Software/Visual_Studio/Web/Tango.MachineService/Controllers/PPCController.cs | 115 |
2 files changed, 183 insertions, 75 deletions
diff --git a/Software/Visual_Studio/Web/Tango.MachineService/Controllers/MachineStudioController.cs b/Software/Visual_Studio/Web/Tango.MachineService/Controllers/MachineStudioController.cs index 660b98576..054c8d781 100644 --- a/Software/Visual_Studio/Web/Tango.MachineService/Controllers/MachineStudioController.cs +++ b/Software/Visual_Studio/Web/Tango.MachineService/Controllers/MachineStudioController.cs @@ -14,35 +14,54 @@ using Tango.Core.Cryptography; using Tango.MachineService.Models; using Tango.MachineStudio.Common.Authentication; using System.Data.Entity; -using Tango.MachineStudio.Common.Update; +using Tango.MachineStudio.Common.Web; using Tango.Web.Controllers; using Tango.Web.Helpers; using Tango.Web.Storage; using Tango.Web.Authentication; using Tango.Web.ActiveDirectory; +using Tango.MachineService.Filters; namespace Tango.MachineService.Controllers { public class MachineStudioController : JsonController { - private static TokensManager _tokens_manager; private static List<MachineStudioPendingUpload> _pendingUploads; private ActiveDirectoryManager _ad_manager; + public static TokensManager<String> TokensManager { get; set; } + + #region Constructors + + /// <summary> + /// Initializes the <see cref="MachineStudioController"/> class. + /// </summary> static MachineStudioController() { - _tokens_manager = new TokensManager(); + TokensManager = new TokensManager<string>(); + TokensManager.ExpirationTime = TimeSpan.FromDays(10); _pendingUploads = new List<MachineStudioPendingUpload>(); } + /// <summary> + /// Initializes a new instance of the <see cref="MachineStudioController"/> class. + /// </summary> public MachineStudioController() : base() { _ad_manager = new ActiveDirectoryManager(); } - #region Update + #endregion + #region Actions + + /// <summary> + /// Checks for updates. + /// </summary> + /// <param name="request">The request.</param> + /// <returns></returns> [HttpPost] + [MachineStudioLoginFilter] public CheckForUpdatesResponse CheckForUpdates(CheckForUpdatesRequest request) { LogManager.Log("Request received..."); @@ -51,41 +70,40 @@ namespace Tango.MachineService.Controllers using (ObservablesContext db = ObservablesContextHelper.CreateContext()) { - if (_tokens_manager.Exists(request.AccessToken)) - { - var versions = db.MachineStudioVersions.ToList(); + var versions = db.MachineStudioVersions.ToList(); - MachineStudioVersion latestVersion = null; + MachineStudioVersion latestVersion = null; - latestVersion = versions.OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault(); + latestVersion = versions.OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault(); - Version currentVersion = Version.Parse(request.Version); + Version currentVersion = Version.Parse(request.Version); - String comments = String.Join(Environment.NewLine, versions.OrderBy(x => Version.Parse(x.Version)).Where(x => Version.Parse(x.Version) > currentVersion).Select(x => x.Comments)); + String comments = String.Join(Environment.NewLine, versions.OrderBy(x => Version.Parse(x.Version)).Where(x => Version.Parse(x.Version) > currentVersion).Select(x => x.Comments)); - if (latestVersion != null && Version.Parse(latestVersion.Version) > currentVersion) - { - var manager = new StorageManager(); - var container = manager.GetContainer(MachineServiceConfig.MACHINE_STUDIO_VERSIONS_CONTAINER); - var blob = container.GetBlockBlobReference(latestVersion.BlobName); + if (latestVersion != null && Version.Parse(latestVersion.Version) > currentVersion) + { + var manager = new StorageManager(); + var container = manager.GetContainer(MachineServiceConfig.MACHINE_STUDIO_VERSIONS_CONTAINER); + var blob = container.GetBlockBlobReference(latestVersion.BlobName); - response.BlobAddress = blob.GenerateReadSignature(TimeSpan.FromMinutes(60)); + response.BlobAddress = blob.GenerateReadSignature(TimeSpan.FromMinutes(60)); - response.IsUpdateAvailable = true; - response.Version = latestVersion.Version; - response.Comments = latestVersion.Comments; - } - } - else - { - throw new AuthenticationException("Invalid token."); + response.IsUpdateAvailable = true; + response.Version = latestVersion.Version; + response.Comments = latestVersion.Comments; } } return response; } + /// <summary> + /// Downloads the latest version. + /// </summary> + /// <param name="request">The request.</param> + /// <returns></returns> [HttpPost] + [MachineStudioLoginFilter] public DownloadLatestVersionResponse DownloadLatestVersion(DownloadLatestVersionRequest request) { LogManager.Log("Request received..."); @@ -94,45 +112,42 @@ namespace Tango.MachineService.Controllers using (ObservablesContext db = ObservablesContextHelper.CreateContext()) { - if (_tokens_manager.Exists(request.AccessToken)) - { - var versions = db.MachineStudioVersions.ToList(); + var versions = db.MachineStudioVersions.ToList(); - MachineStudioVersion latestVersion = versions.OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault(); - - if (latestVersion != null) - { - var manager = new StorageManager(); - var container = manager.GetContainer(MachineServiceConfig.MACHINE_STUDIO_VERSIONS_CONTAINER); - var blob = container.GetBlockBlobReference(latestVersion.BlobName); + MachineStudioVersion latestVersion = versions.OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault(); - response.BlobAddress = blob.GenerateReadSignature(TimeSpan.FromMinutes(60)); - response.Version = latestVersion.Version; - } - } - else + if (latestVersion != null) { - throw new AuthenticationException("Invalid token."); + var manager = new StorageManager(); + var container = manager.GetContainer(MachineServiceConfig.MACHINE_STUDIO_VERSIONS_CONTAINER); + var blob = container.GetBlockBlobReference(latestVersion.BlobName); + + response.BlobAddress = blob.GenerateReadSignature(TimeSpan.FromMinutes(60)); + response.Version = latestVersion.Version; } } return response; } + /// <summary> + /// Uploads a version. + /// </summary> + /// <param name="request">The request.</param> + /// <returns></returns> + /// <exception cref="System.ArgumentException">New version must be greater than latest version.</exception> + /// <exception cref="AuthenticationException">Invalid user credentials.</exception> [HttpPost] + [MachineStudioLoginFilter] public UploadVersionResponse UploadVersion(UploadVersionRequest request) { UploadVersionResponse response = new UploadVersionResponse(); using (ObservablesContext db = ObservablesContextHelper.CreateContext()) { - //Load relation first... - db.Roles.ToList(); - db.Permissions.ToList(); - db.UsersRoles.ToList(); - db.RolesPermissions.ToList(); + String userID = TokensManager.GetTokenObject(request.AccessToken); - var user = db.Users.SingleOrDefault(x => x.Email.ToLower() == request.Email.ToLower() && x.Password == request.Password); + var user = new UserBuilder(db).Set(userID).WithRolesAndPermissions().Build(); if (user != null && user.HasPermission(Permissions.PublishMachineStudioVersions)) { @@ -173,10 +188,17 @@ namespace Tango.MachineService.Controllers return response; } + /// <summary> + /// Notifies about a version upload completion. + /// </summary> + /// <param name="request">The request.</param> + /// <returns></returns> + /// <exception cref="System.ArgumentException">Invalid Token.</exception> [HttpPost] + [MachineStudioLoginFilter] public UploadCompletedResponse NotifyUploadCompleted(UploadCompletedRequest request) { - MachineStudioPendingUpload upload = _pendingUploads.FirstOrDefault(x => x.Token == request.AccessToken); + MachineStudioPendingUpload upload = _pendingUploads.FirstOrDefault(x => x.Token == request.Token); if (upload != null) { @@ -203,6 +225,11 @@ namespace Tango.MachineService.Controllers } } + /// <summary> + /// Gets the latest version. + /// </summary> + /// <param name="request">The request.</param> + /// <returns></returns> [HttpPost] public LatestVersionResponse GetLatestVersion(LatestVersionRequest request) { @@ -213,8 +240,12 @@ namespace Tango.MachineService.Controllers } } - #endregion - + /// <summary> + /// Login to the service. + /// </summary> + /// <param name="request">The request.</param> + /// <returns></returns> + /// <exception cref="AuthenticationException"></exception> [HttpPost] public LoginResponse Login(LoginRequest request) { @@ -235,6 +266,8 @@ namespace Tango.MachineService.Controllers bool versionChangeRequired = false; String requiredVersion = null; + User user = null; + using (ObservablesContext db = ObservablesContextHelper.CreateContext()) { db.Roles.ToList(); @@ -242,7 +275,7 @@ namespace Tango.MachineService.Controllers db.UsersRoles.ToList(); db.RolesPermissions.ToList(); - var user = db.Users.SingleOrDefault(x => x.Email.ToLower() == request.Email.ToLower()); + user = new UserBuilder(db).Set(x => x.Email.ToLower() == request.Email.ToLower()).WithRolesAndPermissions().WithDeleted().Build(); IHashGenerator g = new BasicHashGenerator(); @@ -279,6 +312,11 @@ namespace Tango.MachineService.Controllers } else { + if (user.Deleted) + { + throw new AuthenticationException("Your account has been disabled. Please contact your administrator."); + } + user.LastLogin = DateTime.UtcNow; user.Password = g.Encrypt(request.Password); } @@ -309,11 +347,12 @@ namespace Tango.MachineService.Controllers Password = request.Password, }, - Token = _tokens_manager.CreateNew(), + WebToken = TokensManager.GetOrCreate(user.Guid), VersionChangeRequired = versionChangeRequired, RequiredVersion = requiredVersion, }; } + #endregion } } diff --git a/Software/Visual_Studio/Web/Tango.MachineService/Controllers/PPCController.cs b/Software/Visual_Studio/Web/Tango.MachineService/Controllers/PPCController.cs index 603517caa..ead64fb38 100644 --- a/Software/Visual_Studio/Web/Tango.MachineService/Controllers/PPCController.cs +++ b/Software/Visual_Studio/Web/Tango.MachineService/Controllers/PPCController.cs @@ -13,32 +13,56 @@ using Tango.Core; using Tango.Core.DB; using Tango.Logging; using Tango.MachineService.Models; -using Tango.PPC.Common.MachineSetup; -using Tango.PPC.Common.MachineUpdate; -using Tango.PPC.Common.Update; +using Tango.PPC.Common.Web; using Tango.Web.Controllers; using Tango.Web.Helpers; using Tango.Web.SMO; using Tango.Web.Storage; using System.Data.Entity; +using Tango.Web.Authentication; +using Tango.Web.ActiveDirectory; +using Tango.Core.Cryptography; +using Tango.MachineService.Filters; namespace Tango.MachineService.Controllers { public class PPCController : JsonController { private static List<PPCPendingUpload> _pendingUploads; + private ActiveDirectoryManager _ad_manager; + + public class TokenObject : IEquatable<TokenObject> + { + public LoginMode Mode { get; set; } + public String UserGuid { get; set; } + public String MachineGuid { get; set; } + + public bool Equals(TokenObject other) + { + return UserGuid == other.UserGuid || MachineGuid == MachineGuid; + } + } + + public static TokensManager<TokenObject> TokensManager { get; set; } #region Constructors static PPCController() { + TokensManager = new TokensManager<TokenObject>(); _pendingUploads = new List<PPCPendingUpload>(); } + public PPCController() + { + _ad_manager = new ActiveDirectoryManager(); + } + #endregion #region Setup & Update + [PPCLoginFilter] [HttpPost] public MachineSetupResponse MachineSetup(MachineSetupRequest request) { @@ -49,9 +73,9 @@ namespace Tango.MachineService.Controllers using (ObservablesContext db = ObservablesContextHelper.CreateContext()) { db.Configuration.LazyLoadingEnabled = false; - String serial_number = request.SerialNumber; + String machine_guid = TokensManager.GetTokenObject(request.AccessToken).MachineGuid; - var machine = db.Machines.SingleOrDefault(x => x.SerialNumber == serial_number); + var machine = db.Machines.SingleOrDefault(x => x.Guid == machine_guid); if (machine == null) { @@ -112,6 +136,7 @@ namespace Tango.MachineService.Controllers return response; } + [PPCLoginFilter] [HttpPost] public DownloadUpdateResponse MachineUpdate(DownloadUpdateRequest request) { @@ -120,9 +145,9 @@ namespace Tango.MachineService.Controllers using (ObservablesContext db = ObservablesContextHelper.CreateContext()) { db.Configuration.LazyLoadingEnabled = false; - String serial_number = request.SerialNumber; + String machine_guid = TokensManager.GetTokenObject(request.AccessToken).MachineGuid; - var machine = db.Machines.SingleOrDefault(x => x.SerialNumber == serial_number); + var machine = db.Machines.SingleOrDefault(x => x.Guid == machine_guid); if (machine == null) { @@ -170,6 +195,7 @@ namespace Tango.MachineService.Controllers return response; } + [PPCLoginFilter] [HttpPost] public CheckForUpdateResponse CheckForUpdate(CheckForUpdateRequest request) { @@ -177,9 +203,9 @@ namespace Tango.MachineService.Controllers using (ObservablesContext db = ObservablesContextHelper.CreateContext()) { - db.Configuration.LazyLoadingEnabled = false; + String machine_guid = TokensManager.GetTokenObject(request.AccessToken).MachineGuid; - var machine = db.Machines.SingleOrDefault(x => x.SerialNumber == request.SerialNumber); + var machine = db.Machines.SingleOrDefault(x => x.Guid == machine_guid); if (machine == null) { @@ -201,6 +227,7 @@ namespace Tango.MachineService.Controllers return response; } + [PPCLoginFilter] [HttpPost] public UpdateDBResponse UpdateDB(UpdateDBRequest request) { @@ -208,10 +235,10 @@ namespace Tango.MachineService.Controllers using (ObservablesContext db = ObservablesContextHelper.CreateContext()) { - db.Configuration.LazyLoadingEnabled = false; - String serial_number = request.SerialNumber; - var machine = db.Machines.SingleOrDefault(x => x.SerialNumber == serial_number); + String machine_guid = TokensManager.GetTokenObject(request.AccessToken).MachineGuid; + + var machine = db.Machines.SingleOrDefault(x => x.Guid == machine_guid); if (machine == null) { @@ -274,6 +301,7 @@ namespace Tango.MachineService.Controllers return response; } + [PPCLoginFilter] [HttpPost] public UploadVersionResponse UploadVersion(UploadVersionRequest request) { @@ -287,7 +315,9 @@ namespace Tango.MachineService.Controllers db.UsersRoles.ToList(); db.RolesPermissions.ToList(); - var user = db.Users.SingleOrDefault(x => x.Email.ToLower() == request.Email.ToLower() && x.Password == request.Password); + var user_guid = TokensManager.GetTokenObject(request.AccessToken).UserGuid; + + var user = new UserBuilder(db).Set(user_guid).WithRolesAndPermissions().Build(); if (user != null && user.HasPermission(Permissions.PublishPPCVersions)) { @@ -339,10 +369,11 @@ namespace Tango.MachineService.Controllers return response; } + [PPCLoginFilter] [HttpPost] public UploadCompletedResponse NotifyUploadCompleted(UploadCompletedRequest request) { - PPCPendingUpload upload = _pendingUploads.FirstOrDefault(x => x.Token == request.AccessToken); + PPCPendingUpload upload = _pendingUploads.FirstOrDefault(x => x.Token == request.Token); if (upload != null) { @@ -382,20 +413,58 @@ namespace Tango.MachineService.Controllers } } - #endregion - [HttpPost] - public Machine PersonTest(Person p) + public LoginResponse Login(LoginRequest request) { - using (var db = ObservablesContextHelper.CreateContext()) + LoginResponse response = new LoginResponse(); + + using (ObservablesContext db = ObservablesContextHelper.CreateContext()) { - var machine = new MachineBuilder(db) - .Set(x => x.SerialNumber == "1111") - .WithOrganization() - .WithConfiguration().Build(); + if (request.Mode == LoginMode.User) + { + var authResult = _ad_manager.ValidateUserCredentials(request.Email, request.Password); - return machine; + if (!_ad_manager.CanUserAccessCurrentEnvironment(request.Email)) + { + throw new AuthenticationException($"You do not have permissions to access the {MachineServiceConfig.DEPLOYMENT_SLOT.ToDescription()} environment."); + } + + BasicHashGenerator hash = new BasicHashGenerator(); + String pass = hash.Encrypt(request.Password); + + var user = new UserBuilder(db).Set(x => x.Email.ToLower() == request.Email.ToLower() && x.Password == pass).Build(); + + if (user == null) + { + throw new AuthenticationException("Domain user found but the database entry validation failed."); + } + + response.WebToken = TokensManager.GetOrCreate(new TokenObject() + { + Mode = LoginMode.User, + UserGuid = user.Guid, + }); + } + else if (request.Mode == LoginMode.Machine) + { + var machine = db.Machines.SingleOrDefault(x => x.SerialNumber == request.SerialNumber); + + if (machine == null) + { + throw new AuthenticationException("Invalid serial number."); + } + + response.WebToken = TokensManager.GetOrCreate(new TokenObject() + { + Mode = LoginMode.Machine, + UserGuid = machine.Guid, + }); + } } + + return response; } + + #endregion } } |
