public void PageantAgentInstanceTest() { /* code based on agent_query function in winpgntc.c from PuTTY */ using (PageantAgent agent = new PageantAgent()) { /* try starting a second instance */ Assert.That(delegate() { PageantAgent agent2 = new PageantAgent(); agent2.Dispose(); }, Throws.InstanceOf <PageantRunningException>()); /* test WndProc callback */ IntPtr hwnd = FindWindow("Pageant", "Pageant"); Assert.That(hwnd, Is.Not.EqualTo(IntPtr.Zero)); int threadId = Thread.CurrentThread.ManagedThreadId; string mapName = String.Format("PageantRequest{0:x8}", threadId); using (MemoryMappedFile mappedFile = MemoryMappedFile.CreateNew(mapName, 4096)) { Assert.That(mappedFile.SafeMemoryMappedFileHandle.IsInvalid, Is.False); using (MemoryMappedViewStream stream = mappedFile.CreateViewStream()) { byte[] message = new byte[] { 0, 0, 0, 1, (byte)Agent.Message.SSH2_AGENTC_REMOVE_ALL_IDENTITIES }; stream.Write(message, 0, message.Length); COPYDATASTRUCT copyData = new COPYDATASTRUCT(); if (IntPtr.Size == 4) { copyData.dwData = new IntPtr(unchecked ((int)AGENT_COPYDATA_ID)); } else { copyData.dwData = new IntPtr(AGENT_COPYDATA_ID); } copyData.cbData = mapName.Length + 1; copyData.lpData = Marshal.StringToCoTaskMemAnsi(mapName); IntPtr copyDataPtr = Marshal.AllocHGlobal(Marshal.SizeOf(copyData)); Marshal.StructureToPtr(copyData, copyDataPtr, false); IntPtr resultPtr = SendMessage(hwnd, WM_COPYDATA, IntPtr.Zero, copyDataPtr); Marshal.FreeHGlobal(copyData.lpData); Marshal.FreeHGlobal(copyDataPtr); Assert.That(resultPtr, Is.Not.EqualTo(IntPtr.Zero)); byte[] reply = new byte[5]; stream.Position = 0; stream.Read(reply, 0, reply.Length); byte[] expected = { 0, 0, 0, 1, (byte)Agent.Message.SSH_AGENT_SUCCESS }; Assert.That(reply, Is.EqualTo(expected)); } } } }
public void SendMessageTest() { // TODO: Need to modify this test so that it does not use PageantAgent const string messageValue = "junk"; var builder = new BlobBuilder(); builder.AddStringBlob(messageValue); var messageBytes = builder.GetBlob(); using (var agent = new PageantAgent()) { var client = new PageantClient(); var reply = client.SendMessage(messageBytes); var replyParser = new BlobParser(reply); var replyHeader = replyParser.ReadHeader(); Assert.That(replyHeader.Message, Is.EqualTo(Agent.Message.SSH_AGENT_FAILURE)); } }
static void Main(string[] aArgs) { //Debugger.Launch(); CommandLineArgs.Parse(aArgs); if (CommandLineArgs.Mode == AgentMode.Server && PageantAgent.CheckPageantRunning()) { MessageBox.Show(Strings.errPageantRunning, Util.AssemblyTitle, MessageBoxButtons.OK, MessageBoxIcon.Asterisk); Environment.Exit(1); return; } if (CommandLineArgs.Mode == AgentMode.Auto) { if (PageantAgent.CheckPageantRunning()) { CommandLineArgs.Mode = AgentMode.Client; } else { CommandLineArgs.Mode = AgentMode.Server; } } Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); switch (CommandLineArgs.Mode) { case AgentMode.Server: try { Agent = new PageantAgent(); } catch (PageantRunningException) { Debug.Fail("should not get here unless Pageant started in last few msec."); Environment.Exit(1); return; } break; case AgentMode.Client: Agent = new PageantClient(); break; default: Debug.Fail("unknown mode"); Environment.Exit(1); return; } Agent.AddKeysFromFiles(CommandLineArgs.Files); Application.ApplicationExit += delegate(object aSender, EventArgs aEventArgs) { if (Agent is Agent) { ((Agent)Agent).Dispose(); } }; var keyManagerForm = new KeyManagerForm(Agent); if (!(Agent is Agent)) { keyManagerForm.Text += " - client mode"; } keyManagerForm.FormClosed += delegate(object aSender, FormClosedEventArgs aEventArgs) { Environment.Exit(0); }; keyManagerForm.Show(); Application.Run(); }