CASA/c_adlib/ad_gk/native/FirefoxPasswordManager.cpp
2006-02-28 10:50:24 +00:00

592 lines
15 KiB
C++

#include "FirefoxPasswordManager.h"
#include "Common.h"
#include "ProfileManager.h"
ProfileManager profileManager[MAX_PROFILE_COUNT];
int profileCount = 0;
/*
* Gets the list of profile names...
*
* @param[in/out] profiles pointer to array of profile names
* @param[in/out] profileFlag Indicates if default profile or not.
* @return count count of profiles
* 0 no profiles found
* < 0 on error
*
* If one or more profiles found then profiles array is filled with
* the profile names and count of profiles is returned. ProfileFlag[]
* array is filled with 1 or 0 to indicate if the respective profile
* is default profile or not.If no profiles found then value 0 is
* returned and negative values is returned if there is an error.
*
*/
extern "C" APIEXPORT int FPM_GetProfileList(char **profileList[], int *profileFlag[])
{
#ifdef WIN32
char profileDir[MAX_PATH] = "";
char partialPath[] = "Application Data\\Mozilla\\Firefox";
char profilePath[MAX_PATH];
char line[1024];
DWORD pathSize = MAX_PATH;
char *finalProfilePath = NULL;
int profileCount = 0;
unsigned int i;
HANDLE token;
// Get current user's profile directory
if( OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token) == FALSE )
{
PrintMessage(MESG_ERROR, "\n GetProfileList : Failed to get current process token ");
return FPM_FALSE;
}
if( GetUserProfileDirectory(token, profileDir, &pathSize) == FALSE )
{
PrintMessage(MESG_ERROR, "\n GetProfileList : Failed to get user profile directory");
return FPM_FALSE;
}
PrintMessage(MESG_DEBUG, "\n GetProfileList : User Profile directory = %s", profileDir);
// Get firefox profile directory
strcpy(profilePath, profileDir);
strcat(profilePath,"\\");
strcat(profilePath,partialPath);
strcat(profilePath,"\\profiles.ini");
PrintMessage(MESG_DEBUG, "\n GetProfileList : Firefox profile dir path = %s ", profilePath);
#else // Linux platform....
char profileDir[] ="/.mozilla/firefox";
char profileFile[] ="/.mozilla/firefox/profiles.ini";
char line[1024];
char *profilePath = NULL;
char *homeDir = NULL;
char *finalProfilePath = NULL;
int profileCount = 0;
unsigned int i;
// Get home directory
homeDir = getenv("HOME");
if(homeDir == NULL )
{
PrintMessage(MESG_ERROR, "\n GetProfileList : Unable to get home directory ");
return FPM_FALSE;
}
profilePath = (char*) malloc( strlen(homeDir) + strlen(profileFile) + 3 );
if( profilePath == NULL )
{
PrintMessage(MESG_ERROR, "\n GetProfileList : Insufficient memory ");
return FPM_FALSE;
}
strcpy(profilePath,homeDir);
strcat(profilePath,profileFile);
PrintMessage(MESG_DEBUG, "\n GetProfileList : Firefox profile dir path = %s ", profilePath);
#endif
// Open the firefox profile setting file
FILE *profile = fopen(profilePath, "r");
if( profile == NULL )
{
PrintMessage(MESG_ERROR, "\n GetProfileList : Unable to find firefox profile file : %s ", profilePath);
return FPM_FALSE;
}
// First find out the count of profiles....
profileCount = 0;
while(fgets(line, 1024, profile))
{
// Remove trailing end of line character
line[strlen(line)-1]= 0;
// Convert to smaller case until "=" found....
for(i=0; i<strlen(line); i++)
{
if( line[i] == '=' )
break;
if( line[i] >=65 && line[i]<=90 )
line[i]+=32;
}
if( strstr(line, "name=") != NULL )
profileCount++;
}
PrintMessage(MESG_DEBUG, "\n GetProfileList : Total profiles found = %d ", profileCount);
if( profileCount == 0 )
{
fclose(profile);
return FPM_FALSE;
}
*profileList = ( char**) malloc(profileCount * sizeof (char *));
*profileFlag = ( int * ) malloc(profileCount * sizeof(int));
if( *profileList == NULL || *profileFlag == NULL )
{
PrintMessage(MESG_ERROR, "\n GetProfileList : Insufficient memory ");
fclose(profile);
return FPM_FALSE;
}
char **profList = *profileList;
int *profFlag = *profileFlag;
// Now read the profile names and store it..
fseek(profile, 0, SEEK_SET);
profileCount = 0;
while(fgets(line, 1024, profile))
{
// Remove trailing end of line character
line[strlen(line)-1]= 0;
// Convert to smaller case until "=" found....
for(i=0; i<strlen(line); i++)
{
if( line[i] == '=' )
break;
if( line[i] >=65 && line[i]<=90 )
line[i]+=32;
}
if( strstr(line, "name=") != NULL )
{
char *temp = strchr(line,'=') + 1;
profList[profileCount] = (char*) malloc(strlen(temp)+1);
if( profList[profileCount] == NULL )
{
PrintMessage(MESG_ERROR, "\n GetProfileList : Insufficient memory ");
fclose(profile);
return 0;
}
strcpy(profList[profileCount],temp);
profFlag[profileCount] = 0;
PrintMessage(MESG_ERROR, "\n GetProfileList : Found profile = [%s]", profList[profileCount]);
profileCount++;
continue;
}
// check if the current profile is default
if( strstr(line, "default=1") != NULL )
{
profFlag[profileCount-1] = 1;
}
}
fclose(profile);
// if there is only one profile then set it default profile
if( profileCount == 1 )
{
**profileFlag = 1;
}
return profileCount;
}
extern "C" APIEXPORT int FPM_FirefoxProfileInit(char *profileName)
{
int retValue;
int profileIndex = -1;
int isObjectExist = FPM_FALSE;
// check if the profile is already initialized...
for(int i=0; i< profileCount; i++)
{
if( profileManager[i].profileName != NULL )
{
if( STRCMPI(profileManager[i].profileName, profileName) == 0 )
{
PrintMessage(MESG_ERROR, "\n FirefoxProfileInit : Specified profile object [%s] is already present ", profileName);
profileIndex = i;
isObjectExist = FPM_TRUE;
}
}
}
// This is new profile...
if( (profileIndex == -1) && ( (profileCount + 1) >= MAX_PROFILE_COUNT) )
{
PrintMessage(MESG_ERROR, "\n FirefoxProfileInit : Max profile count exceeded.");
return FPM_PROFILE_LIMIT_EXCEEDED;
}
if(profileIndex == -1 )
{
profileIndex = profileCount;
profileCount++;
}
// If not already initialized then go and initialize it...
if( profileManager[profileIndex].isInitialized == FPM_FALSE )
{
if( (retValue = profileManager[profileIndex].ProfileInit(profileName)) != FPM_TRUE )
{
PrintMessage(MESG_ERROR, "\n FirefoxProfileInit : Failed to initialize the profile %s ", profileName);
return retValue;
}
}
else
{
PrintMessage(MESG_DEBUG, "\n FirefoxProfileInit : Firefox profile %s is already initialized ", profileName);
return FPM_TRUE;
}
PrintMessage(MESG_DEBUG, "\n FirefoxProfileInit : Firefox profile %s initialized successfully ", profileName);
return FPM_TRUE;
}
extern "C" APIEXPORT int FPM_FirefoxProfileExit(char *profileName)
{
// Find the profile...
for(int i=0; i< profileCount; i++)
{
if( profileManager[i].profileName != NULL )
{
if( STRCMPI(profileManager[i].profileName, profileName) == 0 )
{
// check if its initialized
if( profileManager[i].isInitialized == FPM_TRUE )
{
PrintMessage(MESG_DEBUG, "\n FirefoxProfileExit : Exiting the firefox profile %s ", profileName);
profileManager[i].ProfileExit();
return FPM_TRUE;
}
else
{
PrintMessage(MESG_ERROR, "\n FirefoxProfileExit : Specified profile %s is not initialized , cannot exit the profile", profileName);
return FPM_PROFILE_NOT_INITIALIZED;
}
}
}
}
PrintMessage(MESG_ERROR, "\n FirefoxProfileExit : Specified profile %s is not found", profileName);
return FPM_PROFILE_NOT_PRESENT;
}
extern "C" APIEXPORT int FPM_IsMasterPasswordSet(char *profileName)
{
// Find the profile...
for(int i=0; i< profileCount; i++)
{
if( profileManager[i].profileName != NULL )
{
if( STRCMPI(profileManager[i].profileName, profileName) == 0 )
{
// check if its initialized
if( profileManager[i].isInitialized == FPM_TRUE )
{
PrintMessage(MESG_DEBUG, "\n IsMasterPasswordSet : invoking IsMasterPasswordSet for profile %s", profileName);
return profileManager[i].IsMasterPasswordSet();
}
else
{
PrintMessage(MESG_ERROR, "\n IsMasterPasswordSet : Specified profile %s is not initialized ", profileName);
return FPM_PROFILE_NOT_INITIALIZED;
}
}
}
}
PrintMessage(MESG_ERROR, "\n IsMasterPasswordSet : Specified profile %s is not found", profileName);
return FPM_PROFILE_NOT_PRESENT;
}
extern "C" APIEXPORT int FPM_CheckMasterPassword(char *profileName, char *masterPassword)
{
// Find the profile...
for(int i=0; i< profileCount; i++)
{
if( profileManager[i].profileName != NULL )
{
if( STRCMPI(profileManager[i].profileName, profileName) == 0 )
{
// check if its initialized
if( profileManager[i].isInitialized == FPM_TRUE )
{
PrintMessage(MESG_DEBUG, "\n CheckMasterPassword : invoking CheckMasterPassword for profile %s", profileName);
return profileManager[i].CheckMasterPassword(masterPassword, 1);
}
else
{
PrintMessage(MESG_ERROR, "\n CheckMasterPassword : Specified profile %s is not initialized ", profileName);
return FPM_PROFILE_NOT_INITIALIZED;
}
}
}
}
PrintMessage(MESG_ERROR, "\n CheckMasterPassword : Specified profile %s is not found", profileName);
return FPM_PROFILE_NOT_PRESENT;
}
extern "C" APIEXPORT int FPM_GetSignonData(char *profileName,struct Host **host, int doRefresh)
{
// Find the profile...
for(int i=0; i< profileCount; i++)
{
if( profileManager[i].profileName != NULL )
{
if( STRCMPI(profileManager[i].profileName, profileName) == 0 )
{
// check if its initialized
if( profileManager[i].isInitialized == FPM_TRUE )
{
PrintMessage(MESG_DEBUG, "\n GetSignonData : invoking GetSignonData for profile %s", profileName);
return profileManager[i].GetSignonData(host, doRefresh);
}
else
{
PrintMessage(MESG_ERROR, "\n GetSignonData : Specified profile %s is not initialized", profileName);
return FPM_PROFILE_NOT_INITIALIZED;
}
}
}
}
PrintMessage(MESG_ERROR, "\n GetSignonData : Specified profile %s is not found", profileName);
return FPM_PROFILE_NOT_PRESENT;
}
extern "C" APIEXPORT int FPM_WriteSignonData(char *profileName)
{
// Find the profile...
for(int i=0; i< profileCount; i++)
{
if( profileManager[i].profileName != NULL )
{
if( STRCMPI(profileManager[i].profileName, profileName) == 0 )
{
// check if its initialized
if( profileManager[i].isInitialized == FPM_TRUE )
{
PrintMessage(MESG_DEBUG, "\n WriteSignonData : invoking WriteSignonData for profile %s", profileName);
return profileManager[i].WriteSignonData();
}
else
{
PrintMessage(MESG_ERROR, "\n WriteSignonData : Specified profile %s is not initialized", profileName);
return FPM_PROFILE_NOT_INITIALIZED;
}
}
}
}
PrintMessage(MESG_ERROR, "\n WriteSignonData : Specified profile %s is not found", profileName);
return FPM_PROFILE_NOT_PRESENT;
}
extern "C" APIEXPORT int FPM_AddHost(char *profileName, struct Host *host, int doUpdate)
{
// Find the profile...
for(int i=0; i< profileCount; i++)
{
if( profileManager[i].profileName != NULL )
{
if( STRCMPI(profileManager[i].profileName, profileName) == 0 )
{
// check if its initialized
if( profileManager[i].isInitialized == FPM_TRUE )
{
PrintMessage(MESG_DEBUG, "\n AddHost : invoking AddHost for profile %s", profileName);
return profileManager[i].AddHost(host, doUpdate);
}
else
{
PrintMessage(MESG_ERROR, "\n AddHost : Specified profile %s is not initialized", profileName);
return FPM_PROFILE_NOT_INITIALIZED;
}
}
}
}
PrintMessage(MESG_ERROR, "\n AddHost : Specified profile %s is not found", profileName);
return FPM_PROFILE_NOT_PRESENT;
}
extern "C" APIEXPORT int FPM_ModifyHost(char *profileName, struct Host *host, int doUpdate)
{
// Find the profile...
for(int i=0; i< profileCount; i++)
{
if( profileManager[i].profileName != NULL )
{
if( STRCMPI(profileManager[i].profileName, profileName) == 0 )
{
// check if its initialized
if( profileManager[i].isInitialized == FPM_TRUE )
{
PrintMessage(MESG_DEBUG, "\n ModifyHost : invoking ModifyHost for profile %s", profileName);
return profileManager[i].ModifyHost(host, doUpdate);
}
else
{
PrintMessage(MESG_ERROR, "\n ModifyHost : Specified profile %s is not initialized", profileName);
return FPM_PROFILE_NOT_INITIALIZED;
}
}
}
}
PrintMessage(MESG_ERROR, "\n ModifyHost : Specified profile %s is not found", profileName);
return FPM_PROFILE_NOT_PRESENT;
}
extern "C" APIEXPORT int FPM_RemoveHost(char *profileName, char *hostName, int doUpdate)
{
// Find the profile...
for(int i=0; i< profileCount; i++)
{
if( profileManager[i].profileName != NULL )
{
if( STRCMPI(profileManager[i].profileName, profileName) == 0 )
{
// check if its initialized
if( profileManager[i].isInitialized == FPM_TRUE )
{
PrintMessage(MESG_DEBUG, "\n RemoveHost : invoking RemoveHost for profile %s", profileName);
return profileManager[i].RemoveHost(hostName, doUpdate);
}
else
{
PrintMessage(MESG_ERROR, "\n RemoveHost : Specified profile %s is not initialized", profileName);
return FPM_PROFILE_NOT_INITIALIZED;
}
}
}
}
PrintMessage(MESG_ERROR, "\n RemoveHost : Specified profile %s is not found", profileName);
return FPM_PROFILE_NOT_PRESENT;
}
/*
int main(int argc, char* argv[])
{
char **profileList;
int *profileFlag;
int profCount;
profCount = FPM_GetProfileList(&profileList, &profileFlag);
if( profCount > 0)
{
printf("\n Profile names are as follows...");
for(int i=0; i< profCount; i++)
{
printf("\n %d => [%s] [%d]", i+1, profileList[i], profileFlag[i]);
// Load the default profile...
if( profileFlag[i] == 1 )
{
ProfileManager *pm = new ProfileManager();
printf("\n ***************************************");
if( pm->ProfileInit(profileList[i]) == 1)
{
pm->CheckMasterPassword("test123", 1);
struct Host *hostInfo;
pm->GetSignonData(&hostInfo, 1);
// Print all the data
PrintMessage(MESG_PRINT, "\n\n List of hosts ");
for(Host *t=hostInfo; t ; t=t->next)
{
PrintMessage(MESG_PRINT, "\n\n %s", t->hostName);
for(HostElement *h=t->child; h ; h= h->next)
{
PrintMessage(MESG_PRINT, "\n %s : %s ", h->name, h->value);
}
}
pm->WriteSignonData();
pm->ProfileExit();
}
}
printf("\n ***************************************");
}
}
return 0;
}
*/