SEBWIN-312: Corrected original name check for whitelisted applications and changed method to retrieve process names (to ensure image file extension remains present).
This commit is contained in:
		
							parent
							
								
									8d0fe0086b
								
							
						
					
					
						commit
						6ab7047639
					
				
					 6 changed files with 36 additions and 47 deletions
				
			
		|  | @ -122,11 +122,6 @@ namespace SafeExamBrowser.Configuration.ConfigurationData | ||||||
| 								application.ExecutablePath = executablePath; | 								application.ExecutablePath = executablePath; | ||||||
| 							} | 							} | ||||||
| 
 | 
 | ||||||
| 							if (applicationData.TryGetValue(Keys.Applications.Identifier, out v) && v is string identifier) |  | ||||||
| 							{ |  | ||||||
| 								application.Identifier = identifier; |  | ||||||
| 							} |  | ||||||
| 
 |  | ||||||
| 							if (applicationData.TryGetValue(Keys.Applications.OriginalName, out v) && v is string originalName) | 							if (applicationData.TryGetValue(Keys.Applications.OriginalName, out v) && v is string originalName) | ||||||
| 							{ | 							{ | ||||||
| 								application.OriginalName = originalName; | 								application.OriginalName = originalName; | ||||||
|  |  | ||||||
|  | @ -30,7 +30,6 @@ namespace SafeExamBrowser.Configuration.ConfigurationData | ||||||
| 			internal const string DisplayName = "title"; | 			internal const string DisplayName = "title"; | ||||||
| 			internal const string ExecutableName = "executable"; | 			internal const string ExecutableName = "executable"; | ||||||
| 			internal const string ExecutablePath = "path"; | 			internal const string ExecutablePath = "path"; | ||||||
| 			internal const string Identifier = "identifier"; |  | ||||||
| 			internal const string OperatingSystem = "os"; | 			internal const string OperatingSystem = "os"; | ||||||
| 			internal const string OriginalName = "originalName"; | 			internal const string OriginalName = "originalName"; | ||||||
| 			internal const string RendererName = "windowHandlingProcess"; | 			internal const string RendererName = "windowHandlingProcess"; | ||||||
|  |  | ||||||
|  | @ -8,7 +8,6 @@ | ||||||
| 
 | 
 | ||||||
| using System; | using System; | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
| using System.IO; |  | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
| using System.Timers; | using System.Timers; | ||||||
|  | @ -212,18 +211,17 @@ namespace SafeExamBrowser.Monitoring.Applications | ||||||
| 
 | 
 | ||||||
| 		private bool BelongsToApplication(IProcess process, WhitelistApplication application) | 		private bool BelongsToApplication(IProcess process, WhitelistApplication application) | ||||||
| 		{ | 		{ | ||||||
| 			// TODO: Window title and renderer process handling! | 			var ignoreOriginalName = string.IsNullOrWhiteSpace(application.OriginalName); | ||||||
| 			// TODO: WRONG! With original name, both must match! | 			var sameName = process.Name.Equals(application.ExecutableName, StringComparison.OrdinalIgnoreCase); | ||||||
| 			var sameName = process.Name.Equals(Path.GetFileNameWithoutExtension(application.ExecutableName), StringComparison.OrdinalIgnoreCase); |  | ||||||
| 			var sameOriginalName = process.OriginalName?.Equals(application.OriginalName, StringComparison.OrdinalIgnoreCase) == true; | 			var sameOriginalName = process.OriginalName?.Equals(application.OriginalName, StringComparison.OrdinalIgnoreCase) == true; | ||||||
| 
 | 
 | ||||||
| 			return sameName || sameOriginalName; | 			return sameName && (ignoreOriginalName || sameOriginalName); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		private bool BelongsToSafeExamBrowser(IProcess process) | 		private bool BelongsToSafeExamBrowser(IProcess process) | ||||||
| 		{ | 		{ | ||||||
| 			var isRuntime = process.Name == "SafeExamBrowser" && process.OriginalName == "SafeExamBrowser"; | 			var isRuntime = process.Name == "SafeExamBrowser.exe" && process.OriginalName == "SafeExamBrowser.exe"; | ||||||
| 			var isClient = process.Name == "SafeExamBrowser.Client" && process.OriginalName == "SafeExamBrowser.Client"; | 			var isClient = process.Name == "SafeExamBrowser.Client.exe" && process.OriginalName == "SafeExamBrowser.Client.exe"; | ||||||
| 
 | 
 | ||||||
| 			return isRuntime || isClient; | 			return isRuntime || isClient; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | @ -62,12 +62,6 @@ namespace SafeExamBrowser.Settings.Applications | ||||||
| 		/// </summary> | 		/// </summary> | ||||||
| 		public string ExecutablePath { get; set; } | 		public string ExecutablePath { get; set; } | ||||||
| 
 | 
 | ||||||
| 		/// <summary> |  | ||||||
| 		/// Used to identify an application by its main window title. |  | ||||||
| 		/// </summary> |  | ||||||
| 		/// TODO: Rename? |  | ||||||
| 		public string Identifier { get; set; } |  | ||||||
| 
 |  | ||||||
| 		/// <summary> | 		/// <summary> | ||||||
| 		/// The original file name of the main executable of the application, if available. | 		/// The original file name of the main executable of the application, if available. | ||||||
| 		/// </summary> | 		/// </summary> | ||||||
|  |  | ||||||
|  | @ -22,9 +22,9 @@ namespace SafeExamBrowser.WindowsApi | ||||||
| { | { | ||||||
| 	internal class Process : IProcess | 	internal class Process : IProcess | ||||||
| 	{ | 	{ | ||||||
| 		private bool eventInitialized, originalNameInitialized; | 		private bool eventInitialized, namesInitialized; | ||||||
| 		private ILogger logger; | 		private ILogger logger; | ||||||
| 		private string originalName; | 		private string name, originalName; | ||||||
| 		private System.Diagnostics.Process process; | 		private System.Diagnostics.Process process; | ||||||
| 
 | 
 | ||||||
| 		private event ProcessTerminatedEventHandler TerminatedEvent; | 		private event ProcessTerminatedEventHandler TerminatedEvent; | ||||||
|  | @ -39,11 +39,14 @@ namespace SafeExamBrowser.WindowsApi | ||||||
| 			get { return IsTerminated(); } | 			get { return IsTerminated(); } | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		public string Name { get; } | 		public string Name | ||||||
|  | 		{ | ||||||
|  | 			get { return namesInitialized ? name : InitializeNames().name; } | ||||||
|  | 		} | ||||||
| 
 | 
 | ||||||
| 		public string OriginalName | 		public string OriginalName | ||||||
| 		{ | 		{ | ||||||
| 			get { return originalNameInitialized ? originalName : InitializeOriginalName(); } | 			get { return namesInitialized ? originalName : InitializeNames().originalName; } | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		public event ProcessTerminatedEventHandler Terminated | 		public event ProcessTerminatedEventHandler Terminated | ||||||
|  | @ -54,15 +57,15 @@ namespace SafeExamBrowser.WindowsApi | ||||||
| 
 | 
 | ||||||
| 		internal Process(System.Diagnostics.Process process, ILogger logger) | 		internal Process(System.Diagnostics.Process process, ILogger logger) | ||||||
| 		{ | 		{ | ||||||
| 			this.Name = process.ProcessName; |  | ||||||
| 			this.process = process; | 			this.process = process; | ||||||
| 			this.logger = logger; | 			this.logger = logger; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		internal Process(System.Diagnostics.Process process, string originalName, ILogger logger) : this(process, logger) | 		internal Process(System.Diagnostics.Process process, string name, string originalName, ILogger logger) : this(process, logger) | ||||||
| 		{ | 		{ | ||||||
|  | 			this.name = name; | ||||||
| 			this.originalName = originalName; | 			this.originalName = originalName; | ||||||
| 			this.originalNameInitialized = true; | 			this.namesInitialized = true; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		public bool TryActivate() | 		public bool TryActivate() | ||||||
|  | @ -191,22 +194,23 @@ namespace SafeExamBrowser.WindowsApi | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		private string InitializeOriginalName() | 		private (string name, string originalName) InitializeNames() | ||||||
| 		{ | 		{ | ||||||
|  | 			name = process.ProcessName; | ||||||
|  | 
 | ||||||
| 			try | 			try | ||||||
| 			{ | 			{ | ||||||
| 				using (var searcher = new ManagementObjectSearcher($"SELECT ExecutablePath FROM Win32_Process WHERE ProcessId = {process.Id}")) | 				using (var searcher = new ManagementObjectSearcher($"SELECT Name, ExecutablePath FROM Win32_Process WHERE ProcessId = {process.Id}")) | ||||||
| 				using (var results = searcher.Get()) | 				using (var results = searcher.Get()) | ||||||
| 				using (var processData = results.Cast<ManagementObject>().First()) | 				using (var processData = results.Cast<ManagementObject>().First()) | ||||||
| 				{ | 				{ | ||||||
| 					var executablePath = Convert.ToString(processData["ExecutablePath"]); | 					var executablePath = Convert.ToString(processData["ExecutablePath"]); | ||||||
| 
 | 
 | ||||||
|  | 					name = Convert.ToString(processData["Name"]); | ||||||
|  | 
 | ||||||
| 					if (File.Exists(executablePath)) | 					if (File.Exists(executablePath)) | ||||||
| 					{ | 					{ | ||||||
| 						var executableInfo = FileVersionInfo.GetVersionInfo(executablePath); | 						originalName = FileVersionInfo.GetVersionInfo(executablePath).OriginalFilename; | ||||||
| 						var originalName = Path.GetFileNameWithoutExtension(executableInfo.OriginalFilename); |  | ||||||
| 
 |  | ||||||
| 						this.originalName = originalName; |  | ||||||
| 					} | 					} | ||||||
| 					else | 					else | ||||||
| 					{ | 					{ | ||||||
|  | @ -216,14 +220,14 @@ namespace SafeExamBrowser.WindowsApi | ||||||
| 			} | 			} | ||||||
| 			catch (Exception e) | 			catch (Exception e) | ||||||
| 			{ | 			{ | ||||||
| 				logger.Error("Failed to initialize original name!", e); | 				logger.Error("Failed to initialize names!", e); | ||||||
| 			} | 			} | ||||||
| 			finally | 			finally | ||||||
| 			{ | 			{ | ||||||
| 				originalNameInitialized = true; | 				namesInitialized = true; | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			return originalName; | 			return (name, originalName); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		private bool WaitForTermination(int timeout_ms) | 		private bool WaitForTermination(int timeout_ms) | ||||||
|  |  | ||||||
|  | @ -36,13 +36,14 @@ namespace SafeExamBrowser.WindowsApi | ||||||
| 		{ | 		{ | ||||||
| 			var processes = new List<IProcess>(); | 			var processes = new List<IProcess>(); | ||||||
| 			var running = System.Diagnostics.Process.GetProcesses(); | 			var running = System.Diagnostics.Process.GetProcesses(); | ||||||
| 			var originalNames = LoadOriginalNames(); | 			var names = LoadProcessNames(); | ||||||
| 
 | 
 | ||||||
| 			foreach (var process in running) | 			foreach (var process in running) | ||||||
| 			{ | 			{ | ||||||
| 				var originalName = originalNames.FirstOrDefault(n => n.processId == process.Id).originalName; | 				var name = names.FirstOrDefault(n => n.processId == process.Id).name; | ||||||
|  | 				var originalName = names.FirstOrDefault(n => n.processId == process.Id).originalName; | ||||||
| 
 | 
 | ||||||
| 				processes.Add(new Process(process, originalName, LoggerFor(process))); | 				processes.Add(new Process(process, name, originalName, LoggerFor(process))); | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			return processes; | 			return processes; | ||||||
|  | @ -107,13 +108,13 @@ namespace SafeExamBrowser.WindowsApi | ||||||
| 			return process != default(IProcess); | 			return process != default(IProcess); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		private IEnumerable<(int processId, string originalName)> LoadOriginalNames() | 		private IEnumerable<(int processId, string name, string originalName)> LoadProcessNames() | ||||||
| 		{ | 		{ | ||||||
| 			var names = new List<(int, string)>(); | 			var names = new List<(int, string, string)>(); | ||||||
| 
 | 
 | ||||||
| 			try | 			try | ||||||
| 			{ | 			{ | ||||||
| 				using (var searcher = new ManagementObjectSearcher($"SELECT ProcessId, ExecutablePath FROM Win32_Process")) | 				using (var searcher = new ManagementObjectSearcher($"SELECT ProcessId, Name, ExecutablePath FROM Win32_Process")) | ||||||
| 				using (var results = searcher.Get()) | 				using (var results = searcher.Get()) | ||||||
| 				{ | 				{ | ||||||
| 					var processData = results.Cast<ManagementObject>().ToList(); | 					var processData = results.Cast<ManagementObject>().ToList(); | ||||||
|  | @ -122,19 +123,17 @@ namespace SafeExamBrowser.WindowsApi | ||||||
| 					{ | 					{ | ||||||
| 						using (process) | 						using (process) | ||||||
| 						{ | 						{ | ||||||
|  | 							var name = Convert.ToString(process["Name"]); | ||||||
| 							var processId = Convert.ToInt32(process["ProcessId"]); | 							var processId = Convert.ToInt32(process["ProcessId"]); | ||||||
| 							var executablePath = Convert.ToString(process["ExecutablePath"]); | 							var executablePath = Convert.ToString(process["ExecutablePath"]); | ||||||
| 
 | 
 | ||||||
| 							if (File.Exists(executablePath)) | 							if (File.Exists(executablePath)) | ||||||
| 							{ | 							{ | ||||||
| 								var executableInfo = FileVersionInfo.GetVersionInfo(executablePath); | 								names.Add((processId, name, FileVersionInfo.GetVersionInfo(executablePath).OriginalFilename)); | ||||||
| 								var originalName = Path.GetFileNameWithoutExtension(executableInfo.OriginalFilename); |  | ||||||
| 
 |  | ||||||
| 								names.Add((processId, originalName)); |  | ||||||
| 							} | 							} | ||||||
| 							else | 							else | ||||||
| 							{ | 							{ | ||||||
| 								names.Add((processId, default(string))); | 								names.Add((processId, name, default(string))); | ||||||
| 							} | 							} | ||||||
| 						} | 						} | ||||||
| 					} | 					} | ||||||
|  | @ -142,7 +141,7 @@ namespace SafeExamBrowser.WindowsApi | ||||||
| 			} | 			} | ||||||
| 			catch (Exception e) | 			catch (Exception e) | ||||||
| 			{ | 			{ | ||||||
| 				logger.Error("Failed to retrieve original names for processes!", e); | 				logger.Error("Failed to load process names!", e); | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			return names; | 			return names; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 dbuechel
						dbuechel