using System; using System.Text; using System.Runtime.InteropServices; namespace Novell.Casa.Client.Auth { /// /// Summary description for Class1. /// public class Authtoken { private const string AUTH_LIBRARY = "C:\\Program Files\\Novell\\CASA\\lib\\authtoken"; private const int BUFFER_OVERFLOW = 6; [DllImport(AUTH_LIBRARY, CharSet=CharSet.None) ] public static extern int ObtainAuthToken ( [In] byte[] baService, [In] byte[] baHost, [In, Out] byte[] baToken, [In, Out] ref int iTokenLength ); public Authtoken() { } public static byte[] ObtainAuthToken(string sService, string sHost) { int rcode = 0; byte[] baService = null; byte[] baHost = null; int bufferSize = 0; byte[] baToken = new byte[bufferSize]; // convert service to ascii byte array if (sService != null) { baService = Encoding.ASCII.GetBytes(sService); } else { throw new Exception("Invalid parameter"); } // convert host to ascii byte array if (sHost != null) { baHost = Encoding.ASCII.GetBytes(sHost); } else { throw new Exception("Invalid parameter"); } // call with buffersize of 0. This way we determine the exact size. try { rcode = ObtainAuthToken(baService, baHost, baToken, ref bufferSize); int test = (rcode & BUFFER_OVERFLOW); if (test == BUFFER_OVERFLOW) { // now allocate the proper size baToken = new byte[bufferSize]; rcode = ObtainAuthToken(baService, baHost, baToken, ref bufferSize); } } catch (Exception e) { LogMessage(e.ToString()); return null; } if (rcode != 0) { throw new Exception(rcode.ToString()); } else { return baToken; } } private static void LogMessage(string sMessage) { System.Diagnostics.Trace.WriteLine("(C#)AuthToken: " + sMessage); } } }