CASA/c_adlib/ad_ff/FireFox.cs
2006-02-28 10:58:02 +00:00

357 lines
11 KiB
C#

/***********************************************************************
*
* 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.Runtime.InteropServices;
using System.Collections.Specialized;
using System.Collections;
namespace Novell.CASA.DataEngines.FF
{
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class Host
{
public IntPtr hostName;
public IntPtr hostElement;
public IntPtr next;
public Host()
{
hostName = Marshal.AllocHGlobal(128);
}
~Host()
{
Marshal.FreeHGlobal(hostName);
}
};
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class HostElement
{
public IntPtr name;
public IntPtr value;
public int isPassword;
public IntPtr next;
public HostElement()
{
name = Marshal.AllocHGlobal(128);
value = Marshal.AllocHGlobal(128);
}
~HostElement()
{
Marshal.FreeHGlobal(name);
Marshal.FreeHGlobal(value);
}
};
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class KeyringInfo
{
public int lockOnIdle;
public uint lockTimeout;
public uint mTime;
public uint cTime;
public int isLocked;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class NativeItemInfo
{
public int itemType;
public IntPtr displayName;
public IntPtr secret;
public int mTime;
public int cTime;
public NativeItemInfo()
{
displayName = Marshal.AllocHGlobal(128);
secret = Marshal.AllocHGlobal(128);
}
~NativeItemInfo()
{
Marshal.FreeHGlobal(displayName);
Marshal.FreeHGlobal(secret);
}
}
public class ItemInfo
{
public string itemType;
public string displayName;
public string secret;
public int mTime;
public int cTime;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class NativeAttribute
{
public uint type;
public IntPtr key;
public IntPtr value;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class Attribute
{
public uint type;
public string key;
public string value;
}
public class FireFox
{
private static int MAX_PROFILES = 5; //FIXME:Maximum Profiles for Firefox - To be removed when done dynamically via a native api
private static int LOAD_PROFILE_ALWAYSFROM_FILE = 1;
//Initialization functions
[DllImport("libad_ff.so.1.1.1")]
public static extern int FPM_GetProfileList(out IntPtr[] profileList, out IntPtr[] profileFlag);
[DllImport("libad_ff.so.1.1.1")]
public static extern int FPM_FirefoxProfileInit(string profileName);
[DllImport("libad_ff.so.1.1.1")]
public static extern int FPM_FirefoxProfileExit(string profileName);
//Master Password functions
[DllImport("libad_ff.so.1.1.1")]
public static extern int FPM_IsMasterPasswordSet(string profileName);
[DllImport("libad_ff.so.1.1.1")]
public static extern int FPM_CheckMasterPassword(string profileName, string masterPassword);
//Signon functions
[DllImport("libad_ff.so.1.1.1")]
public static extern int FPM_GetSignonData(string profileName,out IntPtr host,int doRefresh);
//TBD
//int FPM_WriteSignonData(char *profileName)
//int FPM_AddHost(char *profileName, struct Host *host, int doUpdate)
//int FPM_ModifyHost(char *profileName, struct Host *host, int doUpdate)
//int FPM_RemoveHost(char *profileName, char *hostname, int doUpdate)
//--------------------------------------------------------------
//GetDefaultProfileName
//@param None
//@return Default ProfileName on success
// else null if not retrivable
//--------------------------------------------------------------
public static String GetDefaultProfileName()
{
IntPtr[] profileListIntPtr=new IntPtr[MAX_PROFILES];;
IntPtr[] profileFlagsIntPtr=new IntPtr[MAX_PROFILES];;
String[] profileList=null;
int[] profileFlags=null;
String profileName=null;
int profileFlag=0;
int profCount=0;
String defaultProfileName=null;
Console.WriteLine("FireFox:Invoking FPM_GetProfileList:");
profCount=FPM_GetProfileList(out profileListIntPtr,out profileFlagsIntPtr);
Console.WriteLine("FireFox:No of Profiles found= "+profCount);
for(int i=0; i< profCount; i++)
{
profileName=Marshal.PtrToStringAnsi(profileListIntPtr[i]);
profileFlag=(int)profileFlagsIntPtr[i];
Console.WriteLine("FireFox:Iter="+i+"profileName="+profileName);
Console.WriteLine("FireFox:Iter="+i+"profileFlag="+profileFlag);
if(profileFlag==1)
defaultProfileName=profileName; //Get the default profile name to init later
}
return defaultProfileName;
}
//--------------------------------------------------------------
//GetAllProfileNames
//@param None
//@return ProfileNames (String[]) - List of all Profile Names
// else null
//--------------------------------------------------------------
public static String[] GetAllProfileNames()
{
//TBD:To be implemented if\when required
return null;
}
//--------------------------------------------------------------
//GetProfileData
//GetProfileData for the specified profile
//@param
// profileName (string)
//
//@return hostList (Host) on success
// else null
//--------------------------------------------------------------
public static Host GetProfileData(string profileName)
{
Host hostList = new Host();
int methodStatusCode=-1;
//Console.WriteLine("FireFox:Initializing the Profile "+profileName);
//methodStatusCode=InitProfile(profileName);
//Console.WriteLine("FireFox:InitProfile returned "+methodStatusCode);
//if(methodStatusCode==1)
{//If Init of the profile was sucessfull, get the sigon data to complete the aggregation
IntPtr hostListIntPtr = new IntPtr();
try
{
Console.WriteLine("FireFox:Getting Data for profile "+profileName);
methodStatusCode=-1;
methodStatusCode = FPM_GetSignonData(profileName,out hostListIntPtr,LOAD_PROFILE_ALWAYSFROM_FILE);
if( 1 != methodStatusCode )
{
Console.WriteLine("FireFox:Getting Data for profile Failed with error "+methodStatusCode);
hostList = null;
}
}
catch(Exception e)
{
Console.WriteLine("FireFox:Exception during invokation of FPM_GetSignonData");
Console.WriteLine(e.ToString());
hostList = null;
}
hostList = (Host)Marshal.PtrToStructure(hostListIntPtr, typeof(Host));
//This can be Null only when nothing is aggregated.
if (((String)Marshal.PtrToStringAnsi(hostList.hostName)) == null )
{
//TBD: Log that there are no secrets to aggregate
Console.WriteLine("FireFox:no secrets to aggregate");
hostList = null;
}
//Uninitialize the profile
//Console.WriteLine("FireFox:UnInitializing the Profile "+profileName);
//UninitProfile(profileName);
}
return hostList;
}
//--------------------------------------------------------------
//InitFFProfile
//@param profileName name of the profile
//@return 1 on success
// <=0 on error
//--------------------------------------------------------------
public static int InitProfile(string profileName)
{
return FPM_FirefoxProfileInit(profileName);
}
//=================================================================
//--------------------------------------------------------------
//UninitProfile
//UninitProfile for the specified profile
//@param
// profileName (string)
//
//@return 1 on success
// <=0 on error
//--------------------------------------------------------------
public static int UninitProfile(string profileName)
{
int methodStatusCode=-1;
Console.WriteLine("FireFox:UninitProfile for "+profileName);
methodStatusCode=-1;
methodStatusCode = FPM_FirefoxProfileExit(profileName);
if( 1 != methodStatusCode )
{
Console.WriteLine("FireFox:UninitProfile Failed with error "+methodStatusCode);
}
return methodStatusCode;
}
//--------------------------------------------------------------
//isMasterPasswordSetFor
//Is MasterPassword Set For specified profile
//@param
// profileName (string)
//
//@param profileName name of the profile
// @return 1 if master password is set
// 0 if master password not set
//--------------------------------------------------------------
public static int isMasterPasswordSetFor(string profileName)
{
int methodStatusCode=0;
Console.WriteLine("FireFox:isMasterPasswordSetFor "+profileName);
methodStatusCode = FPM_IsMasterPasswordSet(profileName);
return methodStatusCode;
}
//--------------------------------------------------------------
//checkMasterPassword
//Check if the specified master password is correct or not.
//If it is correct then password is stored to the internal store for later use.
//If it is wrong then nothing is stored and 0 will be returned.
//
//@param
// profileName (string)
// masterPassword (string)
//
// @return 1 if the specified master password is correct
// 0 if the master password is wrong.
//--------------------------------------------------------------
public static int checkMasterPassword(string profileName,string masterPassword)
{
int methodStatusCode=0;
Console.WriteLine("FireFox:checking MasterPassword for "+profileName);
methodStatusCode = FPM_CheckMasterPassword(profileName,masterPassword);
return methodStatusCode;
}
//=================Local Methods====================================
}
}