public bool Start(string fileName, CommandLineArguments arguments = null) { Process.StartInfo.UseShellExecute = false; Process.StartInfo.FileName = fileName; if (arguments != null) Process.StartInfo.Arguments = arguments.ToString(); if (!Process.Start()) return false; GetMainWindowHandle(); return true; }
public bool Start(CommandLineArguments arguments = null) { var filename = Settings.Default.UseCustomPuttyPath ? Settings.Default.CustomPuttyPath : App.Info.GeneralAppInfo.PuttyPath; return(Start(filename, arguments)); }
private List <Replacement> BuildReplacementList(string input) { var index = 0; var replacements = new List <Replacement>(); do { var tokenStart = input.IndexOf("%", index, StringComparison.InvariantCulture); if (tokenStart == -1) { break; } var tokenEnd = input.IndexOf("%", tokenStart + 1, StringComparison.InvariantCulture); if (tokenEnd == -1) { break; } var tokenLength = tokenEnd - tokenStart + 1; var variableNameStart = tokenStart + 1; var variableNameLength = tokenLength - 2; var isEnvironmentVariable = false; var variableName = ""; if (tokenStart > 0) { var tokenStartPrefix = input.Substring(tokenStart - 1, 1).ToCharArray()[0]; var tokenEndPrefix = input.Substring(tokenEnd - 1, 1).ToCharArray()[0]; if (tokenStartPrefix == '\\' && tokenEndPrefix == '\\') { isEnvironmentVariable = true; // Add the first backslash to the token tokenStart--; tokenLength++; // Remove the last backslash from the name variableNameLength--; } else if (tokenStartPrefix == '^' && tokenEndPrefix == '^') { // Add the first caret to the token tokenStart--; tokenLength++; // Remove the last caret from the name variableNameLength--; variableName = input.Substring(variableNameStart, variableNameLength); replacements.Add(new Replacement(tokenStart, tokenLength, $"%{variableName}%")); index = tokenEnd; continue; } } var token = input.Substring(tokenStart, tokenLength); var escape = DetermineEscapeType(token); if (escape != EscapeType.All) { // Remove the escape character from the name variableNameStart++; variableNameLength--; } if (variableNameLength == 0) { index = tokenEnd; continue; } variableName = input.Substring(variableNameStart, variableNameLength); var replacementValue = token; if (!isEnvironmentVariable) { replacementValue = GetVariableReplacement(variableName, token); } var haveReplacement = false; if (replacementValue != token) { haveReplacement = true; } else { replacementValue = Environment.GetEnvironmentVariable(variableName); if (replacementValue != null) { haveReplacement = true; } } if (haveReplacement) { var trailing = tokenEnd + 2 <= input.Length ? input.Substring(tokenEnd + 1, 1).ToCharArray()[0] : '\0'; if (escape == EscapeType.All) { replacementValue = CommandLineArguments.EscapeBackslashes(replacementValue); if (trailing == '\'') { replacementValue = CommandLineArguments.EscapeBackslashesForTrailingQuote(replacementValue); } } if (escape == EscapeType.All || escape == EscapeType.ShellMetacharacters) { replacementValue = CommandLineArguments.EscapeShellMetacharacters(replacementValue); } replacements.Add(new Replacement(tokenStart, tokenLength, replacementValue)); index = tokenEnd + 1; } else { index = tokenEnd; } } while (true); return(replacements); }
public string ParseArguments(string input) { int index = 0; List <Replacement> replacements = new List <Replacement>(); do { int tokenStart = input.IndexOf("%", index, StringComparison.InvariantCulture); if (tokenStart == -1) { break; } int tokenEnd = input.IndexOf("%", tokenStart + 1, StringComparison.InvariantCulture); if (tokenEnd == -1) { break; } int tokenLength = tokenEnd - tokenStart + 1; int variableNameStart = tokenStart + 1; int variableNameLength = tokenLength - 2; bool isEnvironmentVariable = false; string variableName = ""; if (tokenStart > 0) { char tokenStartPrefix = input.Substring(tokenStart - 1, 1).ToCharArray()[0]; char tokenEndPrefix = input.Substring(tokenEnd - 1, 1).ToCharArray()[0]; if (tokenStartPrefix == '\\' && tokenEndPrefix == '\\') { isEnvironmentVariable = true; // Add the first backslash to the token tokenStart--; tokenLength++; // Remove the last backslash from the name variableNameLength--; } else if (tokenStartPrefix == '^' && tokenEndPrefix == '^') { // Add the first caret to the token tokenStart--; tokenLength++; // Remove the last caret from the name variableNameLength--; variableName = input.Substring(variableNameStart, variableNameLength); replacements.Add(new Replacement(tokenStart, tokenLength, $"%{variableName}%")); index = tokenEnd; continue; } } string token = input.Substring(tokenStart, tokenLength); EscapeType escape = EscapeType.All; string prefix = input.Substring(variableNameStart, 1); switch (prefix) { case "-": escape = EscapeType.ShellMetacharacters; break; case "!": escape = EscapeType.None; break; } if (escape != EscapeType.All) { // Remove the escape character from the name variableNameStart++; variableNameLength--; } if (variableNameLength == 0) { index = tokenEnd; continue; } variableName = input.Substring(variableNameStart, variableNameLength); string replacementValue = token; if (!isEnvironmentVariable) { replacementValue = GetVariableReplacement(variableName, token); } bool haveReplacement = false; if (replacementValue != token) { haveReplacement = true; } else { replacementValue = Environment.GetEnvironmentVariable(variableName); if (replacementValue != null) { haveReplacement = true; } } if (haveReplacement) { var trailing = tokenEnd + 2 <= input.Length ? input.Substring(tokenEnd + 1, 1).ToCharArray()[0] : '\0'; if (escape == EscapeType.All) { replacementValue = CommandLineArguments.EscapeBackslashes(replacementValue); if (trailing == '\'') { replacementValue = CommandLineArguments.EscapeBackslashesForTrailingQuote(replacementValue); } } if (escape == EscapeType.All || escape == EscapeType.ShellMetacharacters) { replacementValue = CommandLineArguments.EscapeShellMetacharacters(replacementValue); } replacements.Add(new Replacement(tokenStart, tokenLength, replacementValue)); index = tokenEnd + 1; } else { index = tokenEnd; } } while (true); string result = input; for (index = result.Length; index >= 0; index--) { foreach (Replacement replacement in replacements) { if (replacement.Start != index) { continue; } string before = result.Substring(0, replacement.Start); string after = result.Substring(replacement.Start + replacement.Length); result = before + replacement.Value + after; } } return(result); }
public override bool Connect() { try { _isPuttyNg = PuttyTypeDetector.GetPuttyType() == PuttyTypeDetector.PuttyType.PuttyNg; PuttyProcess = new Process { StartInfo = { UseShellExecute = false, FileName = PuttyPath } }; var arguments = new CommandLineArguments {EscapeForShell = false}; arguments.Add("-load", InterfaceControl.Info.PuttySession); if (!(InterfaceControl.Info is PuttySessionInfo)) { arguments.Add("-" + PuttyProtocol); if (PuttyProtocol == Putty_Protocol.ssh) { var username = ""; var password = ""; if (!string.IsNullOrEmpty(InterfaceControl.Info.Username)) { username = InterfaceControl.Info.Username; } else { if (Settings.Default.EmptyCredentials == "windows") { username = Environment.UserName; } else if (Settings.Default.EmptyCredentials == "custom") { username = Convert.ToString(Settings.Default.DefaultUsername); } } if (!string.IsNullOrEmpty(InterfaceControl.Info.Password)) { password = InterfaceControl.Info.Password; } else { if (Settings.Default.EmptyCredentials == "custom") { var cryptographyProvider = new LegacyRijndaelCryptographyProvider(); password = cryptographyProvider.Decrypt(Convert.ToString(Settings.Default.DefaultPassword), Runtime.EncryptionKey); } } arguments.Add("-" + (int)PuttySSHVersion); if (((int)Force & (int)ConnectionInfo.Force.NoCredentials) != (int)ConnectionInfo.Force.NoCredentials) { if (!string.IsNullOrEmpty(username)) { arguments.Add("-l", username); } if (!string.IsNullOrEmpty(password)) { arguments.Add("-pw", password); } } } arguments.Add("-P", InterfaceControl.Info.Port.ToString()); arguments.Add(InterfaceControl.Info.Hostname); } if (_isPuttyNg) { arguments.Add("-hwndparent", InterfaceControl.Handle.ToString()); } PuttyProcess.StartInfo.Arguments = arguments.ToString(); PuttyProcess.EnableRaisingEvents = true; PuttyProcess.Exited += ProcessExited; PuttyProcess.Start(); PuttyProcess.WaitForInputIdle(Convert.ToInt32(Settings.Default.MaxPuttyWaitTime * 1000)); var startTicks = Environment.TickCount; while (PuttyHandle.ToInt32() == 0 & Environment.TickCount < startTicks + (Settings.Default.MaxPuttyWaitTime * 1000)) { if (_isPuttyNg) { PuttyHandle = NativeMethods.FindWindowEx( InterfaceControl.Handle, new IntPtr(0), null, null); } else { PuttyProcess.Refresh(); PuttyHandle = PuttyProcess.MainWindowHandle; } if (PuttyHandle.ToInt32() == 0) { Thread.Sleep(0); } } if (!_isPuttyNg) { NativeMethods.SetParent(PuttyHandle, InterfaceControl.Handle); } Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, Language.strPuttyStuff, true); Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, string.Format(Language.strPuttyHandle, PuttyHandle), true); Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, string.Format(Language.strPuttyTitle, PuttyProcess.MainWindowTitle), true); Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, string.Format(Language.strPuttyParentHandle, InterfaceControl.Parent.Handle), true); Resize(this, new EventArgs()); base.Connect(); return true; } catch (Exception ex) { Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.strPuttyConnectionFailed + Environment.NewLine + ex.Message); return false; } }