CASA/c_adlib/AD_Facade.cs

405 lines
14 KiB
C#
Raw Normal View History

using System;
using System.Collections;
using System.Xml;
using System.IO;
using System.Collections.Specialized;
using Novell.CASA.DataEngines.Common;
using Novell.CASA.CASAPolicy;
#if LINUX
using Novell.CASA.GUI;
#endif
namespace Novell.CASA.DataEngines
{
public class AD
{
private miCASAEngine micasaengine;
#if LINUX
private GKEngine gkEngine = null;
private KWalletEngine kwEngine = null;
#endif
private AggregationPol aggPol;
public AD()
{
// Always Aggregate miCASA.
micasaengine = new miCASAEngine();
kwEngine = new KWalletEngine();
gkEngine = new GKEngine();
/*
// Reading Policy to see what else needs to be Aggregated.
aggPol = (AggregationPol) ICASAPol.GetPolicy(CASAPolType.AGGREGATION_POL);
if (aggPol != null )
{
ArrayList stores = aggPol.StoreList;
IEnumerator enumerator = stores.GetEnumerator();
while(enumerator.MoveNext())
{
string storeID = (((Store)(enumerator.Current)).StoreName);
if(storeID.Equals(ConstStrings.KW))
{
Logger.DbgLog("A-D Lib: KWallet Set up for Aggregation");
kwEngine = new KWalletEngine();
}
else if(storeID.Equals(ConstStrings.GK))
{
Logger.DbgLog("A-D Lib:Gnome Keyring Set up for Aggregation");
gkEngine = new GKEngine();
}
// Console.WriteLine("StoreName = " + ((Store)(enumerator.Current)).StoreName + "StoreId = " + ((Store)(enumerator.Current)).StoreId);
}
}
*/
}
public XmlDocument Aggregate()
{
#if LINUX
gkEngine = null;
kwEngine = null;
#endif
//Read the Policy Just before you aggregate
// Reading Policy to see what else needs to be Aggregated.
aggPol = (AggregationPol) ICASAPol.GetPolicy(CASAPolType.AGGREGATION_POL);
if (aggPol != null )
{
ArrayList stores = aggPol.StoreList;
IEnumerator enumerator = stores.GetEnumerator();
while(enumerator.MoveNext())
{
string storeID = (((Store)(enumerator.Current)).StoreName);
#if LINUX
if(storeID.Equals(ConstStrings.KW))
{
Logger.DbgLog("A-D Lib: KWallet Set up for Aggregation");
kwEngine = new KWalletEngine();
}
else if(storeID.Equals(ConstStrings.GK))
{
Logger.DbgLog("A-D Lib:Gnome Keyring Set up for Aggregation");
gkEngine = new GKEngine();
}
#endif
// Console.WriteLine("StoreName = " + ((Store)(enumerator.Current)).StoreName + "StoreId = " + ((Store)(enumerator.Current)).StoreId);
}
}
XmlDocument ccf = new XmlDocument();
XmlElement elem = ccf.CreateElement("CCF");
ccf.AppendChild(elem);
// TBD: Lookup Policy here and maybe send it via constructors
XmlNode micasaEnum = micasaengine.Aggregate();
if (micasaEnum != null) //Atleast <miCASA> should come incase of no secrets
{
XmlNode gotit = ccf.ImportNode(micasaEnum,true);
ccf.DocumentElement.AppendChild(gotit);
}
else
{
// Null comes only when it failed to talk to miCASA.
#if LINUX
Logger.DbgLog("A-D Lib:Failed to Connect to miCASA");
#endif
}
#if LINUX
if (gkEngine != null)
{
XmlNode gkSecrets = gkEngine.Aggregate();
if( null != gkSecrets )
{
XmlNode gkImportedNode = ccf.ImportNode(gkSecrets,true);
ccf.DocumentElement.AppendChild(gkImportedNode);
}
else
{
Logger.DbgLog("A-D Lib:Failed to Connect to Gnome Keyring");
}
}
if(kwEngine != null )
{
XmlNode KwEnum = kwEngine.Aggregate();
if (KwEnum != null) //Atleast <KWallet> should come incase of no secrets
{
XmlNode kwImported = ccf.ImportNode(KwEnum,true);
ccf.DocumentElement.AppendChild(kwImported);
}
else
{
// Null comes only when it failed to talk to Kwallet.
Logger.DbgLog("A-D Lib:Failed to Connect to KWallet");
}
}
#endif
return ccf;
}
/********************************************************************************
Modifying a Secret
SetSecret will modify the Value(s) of a Key(s) for an existing secret
SetSecret will also add new secrets
public int SetSecret(XmlNode secret, int StoreID)
Parameters
secret : Secrets XMLNode
1. If a Key node of a secret is missing then that key will be deleted
2. For Gnome keyring, Key having Id "GkPassword" cannot be deleted as
Gnome Api's do not allow it.
3. All Time nodes for a Secret need not be passed as they cannot be set.
4. Keyring attributes have a fixed datatype of Int and String.
Currently we support only String types. To support int types CCF needs to be modified accordingly.
5. SetSecret overloaded method, without the opnType parameter, is not supported for GnomeKeyring
opnType : Operation Type
ConstStrings.OPERATION_ADD_SECRET
ConstStrings.OPERATION_MODIFY_SECRET
StoreID : int value
Novell.CASA.DataEngines.Common.ConstStrings.CASA_STORE_KWALLET = 3;
Novell.CASA.DataEngines.Common.ConstStrings.CASA_STORE_GK = 4
Returns
An Error code or 0 if operation is successfull.
*********************************************************************************/
public int SetSecret(XmlNode secret, int opnType, int StoreID)
{
if (StoreID == ConstStrings.CASA_STORE_MICASA)
return micasaengine.SetSecret(secret, opnType);
if (StoreID == ConstStrings.CASA_STORE_KWALLET)
return kwEngine.SetSecret(secret, opnType);
if (StoreID == ConstStrings.CASA_STORE_GK)
return gkEngine.SetSecret(secret, opnType);
else
{
#if LINUX
Logger.DbgLog("A-D Lib:Failed to Set Secret in to miCASA");
#endif
return -1;
}
}
/********************************************************************************
Modifying a Secret
SetSecret will modify the Value(s) of a Key(s) for an existing secret
SetSecret will also add new secrets
public int SetSecret(XmlNode secret, int StoreID)
Parameters
secret : Secrets XMLNode
1. If a Key node of a secret is missing then that key will be deleted
2. For Gnome keyring, Key having Id "GkPassword" cannot be deleted as
Gnome Api's do not allow it.
3. All Time nodes for a Secret need not be passed as they cannot be set.
4. Keyring attributes have a fixed datatype of Int and String.
Currently we support only String types. To support int types CCF needs to be modified accordingly.
StoreID : int value
Novell.CASA.DataEngines.Common.ConstStrings.CASA_STORE_KWALLET = 3;
Novell.CASA.DataEngines.Common.ConstStrings.CASA_STORE_GK = 4
Returns
An Error code or 0 if operation is successfull.
*********************************************************************************/
public int SetSecret(XmlNode secret, int StoreID)
{
if (StoreID == ConstStrings.CASA_STORE_MICASA)
return micasaengine.SetSecret(secret);
if (StoreID == ConstStrings.CASA_STORE_KWALLET)
return kwEngine.SetSecret(secret);
if (StoreID == ConstStrings.CASA_STORE_GK)
return gkEngine.SetSecret(secret);
else
{
#if LINUX
Logger.DbgLog("A-D Lib:Failed to Set Secret in to miCASA");
#endif
return -1;
}
}
public int GetSecret(XmlNode secret, int StoreID)
{
//TBD: Check for Store ID and call the right DataEngine.
if (StoreID == ConstStrings.CASA_STORE_MICASA)
return micasaengine.GetSecret(secret);
else
{
#if LINUX
Logger.DbgLog("A-D Lib: Failed to Get Secret in to miCASA");
#endif
return -1;
}
}
/*******************************************************************************
Remove will delete a Secret.
public int Remove(XmlNode secret, int StoreID)
Parameters
secret : Secrets XmlNode
1. This node will be deleted from its parent.
StoreID : int value
Novell.CASA.DataEngines.Common.ConstStrings.CASA_STORE_KWALLET = 3;
Novell.CASA.DataEngines.Common.ConstStrings.CASA_STORE_GK = 4
Returns
An Error code or 0 if operation is successfull.
*********************************************************************************/
public int Remove(XmlNode secret, int StoreID)
{
if (StoreID == ConstStrings.CASA_STORE_MICASA)
return micasaengine.Remove(secret);
if (StoreID == ConstStrings.CASA_STORE_KWALLET)
return kwEngine.Remove(secret);
if (StoreID == ConstStrings.CASA_STORE_GK)
return gkEngine.Remove(secret);
return -1;
}
public int AggregateStore(XmlDocument outDoc, int StoreID)
{
// This need not be policy aware. GUI knows what its doing.
XmlNode secEnum;
DataEngine engine;
XmlNode toproot = outDoc.DocumentElement;
if (toproot == null)
{
XmlElement elem = outDoc.CreateElement("CCF");
outDoc.AppendChild(elem);
}
if ( StoreID == ConstStrings.CASA_STORE_MICASA ) // If its miCASA
{
engine = micasaengine;
secEnum = engine.Aggregate();
if (secEnum != null )
{
XmlNode root = outDoc.DocumentElement;
XmlNodeList miCASANodes = root.SelectNodes("descendant::miCASA");
// Console.WriteLine("ADLIB: Count is " + miCASANodes.Count);
if (miCASANodes.Count != 0) // If there is something remove it
{
root.RemoveChild(miCASANodes[0]);
}
XmlNode gotit = outDoc.ImportNode(secEnum,true);
root.AppendChild(gotit);
return ConstStrings.CASA_SUCCESS;
}
else
return ConstStrings.CASA_STORE_NOT_AVAILABLE;
}
#if LINUX
else if( StoreID == ConstStrings.CASA_STORE_GK )
{
gkEngine = new GKEngine();
secEnum = gkEngine.Aggregate();
if (secEnum != null )
{
XmlNode root = outDoc.DocumentElement;
XmlNodeList gkNode = root.SelectNodes("descendant::GK");
if (gkNode.Count != 0) // If there is something remove it
{
root.RemoveChild(gkNode[0]);
}
XmlNode gkImportNode = outDoc.ImportNode(secEnum,true);
root.AppendChild(gkImportNode);
return ConstStrings.CASA_SUCCESS;
}
else
return ConstStrings.CASA_STORE_NOT_AVAILABLE;
}
else if(StoreID == ConstStrings.CASA_STORE_KWALLET)
{
kwEngine = new KWalletEngine();
secEnum = kwEngine.Aggregate();
if (secEnum != null )
{
XmlNode root = outDoc.DocumentElement;
XmlNodeList gkNode = root.SelectNodes("descendant::KWallet");
if (gkNode.Count != 0) // If there is something remove it
{
root.RemoveChild(gkNode[0]);
}
XmlNode kwImportNode = outDoc.ImportNode(secEnum,true);
root.AppendChild(kwImportNode);
return ConstStrings.CASA_SUCCESS;
}
else
{
//Console.WriteLine("KWallet some issue");
return ConstStrings.CASA_STORE_NOT_AVAILABLE;
}
}
Logger.DbgLog("A-D Lib: Unknown Operation Requested");
#endif
return ConstStrings.CASA_OPERATION_FAILED;
}
public int InitAD()
{
return ConstStrings.CASA_SUCCESS;
}
public int CleanUP_AD()
{
return ConstStrings.CASA_SUCCESS;
}
}
}