From 275f11c089bf07c1e243f3a049b5ed12b50b6528 Mon Sep 17 00:00:00 2001 From: Jim Norman Date: Thu, 1 Mar 2007 21:52:23 +0000 Subject: [PATCH] Check point code for brainshare demo --- .../lib/communication/MiCasaRequestReply.cs | 191 ------------- .../micasad/lib/communication/SAS.Designer.cs | 52 ++++ CASA/micasad/lib/communication/SAS.cs | 18 ++ .../lib/communication/UnixIPCClientChannel.cs | 182 ------------ .../lib/communication/WinIPCClientChannel.cs | 103 ------- .../lib/communication/iss/MethodCall.cs | 125 +++++++++ .../lib/communication/server/AppHandler.cs | 125 +++++++++ .../CommunicationFactory.cs} | 40 +-- .../ICommunication.cs} | 25 +- .../lib/communication/server/IPCChannel.cs | 62 +++++ .../lib/communication/server/ISSVerb.cs | 55 ++++ .../lib/communication/verbs/CMWebClient.cs | 73 +++++ .../lib/communication/verbs/SelectCard.cs | 262 ++++++++++++++++++ .../lib/communication/win/PipeManager.cs | 174 ++++++++++++ .../lib/communication/win/ServerNamedPipe.cs | 132 +++++++++ 15 files changed, 1110 insertions(+), 509 deletions(-) delete mode 100644 CASA/micasad/lib/communication/MiCasaRequestReply.cs create mode 100644 CASA/micasad/lib/communication/SAS.Designer.cs create mode 100644 CASA/micasad/lib/communication/SAS.cs delete mode 100644 CASA/micasad/lib/communication/UnixIPCClientChannel.cs delete mode 100644 CASA/micasad/lib/communication/WinIPCClientChannel.cs create mode 100644 CASA/micasad/lib/communication/iss/MethodCall.cs create mode 100644 CASA/micasad/lib/communication/server/AppHandler.cs rename CASA/micasad/lib/communication/{IPCClientFactory.cs => server/CommunicationFactory.cs} (63%) rename CASA/micasad/lib/communication/{IClientChannel.cs => server/ICommunication.cs} (77%) create mode 100644 CASA/micasad/lib/communication/server/IPCChannel.cs create mode 100644 CASA/micasad/lib/communication/server/ISSVerb.cs create mode 100644 CASA/micasad/lib/communication/verbs/CMWebClient.cs create mode 100644 CASA/micasad/lib/communication/verbs/SelectCard.cs create mode 100644 CASA/micasad/lib/communication/win/PipeManager.cs create mode 100644 CASA/micasad/lib/communication/win/ServerNamedPipe.cs diff --git a/CASA/micasad/lib/communication/MiCasaRequestReply.cs b/CASA/micasad/lib/communication/MiCasaRequestReply.cs deleted file mode 100644 index c15162ff..00000000 --- a/CASA/micasad/lib/communication/MiCasaRequestReply.cs +++ /dev/null @@ -1,191 +0,0 @@ -/*********************************************************************** - * - * Copyright (C) 2005-2006 Novell, Inc. All Rights Reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; version 2.1 - * of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, Novell, Inc. - * - * To contact Novell about this file by physical or electronic mail, - * you may find current contact information at www.novell.com. - * - ***********************************************************************/ - - -using System; -using System.Text; -using System.Runtime.Serialization.Formatters.Binary; -using System.IO; - -using Novell.CASA.MiCasa.Common; - -namespace Novell.CASA.MiCasa.Communication -{ - /// - /// Summary description for MiCasaRequestReply. - /// - public class MiCasaRequestReply - { - - //public const int VERB_GET_SECRET = 1; - //public const int VERB_SET_SECRET = 2; - //public const int VERB_GET_KEYCHAIN = 3; - //public const int VERB_GET_STORE = 4; - //public const int VERB_SET_KEYVALUE = 5; - //public const int VERB_GET_KEYVALUE = 6; - public const int VERB_SET_LINKED_KEY = 7; - public const int VERB_GET_LINKED_KEYS = 8; - public const int VERB_REMOVE_LINKED_KEY = 9; - public const int VERB_WRITE_KEY = 10; - public const int VERB_REMOVE_ALL_SECRETS = 11; - public const int VERB_LOCK_STORE = 12; - public const int VERB_UNLOCK_STORE = 13; - public const int VERB_GET_STORE_STATUS = 14; - public const int VERB_REMOVE_KEY = 15; - public const int VERB_READ_KEY = 16; - public const int VERB_GET_KEY_LIST = 17; - public const int VERB_RESET_MASTER_PASSWORD = 18; - public const int VERB_GET_SECRETIDS = 19; - public const int VERB_VALIDATE_DESKTOP_PWD = 20; - public const int VERB_EXPORT_SECRETS = 21; - public const int VERB_ADD_XML_SECRETS = 22; - public const int VERB_CHANGE_PERSIST_DIR = 23; - public const int VERB_CREATE_POLICY_DIR = 24; - public const int VERB_GET_CREATE_TIME = 25; - public const int VERB_GET_MODIFIED_TIME = 26; - - public const int VERB_DUMP_LINKED_KEYS = 96; - public const int VERB_CREATE_TEST_SECRETS = 97; - public const int VERB_REMOVE_TEST_SECRETS = 98; - public const int VERB_PING_MICASAD = 99; - - public MiCasaRequestReply() - { - // - // TODO: Add constructor logic here - // - } - - public static object Send(int verb) - { - return Send(verb, null, null, null, null); - } - - public static object Send(int verb, object wo) - { - return Send(verb, null, null, null, wo); - } - - public static object Send(int verb, - string sKeyChainID, - string sSecretID, - string sKeyID, - object theObject) - { - - // Lengths of message fields - int MSGID_LEN = 2; - int MSG_LEN = 4; - WrappedObject request; - WrappedObject reply = null; - - // open a client connection - //IInterProcessConnection clientConnection = null; - - ClientChannel ipcChannel = IPCClientFactory.CreateClientConnection(); - ipcChannel.Open(); - - - - try - { - // contruct and serialize the Message Object - request = new WrappedObject(verb, sKeyChainID, sSecretID, sKeyID, theObject); - - BinaryFormatter formatter = new BinaryFormatter(); - MemoryStream ms = new MemoryStream(); - formatter.Serialize(ms, request); - ms.Flush(); - ms.Position = 0; - - byte[] rawBytes = new byte[2+4+ms.Length]; - - byte[] t = new byte[10]; - - // set message id - int destIndex = 0; - ushort msgId = 20; - t = BitConverter.GetBytes((ushort)msgId); - Array.Copy(t,0,rawBytes,destIndex,MSGID_LEN); - destIndex += MSGID_LEN; - - // set the object length -//Poorna - int msgLen = 2+4+(int)ms.Length; -// int msgLen = (int)ms.Length; - t = BitConverter.GetBytes(msgLen); -// t = BitConverter.GetBytes(ms.Length); - Array.Copy(t,0,rawBytes,destIndex,MSG_LEN); - destIndex += MSG_LEN; - - // copy in the object - Array.Copy(ms.GetBuffer(), 0, rawBytes, destIndex, ms.Length); - - //clientConnection = new ClientPipeConnection("MyPipe", "."); - //clientConnection = new ClientPipeConnection(XTIER_RPC_PIPE, "."); - //clientConnection.Connect(); - - // write the bytes - //clientConnection.WriteBytes(rawBytes); - ipcChannel.Write(rawBytes); - - // read the bytes - //byte[] returnBuffer = clientConnection.ReadBytes(); - byte[] returnBuffer = ipcChannel.Read(); - - if (returnBuffer != null) - { - // deserialize MessageObject - uint iMsgLen = BitConverter.ToUInt32(returnBuffer,0); - ms = new MemoryStream(returnBuffer, 4, (int)iMsgLen); - ms.Position = 0; - reply = (WrappedObject)formatter.Deserialize(ms); - - if (reply.GetReturnCode() != 0) - { - ipcChannel.Close(); - throw new Exception(reply.GetReturnCode().ToString()); - } - - } - - // close the connection - //clientConnection.Close(); - ipcChannel.Close(); - - - } - catch (Exception) - { - //Console.WriteLine(e1.ToString()); - //clientConnection.Dispose(); - //throw new Exception(e1.ToString()); - } - - if (reply != null) - return reply.GetObject(); - else - return null; - } - } - } - diff --git a/CASA/micasad/lib/communication/SAS.Designer.cs b/CASA/micasad/lib/communication/SAS.Designer.cs new file mode 100644 index 00000000..3d178fbe --- /dev/null +++ b/CASA/micasad/lib/communication/SAS.Designer.cs @@ -0,0 +1,52 @@ +namespace Novell.CASA.communication +{ + partial class SAS + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // SAS + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.ControlDark; + this.ClientSize = new System.Drawing.Size(292, 266); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "SAS"; + this.Opacity = 0.8; + this.ShowInTaskbar = false; + this.WindowState = System.Windows.Forms.FormWindowState.Maximized; + this.ResumeLayout(false); + + } + + #endregion + } +} \ No newline at end of file diff --git a/CASA/micasad/lib/communication/SAS.cs b/CASA/micasad/lib/communication/SAS.cs new file mode 100644 index 00000000..3561e1f6 --- /dev/null +++ b/CASA/micasad/lib/communication/SAS.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace Novell.CASA.communication +{ + public partial class SAS: Form + { + public SAS() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/CASA/micasad/lib/communication/UnixIPCClientChannel.cs b/CASA/micasad/lib/communication/UnixIPCClientChannel.cs deleted file mode 100644 index 156f6d08..00000000 --- a/CASA/micasad/lib/communication/UnixIPCClientChannel.cs +++ /dev/null @@ -1,182 +0,0 @@ -/*********************************************************************** - * - * Copyright (C) 2005-2006 Novell, Inc. All Rights Reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; version 2.1 - * of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, Novell, Inc. - * - * To contact Novell about this file by physical or electronic mail, - * you may find current contact information at www.novell.com. - * - ***********************************************************************/ - -using System; -using System.Net; -using System.IO; -using System.Net.Sockets; -using Mono.Unix; -using System.Text; - -namespace Novell.CASA.MiCasa.Communication -{ - /// - /// Summary description for UnixIPCClientChannel. - /// - public class UnixIPCClientChannel : ClientChannel - { - - private Socket mSocket = null; - private string socketFileName = "/tmp/.novellCASA"; - private EndPoint sockEndPoint; - - public UnixIPCClientChannel() - { - } - - public void Open() - { - mSocket = new Socket(AddressFamily.Unix, - SocketType.Stream, - ProtocolType.IP); - - if (mSocket == null) - { - throw new Exception("could not get socket"); - } - - sockEndPoint = new UnixEndPoint(socketFileName); - UnixFileSystemInfo sockFileInfo = new UnixFileInfo(socketFileName); - UnixUserInfo sockFileOwner = sockFileInfo.OwnerUser; - - // root is the owner of the file "/tmp/.novellCASA" - if (sockFileOwner.UserId == 0) - { - mSocket.Connect(sockEndPoint); - } - else - { - throw new Exception("not a valid miCASA service"); - } - - } - - public int Read(byte[] buf) - { - buf = Read(); - - if (buf != null) - { - //Console.WriteLine("Bytes read = " + buf.Length); - return buf.Length; - } - else - return 0; - } - - public byte[] Read() - { - byte[] returnBuffer = null; - int bytesRecvd = 0; - - try - { - /* We need to read 'msgLen' to know how many bytes to - * allocate. - */ - - byte[] msgIdBytes = new byte[2]; - bytesRecvd = mSocket.Receive(msgIdBytes); - if (0 == bytesRecvd) - { - return null; - } - byte[] msgLenBytes = new byte[4]; - bytesRecvd = mSocket.Receive(msgLenBytes); - if (0 == bytesRecvd) - { - return null; - } - - uint msgLen = BitConverter.ToUInt32(msgLenBytes, 0); - if (msgLen > 6) - { - byte[] buf = null; - int bytesAvailable; - int totalBytes = 0; - int msgLencount = 0; - string bufstring = null; - - // buffer for data - MemoryStream ms = new MemoryStream(); - - while (totalBytes < (msgLen - 6)) - { - bytesAvailable = mSocket.Available; - if (0 == bytesAvailable) - { - break; - } - buf = new byte[bytesAvailable]; - bytesRecvd = mSocket.Receive(buf); - ms.Write(buf, 0, bytesRecvd); - - totalBytes = totalBytes + bytesAvailable; - } - if (totalBytes == 0) - return null; - - byte[] finalbuf = ms.ToArray(); - - int returnBufferLen = msgIdBytes.Length + msgLenBytes.Length + totalBytes; - returnBuffer = new byte[returnBufferLen]; - Array.Copy(msgIdBytes, returnBuffer, 2); - Array.Copy(msgLenBytes, 0, returnBuffer, 2, 4); - Array.Copy(finalbuf, 0, returnBuffer, 6, finalbuf.Length); - return returnBuffer; - } - else - { - returnBuffer = new byte[6]; - Array.Copy(msgIdBytes, returnBuffer, 2); - Array.Copy(msgLenBytes, 0, returnBuffer, 2, 4); - return returnBuffer; - } - } - catch (Exception e) - { - Console.WriteLine(e.ToString()); - return null; - } - } - - public int Write(byte[] buf) - { - try - { - mSocket.Send(buf); - //Console.WriteLine("Bytes written = " + buf.Length); - return buf.Length; - } - catch (Exception e) - { - Console.WriteLine(e.ToString()); - return 0; - } - } - - public void Close() - { - mSocket.Close(); - } - } -} diff --git a/CASA/micasad/lib/communication/WinIPCClientChannel.cs b/CASA/micasad/lib/communication/WinIPCClientChannel.cs deleted file mode 100644 index ebe27f82..00000000 --- a/CASA/micasad/lib/communication/WinIPCClientChannel.cs +++ /dev/null @@ -1,103 +0,0 @@ -/*********************************************************************** - * - * Copyright (C) 2005-2006 Novell, Inc. All Rights Reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; version 2.1 - * of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, Novell, Inc. - * - * To contact Novell about this file by physical or electronic mail, - * you may find current contact information at www.novell.com. - * - ***********************************************************************/ - - -using System; - -using AppModule.InterProcessComm; -using AppModule.NamedPipes; - -namespace Novell.CASA.MiCasa.Communication -{ - /// - /// Summary description for WinIPCClientChannel. - /// - public class WinIPCClientChannel : ClientChannel - { - - private static IInterProcessConnection clientConnection = null; - private static string XTIER_RPC_PIPE = "SS_RPC_PIPE"; - - public WinIPCClientChannel() - { - - } - - public void Open() - { - if (clientConnection == null) - { - clientConnection = new ClientPipeConnection(XTIER_RPC_PIPE, "."); - clientConnection.Connect(); - } - - } - - public int Read(byte[] buf) - { - buf = Read(); - - if (buf != null) - return 0; - else - return -1; - } - - public byte[] Read() - { - byte[] returnBuffer; - - try - { - returnBuffer = clientConnection.ReadBytes(); - return returnBuffer; - } - catch (Exception e) - { - Console.WriteLine(e.ToString()); - return null; - } - } - - public int Write(byte[] buf) - { - try - { - clientConnection.WriteBytes(buf); - return 0; - } - catch (Exception e) - { - Console.WriteLine(e.ToString()); - return -1; - } - } - - public void Close() - { - - //clientConnection.Close(); - //clientConnection.Dispose(); - } - - } -} diff --git a/CASA/micasad/lib/communication/iss/MethodCall.cs b/CASA/micasad/lib/communication/iss/MethodCall.cs new file mode 100644 index 00000000..28c66339 --- /dev/null +++ b/CASA/micasad/lib/communication/iss/MethodCall.cs @@ -0,0 +1,125 @@ +using System; +using System.Collections; +using System.Text; + +using System.Xml; + +namespace Novell.CASA +{ + class MethodCall + { + internal static string GetCard = "getCard"; + internal static string GetSecurityToken = "getSecurityToken"; + + //private string m_methodname; + private Hashtable m_htParams = new Hashtable(); + private ArrayList m_alReqClaims = new ArrayList(); + private ArrayList m_alOptClaims = new ArrayList(); + + private XmlDocument m_doc = new XmlDocument(); + private XmlNode m_methodCall; + private XmlNode m_methodName; + private XmlNode m_params; + private XmlNode m_param; + private XmlNode m_struct; + + + public MethodCall(string sMethodName) + { + //m_methodname = sMethodName; + //m_methodCall = m_doc.CreateNode(XmlNodeType.Element, "methodCall", ""); + m_methodCall = m_doc.CreateElement("methodCall"); + + m_methodName = m_doc.CreateElement("methodName"); + m_methodName.InnerText = sMethodName; + + m_params = m_doc.CreateElement("params"); + m_param = m_doc.CreateElement("param"); + m_struct = m_doc.CreateElement("struct"); + + m_param.AppendChild(m_struct); + m_params.AppendChild(m_param); + + m_methodCall.AppendChild(m_methodName); + m_methodCall.AppendChild(m_params); + + m_doc.AppendChild(m_methodCall); + + } + + + public void AddMember(string sName, string sValue) + { + XmlNode nodeMember = m_doc.CreateElement("member"); + + XmlNode nodeName = m_doc.CreateNode(XmlNodeType.Element, "name", null); + nodeName.InnerText = sName; + + XmlNode nodeValue = m_doc.CreateNode(XmlNodeType.Element, "value", null); + nodeValue.InnerText = sValue; + + nodeMember.AppendChild(nodeName); + nodeMember.AppendChild(nodeValue); + + m_struct.AppendChild(nodeMember); + } + + + public void AddRequiredClaim(string sClaim) + { + m_alReqClaims.Add(sClaim); + } + + public void AddOptionalClaim(string sOptClaim) + { + m_alOptClaims.Add(sOptClaim); + } + + internal string GetXmlRpc() + { + + // add claims to doc + if (m_alReqClaims.Count > 0) + { + AppendClaims("requiredclaims", m_alReqClaims); + } + + if (m_alOptClaims.Count > 0) + { + AppendClaims("optionalclaims", m_alOptClaims); + } + + return m_doc.InnerXml; +// return null; + + } + + private void AppendClaims(string sClaimType, ArrayList al) + { + + XmlNode member = m_doc.CreateNode(XmlNodeType.Element, "member", null); + XmlNode name = m_doc.CreateNode(XmlNodeType.Element, "name", null); + name.InnerText = sClaimType; + + XmlNode array = m_doc.CreateElement("array"); + XmlNode data = m_doc.CreateElement("data"); + array.AppendChild(data); + + foreach (string sClaim in al) + { + XmlNode valueNode = m_doc.CreateNode(XmlNodeType.Element, "value", null); + valueNode.InnerText = sClaim; + data.AppendChild(valueNode); + } + + member.AppendChild(name); + member.AppendChild(array); + + m_struct.AppendChild(member); + + } + + + + } +} diff --git a/CASA/micasad/lib/communication/server/AppHandler.cs b/CASA/micasad/lib/communication/server/AppHandler.cs new file mode 100644 index 00000000..3f70cf07 --- /dev/null +++ b/CASA/micasad/lib/communication/server/AppHandler.cs @@ -0,0 +1,125 @@ +/*********************************************************************** + * + * Copyright (C) 2005-2006 Novell, Inc. All Rights Reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1 + * of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, Novell, Inc. + * + * To contact Novell about this file by physical or electronic mail, + * you may find current contact information at www.novell.com. + * + ***********************************************************************/ + + +using System; +using System.Collections; +using System.Text; +using Novell.CASA.MiCasa.Communication.Server; + +class AppHandler +{ + //Data + private IPCChannel clientChannel; + + //Methods + internal AppHandler(IPCChannel ipcChannel) + { + clientChannel = ipcChannel; + //CSSSLogger.ExecutionTrace(this); + } + + ~AppHandler() + { + //CSSSLogger.ExecutionTrace(this); + } + + /* Starts servicing the application. This is called as soon + * as a new client connection is established. + */ + internal int ServiceApp(RequestParser reqParser) + { + SSVerb verb = null; + //CSSSLogger.ExecutionTrace(this); + + while(true) + { + byte[] buf = null; + + try + { + buf = clientChannel.Read(); + if( null == buf ) + { + return RetCodes.SUCCESS; + } + //RequestParser reqParser = new RequestParser(); + verb = reqParser.ParseRequest(buf); + //CSSSLogger.logbreak(); + //CSSSLogger.DbgLog("SSCS going to sevice a :: ** " + verb.GetVerbName() + " **"); + + + buf = verb.ProcessRequest(); + if ( buf != null) + { + int retVal = clientChannel.Write(buf); + if(retVal < 0) + { +// CSSSLogger.DbgLog("Write failed"); + return RetCodes.FAILURE; + } + } + else + { + //There must always be something written back to client. + return RetCodes.FAILURE; + } + } +// catch(CommunicationException e) +// { +// CSSSLogger.ExpLog(e.ToString()); +// throw e; +// } + catch(FormatException e) + { +// CSSSLogger.ExpLog(e.ToString()); + throw e; + } + catch(Exception e) + { + // CSSSLogger.ExpLog(e.ToString()); + throw e; + } + + /* TBD define verb specific heirarchy of exceptions catch + * (Some processing problem) + */ + + finally + { +// CSSSLogger.DbgLog("SSCS finished processing a SS Verb :: ** " + verb.GetVerbName() + " **"); +// CSSSLogger.logbreak(); + } + } + } + + internal class RetCodes + { + internal static int SUCCESS = 0; + internal static int FAILURE = -1; + internal static int LOAD_HIDDEN_ONLY = 1; + internal static int LOAD_ALL_EXCEPT_HIDDEN = 2; + internal static int WRITE_HIDDEN_ONLY = 3; + internal static int WRITE_ALL_EXCEPT_HIDDEN = 4; + internal static int WRITE_ALL = 5; + } +} diff --git a/CASA/micasad/lib/communication/IPCClientFactory.cs b/CASA/micasad/lib/communication/server/CommunicationFactory.cs similarity index 63% rename from CASA/micasad/lib/communication/IPCClientFactory.cs rename to CASA/micasad/lib/communication/server/CommunicationFactory.cs index 3e487562..493d130f 100644 --- a/CASA/micasad/lib/communication/IPCClientFactory.cs +++ b/CASA/micasad/lib/communication/server/CommunicationFactory.cs @@ -21,30 +21,32 @@ ***********************************************************************/ using System; - -namespace Novell.CASA.MiCasa.Communication +/* This class would have only static methods. + */ +namespace Novell.CASA.MiCasa.Communication.Server { - /// - /// Summary description for IPCClientFactory. - /// - public class IPCClientFactory - { - private IPCClientFactory() - { - } - public static ClientChannel CreateClientConnection() - { +public class CommunicationFactory +{ + /* Make the constructor private, to avoid instances of this + * class. + */ + private CommunicationFactory() + { + } + + /* This method must check for platform and return + * an appropriate class. As of now, it assumes platform as Linux. + */ + public static Communication CreateCommunicationEndPoint() + { #if LINUX - return( new UnixIPCClientChannel()); + return( new UnixCommunication()); #endif #if W32 - return (new WinIPCClientChannel()); + return (new WinCommunication()); #endif - } - - - } + } +} } - diff --git a/CASA/micasad/lib/communication/IClientChannel.cs b/CASA/micasad/lib/communication/server/ICommunication.cs similarity index 77% rename from CASA/micasad/lib/communication/IClientChannel.cs rename to CASA/micasad/lib/communication/server/ICommunication.cs index 0138551b..7a644f7d 100644 --- a/CASA/micasad/lib/communication/IClientChannel.cs +++ b/CASA/micasad/lib/communication/server/ICommunication.cs @@ -21,20 +21,17 @@ ***********************************************************************/ using System; -using System.Net; -using System.Net.Sockets; -//using sscs.communication.win.NamedPipes; +/* This is an interface which would be implemented + * by UnixCommunication and WinCommunication. + */ - -namespace Novell.CASA.MiCasa.Communication +namespace Novell.CASA.MiCasa.Communication.Server { - public interface ClientChannel - { - void Open(); - int Read(byte[] buf); - byte[] Read(); - int Write(byte[] buf); - void Close(); - } -} \ No newline at end of file + +public interface Communication +{ + void StartCommunicationEndPoint(); + void CloseCommunicationEndPoint(); +} +} diff --git a/CASA/micasad/lib/communication/server/IPCChannel.cs b/CASA/micasad/lib/communication/server/IPCChannel.cs new file mode 100644 index 00000000..0fd9d275 --- /dev/null +++ b/CASA/micasad/lib/communication/server/IPCChannel.cs @@ -0,0 +1,62 @@ +/*********************************************************************** + * + * Copyright (C) 2005-2006 Novell, Inc. All Rights Reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1 + * of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, Novell, Inc. + * + * To contact Novell about this file by physical or electronic mail, + * you may find current contact information at www.novell.com. + * + ***********************************************************************/ + +using System; +using System.Net; +using System.Net.Sockets; +#if W32 +using AppModule.NamedPipes; +#endif + +namespace Novell.CASA.MiCasa.Communication.Server +{ + +abstract class IPCChannel +{ + /* This must check for the platform and return an + * appropriate IPCChannel. + */ +#if LINUX + internal static IPCChannel Create(Socket socket) + { + int platform = (int)Environment.OSVersion.Platform; + if(( platform ==4 ) || ( platform == 128 )) + return (new UnixIPCChannel(socket) ) ; + else + return null; + } + +#endif + +#if W32 + internal static IPCChannel Create(ServerPipeConnection serverPipe) + { + return (new WinIPCChannel(serverPipe)); + } +#endif + abstract internal int Read(byte[] buf); + abstract internal byte[] Read(); + abstract internal int Write(byte[] buf); + abstract internal void Close(); + +} +} diff --git a/CASA/micasad/lib/communication/server/ISSVerb.cs b/CASA/micasad/lib/communication/server/ISSVerb.cs new file mode 100644 index 00000000..85d9189e --- /dev/null +++ b/CASA/micasad/lib/communication/server/ISSVerb.cs @@ -0,0 +1,55 @@ +/*********************************************************************** + * + * Copyright (C) 2005-2006 Novell, Inc. All Rights Reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1 + * of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, Novell, Inc. + * + * To contact Novell about this file by physical or electronic mail, + * you may find current contact information at www.novell.com. + * + ***********************************************************************/ + +using System; +using System.Collections; +using System.Text; +using System.Threading; + + + +namespace Novell.CASA.MiCasa.Communication.Server + { + + /* + * Defines the interfaces to be implemenetd by all Secret Store Verbs. + */ + public interface SSVerb + { + /* Takes in the raw bytes and sets them for a Verb, + * so that the verb will execute in the bytes given. + * TBD: In case we are able to send the byte[] through constructor, + * we can avoid this interface. + */ + + void SetMessageContent(byte[] rawbytes); + + /* Takes in the SecretStore Reeference and returns the correct SSVerb + */ + byte[] ProcessRequest(); + + //Gives the name of operation performed.Can be used in case of error. + string GetVerbName(); + } + + } + diff --git a/CASA/micasad/lib/communication/verbs/CMWebClient.cs b/CASA/micasad/lib/communication/verbs/CMWebClient.cs new file mode 100644 index 00000000..3ba1560f --- /dev/null +++ b/CASA/micasad/lib/communication/verbs/CMWebClient.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Specialized; +using System.Text; +using System.Net; +using System.IO; + +using Novell.CASA.GUI; + +namespace Novell.CASA.communication +{ + class CMWebClient + { + private WebClient m_wc = new WebClient(); + private Config m_config; + + public CMWebClient(Config config) + { + m_config = config; + } + + public byte[] GetData() + { + return GetData(null); + } + + public byte[] GetData(byte[] baDataToSend) + { + + try + { + string sISSAddr = m_config.GetConfigSetting("ISS_Address", "http://localhost:2020"); + byte[] responseData; + + if (baDataToSend != null) + { + responseData = m_wc.UploadData(sISSAddr, "POST", baDataToSend); + } + else + { + responseData = m_wc.DownloadData(sISSAddr); + } + + //NameValueCollection form = new NameValueCollection(); + //form.Add("MyName", "MyValue"); + //byte[] responseData = m_wc.UploadValues("http://buydotcom:8080/auction/innerweb.jsp", form); + return responseData; + } + catch (Exception e) + { + e.ToString(); + + } + + return null; + + //byte[] new data = m_wc.UploadData("http://www.novell.com", "POST", responseData); + + /* + + Stream s = m_wc.OpenRead("http://buydotcom:8080/auction/innerweb.jsp"); + StreamReader sr = new StreamReader(s); + string line = sr.ReadLine(); + while (line != null) + { + Console.WriteLine(line); + line = sr.ReadLine(); + } + */ + + + } + } +} diff --git a/CASA/micasad/lib/communication/verbs/SelectCard.cs b/CASA/micasad/lib/communication/verbs/SelectCard.cs new file mode 100644 index 00000000..1df2449c --- /dev/null +++ b/CASA/micasad/lib/communication/verbs/SelectCard.cs @@ -0,0 +1,262 @@ +/*********************************************************************** + * + * Copyright (C) 2005-2006 Novell, Inc. All Rights Reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1 + * of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, Novell, Inc. + * + * To contact Novell about this file by physical or electronic mail, + * you may find current contact information at www.novell.com. + * + ***********************************************************************/ + +using System; +using System.Collections; +using System.Text; +using System.Threading; + +using Novell.CASA.MiCasa.Communication.Server; +using Novell.CASA.GUI; + +namespace casa.verbs +{ + + /* + * This class is implementation of OpenSecretStore call. + * There will be one instance existing for every call made by the client. + */ + + internal class SelectCard : SSVerb + { + ushort msgId = 0; + uint inMsgLen = 0; + uint outMsgLen = 0; + uint ssVersion = 0; + uint ssNameLen = 0; + private string ssName; //Name of SecretStore to open + private byte[] inBuf; + + private byte[] outBuf; + int retCode = 0; + + private static int MAX_SS_NAME_LEN = 256; + + /* + * This method sets the class member with the byte array received. + */ + + public void SetMessageContent(byte[] ipcBytes) + { + inBuf = ipcBytes; + } + + /* + * This method does the actual implementation of OpenSecretStore + * + */ + + public byte[] ProcessRequest() + { + /* If an exception occurs in message format decoding, + * it is handled by AppHandler + */ + string sCardSelected = null; + byte[] baToken = null; + + + //parse incoming data + uint iLenIssuerUri = 0; + uint iLenRecipientUrl = 0; + uint iLenRequiredClaims = 0; + uint iLenOptionalClaims = 0; + uint iLenTokenType = 0; + uint iLenPolicy = 0; + + // get issuer + string sIssueUri = null; + iLenIssuerUri = BitConverter.ToUInt32(inBuf, 6); + if (iLenIssuerUri > 0) + { + byte[] baIssuerUri = new Byte[iLenIssuerUri]; + Array.Copy(inBuf, 10, baIssuerUri, 0, iLenIssuerUri); + sIssueUri = Encoding.Unicode.GetString(baIssuerUri); + } + + string sRecipientUrl = null; + iLenRecipientUrl = BitConverter.ToUInt32(inBuf, 6 + (4 + (int)iLenIssuerUri)); + if (iLenRecipientUrl > 0) + { + byte[] baRecipentUrl = new byte[iLenRecipientUrl]; + Array.Copy(inBuf, 10 + (4 + iLenIssuerUri), baRecipentUrl, 0, iLenRecipientUrl); + sRecipientUrl = Encoding.Unicode.GetString(baRecipentUrl); + } + + + // get requested claims + string sClaims = null; + iLenRequiredClaims = BitConverter.ToUInt32(inBuf, 6 + (4 + (int)iLenIssuerUri) + (4 + (int)iLenRecipientUrl)); + if (iLenRequiredClaims > 0) + { + byte[] baRequiredClaims = new byte[iLenRequiredClaims]; + Array.Copy(inBuf, 10 + (4 + iLenIssuerUri) + (4 + iLenRecipientUrl), baRequiredClaims, 0, iLenRequiredClaims); + sClaims = Encoding.Unicode.GetString(baRequiredClaims); + } + + // get optional claims + string sOptClaims = null; + iLenOptionalClaims = BitConverter.ToUInt32(inBuf, + 6 + + (4 + (int)iLenIssuerUri) + + (4 + (int)iLenRecipientUrl) + + (4 + (int)iLenRequiredClaims)); + + if (iLenOptionalClaims > 0) + { + byte[] baOptClaims = new byte[iLenOptionalClaims]; + Array.Copy(inBuf, 10 + (4 + iLenIssuerUri) + (4 + iLenRecipientUrl) + (4 + iLenRequiredClaims), baOptClaims, 0, iLenOptionalClaims); + sOptClaims = Encoding.Unicode.GetString(baOptClaims); + } + + string sTokenType = null; + iLenTokenType = BitConverter.ToUInt32(inBuf, + 6 + + (4 + (int)iLenIssuerUri) + + (4 + (int)iLenRecipientUrl) + + (4 + (int)iLenRequiredClaims) + + (4 + (int)iLenOptionalClaims)); + + if (iLenTokenType > 0) + { + byte[] baTokenType = new byte[iLenTokenType]; + Array.Copy(inBuf, + 10 + (4 + iLenIssuerUri) + (4 + iLenRecipientUrl) + (4 + iLenRequiredClaims) + (4 + iLenOptionalClaims), + baTokenType, + 0, + iLenTokenType); + sTokenType = Encoding.Unicode.GetString(baTokenType); + + } + + + string sPolicy = null; + iLenPolicy = BitConverter.ToUInt32(inBuf, + 6 + + (4 + (int)iLenIssuerUri) + + (4 + (int)iLenRecipientUrl) + + (4 + (int)iLenRequiredClaims) + + (4 + (int)iLenOptionalClaims) + + (4 + (int)iLenTokenType)); + + if (iLenPolicy > 0) + { + byte[] baPolicy = new byte[iLenPolicy]; + Array.Copy(inBuf, + 10 + (4 + iLenIssuerUri) + (4 + iLenRecipientUrl) + (4 + iLenRequiredClaims) + (4 + iLenOptionalClaims) + (4 + iLenTokenType), + baPolicy, + 0, + iLenPolicy); + sPolicy = Encoding.Unicode.GetString(baPolicy); + } + + if (true) + { + // display Card Selector + CardSelector cs = new CardSelector(); + //sCardSelected = cs.DisplaySelector(); + baToken = cs.GetToken(); + + retCode = 0; + } + else + { + + msgId = BitConverter.ToUInt16(inBuf, 0); + inMsgLen = BitConverter.ToUInt32(inBuf, 2); + + if (inMsgLen != inBuf.Length) + throw new FormatException(" MsgLen sent does not match the length of the message received."); + + ssVersion = BitConverter.ToUInt32(inBuf, 6); + ssNameLen = BitConverter.ToUInt32(inBuf, 10); + + if (ssNameLen > MAX_SS_NAME_LEN) + throw new FormatException(" SecretStore Name length exceeds length allowed"); + + byte[] tempArr = new byte[ssNameLen]; + Array.Copy(inBuf, 14, tempArr, 0, ssNameLen); + ssName = Encoding.UTF8.GetString(tempArr); + + } + + try + { + msgId = 0; + outMsgLen = 14; + if (baToken.Length > 0) + { + outBuf = new byte[14 + baToken.Length]; + outMsgLen = 14 + (uint)baToken.Length; + } + else + { + outBuf = new byte[14]; + } + + byte[] t = new byte[10]; + + t = BitConverter.GetBytes((ushort)msgId); + Array.Copy(t,0,outBuf,0,2); + + t = BitConverter.GetBytes((uint)outMsgLen); + Array.Copy(t,0,outBuf,2,4); + + t = BitConverter.GetBytes((uint)ssVersion); + Array.Copy(t,0,outBuf,6,4); + + t = BitConverter.GetBytes(retCode); + Array.Copy(t,0,outBuf,10,4); + + // copy card selected if there is one + //if (sCardSelected != null) + //{ + // byte[] baCard = Encoding.ASCII.GetBytes(sCardSelected); + // Array.Copy(baCard, 0, outBuf, 14, baCard.Length); + //} + if (baToken.Length > 0) + { + Array.Copy(baToken, 0, outBuf, 14, baToken.Length); + } + + + + + } + catch(Exception e) + { + + throw new FormatException("Unable to form the response " + e.ToString()); + } + return outBuf; + } + + + /* + * Gives the name of operation performed. Will be used in case + * of error. + */ + public string GetVerbName() + { + return this.ToString(); + } + } +} diff --git a/CASA/micasad/lib/communication/win/PipeManager.cs b/CASA/micasad/lib/communication/win/PipeManager.cs new file mode 100644 index 00000000..5e2e65e8 --- /dev/null +++ b/CASA/micasad/lib/communication/win/PipeManager.cs @@ -0,0 +1,174 @@ +/*********************************************************************** + * + * Copyright (C) 2005-2006 Novell, Inc. All Rights Reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1 + * of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, Novell, Inc. + * + * To contact Novell about this file by physical or electronic mail, + * you may find current contact information at www.novell.com. + * + ***********************************************************************/ + +using System; +using System.Collections; +using System.Threading; +using System.Web; +using System.IO; +using System.Configuration; +using System.Diagnostics; + +using AppModule.InterProcessComm; +using AppModule.NamedPipes; + +using Novell.CASA.MiCasa.Communication.Server; + +namespace Novell.CASA.MiCasa.Communication.win +{ + + public class PipeManager : IChannelManager { + + public Hashtable Pipes; + + private uint NumberPipes = 16; + private uint OutBuffer = 65536; //512; + private uint InBuffer = 65536; //512; + private const int MAX_READ_BYTES = 15000; + private bool _listen = true; + public bool Listen { + get { + return _listen; + } + set { + _listen=value; + } + } + private int numChannels = 0; + private Hashtable _pipes = new Hashtable(); + + //private Thread MainThread; + private string CASA_RPC_PIPE = "\\\\.\\PIPE\\CASA_MANAGER"; + private ManualResetEvent Mre; + private const int PIPE_MAX_STUFFED_TIME = 5000; + + public object SyncRoot = new object(); + + public void Initialize() { + Pipes = Hashtable.Synchronized(_pipes); + Mre = new ManualResetEvent(false); + /* + MainThread = new Thread(new ThreadStart(Start)); + MainThread.IsBackground = true; + MainThread.Name = "Main Pipe Thread"; + MainThread.Start(); + */ + Thread.Sleep(1000); + } + public string HandleRequest(string request) { + string returnVal; + + //Form1.ActivityRef.AppendText(request + Environment.NewLine); + returnVal = "Response to: " + request; + + return returnVal; + } + + public void Start() { + try { + while (_listen) { + int[] keys = new int[Pipes.Keys.Count]; + Pipes.Keys.CopyTo(keys,0); + foreach (int key in keys) { + ServerNamedPipe serverPipe = (ServerNamedPipe)Pipes[key]; + if (serverPipe != null && DateTime.Now.Subtract(serverPipe.LastAction).Milliseconds > PIPE_MAX_STUFFED_TIME && serverPipe.PipeConnection.GetState() != InterProcessConnectionState.WaitingForClient) { + serverPipe.Listen = false; + serverPipe.PipeThread.Abort(); + RemoveServerChannel(serverPipe.PipeConnection.NativeHandle); + } + } + if (numChannels <= NumberPipes) { + ServerNamedPipe pipe = new ServerNamedPipe(CASA_RPC_PIPE, OutBuffer, InBuffer, MAX_READ_BYTES); + + // register all verbs with this pipe + + + try { + pipe.Connect(); + pipe.LastAction = DateTime.Now; + System.Threading.Interlocked.Increment(ref numChannels); + pipe.Start(); + Pipes.Add(pipe.PipeConnection.NativeHandle, pipe); + } + catch (InterProcessIOException) { + RemoveServerChannel(pipe.PipeConnection.NativeHandle); + pipe.Dispose(); + } + } + else { + Mre.Reset(); + Mre.WaitOne(1000, false); + } + } + } + catch (Exception e) + { + Console.WriteLine("Exception starting server: "+e.ToString()); + // Log exception + } + } + public void Stop() { + _listen = false; + Mre.Set(); + try { + int[] keys = new int[Pipes.Keys.Count]; + Pipes.Keys.CopyTo(keys,0); + foreach (int key in keys) { + ((ServerNamedPipe)Pipes[key]).Listen = false; + } + int i = numChannels * 3; + for (int j = 0; j < i; j++) { + StopServerPipe(); + } + Pipes.Clear(); + Mre.Close(); + Mre = null; + } + catch { + // Log exception + } + } + + public void WakeUp() { + if (Mre != null) { + Mre.Set(); + } + } + private void StopServerPipe() { + try { + ClientPipeConnection pipe = new ClientPipeConnection(CASA_RPC_PIPE); + if (pipe.TryConnect()) { + pipe.Close(); + } + } catch { + // Log exception + } + } + + public void RemoveServerChannel(object param) { + int handle = (int)param; + System.Threading.Interlocked.Decrement(ref numChannels); + Pipes.Remove(handle); + this.WakeUp(); + } + } +} \ No newline at end of file diff --git a/CASA/micasad/lib/communication/win/ServerNamedPipe.cs b/CASA/micasad/lib/communication/win/ServerNamedPipe.cs new file mode 100644 index 00000000..1b91169b --- /dev/null +++ b/CASA/micasad/lib/communication/win/ServerNamedPipe.cs @@ -0,0 +1,132 @@ +/*********************************************************************** + * + * Copyright (C) 2005-2006 Novell, Inc. All Rights Reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1 + * of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, Novell, Inc. + * + * To contact Novell about this file by physical or electronic mail, + * you may find current contact information at www.novell.com. + * + ***********************************************************************/ + +using System; +using System.Threading; +using System.IO; + +using AppModule.InterProcessComm; +using AppModule.NamedPipes; + +using Novell.CASA.MiCasa.Communication.Server; + + +namespace Novell.CASA.MiCasa.Communication.win +{ + + public sealed class ServerNamedPipe : IDisposable { + internal Thread PipeThread; + internal ServerPipeConnection PipeConnection; + internal bool Listen = true; + internal DateTime LastAction; + private bool disposed = false; + + private void PipeListener() { + CheckIfDisposed(); + try { + Listen = true; + while (Listen) { + LastAction = DateTime.Now; + + // Service Client (new code) + IPCChannel ipcChannel = IPCChannel.Create(PipeConnection); + AppHandler appHandler = new AppHandler(ipcChannel); + + try + { + int retVal = appHandler.ServiceApp(new RequestParser()); + } + catch(Exception) + { + ipcChannel.Close(); + } + + LastAction = DateTime.Now; + PipeConnection.Disconnect(); + if (Listen) { + Connect(); + } + WinCommunication.PipeManager.WakeUp(); + } + } + catch (System.Threading.ThreadAbortException) { } + catch (System.Threading.ThreadStateException) { } + catch (Exception) { + // Log exception + + } + finally { + this.Close(); + } + } + internal void Connect() { + CheckIfDisposed(); + PipeConnection.Connect(); + } + internal void Close() { + CheckIfDisposed(); + this.Listen = false; + WinCommunication.PipeManager.RemoveServerChannel(this.PipeConnection.NativeHandle); + this.Dispose(); + } + internal void Start() { + CheckIfDisposed(); + PipeThread.Start(); + } + private void CheckIfDisposed() { + if(this.disposed) { + throw new ObjectDisposedException("ServerNamedPipe"); + } + } + public void Dispose() { + Dispose(true); + GC.SuppressFinalize(this); + } + private void Dispose(bool disposing) { + if(!this.disposed) { + PipeConnection.Dispose(); + if (PipeThread != null) { + try { + PipeThread.Abort(); + } + catch (System.Threading.ThreadAbortException) { } + catch (System.Threading.ThreadStateException) { } + catch (Exception) { + // Log exception + } + } + } + disposed = true; + } + ~ServerNamedPipe() { + Dispose(false); + } + + internal ServerNamedPipe(string name, uint outBuffer, uint inBuffer, int maxReadBytes) { + PipeConnection = new ServerPipeConnection(name, outBuffer, inBuffer, maxReadBytes, false); + PipeThread = new Thread(new ThreadStart(PipeListener)); + PipeThread.IsBackground = true; + PipeThread.Name = "Pipe Thread " + this.PipeConnection.NativeHandle.ToString(); + LastAction = DateTime.Now; + } + } +} \ No newline at end of file