private void SetActiveClient(Client client) { try { ClientLock.AcquireWriterLock(15 * 1000); Client = client; } catch (ApplicationException exception) { C.WriteLine("============================================================================"); C.WriteLine("DeadLock? ConsoleUiMediator::SetActiveClient(Client) AcquireWriterLock"); C.WriteLine("============================================================================"); return; } finally { ClientLock.ReleaseWriterLock(); } if (CurrentView.GetType() == typeof(IClientView)) { ((IClientView)CurrentView).SetActiveClient(Client); } // MainView also takes care of client interaction if (CurrentView == MainView) { MainView.SetActiveClient(Client); } }
public void OnClientDisconnected(Client client) { try { ClientLock.AcquireWriterLock(15 * 1000); if (Client == client) { Client = null; if (CurrentView.GetType() == typeof(ClientView)) { ((ClientView)CurrentView).SetActiveClient(null); CurrentView = MainView; C.WriteLine("Current interacting user has disconnected"); CurrentView.PrintBanner(); } } } catch (ApplicationException exception) { C.WriteLine("============================================================================"); C.WriteLine("DeadLock? ConsoleUiMediator::OnClientDisconnected(Client) AcquireReaderLock"); C.WriteLine("============================================================================"); } finally { ClientLock.ReleaseWriterLock(); } }
private void SetActiveClient(int clientId) { try { ClientLock.AcquireWriterLock(15 * 1000); Client = Application.GetClient(clientId); SetActiveClient(Client); } catch (ApplicationException exception) { C.WriteLine("============================================================================"); C.WriteLine("DeadLock? ConsoleUiMediator::SetActiveClient(int) AcquireWriterLock"); C.WriteLine("============================================================================"); } finally { ClientLock.ReleaseWriterLock(); } }
private bool ProcessInstructionInteracting(string instruction, string[] parts) { try { ClientLock.AcquireReaderLock(15 * 1000); try { RevShellLock.AcquireReaderLock(15 * 1000); if (IsRevShellActive) { Application.ExecInShell(Client, instruction); return(true); } } catch (ApplicationException) { C.WriteLine("DeadLock ? ProcessInstructionInteracting"); } finally { RevShellLock.ReleaseReaderLock(); } if (parts[0] == "ls") { if (CurrentView == FileSystemView) { string basePath = FileSystemView.CurrentBasePath; if (basePath == null) { Application.FetchFileSystemDrives(Client); } else { Application.FetchDirEntries(Client, basePath); } } else { if (parts.Length == 1 || (parts.Length > 1 && parts[1].Trim().Equals("/"))) { Application.FetchFileSystemDrives(Client); } else { string basePath = Path.GetFullPath(parts[1]); Application.FetchDirEntries(Client, basePath); } } return(true); } if (parts[0].Equals("sysinfo", StringComparison.OrdinalIgnoreCase)) { Application.FetchSystemInfo(Client); return(true); } if (parts[0] == "fs") { if (parts.Length == 1 || (parts.Length > 1 && parts[1].Equals("start", StringComparison.OrdinalIgnoreCase))) { CurrentView = FileSystemView; FileSystemView.SetActiveClient(Application.GetClient(Client.Id)); } } else if (parts[0] == "ps") { Application.FetchProcessList(Client); return(true); } else if (instruction.Equals("desktop start", StringComparison.OrdinalIgnoreCase)) { bool shouldStart; lock (IsDesktopActiveLock) { shouldStart = !IsDesktopActive; } if (shouldStart) { Application.StartDesktop(Client); } return(true); } else if (instruction.Equals("desktop stop", StringComparison.OrdinalIgnoreCase)) { lock (IsDesktopActiveLock) { if (IsDesktopActive) { IsDesktopActive = false; Application.StopDesktop(Client); } } return(true); } else if (parts[0] == "cd") { if (parts.Length > 1) { if (CurrentView != FileSystemView) { CurrentView = FileSystemView; FileSystemView.ChangeDirectory(parts[1]); FileSystemView.Client = Client; } } } else if (parts[0] == "shell") { try { RevShellLock.AcquireWriterLock(15 * 1000); IsRevShellActive = true; } catch (ApplicationException) { C.WriteLine("DeadLock? RevShellLock.AcquireWriterLock"); } finally { RevShellLock.ReleaseWriterLock(); } Application.StartShell(Client); return(true); } } catch (ApplicationException exception) { C.WriteLine("============================================================================"); C.WriteLine("DeadLock? ConsoleUiMediator::ProcessInstructionInteracting AcquireReaderLock"); C.WriteLine("============================================================================"); return(false); } finally { ClientLock.ReleaseReaderLock(); } return(false); }
private bool ProcessInstructionInteracting(string instruction, string[] parts) { try { ClientLock.AcquireReaderLock(15 * 1000); if (CurrentView == ShellView) { AppUiChannel.SubmitToApp(new ClientAppEvent(Client) { Subject = Subject.Shell, Action = Action.Push, Data = string.Join(" ", parts) }); return(true); } else if (parts[0] == "ls") { if (CurrentView == FileSystemView) { string basePath = FileSystemView.CurrentBasePath; if (basePath == null) { AppUiChannel.SubmitToApp(new ClientAppEvent(Client) { Subject = Subject.FileSystem, Action = Action.Start }); } else { AppUiChannel.SubmitToApp(new ClientAppEvent(Client) { Subject = Subject.FileSystem, Action = Action.Start, Data = basePath }); } } else { if (parts.Length == 1 || (parts.Length > 1 && parts[1].Trim().Equals("/"))) { AppUiChannel.SubmitToApp(new ClientAppEvent(Client) { Subject = Subject.FileSystem, Action = Action.Start }); } else { string basePath = Path.GetFullPath(parts[1]); AppUiChannel.SubmitToApp(new ClientAppEvent(Client) { Subject = Subject.FileSystem, Action = Action.Start, Data = basePath }); } } return(true); } else if (parts[0].Equals("sysinfo", StringComparison.OrdinalIgnoreCase)) { AppUiChannel.SubmitToApp(new ClientAppEvent(Client) { Subject = Subject.Information, Action = Action.Start }); return(true); } else if (parts[0] == "fs") { if (parts.Length == 1 || (parts.Length > 1 && parts[1].Equals("start", StringComparison.OrdinalIgnoreCase))) { CurrentView = FileSystemView; FileSystemView.SetActiveClient(Client); } } else if (parts[0] == "ps") { AppUiChannel.SubmitToApp(new ClientAppEvent(Client) { Subject = Subject.Process, Action = Action.Start }); return(true); } else if (parts[0] == "exec") { AppUiChannel.SubmitToApp(new ClientAppEvent(Client) { Subject = Subject.Shell, Action = Action.Push }); return(true); } else if (parts[0] == "shell") { CurrentView = ShellView; ShellView.SetActiveClient(Client); AppUiChannel.SubmitToApp(new ClientAppEvent(Client) { Subject = Subject.Shell, Action = Action.Start }); return(true); } else if (instruction.Equals("desktop start", StringComparison.OrdinalIgnoreCase)) { bool shouldStart; lock (IsDesktopActiveLock) { shouldStart = !IsDesktopActive; } if (shouldStart) { AppUiChannel.SubmitToApp(new ClientAppEvent(Client) { Subject = Subject.Desktop, Action = Action.Start }); return(true); } return(true); } else if (instruction.Equals("desktop stop", StringComparison.OrdinalIgnoreCase)) { lock (IsDesktopActiveLock) { if (IsDesktopActive) { IsDesktopActive = false; AppUiChannel.SubmitToApp(new ClientAppEvent(Client) { Subject = Subject.Desktop, Action = Action.Stop }); } } return(true); } else if (parts[0] == "cd") { if (parts.Length > 1) { if (CurrentView != FileSystemView) { CurrentView = FileSystemView; FileSystemView.ChangeDirectory(parts[1]); FileSystemView.Client = Client; } } } } catch (ApplicationException exception) { C.WriteLine("============================================================================"); C.WriteLine("DeadLock? ConsoleUiMediator::ProcessInstructionInteracting AcquireReaderLock"); C.WriteLine("============================================================================"); return(false); } finally { ClientLock.ReleaseReaderLock(); } return(false); }