diff options
| author | Shlomo Hecht <shlomo@twine-s.com> | 2019-02-19 11:19:21 +0200 |
|---|---|---|
| committer | Shlomo Hecht <shlomo@twine-s.com> | 2019-02-19 11:19:21 +0200 |
| commit | 93e6a6bfa7238826dcdea989e279ec3450067f83 (patch) | |
| tree | 212b5023935862346a7de311e37cf1ef727efcd5 /Software/Visual_Studio/Web/Tango.MachineService/Controllers | |
| parent | e99efd9d9b7b67a76db82a9a40525f96bcf064c0 (diff) | |
| parent | 3fcd0dbc6650749421f0390a60154c52254682e6 (diff) | |
| download | Tango-93e6a6bfa7238826dcdea989e279ec3450067f83.tar.gz Tango-93e6a6bfa7238826dcdea989e279ec3450067f83.zip | |
Merge branch 'master' of https://twinetfs.visualstudio.com/Tango/_git/Tango
Diffstat (limited to 'Software/Visual_Studio/Web/Tango.MachineService/Controllers')
| -rw-r--r-- | Software/Visual_Studio/Web/Tango.MachineService/Controllers/MachineStudioController.cs | 134 | ||||
| -rw-r--r-- | Software/Visual_Studio/Web/Tango.MachineService/Controllers/PPCController.cs | 115 |
2 files changed, 179 insertions, 70 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..82082ca2f 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,32 +112,33 @@ 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(); + 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); - - 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(); @@ -132,7 +151,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); + String userID = TokensManager.GetTokenObject(request.AccessToken); + + var user = db.Users.SingleOrDefault(x => x.Guid == userID); if (user != null && user.HasPermission(Permissions.PublishMachineStudioVersions)) { @@ -173,10 +194,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 +231,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 +246,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 +272,8 @@ namespace Tango.MachineService.Controllers bool versionChangeRequired = false; String requiredVersion = null; + User user = null; + using (ObservablesContext db = ObservablesContextHelper.CreateContext()) { db.Roles.ToList(); @@ -242,7 +281,7 @@ namespace Tango.MachineService.Controllers db.UsersRoles.ToList(); db.RolesPermissions.ToList(); - var user = db.Users.SingleOrDefault(x => x.Email.ToLower() == request.Email.ToLower()); + user = db.Users.SingleOrDefault(x => x.Email.ToLower() == request.Email.ToLower()); IHashGenerator g = new BasicHashGenerator(); @@ -309,11 +348,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..5e41e0d8a 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 = db.Users.SingleOrDefault(x => x.Guid == user_guid); 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 = db.Users.SingleOrDefault(x => x.Email.ToLower() == request.Email.ToLower() && x.Password == pass); + + 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 } } |
