Пример #1
0
        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));
                    }
                }
            }
        }
Пример #2
0
        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));
            }
        }
Пример #3
0
        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();
        }