#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=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; } */