using System; using System.Collections; using System.Collections.Specialized; using Novell.CASA.MiCasa.Common; using Novell.CASA.MiCasa.Communication; namespace Novell.CASA { /// /// Summary description for Secret. /// public class Secret : MarshalByRefObject { internal IntPtr m_pHsc; private string m_keyChainID; private uint m_ssFlags; internal IntPtr m_secretHandle; private string m_secretID; private string m_epPassword = null; private uint m_iCreateTime = 0; private uint m_iModifyTime = 0; private uint m_iAccessTime = 0; internal int m_type = 0; // holds name value pairs for this secret private System.Collections.Specialized.NameValueCollection m_nvc; private byte[] m_baValue = null; public static int SS_APP = 1; public static int SS_CREDSET = 2; public static int SS_BINARY = 4; // constructor internal Secret( IntPtr pHSC, string sKeyChainID, uint iSSFlags, IntPtr ptrHandle, string sSecretID, int iSecretType, string sEPPassword) { m_pHsc = pHSC; m_keyChainID = sKeyChainID; m_ssFlags = iSSFlags; m_secretHandle = ptrHandle; m_secretID = sSecretID; m_epPassword = sEPPassword; m_type = iSecretType; if (sSecretID.StartsWith("SS_CredSet")) m_type = Secret.SS_CREDSET; else if (sSecretID.StartsWith("SS_App")) m_type = Secret.SS_APP; else if (sSecretID.StartsWith("SS_Binary")) m_type = Secret.SS_BINARY; // create collection m_nvc = new System.Collections.Specialized.NameValueCollection(); } // TO clean up SecretHandle public string getID() { return m_secretID; } public void setKeyValuePair(string sKey, string sKeyValue) { if (m_type == Secret.SS_APP) m_nvc.Add(sKey, sKeyValue); else m_nvc.Set(sKey, sKeyValue); } public byte[] getBinaryValue() { return m_baValue; } // used for binary secrets, throws exception if not public void setBinaryValue(byte[] baData) { // make sure this is a binary secret if (this.m_type == SS_BINARY) { m_baValue = baData; } else { throw new Exception(); } } public string[] getKeyValues(string sKey) { return m_nvc.GetValues(sKey); } public string getKeyValue(string sKey) { return m_nvc.Get(sKey); } public int getSecretType() { return this.m_type; } // public string getSecretValue() // { // // TODO this is for a raw secret, just an ID and value // // should be only one key in the NameValueCollection // } public NameValueCollection getKeyValueCollection() { return m_nvc; } public void mergeKeyValueCollection(NameValueCollection nvc) { //if (m_nvc == null) m_nvc = nvc; } public void setEnhancedProtectionPassword(string sEPPassword) { m_epPassword = sEPPassword; } internal string getEnhancedProtectionPassword() { return m_epPassword; } public bool isEnhancedProtected() { if (m_epPassword != null) return true; else return false; } public void removeKey(string sKey, uint ctxFlags) { //call the ndk to remove that one too. NativeCalls.removeKeyValue(this.m_secretHandle, sKey, m_nvc.Get(sKey), ctxFlags); // remove from our collection m_nvc.Remove(sKey); } internal void setTimeStamps(uint uiCreated, uint uiModified, uint uiAccessed) { m_iCreateTime = uiCreated; m_iModifyTime = uiModified; m_iAccessTime = uiAccessed; } public uint getCreateTime() { return m_iCreateTime; } public uint getModifiedTime() { return m_iModifyTime; } public uint getAccessTime() { return m_iAccessTime; } public Hashtable GetLinkedKeys(string sKey) { Hashtable htLinkedKeys = (Hashtable)MiCasaRequestReply.Send(MiCasaRequestReply.VERB_GET_LINKED_KEYS, null, this.getID(), sKey, null); return htLinkedKeys; } } }