major source structure and module name changes
This commit is contained in:
		
							
								
								
									
										115
									
								
								adlib/ad_ff/native/Common.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								adlib/ad_ff/native/Common.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,115 @@ | ||||
| /*********************************************************************** | ||||
|  * | ||||
|  *  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. | ||||
|  * | ||||
|  ***********************************************************************/ | ||||
|  | ||||
|  | ||||
|  | ||||
| #include "FirefoxPasswordManager.h" | ||||
| #include "Common.h" | ||||
|  | ||||
| char lastErrorMesg[10000]; | ||||
|  | ||||
| void PrintMessage( int level, char *mesg , ...) | ||||
| { | ||||
|     va_list vl; | ||||
| 	 | ||||
| 	va_start( vl , mesg ); | ||||
| 	vsprintf( lastErrorMesg , mesg , vl ); | ||||
| 	va_end( vl ); | ||||
| 	 | ||||
| // if we are not debugging then print DEBUG level messages | ||||
| #ifdef DEBUG | ||||
| 		printf("%s", lastErrorMesg );	 | ||||
| #else	 | ||||
| 	if( level != MESG_DEBUG ) | ||||
| 	{ | ||||
| 		//printf("%s", lastErrorMesg ); | ||||
| 	} | ||||
| #endif | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
| *     Converts given string to lower case.... | ||||
| * | ||||
| */ | ||||
| void StrLwr(char *str) | ||||
| { | ||||
| int n=strlen(str); | ||||
|  | ||||
| 	for(int i=0; i<n; i++) | ||||
| 	{ | ||||
| 	    if( str[i] >=65 && str[i]<=90 ) | ||||
| 		str[i]+=32; | ||||
| 	} 		 | ||||
| 	 | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
| *     Checks if specified directory exists | ||||
| *    | ||||
| *     return  MC_TRUE if directory exists else MC_FALSE | ||||
| * | ||||
| */ | ||||
| int IsDirectoryExists( char *path ) | ||||
| { | ||||
| 	if( path == NULL ) | ||||
| 		return 0; | ||||
|  | ||||
| #ifdef WIN32 | ||||
|  | ||||
| 	DWORD attr = GetFileAttributes(path); | ||||
| 		 | ||||
| 	if( (attr == -1) || !(attr & FILE_ATTRIBUTE_DIRECTORY ) ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n IsDirectoryExists : Directory does not exist :  [%s] ", path); | ||||
| 		return 0; | ||||
| 	} | ||||
|  | ||||
| 	return 1; | ||||
|  | ||||
| #else | ||||
| 	 | ||||
| 	char *program = (char*) malloc(strlen(path)+20); | ||||
|  | ||||
| 	if( program == NULL ) | ||||
| 	   return 0; | ||||
|  | ||||
| 	strcpy(program, "test -d "); | ||||
| 	strcat(program, path); | ||||
|  | ||||
| 	int result= system(program); | ||||
| 	free(program); | ||||
|  | ||||
| 	if( result != 0 ) | ||||
| 	{ | ||||
| 	    PrintMessage(MESG_ERROR, "\n IsDirectoryExists : Directory does not exist :  [%s] ", path); | ||||
| 	    return 0; | ||||
| 	} | ||||
|  | ||||
| 	return 1; | ||||
|  | ||||
| #endif | ||||
|  | ||||
| } | ||||
|  | ||||
							
								
								
									
										74
									
								
								adlib/ad_ff/native/Common.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								adlib/ad_ff/native/Common.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,74 @@ | ||||
| /*********************************************************************** | ||||
|  * | ||||
|  *  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. | ||||
|  * | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| #ifndef __FPM_COMMON_H__ | ||||
| #define __FPM_COMMON_H__ | ||||
|  | ||||
| // Common structure declarations... | ||||
|  | ||||
| struct Host | ||||
| { | ||||
| 	char *hostName; | ||||
| 	struct HostElement *child; | ||||
| 	struct Host *next; | ||||
| }; | ||||
|  | ||||
|  | ||||
| // Each name/value pair for the Host is represented by HostElement | ||||
| struct HostElement | ||||
| { | ||||
| 	char *name; | ||||
| 	char *value; | ||||
| 	int isPassword; | ||||
| 	struct HostElement *next; | ||||
| }; | ||||
|  | ||||
|  | ||||
| struct RejectHost | ||||
| { | ||||
| 	char *hostName; | ||||
| 	struct RejectHost *next; | ||||
| }; | ||||
|  | ||||
|  | ||||
| // Error codes  | ||||
|  | ||||
| #define FPM_PROFILE_NOT_PRESENT        -101                // Specified profile does not exist | ||||
| #define FPM_LIBRARY_LOAD_FAILED        -102                // Failed to load the firefox library | ||||
| #define FPM_LIBRARY_INIT_FAILED        -103                // Failed to initialize firefox library | ||||
| #define FPM_PROFILE_NOT_INITIALIZED    -104                // Specified profile not initialized | ||||
| #define FPM_MASTERPASSWORD_WRONG       -105                // Wrong master password is specified | ||||
| #define FPM_SIGNON_DATASTORE_EMPTY     -106                // Internal signon data store is empty | ||||
| #define FPM_SIGNON_FILE_NOT_PRESENT    -107                // Signon file is not present in profile directory | ||||
| #define FPM_SIGNON_FILE_READ_ERROR     -108                // Error in reading signon file | ||||
| #define FPM_SIGNON_FILE_WRITE_ERROR    -109                // Error in writing signon file | ||||
| #define FPM_SIGNON_FILE_LOCKED         -110                // Signon file is locked. | ||||
| #define FPM_INSUFFICIENT_MEMORY        -111                // Insufficient memory. | ||||
| #define FPM_ILLEGAL_HOSTNAME           -112                // Hostname is not in proper form | ||||
| #define FPM_HOSTNAME_NOT_PRESENT       -113                // Specified hostname is not present | ||||
| #define FPM_NAME_NOT_PRESENT           -114                // Specified name is not present | ||||
| #define FPM_SIGNON_FILE_INVALID_DATA   -115				   // Invalid data is read from signon file      | ||||
| #define FPM_PROFILE_LIMIT_EXCEEDED     -116                // Maximum number of profiles exceeded... | ||||
|  | ||||
| #endif | ||||
|  | ||||
|  | ||||
							
								
								
									
										458
									
								
								adlib/ad_ff/native/CryptManager.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										458
									
								
								adlib/ad_ff/native/CryptManager.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,458 @@ | ||||
| /*********************************************************************** | ||||
|  * | ||||
|  *  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. | ||||
|  * | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| #include "CryptManager.h" | ||||
|  | ||||
|  | ||||
|  | ||||
| void CryptManager::SetupFunctions(void *funList[]) | ||||
| { | ||||
|  | ||||
| 	 //PK11SetPasswordFunc = (PK11_SetPasswordFunc) funList[0]; | ||||
| 	 PK11GetInternalKeySlot = (PK11_GetInternalKeySlot) funList[1]; | ||||
| 	 PK11FreeSlot = (PK11_FreeSlot) funList[2]; | ||||
| 	 PK11Authenticate = (PK11_Authenticate) funList[3]; | ||||
| 	 PK11CheckUserPassword =(PK11_CheckUserPassword) funList[4]; | ||||
| 	 PK11SDRDecrypt = (PK11SDR_Decrypt) funList[5]; | ||||
| 	 PK11SDREncrypt = (PK11SDR_Encrypt) funList[6]; | ||||
| 	 PLBase64Encode = (PL_Base64Encode) funList[7]; | ||||
| 	 PLBase64Decode = (PL_Base64Decode) funList[8]; | ||||
|  | ||||
| } | ||||
|  | ||||
| int CryptManager::GetEncryptionPref() | ||||
| { | ||||
|  | ||||
| return FPM_TRUE; | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
| *     This function encrypts the clear text data. First it performs TRIPLE DES encryption | ||||
| *     and then performs base64 encoding on the encrypted data. | ||||
| *    | ||||
| *     @param(in)  clearData   clear text data to be encrypted | ||||
| *     @param(out) finalData   encrypted data ( null terminated) | ||||
| * | ||||
| *	  @return     FPM_TRUE on success and FPM_FALSE on error. | ||||
| * | ||||
| */ | ||||
| int CryptManager::EncryptString (char *clearData, char **finalData)  | ||||
| { | ||||
| int encryptDataLen = 0; | ||||
| char *encryptData = NULL; | ||||
| char *encodeData  = NULL; | ||||
| int retValue; | ||||
|  | ||||
|  | ||||
| 	if( clearData == NULL ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n EncryptString : Text Data is NULL"); | ||||
| 		return FPM_FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// Do the encryption if encryption pref is set otherwise just do base64 encoding... | ||||
| 	if ( GetEncryptionPref() )  | ||||
| 	{ | ||||
| 		PrintMessage(MESG_DEBUG, "\n EncryptString : Performing PK11 Encryption..."); | ||||
| 		 | ||||
| 		retValue = FPM_FALSE; | ||||
| 		if( ((retValue = CryptPK11EncryptString(clearData, strlen(clearData), &encryptData, &encryptDataLen)) != FPM_TRUE) || ( encryptData == NULL) ) | ||||
| 		{ | ||||
| 			PrintMessage(MESG_ERROR, "\n EncryptString : Failed to encrypt the string : %s ", clearData); | ||||
| 			return retValue; | ||||
| 		} | ||||
|  | ||||
| 		if( (CryptBase64Encode(encryptData, encryptDataLen, finalData) != FPM_TRUE) || (*finalData == NULL) ) | ||||
| 		{ | ||||
| 			PrintMessage(MESG_ERROR, "\n EncryptString : BASE64 encoding failed"); | ||||
| 			return FPM_FALSE; | ||||
| 		} | ||||
| 		 | ||||
| 		PrintMessage(MESG_DEBUG, "\n EncryptString : Success  "); | ||||
| 	 | ||||
| 		// WARNING : If you uncomment , then be ready for side effects , crashes..etc | ||||
| 		// Need full analysis of malloc for this data.. | ||||
| 		// Free the allocated blocks... | ||||
|  | ||||
| 		//if( encryptData ) | ||||
| 		//	free( encryptData); | ||||
| 		 | ||||
| 		return FPM_TRUE; | ||||
| 	} | ||||
| 	 | ||||
| 	// otherwise do our own obscuring using Base64 encoding  | ||||
| 	PrintMessage(MESG_DEBUG, "\n EncryptString : Performing JUST base64 encoding..."); | ||||
| 	 | ||||
| 	if( (CryptBase64Encode(clearData, strlen(clearData), &encodeData) == FPM_FALSE) || (encodeData == NULL) ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n EncryptString : BASE64 encoding failed"); | ||||
| 		return FPM_FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// We need to add the CRYPT_PREFIX at the begining of encoded data... | ||||
| 	// This will help during decrption process to identify type of encryption | ||||
|  | ||||
| 	int prefixLen = strlen( CRYPT_PREFIX ); | ||||
| 	int encodeLen = strlen( encodeData ); | ||||
| 	*finalData = (char *)malloc( prefixLen + encodeLen + 1); | ||||
| 	 | ||||
| 	if( *finalData == NULL ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n EncryptString : Insufficient memory"); | ||||
| 		return FPM_FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// FinalData = CRYPT_PREFIX + Encoded Data + '\0' | ||||
| 	strcpy(*finalData, CRYPT_PREFIX); | ||||
| 	strcat(*finalData, encodeData); | ||||
| 	*(*finalData + prefixLen + encodeLen) = 0; | ||||
| 			   | ||||
| 	free(encodeData); | ||||
|  | ||||
| 	return FPM_TRUE; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| /** | ||||
| *     This function decrypts the encrypted data. First it performs base64 decoding and | ||||
| *     then performs TRIPLE DES decryption. | ||||
| *    | ||||
| *     @param(in)  cryptData   encrypted data  | ||||
| *     @param(out) clearData   clear text data ( null terminated) | ||||
| * | ||||
| *	  @return    FPM_TRUE on success and FPM_FALSE on error. | ||||
| * | ||||
| */ | ||||
|  | ||||
| int CryptManager::DecryptString(char *cryptData, char **clearData) | ||||
| { | ||||
| int decodeLen = 0; | ||||
| int finalLen = 0; | ||||
| char *decodeData = NULL; | ||||
| char *finalData = NULL; | ||||
| int retValue; | ||||
|  | ||||
| 	if( cryptData == NULL ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n DecryptString: CryptData is NULL..."); | ||||
| 		return FPM_FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// treat zero-length crypt string as a special case  | ||||
| 	if(cryptData[0] == '\0')  | ||||
| 	{ | ||||
| 		*clearData  = (char*) malloc(1); | ||||
| 		**clearData = 0; | ||||
| 		return FPM_TRUE; | ||||
| 	} | ||||
| 	 | ||||
| 	// use PK11 encryption stuff if crypt doesn't starts with prefix  | ||||
| 	if( cryptData[0] != CRYPT_PREFIX[0] )  | ||||
| 	{ | ||||
| 		 | ||||
| 		PrintMessage(MESG_DEBUG, "\n Performing PK11 Decryption "); | ||||
| 			 | ||||
| 		// First do base64 decoding..... | ||||
| 		if(  (CryptBase64Decode(cryptData, &decodeData, &decodeLen) != FPM_TRUE) || (decodeData == NULL) ) | ||||
| 		{ | ||||
| 			PrintMessage(MESG_ERROR, "\n DecryptString : Base64 decoding of crypt data failed "); | ||||
| 			return FPM_FALSE; | ||||
| 		} | ||||
|  | ||||
| 		PrintMessage(MESG_DEBUG, "\n DecryptString : base64data (%d) = %s ", decodeLen, decodeData); | ||||
| 		 | ||||
| 		// Now do actual PK11 decryption	 | ||||
| 		retValue = FPM_FALSE; | ||||
| 		retValue = CryptPK11DecryptString(decodeData, decodeLen, &finalData, &finalLen); | ||||
|  | ||||
| 		if( retValue != FPM_TRUE )  | ||||
| 		{ | ||||
| 			PrintMessage(MESG_ERROR, "\n DecryptString : Failed to decrypt the string "); | ||||
| 			return retValue; | ||||
| 		} | ||||
| 		 | ||||
| 			 | ||||
| 		// WARNING : Decrypted string is not NULL terminated  | ||||
| 		// So we will create new NULL terminated string here... | ||||
| 	 | ||||
| 		*clearData = (char*) malloc( finalLen + 1 ); | ||||
|  | ||||
| 		if( *clearData == NULL ) | ||||
| 		{ | ||||
| 			PrintMessage(MESG_ERROR, "\n DecryptString :Insufficient memory... "); | ||||
| 			return FPM_INSUFFICIENT_MEMORY; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			PrintMessage(MESG_DEBUG, "\n DecryptString : Copying new data ...."); | ||||
| 			memcpy(*clearData, finalData, finalLen); | ||||
| 			*(*clearData + finalLen) = 0;    // Null terminate the string.... | ||||
| 		} | ||||
| 		 | ||||
| 		/*   | ||||
| 		// Free the allocated memory | ||||
| 		// This is causing the problems currently...Later point we have to reanalyze the cause for this | ||||
| 		 | ||||
| 		if( decodeData ) | ||||
| 			free(decodeData); | ||||
|  | ||||
| 		if( finalData ) | ||||
| 			free(finalData); | ||||
| 		*/ | ||||
|  | ||||
| 		PrintMessage(MESG_DEBUG, "\n decryptString : finalLen = %d ", finalLen); | ||||
|  | ||||
| 		return FPM_TRUE; | ||||
| 	} | ||||
| 	 | ||||
| 	 | ||||
| 	// otherwise do our own de-obscuring  | ||||
| 	PrintMessage(MESG_DEBUG, "\n  DecryptString : Performing simple Base64 Decoding "); | ||||
|  | ||||
| 	unsigned int PREFIX_Len = strlen(CRYPT_PREFIX); | ||||
| 	if( strlen(cryptData) ==  PREFIX_Len ) | ||||
| 	{ | ||||
| 		*clearData = (char *)malloc(1); | ||||
| 		**clearData = '\0'; | ||||
| 		return FPM_TRUE; | ||||
| 	} | ||||
| 	 | ||||
| 	if(  CryptBase64Decode(&cryptData[PREFIX_Len], clearData, &decodeLen) == FPM_FALSE ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n DecryptString : Base64 decoding of crypt data failed "); | ||||
| 		return FPM_FALSE; | ||||
| 	} | ||||
| 	 | ||||
| 	return FPM_TRUE; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /** | ||||
| *     Performs base64 encoding of the encrypted data.. | ||||
| *    | ||||
| *     @param(in)  cryptData    encrypted data  | ||||
| *     @param(in)  cryptDataLen length of encrypted data | ||||
| *     @param(out) encodeData   base64 encoded data | ||||
| * | ||||
| *	  @return     FPM_TRUE on success and FPM_FALSE on error. | ||||
| * | ||||
| */ | ||||
|  | ||||
| int CryptManager::CryptBase64Encode(char *cryptData, int cryptDataLen, char **encodeData) | ||||
| { | ||||
|      | ||||
| 	*encodeData = (*PLBase64Encode)((const char *)cryptData, cryptDataLen, NULL); | ||||
|      | ||||
| 	if ( *encodeData == NULL )  | ||||
| 	{  | ||||
| 		PrintMessage(MESG_ERROR, "\n Base64 encoding failed ..."); | ||||
| 		return FPM_FALSE; | ||||
| 	} | ||||
|  | ||||
| 	return FPM_TRUE; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| /** | ||||
| *     Performs base64 decoding of the encrypted data.. | ||||
| *    | ||||
| *     @param(in)  cryptData   encrypted data  | ||||
| *     @param(out) decodeData  base64 decoded data | ||||
| *     @param(out) decodeLen   length of base64 decoded data | ||||
| * | ||||
| *	  @return     FPM_TRUE on success and FPM_FALSE on error. | ||||
| * | ||||
| */ | ||||
| int CryptManager::CryptBase64Decode(char *cryptData, char **decodeData, int *decodeLen) | ||||
| { | ||||
|     int len = strlen( cryptData ); | ||||
|     int adjust = 0; | ||||
|  | ||||
| 	PrintMessage(MESG_DEBUG, "\n CryptBase64Decode : Length of crypt data = %d", len); | ||||
|      | ||||
| 	// Compute length adjustment  | ||||
|     if (cryptData[len-1] == '=')  | ||||
| 	{ | ||||
|       adjust++; | ||||
|       if (cryptData[len-2] == '=')  | ||||
| 		  adjust++; | ||||
|     } | ||||
|  | ||||
|     *decodeData = ( char *)(*PLBase64Decode)(cryptData, len, NULL); | ||||
|  | ||||
|     if( *decodeData == NULL ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n Base64 decoding failed ..."); | ||||
| 		return FPM_FALSE; | ||||
| 	} | ||||
| 	 | ||||
|     *decodeLen = (len*3)/4 - adjust; | ||||
| 	 | ||||
| 	PrintMessage(MESG_DEBUG, "\n CryptBase64Decode : Length of decoded data = %d", *decodeLen); | ||||
|      | ||||
| 	return FPM_TRUE; | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
| *     Performs TRIPLE DES encryption of clear text data | ||||
| *    | ||||
| *     @param(in)  clearData     clear text data to be encrypted | ||||
| *     @param(in)  clearDataLen  length of clear text data | ||||
| *     @param(out) cryptData     TRIPLE DES encrypted data | ||||
| *     @param(out) cryptDataLen  length of encrypted data | ||||
| * | ||||
| *	  @return     FPM_TRUE on success and FPM_FALSE on error. | ||||
| * | ||||
| */ | ||||
| int CryptManager::CryptPK11EncryptString(char *clearData, int clearDataLen, char **cryptData, int *cryptDataLen) | ||||
| { | ||||
|   PK11SlotInfo *slot = 0; | ||||
|   SECItem keyid; | ||||
|   SECItem request; | ||||
|   SECItem reply; | ||||
|   SECStatus status; | ||||
|  | ||||
| 	slot = (*PK11GetInternalKeySlot)(); | ||||
| 	 | ||||
| 	if (!slot)  | ||||
| 	{  | ||||
| 		PrintMessage(MESG_ERROR, "\n CryptPK11EncryptString : PK11_GetInternalKeySlot failed  ..."); | ||||
| 		return FPM_FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// PK11 authentication | ||||
| 	if ( (*PK11Authenticate)(slot, PR_TRUE, NULL) != SECSuccess) | ||||
| 	{ | ||||
| 		// since we have specified password callback function , we won't come here... | ||||
| 		PrintMessage(MESG_ERROR, "\n CryptPK11EncryptString : PK11_Authenticate failed, possibly master password is wrong"); | ||||
| 		(*PK11FreeSlot) (slot); | ||||
| 		return FPM_MASTERPASSWORD_WRONG; | ||||
| 	} | ||||
|  | ||||
| 		 | ||||
| 	// Use default key id  | ||||
| 	keyid.data = 0; | ||||
| 	keyid.len  = 0; | ||||
| 	request.data = (unsigned char *)clearData; | ||||
| 	request.len  = clearDataLen; | ||||
| 	reply.data = 0; | ||||
| 	reply.len  = 0; | ||||
|  | ||||
| 	status = (*PK11SDREncrypt)(&keyid, &request, &reply, NULL); | ||||
| 	 | ||||
| 	if (status != SECSuccess)  | ||||
| 	{  | ||||
| 		PrintMessage(MESG_ERROR, "\n CryptPK11EncryptString : PK11SDR_Encrypt failed  ..."); | ||||
| 		(*PK11FreeSlot) (slot); | ||||
| 		return FPM_FALSE; | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	*cryptData = (char*)reply.data; | ||||
| 	*cryptDataLen = reply.len; | ||||
| 	 | ||||
| 	(*PK11FreeSlot) (slot); | ||||
| 	return FPM_TRUE; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /** | ||||
| *     Performs TRIPLE DES decryption of base64 decoded data | ||||
| *    | ||||
| *     @param(in)  decodeData  base64 decoded data | ||||
| *     @param(in)  decodeLen   length of base64 decoded data | ||||
| *     @param(out) clearData   decrypted data | ||||
| *     @param(out) finalLen    length of decrypted data | ||||
| * | ||||
| *	  @return     FPM_TRUE on success and FPM_FALSE on error. | ||||
| * | ||||
| */ | ||||
| int CryptManager::CryptPK11DecryptString(char *decodeData, int decodeLen, char **clearData, int *finalLen) | ||||
| { | ||||
| 	PK11SlotInfo *slot = 0; | ||||
| 	SECStatus status; | ||||
| 	SECItem request; | ||||
| 	SECItem reply; | ||||
|  | ||||
| 	PrintMessage(MESG_DEBUG, "\n CryptPK11DecryptString entered  ..."); | ||||
|  | ||||
| 	// Find token with SDR key  | ||||
| 	slot = (*PK11GetInternalKeySlot)(); | ||||
| 	 | ||||
| 	if (!slot)  | ||||
| 	{  | ||||
| 		PrintMessage(MESG_ERROR, "\n PK11_GetInternalKeySlot failed  ..."); | ||||
| 		return FPM_FALSE; | ||||
| 	} | ||||
|  | ||||
| 	PrintMessage(MESG_DEBUG, "\n  PK11_GetInternalKeySlot SUCCESS ..."); | ||||
| 	 | ||||
| 	// Force authentication | ||||
| 	if ( (*PK11Authenticate)(slot, PR_TRUE, NULL) != SECSuccess) | ||||
| 	{ | ||||
| 		// since we have specified password callback function , we won't come here... | ||||
| 		PrintMessage(MESG_ERROR, "\n PK11_Authenticate failed, Probably master password is wrong"); | ||||
| 		(*PK11FreeSlot) (slot); | ||||
| 		return FPM_MASTERPASSWORD_WRONG; | ||||
| 	} | ||||
|  | ||||
| 	PrintMessage(MESG_DEBUG, "\n  PK11_Authenticate SUCCESS ..."); | ||||
|  | ||||
| 	// Decrypt the string | ||||
| 	request.data = (unsigned char *)decodeData; | ||||
| 	request.len = decodeLen; | ||||
| 	reply.data = 0; | ||||
| 	reply.len = 0; | ||||
|  | ||||
| 	PrintMessage(MESG_DEBUG, "\n calling PK11SDR_Decrypt ..."); | ||||
|  | ||||
| 	status = (*PK11SDRDecrypt)(&request, &reply, NULL); | ||||
|  | ||||
| 	if (status != SECSuccess)  | ||||
| 	{  | ||||
| 		PrintMessage(MESG_ERROR, "\n PK11SDR_Decrypt failed  ..."); | ||||
| 		(*PK11FreeSlot) (slot); | ||||
| 		return FPM_FALSE; | ||||
| 	} | ||||
|  | ||||
| 	PrintMessage(MESG_DEBUG, "\n PK11SDR_Decrypt SUCCESS "); | ||||
| 	 | ||||
| 	// WARNING : This string is not NULL terminated.. | ||||
| 	*clearData = (char*)reply.data; | ||||
| 	*finalLen  = reply.len; | ||||
|  | ||||
| 	// Free the slot | ||||
| 	(*PK11FreeSlot) (slot); | ||||
|  | ||||
| 	return FPM_TRUE; | ||||
| } | ||||
| 		 | ||||
|  | ||||
							
								
								
									
										62
									
								
								adlib/ad_ff/native/CryptManager.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								adlib/ad_ff/native/CryptManager.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,62 @@ | ||||
| /*********************************************************************** | ||||
|  * | ||||
|  *  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. | ||||
|  * | ||||
|  ***********************************************************************/ | ||||
|  | ||||
|  | ||||
| #ifndef __FPM_CRYPT_MANAGER_H__ | ||||
| #define __FPM_CRYPT_MANAGER_H__ | ||||
|  | ||||
| #include "FirefoxPasswordManager.h" | ||||
| #include "Common.h" | ||||
|  | ||||
|  | ||||
| class CryptManager  | ||||
| { | ||||
|  | ||||
| 	//PK11_SetPasswordFunc    PK11SetPasswordFunc; | ||||
| 	PK11_GetInternalKeySlot PK11GetInternalKeySlot; | ||||
| 	PK11_FreeSlot           PK11FreeSlot; | ||||
| 	PK11_Authenticate       PK11Authenticate; | ||||
|     PK11_CheckUserPassword  PK11CheckUserPassword; | ||||
| 	PK11SDR_Decrypt         PK11SDRDecrypt; | ||||
| 	PK11SDR_Encrypt         PK11SDREncrypt; | ||||
|  | ||||
| 	PL_Base64Encode         PLBase64Encode; | ||||
| 	PL_Base64Decode         PLBase64Decode; | ||||
|  | ||||
| public: | ||||
|  | ||||
| 	int DecryptString(char *cryptData, char **clearData); | ||||
| 	int EncryptString (char *clearData, char **finalData) ; | ||||
| 	int CryptBase64Decode(char *cryptData, char **decodeData, int *decodeLen); | ||||
| 	int CryptBase64Encode(char *cryptData, int cryptDataLen, char **encodeData); | ||||
| 	int CryptPK11DecryptString(char *decodeData, int decodeLen, char **clearData, int *finalLen); | ||||
| 	int CryptPK11EncryptString(char *clearData, int clearDataLen, char **cryptData, int *cryptDataLen); | ||||
|  | ||||
| 	void SetupFunctions(void *funList[]); | ||||
| 	int GetEncryptionPref(); | ||||
|  | ||||
| }; | ||||
|  | ||||
|  | ||||
| #endif | ||||
|  | ||||
|  | ||||
							
								
								
									
										608
									
								
								adlib/ad_ff/native/DataManager.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										608
									
								
								adlib/ad_ff/native/DataManager.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,608 @@ | ||||
| /*********************************************************************** | ||||
|  * | ||||
|  *  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. | ||||
|  * | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| #include "DataManager.h" | ||||
|  | ||||
|  | ||||
| DataManager::DataManager() | ||||
| { | ||||
| 	hostList = NULL; | ||||
| 	rejectHostList = NULL; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| DataManager::~DataManager() | ||||
| { | ||||
|  | ||||
| } | ||||
|  | ||||
| int DataManager::AddRejectHost(char *hostName) | ||||
| { | ||||
| RejectHost *t; | ||||
|  | ||||
| 	if( hostName == NULL || hostName[0] == 0 ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n DataManager : Host name is NULL or empty "); | ||||
| 		// Just ignore this.. | ||||
| 		return FPM_TRUE; | ||||
| 	} | ||||
| 	 | ||||
| 	// check if the specified host is already present | ||||
| 	for(t=rejectHostList; t ; t = t->next) | ||||
| 	{ | ||||
| 		if( STRCMPI(hostName, t->hostName) == 0 ) | ||||
| 		{ | ||||
| 			PrintMessage(MESG_DEBUG, "\n DataManager : Specified hostname [%s] is already present ", hostName); | ||||
| 			return FPM_TRUE; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Create new Host element for new host | ||||
| 	RejectHost *tempHost = (RejectHost *) malloc(sizeof(RejectHost)); | ||||
| 	 | ||||
| 	if( tempHost ) | ||||
| 		tempHost->hostName = (char*) malloc(strlen(hostName) + 1); | ||||
| 	 | ||||
| 	if( !tempHost || !tempHost->hostName)  | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n DataManager : Failed to add reject host due to insufficient memory "); | ||||
| 		return FPM_INSUFFICIENT_MEMORY; | ||||
| 	} | ||||
| 	 | ||||
| 	strcpy(tempHost->hostName, hostName); | ||||
| 	tempHost->next  = NULL; | ||||
| 	 | ||||
| 	if( rejectHostList == NULL ) | ||||
| 		rejectHostList = tempHost; | ||||
| 	else | ||||
| 	{   // Add new host at the end | ||||
| 		for(t=rejectHostList; t->next ; t=t->next); | ||||
|  | ||||
| 		t->next = tempHost; | ||||
| 	} | ||||
|  | ||||
| 	return FPM_TRUE;	 | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| //invoked from outside | ||||
| int DataManager::RemoveRejectHost(char *hostName) | ||||
| { | ||||
| 	RejectHost *prev = NULL; | ||||
|  | ||||
| 	if( !hostName ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n DataManager : Host name is Null ...."); | ||||
| 		return FPM_FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// Find out and destroy it..! | ||||
| 	for(RejectHost *t=rejectHostList; t ; prev=t,t=t->next) | ||||
| 	{ | ||||
| 		if( STRCMPI(hostName, t->hostName) == 0 ) | ||||
| 		{ | ||||
| 			// if this is the first node | ||||
| 			if( rejectHostList == t ) | ||||
| 				rejectHostList = t->next; | ||||
| 			else  | ||||
| 				prev->next = t->next; | ||||
|  | ||||
| 			free(t->hostName); | ||||
| 			free(t); | ||||
| 			return FPM_TRUE; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	PrintMessage(MESG_ERROR, "\n DataManager : Specified hostname[%s] is not present in the reject host list", hostName); | ||||
| 	 | ||||
| 	return FPM_FALSE; | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| void DataManager::PrintAllRejectHosts() | ||||
| { | ||||
| 	 | ||||
| 	PrintMessage(MESG_PRINT, "\n\n ******  List of Reject Hosts ******"); | ||||
| 		 | ||||
| 	for(RejectHost *t=rejectHostList; t ; t=t->next) | ||||
| 		PrintMessage(MESG_PRINT, "\n %s", t->hostName); | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| // internal function | ||||
| int DataManager::AddHost(char *hostName) | ||||
| { | ||||
| Host *host, *t; | ||||
|  | ||||
| 	if( hostName == NULL || hostName[0] == 0 ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n DataManager : Host name is NULL or empty "); | ||||
| 		return FPM_ILLEGAL_HOSTNAME; | ||||
| 	} | ||||
| 	 | ||||
| 	// check if the specified host is already present | ||||
| 	for(host=hostList; host ; host = host->next) | ||||
| 	{ | ||||
| 		if( STRCMPI(hostName, host->hostName) == 0 ) | ||||
| 		{ | ||||
| 			PrintMessage(MESG_DEBUG, "\n DataManager : Specified hostname [%s] is already present ", hostName); | ||||
| 			return FPM_TRUE; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Create new Host  | ||||
| 	Host *tempHost = (Host *) malloc(sizeof(Host)); | ||||
| 	 | ||||
| 	if( tempHost ) | ||||
| 		tempHost->hostName = (char*) malloc(strlen(hostName) + 1); | ||||
| 	 | ||||
| 	if( !tempHost || !tempHost->hostName)  | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n DataManager : Failed to add host due to insufficient memory "); | ||||
| 		return FPM_INSUFFICIENT_MEMORY; | ||||
| 	} | ||||
| 	 | ||||
| 	strcpy(tempHost->hostName, hostName); | ||||
| 	tempHost->child = NULL; | ||||
| 	tempHost->next  = NULL; | ||||
| 	 | ||||
| 	// Now add the new host to the existing store | ||||
| 	if( hostList == NULL ) | ||||
| 		hostList = tempHost; | ||||
| 	else | ||||
| 	{   // Add new host at the end | ||||
| 		for(t=hostList; t->next ; t=t->next); | ||||
|  | ||||
| 		t->next = tempHost; | ||||
| 	} | ||||
|  | ||||
| 	return FPM_TRUE; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| // invoked from outside... | ||||
| int DataManager::ModifyHost(char *oldHostName, char *newHostName) | ||||
| { | ||||
| 	if( !oldHostName || !newHostName ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n DataManager : Null parameters passed...."); | ||||
| 		return FPM_FALSE; | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	for(Host *t=hostList; t ; t=t->next) | ||||
| 	{ | ||||
| 		if( STRCMPI(oldHostName, t->hostName) == 0 ) | ||||
| 		{ | ||||
| 			free(t->hostName); | ||||
| 			t->hostName = (char*) malloc( strlen(newHostName) + 1 ); | ||||
| 			 | ||||
| 			if( !t->hostName ) | ||||
| 			{ | ||||
| 				PrintMessage(MESG_ERROR, "\n DataManager : Failed to modify host entry due to insufficient memory "); | ||||
| 				return FPM_FALSE; | ||||
| 			} | ||||
| 			 | ||||
| 			strcpy(t->hostName, newHostName); | ||||
| 			return FPM_TRUE; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	PrintMessage(MESG_ERROR, "\n DataManager : Specified hostname[%s] is not present ", oldHostName); | ||||
| 	return FPM_FALSE; | ||||
|  | ||||
| } | ||||
|  | ||||
| int DataManager::AddHost(Host *host) | ||||
| { | ||||
|  | ||||
| Host *t; | ||||
|  | ||||
| 	if( host == NULL ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n AddHost :  host is NULL...."); | ||||
| 		return FPM_FALSE; | ||||
| 	} | ||||
|  | ||||
| 	for(t=hostList; t ; t=t->next) | ||||
| 	{ | ||||
| 		if( STRCMPI(host->hostName, t->hostName) == 0 ) | ||||
| 		{ | ||||
| 			PrintMessage(MESG_ERROR, "\n AddHost :  Specified hostname %s is already present..", host->hostName); | ||||
| 			return FPM_FALSE; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	Host *newHost = DuplicateHost(host); | ||||
| 	 | ||||
| 	if( newHost == NULL) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n AddHost : Insufficient memory"); | ||||
| 		return FPM_INSUFFICIENT_MEMORY; | ||||
| 	} | ||||
|  | ||||
| 	// Add the new host at the end of the list... | ||||
| 	if( hostList == NULL ) | ||||
| 		hostList = newHost; | ||||
| 	else | ||||
| 	{ | ||||
| 		for(t=hostList; t->next ; t=t->next); | ||||
| 		 | ||||
| 		t->next = newHost; | ||||
| 	} | ||||
|  | ||||
| 	PrintMessage(MESG_DEBUG, "\n AddHost : Host %s added successfully", newHost->hostName); | ||||
|  | ||||
| 	return FPM_TRUE; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| int DataManager::ModifyHost(Host *host) | ||||
| { | ||||
| 	Host *prev = NULL; | ||||
| 	 | ||||
| 	if( host == NULL ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n ModifyHost :  host is NULL...."); | ||||
| 		return FPM_FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// check if the specified host is present | ||||
| 	// If present remove it and add new host ... | ||||
| 	for(Host *t=hostList; t ; prev=t,t=t->next) | ||||
| 	{ | ||||
| 		if( STRCMPI(host->hostName, t->hostName) == 0 ) | ||||
| 		{ | ||||
| 			Host *newHost = DuplicateHost(host); | ||||
|  | ||||
| 			if( newHost == NULL ) | ||||
| 			{ | ||||
| 				PrintMessage(MESG_ERROR, "\n ModifyHost : Insufficient memory"); | ||||
| 				return FPM_INSUFFICIENT_MEMORY; | ||||
| 			} | ||||
|  | ||||
| 			// if this is the first node | ||||
| 			if( hostList == t ) | ||||
| 			{ | ||||
| 				hostList = newHost; | ||||
| 				newHost->next = t->next; | ||||
| 			} | ||||
| 			else  | ||||
| 			{ | ||||
| 				prev->next = newHost; | ||||
| 				newHost->next = t->next; | ||||
| 			} | ||||
|  | ||||
| 			PrintMessage(MESG_DEBUG, "\n ModifyHost : Host %s modified successfully", newHost->hostName); | ||||
|  | ||||
| 			return FPM_TRUE; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	PrintMessage(MESG_ERROR, "\n ModifyHost :  Specified host %s is not present", host->hostName); | ||||
| 	 | ||||
| 	return FPM_HOSTNAME_NOT_PRESENT; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| //invoked from outside | ||||
| int DataManager::RemoveHost(char *hostName) | ||||
| { | ||||
| 	Host *prev = NULL; | ||||
|  | ||||
| 	if( !hostName ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n DataManager : Host name is Null ...."); | ||||
| 		return FPM_ILLEGAL_HOSTNAME; | ||||
| 	} | ||||
|  | ||||
| 	// Find out and destroy it..! | ||||
| 	for(Host *t=hostList; t ; prev=t,t=t->next) | ||||
| 	{ | ||||
| 		if( STRCMPI(hostName, t->hostName) == 0 ) | ||||
| 		{ | ||||
| 			// if this is the first node | ||||
| 			if( hostList == t ) | ||||
| 				hostList = t->next; | ||||
| 			else  | ||||
| 				prev->next = t->next; | ||||
|  | ||||
| 			free(t->hostName); | ||||
| 			free(t); | ||||
| 			return FPM_TRUE; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	PrintMessage(MESG_ERROR, "\n DataManager : Specified hostname[%s] is not present ", hostName); | ||||
| 	 | ||||
| 	return FPM_HOSTNAME_NOT_PRESENT; | ||||
| } | ||||
|  | ||||
|  | ||||
| Host* DataManager::DuplicateHost(Host *host) | ||||
| { | ||||
| HostElement *prev = NULL; | ||||
| HostElement *t, *temp; | ||||
|  | ||||
| 	Host *newHost = (Host *) malloc(sizeof(Host)); | ||||
| 	 | ||||
| 	if( newHost ) | ||||
| 		newHost->hostName = (char*) malloc(strlen(host->hostName) + 1); | ||||
|  | ||||
| 	if( !newHost || !newHost->hostName ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n DuplicateHost : Insufficient memory"); | ||||
| 		return NULL; | ||||
| 	} | ||||
|  | ||||
| 	strcpy(newHost->hostName, host->hostName); | ||||
| 	newHost->child = NULL; | ||||
| 	newHost->next = NULL; | ||||
| 	 | ||||
| 	for(t=host->child; t ; t = t->next) | ||||
| 	{ | ||||
| 		HostElement *nh = (HostElement*) malloc(sizeof(HostElement)); | ||||
| 		 | ||||
| 		if( nh ) | ||||
| 		{ | ||||
| 			nh->name = (char*) malloc(strlen(t->name) + 1 ); | ||||
| 			nh->value = (char*) malloc(strlen(t->value) + 1); | ||||
| 		} | ||||
| 		 | ||||
| 		if( !nh || !nh->name || !nh->value) | ||||
| 			goto duplicate_error; | ||||
|  | ||||
| 		nh->isPassword = t->isPassword; | ||||
| 		strcpy(nh->name, t->name); | ||||
| 		strcpy(nh->value, t->value); | ||||
| 		nh->next = NULL; | ||||
|  | ||||
| 		if( prev == NULL ) | ||||
| 			newHost->child = nh; | ||||
| 		else | ||||
| 			prev->next = nh; | ||||
|  | ||||
| 		prev = nh; | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	return newHost; | ||||
|  | ||||
| duplicate_error: | ||||
| 	 | ||||
| 	// cleanup partially loaded data | ||||
| 	for(t=newHost->child; t ; ) | ||||
| 	{ | ||||
| 		if(t->name) free(t); | ||||
| 		if(t->value) free(t); | ||||
| 		 | ||||
| 		temp = t; | ||||
| 		t = t->next; | ||||
| 		free(temp); | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	if(newHost->hostName) | ||||
| 		free(newHost->hostName); | ||||
| 	 | ||||
| 	free(newHost); | ||||
| 	 | ||||
| 	PrintMessage(MESG_ERROR, "\n DuplicateHost : Insufficient memory"); | ||||
| 	return NULL; | ||||
| } | ||||
|  | ||||
| void DataManager::PrintAllHosts() | ||||
| { | ||||
| 	PrintMessage(MESG_PRINT, "\n\n List of hosts "); | ||||
| 	 | ||||
| 	for(Host *t=hostList; 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); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| int DataManager::AddHostElement(char *hostName, char *name, char *value, unsigned char isPassword) | ||||
| { | ||||
| 	Host *host; | ||||
| 	HostElement *h, *t; | ||||
|  | ||||
|  | ||||
| 	if( !hostName || !name || !value) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n DataManager : Null parameters passed...."); | ||||
| 		return FPM_SIGNON_FILE_INVALID_DATA; | ||||
| 	} | ||||
|  | ||||
| 	 | ||||
| 	// First find the specified host | ||||
| 	for(host = hostList; host ; host = host->next) | ||||
| 	{ | ||||
| 		if( STRCMPI(hostName, host->hostName) == 0 ) | ||||
| 			break; | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	if( !host ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n DataManager : Specified hostname[%s] is not present ", hostName); | ||||
| 		return FPM_HOSTNAME_NOT_PRESENT; | ||||
| 	} | ||||
|  | ||||
| 	// check if specified name/value pair exist already.... | ||||
| 	for(h = host->child; h ; h=h->next) | ||||
| 	{ | ||||
| 		if( (STRCMPI(h->name,name) == 0 ) && (strcmp(h->value, value) == 0 ) ) | ||||
| 		{ | ||||
| 			PrintMessage(MESG_ERROR, "\n DataManager : Specified name/value [%s/%s]pair is already present ", name,value); | ||||
| 			return FPM_TRUE; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	HostElement *temp = (HostElement *) malloc(sizeof(HostElement)); | ||||
| 	if( temp ) | ||||
| 	{ | ||||
| 		temp->name = (char*) malloc( strlen(name)+1 ); | ||||
| 		temp->value = (char*) malloc( strlen( value) + 1 ); | ||||
| 	} | ||||
| 	 | ||||
| 	if( !temp || !temp->name || !temp->value )  | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n DataManager : Failed to add name/value due to insufficient memory "); | ||||
| 		return FPM_INSUFFICIENT_MEMORY; | ||||
| 	} | ||||
|  | ||||
| 	strcpy(temp->name,name); | ||||
| 	strcpy(temp->value, value); | ||||
| 	temp->isPassword = isPassword; | ||||
| 	temp->next = NULL; | ||||
|  | ||||
| 	// Now add it to the host...	 | ||||
| 	if( host->child == NULL ) | ||||
| 	{ | ||||
| 		host->child = temp;		 | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 	  for(t = host->child; t->next ; t=t->next); | ||||
| 	   | ||||
| 	  t->next = temp; | ||||
| 	} | ||||
|  | ||||
| 	return FPM_TRUE; | ||||
| } | ||||
|  | ||||
|  | ||||
| // invoked from outside.. | ||||
| int DataManager::RemoveHostElement(char *hostName, char *value) | ||||
| { | ||||
| 	 | ||||
| 	Host *host; | ||||
|  | ||||
| 	if( !hostName || !value ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n DataManager : Null parameters passed...."); | ||||
| 		return FPM_FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// First find the specified hot | ||||
| 	for(host = hostList; host; host = host->next) | ||||
| 	{ | ||||
| 		if( STRCMPI(hostName, host->hostName) == 0 ) | ||||
| 			break; | ||||
| 	} | ||||
|  | ||||
| 	if( !host ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n DataManager : Specified hostname[%s] is not present ", hostName); | ||||
| 		return FPM_FALSE; | ||||
| 	} | ||||
|  | ||||
| 	HostElement *prev = host->child; | ||||
| 	for(HostElement *h = host->child; h ;prev=h, h=h->next) | ||||
| 	{ | ||||
| 		if( strcmp(h->value, value) == 0  ) | ||||
| 		{ | ||||
|  | ||||
| 			if( host->child == h ) | ||||
| 				host->child = h->next; | ||||
| 			else | ||||
| 				prev->next = h->next; | ||||
|  | ||||
| 			free(h->value); | ||||
| 			free(h->name); | ||||
| 			free(h); | ||||
| 			 | ||||
| 			return FPM_TRUE; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	return FPM_FALSE; | ||||
| } | ||||
|  | ||||
|  | ||||
| // internal | ||||
| int DataManager::RemoveAllData() | ||||
| { | ||||
| 	 | ||||
| 	RemoveAllRejectHosts(); | ||||
| 	RemoveAllHosts(); | ||||
|  | ||||
| 	return FPM_TRUE; | ||||
| } | ||||
|  | ||||
|  | ||||
| int DataManager::RemoveAllRejectHosts() | ||||
| { | ||||
| RejectHost *t = rejectHostList;	 | ||||
| RejectHost *temp; | ||||
|  | ||||
| 	for( ; t; ) | ||||
| 	{ | ||||
| 		temp = t; | ||||
| 		t= t->next; | ||||
| 		RemoveRejectHost(temp->hostName); | ||||
| 	} | ||||
|  | ||||
| 	rejectHostList = NULL; | ||||
| 	 | ||||
| 	return FPM_TRUE; | ||||
| } | ||||
|  | ||||
|  | ||||
| int DataManager::RemoveAllHosts() | ||||
| { | ||||
| Host *t = hostList; | ||||
| Host *temp; | ||||
|  | ||||
| 	for( ; t ; ) | ||||
| 	{ | ||||
| 		temp = t; | ||||
| 		t = t->next; | ||||
|  | ||||
| 		RemoveHost(temp->hostName); | ||||
| 	} | ||||
|  | ||||
| 	hostList = NULL; | ||||
|  | ||||
| 	return FPM_TRUE; | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
							
								
								
									
										65
									
								
								adlib/ad_ff/native/DataManager.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								adlib/ad_ff/native/DataManager.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,65 @@ | ||||
| /*********************************************************************** | ||||
|  * | ||||
|  *  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. | ||||
|  * | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| #ifndef __FPM_DATA_MANAGER_H__ | ||||
| #define __FPM_DATA_MANAGER_H__ | ||||
|  | ||||
| #include "FirefoxPasswordManager.h" | ||||
| #include "Common.h" | ||||
|  | ||||
|  | ||||
| class DataManager   | ||||
| { | ||||
| 	 | ||||
| public: | ||||
|  | ||||
| 	Host *hostList; | ||||
| 	RejectHost *rejectHostList; | ||||
|  | ||||
| 	DataManager(); | ||||
| 	virtual ~DataManager(); | ||||
|  | ||||
| 	int AddRejectHost(char *hostName); | ||||
| 	int RemoveRejectHost(char *hostName); | ||||
| 	void PrintAllRejectHosts(); | ||||
| 	 | ||||
|  | ||||
| 	int AddHost(char *hostName); | ||||
| 	int AddHost(Host *host); | ||||
| 	int ModifyHost(struct Host *host); | ||||
| 	int ModifyHost(char *oldHostName, char *newHostName); | ||||
| 	int RemoveHost(char *hostName); | ||||
| 	void PrintAllHosts(); | ||||
|  | ||||
| 	int AddHostElement(char *hostName, char *name, char *value, unsigned char isPassword); | ||||
| 	int RemoveHostElement(char *hostName, char *clearValue); | ||||
| 	Host* DuplicateHost(Host *host); | ||||
|  | ||||
| 	int RemoveAllData(); | ||||
| 	int RemoveAllRejectHosts(); | ||||
| 	int RemoveAllHosts(); | ||||
|  | ||||
| }; | ||||
|  | ||||
| #endif  | ||||
|  | ||||
|  | ||||
							
								
								
									
										727
									
								
								adlib/ad_ff/native/FirefoxPasswordManager.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										727
									
								
								adlib/ad_ff/native/FirefoxPasswordManager.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,727 @@ | ||||
| /*********************************************************************** | ||||
|  * | ||||
|  *  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. | ||||
|  * | ||||
|  ***********************************************************************/ | ||||
|  | ||||
|  | ||||
| #include "FirefoxPasswordManager.h" | ||||
| #include "Common.h" | ||||
| #include "ProfileManager.h" | ||||
|  | ||||
|  | ||||
| ProfileManager profileManager[MAX_PROFILE_COUNT]; | ||||
| int profileCount = 0; | ||||
|  | ||||
|  | ||||
|  | ||||
| /** | ||||
| *   Check if firefox is there on the system | ||||
| * | ||||
| *   @return  1   if firefox libraries are present | ||||
| *            0   otherwise | ||||
| * | ||||
| *   It loads the libraries from the firefox library path and if they are loaded | ||||
| *   successfully then that indicates that firefox is present. | ||||
| * | ||||
| */ | ||||
| extern "C" APIEXPORT int FPM_IsStoreAvailable() | ||||
| { | ||||
| 	ProfileManager pm; | ||||
| 	return pm.IsStoreAvailable(); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /* | ||||
| *  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_DEBUG, "\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; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /** | ||||
| *	 Initializes the firefox library with the specified profile | ||||
| * | ||||
| *	@param   profileName   name of the profile | ||||
| *	@return  1     on success | ||||
| *         <=0   on error  | ||||
| *   | ||||
| *    It initializes the firefox library with the specified profile. This must be called before  | ||||
| *    invoking any operation on the specified profile. | ||||
| *    It performs following tasks | ||||
| *       * Determine firefox profile directory  | ||||
| *       * Loads the firefox security libraries. | ||||
| *       * Initializes the firefox security library for the profile. | ||||
| * | ||||
| *	If the mentioned profile is not found then FPM_PROFILE_NOT_PRESENT will be returned. If there is | ||||
| *   an error in loading or initializing the firefox library then FPM_LIBRARY_LOAD_FAILED or FPM_LIBRARY_INIT_FAILED | ||||
| *   is returned. If user has not enabled "remember passwords" then certain files (key3.db, cert8.db) required for  | ||||
| *   initialization will not be present in the profile directory. This can cause FPM_LIBRARY_INIT_FAILED error. | ||||
| * | ||||
| */ | ||||
|  | ||||
| extern "C" APIEXPORT int FPM_FirefoxProfileInit(char *profileName) | ||||
| { | ||||
| int retValue; | ||||
| int profileIndex = -1; 	 | ||||
|  | ||||
| 	// Check if the object for specified profile already present... | ||||
| 	for(int i=0; i< profileCount; i++) | ||||
| 	{ | ||||
| 		if( profileManager[i].profileName != NULL ) | ||||
| 		{ | ||||
| 			if( STRCMPI(profileManager[i].profileName, profileName) == 0 ) | ||||
| 			{ | ||||
| 				PrintMessage(MESG_DEBUG, "\n FirefoxProfileInit : Object for specified profile %s exist ", profileName); | ||||
| 				profileIndex = i; | ||||
|  | ||||
| 				break; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// This is new profile... | ||||
| 	if( profileIndex == -1)  | ||||
| 	{ | ||||
| 		if( (profileCount + 1) >= MAX_PROFILE_COUNT) | ||||
| 		{ | ||||
| 			PrintMessage(MESG_ERROR, "\n FirefoxProfileInit : Max profile count exceeded."); | ||||
| 			return FPM_PROFILE_LIMIT_EXCEEDED; | ||||
| 		} | ||||
|  | ||||
| 		profileIndex = profileCount; | ||||
| 		profileCount++; | ||||
| 	} | ||||
|  | ||||
| 	// check if the profile is already initialized... | ||||
| 	if( profileManager[profileIndex].isInitialized == FPM_TRUE ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_DEBUG, "\n FirefoxProfileInit :  Specified profile %s is already initialized", profileName); | ||||
| 		return FPM_TRUE;			 | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	if( (retValue = profileManager[profileIndex].ProfileInit(profileName)) != FPM_TRUE ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n FirefoxProfileInit : Failed to initialize the profile %s ", profileName); | ||||
| 		return retValue; | ||||
| 	} | ||||
|  | ||||
| 	PrintMessage(MESG_DEBUG, "\n FirefoxProfileInit : Firefox profile %s initialized successfully ", profileName); | ||||
|  | ||||
| 	 | ||||
| 	return FPM_TRUE; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /** | ||||
| *   Uninitializes the specified profile. | ||||
| * | ||||
| *	@param   profileName   name of the profile | ||||
| *   @return  1     on success | ||||
| *			<=0    on error  | ||||
| * | ||||
| *   Uninitializes the specified profile and unloads the firefox security library. | ||||
| *   It also cleans up internal data structure. | ||||
| */ | ||||
|  | ||||
| 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; | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
| *   Verifies if master passsword is set for the specified profile	 | ||||
| * | ||||
| *	@param   profileName   name of the profile | ||||
| *	@return 1    if master password is set | ||||
| *			0    if master password not set | ||||
| * | ||||
| *	Checks if the master password is set or not for the specified profile. The application can  | ||||
| *	use this function to determine if the user has set the master password. If so it can prompt  | ||||
| *	the user to enter the master password. | ||||
| */ | ||||
|  | ||||
| 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; | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /** | ||||
| *	Checks if the master password is correct for the specified profile. | ||||
| * | ||||
| *	@param    profileName      name of the profile | ||||
| *	@param    masterPassword   Master password to be checked. | ||||
| *	@return  1   if the specified master password is correct | ||||
| *			 0   if the master password is wrong. | ||||
| * | ||||
| * | ||||
| *	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. | ||||
| */ | ||||
|  | ||||
| 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; | ||||
|  | ||||
| } | ||||
|  | ||||
| /** | ||||
| *	Loads the signon data from the firefox signon file for specified profile | ||||
| * | ||||
| *	@param   profileName    name of the profile | ||||
| *	@param   struct Host**  pointer to list of signon host structure | ||||
| *	@param   doRefresh      signon data to be refreshed or not  | ||||
| *	@return  1              success | ||||
| *         <= 0           If an error has occurred. | ||||
| * | ||||
| *	Returns the pointer to the internal signon data store which contains list of hosts | ||||
| *	and associated name/value pairs. If doRefresh value is positive then fresh signon  | ||||
| *	data is loaded from the signon file. Otherwise current signon data is returned. | ||||
| * | ||||
| *	If the master password is set and its not specified or wrong password is specified | ||||
| *   then error code FPM_MASTERPASSWORD_WRONG will be returned. In this case use  | ||||
| *	CheckMasterPassword function to set the correct master password and then call this  | ||||
| *	function again. | ||||
| * | ||||
| *	In case of error in reading signon information FPM_SIGNON_FILE_READ_ERROR or  | ||||
| *	FPM_SIGNON_FILE_NOT_PRESENT will be returned. | ||||
| * | ||||
| */ | ||||
|  | ||||
|  | ||||
| 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; | ||||
| } | ||||
|  | ||||
| /** | ||||
| *   Updates the firefox signon file with new signon data. | ||||
| * | ||||
| *	@param   profileName    name of the profile | ||||
| *	@return   1      If signon data written to the disk successfully  | ||||
| *           <=0    If an error has occurred. | ||||
| * | ||||
| *	Writes the signon data from the internal signon data store to the disk. If an  | ||||
| *	error occurs then proper error code will be returned. If the master password is set | ||||
| *   and its not specified or wrong password is specified then error code FPM_MASTERPASSWORD_WRONG | ||||
| *   will be returned. In this case use CheckMasterPassword function to set the correct  | ||||
| *   master password and then call this function again. | ||||
| * | ||||
| *	In case of write error, error code FPM_SIGNON_FILE_WRITE_ERROR will be returned. | ||||
| * | ||||
| *	If the signon file is locked then error code FPM_SIGNON_FILE_LOCKED will be  | ||||
| *   returned. In this case application should ask the user to close the firefox  | ||||
| *   application and then it should call this function again. | ||||
| * | ||||
| */ | ||||
|  | ||||
| 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; | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
| *   Adds signon data for new host... | ||||
| * | ||||
| *	@param   profileName    name of the profile | ||||
| *	@param   struct Host*   pointer to host structure to be added | ||||
| *	@param   doUpdate       signon data to be written to the file or not | ||||
| *	@return  1      success | ||||
| *         <=0    error | ||||
| * | ||||
| *	Adds the specified host information to the internal signon data store. If the  | ||||
| *	value of doUpdate is positive then the entire signon data is written to the file.  | ||||
| *	Otherwise changes are done only in the internal data store. | ||||
| * | ||||
| *	If doUpdate is positive then error code may be from FPM_WriteSignonData function. | ||||
| * | ||||
| */ | ||||
|  | ||||
|  | ||||
| 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; | ||||
|  | ||||
| } | ||||
|  | ||||
| /** | ||||
| *   Modifies the credentials for the specified host url for specified profile. | ||||
| * | ||||
| *	@param   profileName    name of the profile | ||||
| *	@param   struct Host*   pointer to host structure to be modified. | ||||
| *	@param   doUpdate       signon data to be written to the file or not | ||||
| *	@return   1      success | ||||
| *         <=0     error | ||||
| * | ||||
| *	Modifes the values of the specified host with new values. If the value  | ||||
| *	of doUpdate is positive then the entire signon data is written to the file.  | ||||
| *	Otherwise changes are done only in the internal data store. If any of | ||||
| *	the names ( name/value pairs ) is not matched with the existing name in the  | ||||
| *	Host's username/password list then error FPM_NAME_NOT_PRESENT is returned. | ||||
| * | ||||
| *	If doUpdate is positive then error code may be from FPM_WriteSignonData function. | ||||
| * | ||||
| */ | ||||
|    | ||||
| 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; | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| /** | ||||
| *    Removes the signon credentials for specified host | ||||
| * | ||||
| *	@param   profileName  name of the profile | ||||
| *	@param   hostName     complete URL of the host name  | ||||
| *	@param   doUpdate     signon data to be written to the file or not | ||||
| * | ||||
| *	@return  1      on success | ||||
| *         <=0    on error | ||||
| * | ||||
| *	Removes the specified host from the internal signon data store. All  | ||||
| *	name-value pairs associated with specified host will also be removed.  | ||||
| *	If the value of doUpdate is positive then the entire signon data is | ||||
| *	written to the file. Otherwise changes are done only in the internal data store.  | ||||
| * | ||||
| *	If doUpdate is positive then error code may be from FPM_WriteSignonData function. | ||||
| * | ||||
| */ | ||||
| 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; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
							
								
								
									
										186
									
								
								adlib/ad_ff/native/FirefoxPasswordManager.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										186
									
								
								adlib/ad_ff/native/FirefoxPasswordManager.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,186 @@ | ||||
| /*********************************************************************** | ||||
|  * | ||||
|  *  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. | ||||
|  * | ||||
|  ***********************************************************************/ | ||||
|  | ||||
|  | ||||
| #ifndef __FPM_Firefox_Password_MANAGER_H__ | ||||
| #define __FPM_Firefox_Password_MANAGER_H__ | ||||
|  | ||||
|  | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include <stdarg.h> | ||||
| #include <time.h> | ||||
|  | ||||
| #ifdef WIN32 | ||||
| 	#include <windows.h> | ||||
| 	#include <userenv.h> | ||||
| 	#pragma comment(lib,"userenv.lib") | ||||
|  | ||||
| 	#define STRCMPI strcmpi	 | ||||
| 	#define APIEXPORT __declspec(dllexport) | ||||
|  | ||||
| 	#define NSS_LIBRARY_NAME   "nss3.dll" | ||||
| 	#define PLC_LIBRARY_NAME   "plc4.dll" | ||||
| 	#define NSPR_LIBRARY_NAME  "nspr4.dll" | ||||
| 	#define PLDS_LIBRARY_NAME  "plds4.dll" | ||||
| 	#define SOFTN_LIBRARY_NAME "softokn3.dll" | ||||
|  | ||||
| 	#define LOADLIBRARY(x)  LoadLibrary(x) | ||||
| 	#define GETPROCADDRESS  GetProcAddress | ||||
| 	#define FREELIBRARY     FreeLibrary | ||||
|  | ||||
| #else | ||||
| 	#include <dlfcn.h> | ||||
| 	#define STRCMPI strcasecmp | ||||
| 	#define APIEXPORT  | ||||
|  | ||||
| 	#define NSS_LIBRARY_NAME   "libnss3.so" | ||||
| 	#define PLC_LIBRARY_NAME   "libplc4.so" | ||||
| 	#define NSPR_LIBRARY_NAME  "libnspr4.so" | ||||
| 	#define PLDS_LIBRARY_NAME  "libplds4.so" | ||||
| 	#define SOFTN_LIBRARY_NAME "libsoftokn3.so" | ||||
|  | ||||
| 	#define LOADLIBRARY(x)  dlopen(x, RTLD_LAZY)   // alternative : RTLD_NOW  | ||||
| 	#define GETPROCADDRESS  dlsym | ||||
| 	#define FREELIBRARY     dlclose | ||||
|  | ||||
| 	#define HMODULE   void * | ||||
|  | ||||
| #endif | ||||
|  | ||||
|  | ||||
|  | ||||
| #define FPM_TRUE    1 | ||||
| #define FPM_FALSE   0 | ||||
|  | ||||
| #define MESG_DEBUG      0 | ||||
| #define MESG_PRINT      1 | ||||
| #define MESG_ERROR      2 | ||||
|  | ||||
| #define MAX_PROFILE_COUNT 5 | ||||
|  | ||||
| //#define DEBUG  11 | ||||
|  | ||||
| #define Unichar unsigned int | ||||
|  | ||||
| #define HEADER_VERSION  "#2c" | ||||
| #define CRYPT_PREFIX    "~" | ||||
|  | ||||
| #define SIGNON_FILE_NAME "signons.txt" | ||||
|  | ||||
| // Internal structure declaration taken from firefox..... | ||||
| typedef enum SECItemType | ||||
| { | ||||
|     siBuffer = 0, | ||||
|     siClearDataBuffer = 1, | ||||
|     siCipherDataBuffer = 2, | ||||
|     siDERCertBuffer = 3, | ||||
|     siEncodedCertBuffer = 4, | ||||
|     siDERNameBuffer = 5, | ||||
|     siEncodedNameBuffer = 6, | ||||
|     siAsciiNameString = 7, | ||||
|     siAsciiString = 8, | ||||
|     siDEROID = 9, | ||||
|     siUnsignedInteger = 10, | ||||
|     siUTCTime = 11, | ||||
|     siGeneralizedTime = 12 | ||||
| }; | ||||
|  | ||||
| //typedef struct SECItemStr SECItem; | ||||
|  | ||||
| struct SECItem  | ||||
| { | ||||
|     SECItemType type; | ||||
|     unsigned char *data; | ||||
|     unsigned int len; | ||||
| }; | ||||
|  | ||||
|  | ||||
| typedef enum SECStatus  | ||||
| { | ||||
|     SECWouldBlock = -2, | ||||
|     SECFailure = -1, | ||||
|     SECSuccess = 0 | ||||
| }; | ||||
|  | ||||
| // For some PR type varialbes...just to remove gecko-sdk dependency | ||||
| // following is added here. | ||||
| #define PRBool   int | ||||
| #define PRUint32 unsigned int | ||||
| #define PR_TRUE  1 | ||||
| #define PR_FALSE 0 | ||||
|  | ||||
|  | ||||
|  | ||||
| // End | ||||
|  | ||||
|  | ||||
|  | ||||
| typedef struct PK11SlotInfoStr PK11SlotInfo; | ||||
|  | ||||
| // NSS Library functions | ||||
| //typedef char *(PR_CALLBACK *PK11PasswordFunc)(PK11SlotInfo *slot, PRBool retry, void *arg); | ||||
| typedef SECStatus      (*NSS_Init) (const char *configdir); | ||||
| typedef SECStatus      (*NSS_Shutdown) (void); | ||||
| //typedef void           (*PK11_SetPasswordFunc) (PK11PasswordFunc func); | ||||
| typedef PK11SlotInfo * (*PK11_GetInternalKeySlot) (void); | ||||
| typedef void           (*PK11_FreeSlot) (PK11SlotInfo *slot); | ||||
| typedef SECStatus      (*PK11_Authenticate) (PK11SlotInfo *slot, PRBool loadCerts, void *wincx); | ||||
| typedef SECStatus      (*PK11_CheckUserPassword) (PK11SlotInfo *slot,char *pw); | ||||
| typedef SECStatus      (*PK11SDR_Decrypt) (SECItem *data, SECItem *result, void *cx); | ||||
| typedef SECStatus      (*PK11SDR_Encrypt) (SECItem *keyid, SECItem *data, SECItem *result, void *cx); | ||||
|  | ||||
| // PLC Library functions | ||||
| typedef char *         (*PL_Base64Encode)( const char *src, PRUint32 srclen, char *dest); | ||||
| typedef char *         (*PL_Base64Decode)( const char *src, PRUint32 srclen, char *dest); | ||||
|  | ||||
| void PrintMessage( int level, char *mesg , ...); | ||||
| int IsDirectoryExists( char *path ); | ||||
| void StrLwr(char *str); | ||||
|  | ||||
|  | ||||
|  | ||||
| // Profile initiliazation functions | ||||
| extern "C" APIEXPORT int FPM_IsStoreAvailable(); | ||||
| extern "C" APIEXPORT int FPM_GetProfileList(char **profileList[], int **profileFlag); | ||||
| extern "C" APIEXPORT int FPM_FirefoxProfileInit(char *profileName); | ||||
| extern "C" APIEXPORT int FPM_FirefoxProfileExit(char *profileName); | ||||
|  | ||||
| // Master password functions | ||||
| extern "C" APIEXPORT int FPM_IsMasterPasswordSet(char *profileName); | ||||
| extern "C" APIEXPORT int FPM_CheckMasterPassword(char *profileName, char *masterPassword); | ||||
|  | ||||
| // Signon data update functions | ||||
| extern "C" APIEXPORT int FPM_GetSignonData(char *profileName,struct Host **host, int doRefresh); | ||||
| extern "C" APIEXPORT int FPM_WriteSignonData(char *profileName); | ||||
| extern "C" APIEXPORT int FPM_AddHost(char *profileName, struct Host *host, int doUpdate); | ||||
| extern "C" APIEXPORT int FPM_ModifyHost(char *profileName, struct Host *host, int doUpdate); | ||||
| extern "C" APIEXPORT int FPM_RemoveHost(char *profileName, char *hostname, int doUpdate); | ||||
|  | ||||
|  | ||||
| #endif | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
							
								
								
									
										123
									
								
								adlib/ad_ff/native/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										123
									
								
								adlib/ad_ff/native/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,123 @@ | ||||
| ####################################################################### | ||||
| # | ||||
| #  Copyright (C) 2006 Novell, Inc. | ||||
| # | ||||
| #  This program is free software; you can redistribute it and/or | ||||
| #  modify it under the terms of the GNU General Public | ||||
| #  License as published by the Free Software Foundation; either | ||||
| #  version 2 of the License, or (at your option) any later version. | ||||
| # | ||||
| #  This program 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 | ||||
| #  General Public License for more details. | ||||
| # | ||||
| #  You should have received a copy of the GNU General Public | ||||
| #  License along with this program; if not, write to the Free | ||||
| #  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||
| # | ||||
| # | ||||
| ####################################################################### | ||||
|  | ||||
| if DEBUG | ||||
| TARGET_CFG = Debug | ||||
| CFLAGS += -v -w | ||||
| else | ||||
| TARGET_CFG = Release | ||||
| endif | ||||
|  | ||||
| SUBDIRS = | ||||
| DIST_SUBDIRS = | ||||
|  | ||||
| EXTRA_DIST = $(CXXFILES)  *.h | ||||
|  | ||||
| CASAROOT = ../../.. | ||||
|  | ||||
| CASALIBDIR = $(CASAROOT)/$(LIB) | ||||
|  | ||||
| BUILD_VER = 1.1.1 | ||||
|  | ||||
| # handle Mono secondary dependencies | ||||
| export MONO_PATH := $(MONO_PATH) | ||||
|  | ||||
| PLATFORMINDEPENDENTSOURCEDIR = | ||||
| PLATFORMDEPENDENTSOURCEDIR = . | ||||
|  | ||||
| CXX = g++ | ||||
|  | ||||
| MODULE_NAME =libad_ff | ||||
| MODULE_EXT =so | ||||
|  | ||||
| CXXFILES = $(srcdir)/Common.cpp \  | ||||
| 	$(srcdir)/CryptManager.cpp \ | ||||
| 	$(srcdir)/FirefoxPasswordManager.cpp \ | ||||
| 	$(srcdir)/ProfileManager.cpp \ | ||||
| 	$(srcdir)/SignonManager.cpp \ | ||||
| 	$(srcdir)/DataManager.cpp | ||||
|  | ||||
|  | ||||
| CXXFILES_CXX := | ||||
| INCLUDES =  -I. -I.. -I$(CASAROOT)/include \ | ||||
| -I/opt/gnome/include/gnome-keyring-1  | ||||
| CXXFLAGS = $(CPP_LIBFLAG) $(INCLUDES)  | ||||
| EXTRA_CXXFLAGS = -fPIC -DPIC -DSSCS_LINUX_PLAT_F -DQT_THREAD_SUPPORT -DQT_CLEAN_NANESPACE \  | ||||
|    -DQT_NO_ASCII_CAS -O2 -fmessage-length=0 -Wall -g -D_REENTRANT \ | ||||
|    -DALIGNMENT -DN_PLAT_UNIX -DUNIX -DLINUX -DIAPX386  | ||||
| CXX_RESOURCES = | ||||
| LIBS = -lpthread -ldl -L/opt/kde3/lib   | ||||
| LDFLAGS = -fno-exception -fno-check-new -Wl,-Bsymbolic -shared -pthread -O2  \ | ||||
|         -Wl,-soname -Wl,libkwallets_rw.so.1 | ||||
|  | ||||
| EXTRA_LDFLAGS = -L/usr/$(LIB) -lqt-mt -L/usr/X11R6/$(LIB) -L/usr/lib/qt3/$(LIB)  | ||||
|  | ||||
| OBJDIR = ./$(TARGET_CFG)/$(LIB) | ||||
|  | ||||
| OBJS = $(addprefix $(OBJDIR)/, $(CXXFILES:%.cpp=%.o)) | ||||
|  | ||||
| CUR_DIR := $(shell pwd) | ||||
|  | ||||
| all: $(OBJDIR)/$(MODULE_NAME).$(MODULE_EXT).$(BUILD_VER) | ||||
|  | ||||
| # | ||||
| # Pattern based rules. | ||||
| # | ||||
| vpath %.c $(PLATFORMDEPENDENTSOURCEDIR) $(PLATFORMINDEPENDENTSOURCEDIR) | ||||
| vpath %.cpp $(PLATFORMDEPENDENTSOURCEDIR) $(PLATFORMINDEPENDENTSOURCEDIR) | ||||
| vpath %.cs $(PLATFORMDEPENDENTSOURCEDIR) $(PLATFORMINDEPENDENTSOURCEDIR) | ||||
|  | ||||
|  | ||||
| $(OBJDIR)/%.o: %.cpp | ||||
| 	$(CXX) -c $(CXXFLAGS) $(EXTRA_CXXFLAGS) -o $@ $< | ||||
|  | ||||
| $(OBJDIR)/$(MODULE_NAME).$(MODULE_EXT).$(BUILD_VER): $(OBJDIR) $(OBJS) | ||||
| 	@echo [======== Linking $@ ========] | ||||
| 	c++ -o $@ $(LDFLAGS) $(EXTRA_LDFLAGS) $(OBJS) $(LIBS) | ||||
| 	cp -f $(OBJDIR)/$(MODULE_NAME).$(MODULE_EXT).$(BUILD_VER) $(CASALIBDIR)/$(TARGET_CFG)/$(MODULE_NAME).$(MODULE_EXT).$(BUILD_VER) | ||||
| 	ln -sf  $(CASALIBDIR)/$(TARGET_CFG)/$(MODULE_NAME).$(MODULE_EXT).$(BUILD_VER)  $(CASALIBDIR)/$(TARGET_CFG)/$(MODULE_NAME).$(MODULE_EXT).1 | ||||
|  | ||||
| $(OBJDIR): | ||||
| 	[ -d $(OBJDIR) ] || mkdir -p $(OBJDIR) | ||||
| 	[ -d $(CASALIBDIR) ] || mkdir -p $(CASALIBDIR) | ||||
| 	[ -d $(CASALIBDIR)/$(TARGET_CFG) ] || mkdir -p $(CASALIBDIR)/$(TARGET_CFG) | ||||
|  | ||||
|  | ||||
| install-exec-local: $(OBJDIR)/$(MODULE_NAME).$(MODULE_EXT) | ||||
| 	$(mkinstalldirs) $(DESTDIR)$(libdir) | ||||
| 	$(INSTALL_PROGRAM) $(OBJDIR)/$(MODULE_NAME).$(MODULE_EXT) $(DESTDIR)$(libdir)/ | ||||
|  | ||||
| uninstall-local: | ||||
| 	cd $(DESTDIR)$(libdir); rm -f $(OBJDIR)/$(MODULE_NAME).$(MODULE_EXT) | ||||
| 	rmdir $(DESTDIR)$(libdir) | ||||
|  | ||||
| #installcheck-local: install | ||||
| #	$(mkinstalldirs) $(DESTDIR)$(libdir) | ||||
| #	$(INSTALL_PROGRAM) $(DESTDIR)$(libdir) | ||||
| #	cd $(DESTDIR)$(libdir); $(MONO) | ||||
|  | ||||
| clean-local: | ||||
| 	if [ -d $(TARGET_CFG) ]; then  rm -rf $(TARGET_CFG); fi | ||||
|  | ||||
| distclean-local: | ||||
|  | ||||
| maintainer-clean-local: | ||||
| 	rm -f Makefile.in | ||||
							
								
								
									
										984
									
								
								adlib/ad_ff/native/ProfileManager.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										984
									
								
								adlib/ad_ff/native/ProfileManager.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,984 @@ | ||||
| /*********************************************************************** | ||||
|  * | ||||
|  *  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. | ||||
|  * | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| #include "ProfileManager.h" | ||||
|  | ||||
|  | ||||
|  | ||||
| // Private functions.... | ||||
|  | ||||
| ProfileManager::ProfileManager() | ||||
| { | ||||
| 	isInitialized = 0; | ||||
| 	libnss = NULL; | ||||
| 	libplc = NULL; | ||||
|  | ||||
| 	profileName = NULL; | ||||
| 	profilePath = NULL; | ||||
| 	libraryPath = NULL; | ||||
| 	masterPassword = NULL; | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| char * ProfileManager::GetFirefoxProfilePath(char *profileName) | ||||
| { | ||||
|  | ||||
| #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; | ||||
| 	unsigned int i; | ||||
| 	HANDLE token; | ||||
|  | ||||
| 		 | ||||
| 	// Get current user's profile directory | ||||
| 	if( OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token) == FALSE ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n GetFirefoxProfilePath : Failed to get current process token "); | ||||
| 		return 0; | ||||
| 	} | ||||
| 	 | ||||
| 	if( GetUserProfileDirectory(token, profileDir, &pathSize) == FALSE ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n GetFirefoxProfilePath : Failed to get user profile directory"); | ||||
| 		return 0; | ||||
| 	} | ||||
| 	 | ||||
| 	PrintMessage(MESG_DEBUG, "\n GetFirefoxProfilePath : 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 GetFirefoxProfilePath : Firefox profile.ini 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; | ||||
| 	unsigned int i; | ||||
| 	 | ||||
| 	// Get home directory | ||||
| 	homeDir = getenv("HOME"); | ||||
| 	 | ||||
| 	if(homeDir == NULL ) | ||||
| 	{ | ||||
| 	    PrintMessage(MESG_ERROR, "\n GetFirefoxProfilePath : Unable to get home directory "); | ||||
| 	    return 0; | ||||
| 	}	 | ||||
|  | ||||
| 	profilePath = (char*) malloc( strlen(homeDir) + strlen(profileFile) + 3 ); | ||||
| 	if( profilePath == NULL ) | ||||
| 	{ | ||||
| 	    PrintMessage(MESG_ERROR, "\n GetFirefoxProfilePath : Insufficient memory "); | ||||
| 	    return 0; | ||||
| 	} | ||||
| 	strcpy(profilePath,homeDir); | ||||
| 	strcat(profilePath,profileFile); | ||||
|  | ||||
| 	PrintMessage(MESG_DEBUG, "\n GetFirefoxProfilePath : 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 GetFirefoxProfilePath : Unable to find firefox profile file : %s ", profilePath); | ||||
| 		return NULL; | ||||
| 	} | ||||
|  | ||||
| 	// Find out the profile path for given profile name | ||||
| 	char *temp; | ||||
| 	int isProfileFound = 0; | ||||
| 	int isRelative = 1; | ||||
| 	char *path = NULL; | ||||
|  | ||||
| 	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( isProfileFound ) | ||||
| 		{ | ||||
| 			 | ||||
| 			temp = strchr(line,'=') + 1; | ||||
| 		 | ||||
| 			// check for IsRelative= | ||||
| 			if( strstr(line, "isrelative=") != NULL ) | ||||
| 			{ | ||||
| 				// Is the value greater than 0 ( ascii 48 ) | ||||
| 				isRelative = (*temp > 48)? 1 : 0 ; | ||||
| 				continue; | ||||
| 			} | ||||
| 			 | ||||
| 			// check for Path= | ||||
| 			if( strstr(line, "path=") != NULL ) | ||||
| 			{ | ||||
| 				path =  (char*) malloc(strlen(temp) + 1); | ||||
| 				if( !path ) | ||||
| 				{ | ||||
| 				    PrintMessage(MESG_ERROR, "\n GetFirefoxProfilePath : Insufficient memory "); | ||||
| 					fclose(profile); | ||||
| 					return 0; | ||||
| 				} | ||||
|  | ||||
| 				strcpy(path,temp); | ||||
| 				continue; | ||||
| 			} | ||||
| 		 | ||||
| 			// Break once you encounter next profile | ||||
| 			if( strstr(line, "profile") != NULL ) | ||||
| 			{ | ||||
| 				break; | ||||
| 			} | ||||
| 			 | ||||
|  | ||||
| 		} | ||||
| 		 | ||||
| 		 | ||||
| 		if( strstr(line, "name=") != NULL ) | ||||
| 		{ | ||||
| 			temp = strchr(line,'=') + 1; | ||||
| 			 | ||||
| 			if( STRCMPI(temp, profileName) == 0 ) | ||||
| 			{ | ||||
| 				PrintMessage(MESG_DEBUG, "\n GetFirefoxProfilePath : Profile name [%s] found ", profileName); | ||||
| 				isProfileFound = 1; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		 | ||||
| 	} | ||||
|  | ||||
| 	fclose(profile); | ||||
|  | ||||
| 	if( !isProfileFound ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n GetFirefoxProfilePath : Specified Profile [%s] not present ", profileName); | ||||
| 		return NULL; | ||||
| 	} | ||||
|  | ||||
| 	if( !path ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n GetFirefoxProfilePath : Profile [%s] path not found ", profileName); | ||||
| 		return NULL; | ||||
| 	} | ||||
|  | ||||
| 	if( isRelative ) | ||||
| 	{ | ||||
| 		#ifdef WIN32 | ||||
| 			// if path contains '/' then make it '\\' | ||||
| 			char *slash = strstr(path,"/"); | ||||
| 				 | ||||
| 			if( slash != NULL ) | ||||
| 				*slash = '\\'; | ||||
| 				 | ||||
| 			int totalLen = strlen(profileDir) + strlen(partialPath) + strlen(path) + 3 ; | ||||
| 			finalProfilePath = (char *) malloc(totalLen); | ||||
| 			 | ||||
| 			if( finalProfilePath ) | ||||
| 			{ | ||||
| 				strcpy(finalProfilePath,profileDir); | ||||
| 				strcat(finalProfilePath,"\\"); | ||||
| 				strcat(finalProfilePath,partialPath); | ||||
| 				strcat(finalProfilePath,"\\"); | ||||
| 				strcat(finalProfilePath,path); | ||||
|  | ||||
| 				PrintMessage(MESG_DEBUG, "\n Final profile path is : %s ", finalProfilePath); | ||||
| 			} | ||||
| 				 | ||||
| 		#else // Linux platform | ||||
|  | ||||
| 			int totalLen = strlen(homeDir) + strlen(profileDir) +  strlen(path) + 2 ; | ||||
| 			finalProfilePath = (char *) malloc(totalLen); | ||||
|  | ||||
| 			if( finalProfilePath ) | ||||
| 			{ | ||||
| 				strcpy(finalProfilePath,homeDir); | ||||
| 				strcat(finalProfilePath,profileDir); | ||||
| 				strcat(finalProfilePath,"/"); | ||||
| 				strcat(finalProfilePath,path); | ||||
|  | ||||
| 				PrintMessage(MESG_DEBUG, "\n Final profile path is : %s ", finalProfilePath); | ||||
| 			} | ||||
|  | ||||
| 		#endif | ||||
| 	 | ||||
| 		if(path) | ||||
| 			free(path); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		finalProfilePath = path; | ||||
| 		 | ||||
| 	} | ||||
|  | ||||
| 	if( !finalProfilePath) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n GetFirefoxProfilePath : Insufficient memory "); | ||||
| 		return NULL; | ||||
| 	} | ||||
|  | ||||
| 	// check if profile directory exists..... | ||||
| 	if( !IsDirectoryExists(finalProfilePath) ) | ||||
| 	{	 | ||||
| 		PrintMessage(MESG_ERROR, "\n GetFirefoxProfilePath : Profile directory [%s] does not exist", finalProfilePath); | ||||
| 		free(finalProfilePath); | ||||
| 		return NULL; | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	return finalProfilePath; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| char* ProfileManager::GetFirefoxLibPath() | ||||
| { | ||||
| 	char *firefoxPath = NULL; | ||||
|  | ||||
| #ifdef WIN32 | ||||
|  | ||||
| 	char regSubKey[]    = "SOFTWARE\\Clients\\StartMenuInternet\\firefox.exe\\shell\\open\\command"; | ||||
| 	char pathValue[MAX_PATH] =""; | ||||
| 	DWORD pathSize = MAX_PATH; | ||||
| 	DWORD valueType; | ||||
| 	HKEY rkey; | ||||
|  | ||||
| 	// Open firefox registry key | ||||
| 	if( RegOpenKeyEx(HKEY_LOCAL_MACHINE, regSubKey, 0, KEY_READ, &rkey) != ERROR_SUCCESS ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n GetFirefoxLibPath : Failed to open the firefox registry key : HKCU\\%s", regSubKey ); | ||||
| 		return NULL; | ||||
| 	} | ||||
|  | ||||
| 	// Read the firefox path value | ||||
| 	if( RegQueryValueEx(rkey, NULL, 0,  &valueType, (unsigned char*)&pathValue, &pathSize) != ERROR_SUCCESS ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n GetFirefoxLibPath : Failed to read the firefox path value from registry "); | ||||
| 		RegCloseKey(rkey); | ||||
| 		return NULL; | ||||
| 	}  | ||||
| 	 | ||||
| 	if( pathSize <= 0 || pathValue[0] == 0) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n GetFirefoxLibPath : Path value read from the registry is empty"); | ||||
| 		RegCloseKey(rkey); | ||||
| 		return NULL; | ||||
| 	}	 | ||||
|  | ||||
| 	RegCloseKey(rkey); | ||||
|  | ||||
| 	// This path may contain extra double quote.... | ||||
| 	if( pathValue[0] == '\"' ) | ||||
| 	{ | ||||
| 		for(unsigned int i=0; i< strlen(pathValue)-1 ; i++) | ||||
| 			pathValue[i] = pathValue[i+1]; | ||||
| 	} | ||||
|  | ||||
| 	PrintMessage(MESG_DEBUG, "\n GetFirefoxLibPath : Path value read from registry is %s", pathValue); | ||||
|  | ||||
| 	StrLwr(pathValue);	 | ||||
| 	char *firefox = strstr(pathValue, "firefox.exe"); | ||||
|  | ||||
| 	if( firefox == NULL ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n GetFirefoxLibPath : Path value read from registry is invalid"); | ||||
| 		return NULL; | ||||
| 	} | ||||
|  | ||||
| 	// remove the firefox.exe from the end... | ||||
| 	*(firefox-1) = 0; | ||||
| 	 | ||||
| 	firefoxPath = (char*) malloc( strlen(pathValue) + 1); | ||||
| 	 | ||||
| 	if( firefoxPath ) | ||||
| 	{ | ||||
| 		strcpy(firefoxPath, pathValue); | ||||
|  | ||||
| 		if( !IsDirectoryExists(firefoxPath) ) | ||||
| 		{ | ||||
| 			free(firefoxPath); | ||||
| 			return NULL; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
|  | ||||
| #else  // Linux platform... | ||||
|  | ||||
| 	char path[]="/opt/MozillaFirefox/lib"; | ||||
| 	 | ||||
| 	firefoxPath = (char*) malloc( strlen(path) + 1); | ||||
| 	 | ||||
| 	if( firefoxPath ) | ||||
| 	{ | ||||
| 		strcpy(firefoxPath, path); | ||||
| 	} | ||||
|  | ||||
| #endif | ||||
|  | ||||
| 	PrintMessage(MESG_DEBUG, "\n GetFirefoxLibPath : Firefox library path = [%s] ", firefoxPath); | ||||
| 	 | ||||
| 	return firefoxPath; | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| HMODULE ProfileManager::PMLoadLibrary(char *firefoxDir, char *libName) | ||||
| { | ||||
| char *loadPath; | ||||
| HMODULE libtmp = NULL; | ||||
|  | ||||
| 	if( firefoxDir != NULL ) | ||||
| 		loadPath = ( char*) malloc(strlen(firefoxDir) + strlen(libName) + 2); | ||||
| 	else | ||||
| 		loadPath = ( char*) malloc(strlen(libName) + 1); | ||||
| 	 | ||||
| 	if( !loadPath ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n\n LoadLibrary : Insufficient memory"); | ||||
| 		return 0; | ||||
| 	} | ||||
| 	 | ||||
| 	if( firefoxDir != NULL ) | ||||
| 	{ | ||||
| 		strcpy(loadPath, firefoxDir); | ||||
| 		strcat(loadPath, "/"); | ||||
| 		strcat(loadPath, libName); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		strcpy(loadPath, libName); | ||||
| 	} | ||||
|  | ||||
| 	libtmp = LOADLIBRARY(loadPath); | ||||
|  | ||||
| 	if( !libtmp ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_DEBUG, "\n\n LoadLibrary : Failed to load library %s ", loadPath); | ||||
| 		free(loadPath); | ||||
| 		return 0; | ||||
| 	} | ||||
|  | ||||
| 	free(loadPath); | ||||
|  | ||||
| 	return libtmp; | ||||
| } | ||||
|  | ||||
| // | ||||
| //   Checks if store is available... | ||||
| // | ||||
| int ProfileManager::IsStoreAvailable() | ||||
| { | ||||
| 	 | ||||
| 	PrintMessage(MESG_DEBUG, "\n IsStoreAvailable : Checking if firefox and its libraries are present "); | ||||
| 	 | ||||
|  | ||||
|  | ||||
| 	libraryPath = GetFirefoxLibPath(); | ||||
| 	 | ||||
| 	if( !libraryPath ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n IsStoreAvailable : Failed to find firefox profile or library path "); | ||||
| 		return FPM_FALSE;         | ||||
| 	} | ||||
|  | ||||
| 	// First check if firefox binary is present.... | ||||
| 	// Because on NLD, NSS library is no longer shipped with firefox. | ||||
| 	// Hence NSS libraries will still be there even if firefox is removed :) | ||||
| #ifdef WIN32 | ||||
|  | ||||
| 	char *firefox_bin_file = (char*) malloc(strlen(libraryPath)+ strlen("firefox.exe") + 2); | ||||
| 	if( !firefox_bin_file ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n IsStoreAvailable : Insufficient memory..malloc failed \n"); | ||||
| 		return FPM_FALSE;         | ||||
| 	} | ||||
|  | ||||
| 	strcpy(firefox_bin_file,libraryPath); | ||||
| 	strcat(firefox_bin_file,"\\firefox.exe"); | ||||
|  | ||||
| 	FILE *firefox_bin = fopen(firefox_bin_file,"r"); | ||||
| 	 | ||||
| 	if( firefox_bin == NULL) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n IsStoreAvailable : Failed to find firefox binary file %s\n", firefox_bin_file); | ||||
| 		free(firefox_bin_file); | ||||
| 		return FPM_FALSE;   | ||||
| 	} | ||||
| 	 | ||||
| 	free(firefox_bin_file); | ||||
| 	fclose(firefox_bin); | ||||
|  | ||||
| #else | ||||
|  | ||||
| 	FILE *firefox_bin = fopen("/usr/bin/firefox","r"); | ||||
| 	 | ||||
| 	if( firefox_bin == NULL) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n IsStoreAvailable : Failed to find firefox binary file /usr/bin/firefox \n"); | ||||
| 		return FPM_FALSE;   | ||||
| 	} | ||||
|  | ||||
| 	fclose(firefox_bin); | ||||
| #endif | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| 	// Next try to load from the library path then try to load from default lib path | ||||
| 	 | ||||
| 	// Here we have to first load all dependent libraries and then | ||||
| 	// load main library , otherwise face the problems...:) | ||||
| 	if( PMLoadLibrary(libraryPath, NSPR_LIBRARY_NAME) ) | ||||
| 	{ | ||||
| 		if((libplc=PMLoadLibrary(libraryPath, PLC_LIBRARY_NAME)) ) | ||||
| 		{ | ||||
| 			if( PMLoadLibrary(libraryPath, PLDS_LIBRARY_NAME) ) | ||||
| 			{ | ||||
| 				if( PMLoadLibrary(libraryPath, SOFTN_LIBRARY_NAME) ) | ||||
| 					libnss=PMLoadLibrary(libraryPath, NSS_LIBRARY_NAME); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	else  // try to load library from default library path | ||||
| 	{ | ||||
| 		if( PMLoadLibrary(NULL, NSPR_LIBRARY_NAME) ) | ||||
| 		{ | ||||
| 			if((libplc=PMLoadLibrary(NULL, PLC_LIBRARY_NAME)) ) | ||||
| 			{ | ||||
| 				if( PMLoadLibrary(NULL, PLDS_LIBRARY_NAME) ) | ||||
| 				{ | ||||
| 					if( PMLoadLibrary(NULL, SOFTN_LIBRARY_NAME) ) | ||||
| 						libnss=PMLoadLibrary(NULL, NSS_LIBRARY_NAME); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if( !libnss || !libplc )  | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n IsStoreAvailable : Failed to load the required firefox library"); | ||||
| 		return FPM_FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// Free the library | ||||
| 	if( libnss != NULL ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_DEBUG, "\n IsStoreAvailable : Freeing library libnss.dll"); | ||||
| 		FREELIBRARY(libnss); | ||||
| 	} | ||||
|  | ||||
| 	if( libplc != NULL ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_DEBUG, "\n IsStoreAvailable : Freeing library libplc.dll"); | ||||
| 		FREELIBRARY(libplc); | ||||
| 	} | ||||
|  | ||||
| 	return FPM_TRUE; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| // Public functions... | ||||
|  | ||||
|  | ||||
| int ProfileManager::ProfileInit(char *profileName) | ||||
| { | ||||
|  | ||||
| 	if( isInitialized == FPM_TRUE) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_DEBUG, "\n ProfileInit : Firefox profile [%s] is already initialized ", profileName); | ||||
| 		return FPM_TRUE; | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	profilePath = GetFirefoxProfilePath(profileName); | ||||
| 	libraryPath = GetFirefoxLibPath(); | ||||
|  | ||||
| 	if( !profilePath  || !libraryPath ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n ProfileInit : Failed to find firefox profile or library path "); | ||||
| 		return FPM_PROFILE_NOT_PRESENT;         | ||||
| 	} | ||||
|  | ||||
| 	PrintMessage(MESG_DEBUG, "\n Profile path = [%s] ", profilePath); | ||||
| 	PrintMessage(MESG_DEBUG, "\n Library path = [%s] ", libraryPath); | ||||
|  | ||||
| 	// First try to load from the library path then try to load from default lib path | ||||
| 	 | ||||
| 	// Here we have to first load all dependent libraries and then | ||||
| 	// load main library , otherwise face the problems...:) | ||||
| 	if( PMLoadLibrary(libraryPath, NSPR_LIBRARY_NAME) ) | ||||
| 	{ | ||||
| 		if((libplc=PMLoadLibrary(libraryPath, PLC_LIBRARY_NAME)) ) | ||||
| 		{ | ||||
| 			if( PMLoadLibrary(libraryPath, PLDS_LIBRARY_NAME) ) | ||||
| 			{ | ||||
| 				if( PMLoadLibrary(libraryPath, SOFTN_LIBRARY_NAME) ) | ||||
| 					libnss=PMLoadLibrary(libraryPath, NSS_LIBRARY_NAME); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	else  // try to load library from default library path | ||||
| 	{ | ||||
| 		if( PMLoadLibrary(NULL, NSPR_LIBRARY_NAME) ) | ||||
| 		{ | ||||
| 			if((libplc=PMLoadLibrary(NULL, PLC_LIBRARY_NAME)) ) | ||||
| 			{ | ||||
| 				if( PMLoadLibrary(NULL, PLDS_LIBRARY_NAME) ) | ||||
| 				{ | ||||
| 					if( PMLoadLibrary(NULL, SOFTN_LIBRARY_NAME) ) | ||||
| 						libnss=PMLoadLibrary(NULL, NSS_LIBRARY_NAME); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if( !libnss || !libplc )  | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n ProfileInit : Failed to load the required firefox library"); | ||||
| 		return FPM_LIBRARY_LOAD_FAILED; | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	PrintMessage(MESG_DEBUG, "\n ProfileInit : Required libraries are loaded from firefox path successfully.."); | ||||
|  | ||||
|  | ||||
| 	// Get all the functions from NSS library | ||||
| 	NSSInit				   = (NSS_Init) GETPROCADDRESS(libnss, "NSS_Init"); | ||||
| 	NSSShutdown			   = (NSS_Shutdown)GETPROCADDRESS(libnss, "NSS_Shutdown"); | ||||
| 	//PK11SetPasswordFunc    = (PK11_SetPasswordFunc) GETPROCADDRESS(libnss, "PK11_SetPasswordFunc"); | ||||
| 	PK11GetInternalKeySlot = (PK11_GetInternalKeySlot) GETPROCADDRESS(libnss, "PK11_GetInternalKeySlot"); | ||||
| 	PK11FreeSlot           = (PK11_FreeSlot) GETPROCADDRESS(libnss, "PK11_FreeSlot"); | ||||
| 	PK11Authenticate       = (PK11_Authenticate) GETPROCADDRESS(libnss, "PK11_Authenticate"); | ||||
| 	PK11SDRDecrypt         = (PK11SDR_Decrypt) GETPROCADDRESS(libnss, "PK11SDR_Decrypt"); | ||||
| 	PK11SDREncrypt         = (PK11SDR_Encrypt) GETPROCADDRESS(libnss, "PK11SDR_Encrypt"); | ||||
| 	PK11CheckUserPassword  = (PK11_CheckUserPassword) GETPROCADDRESS(libnss, "PK11_CheckUserPassword"); | ||||
|  | ||||
| 	if( !NSSInit || !NSSShutdown || !PK11GetInternalKeySlot || !PK11Authenticate || !PK11SDRDecrypt || !PK11SDREncrypt || !PK11FreeSlot || !PK11CheckUserPassword) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n\n ProfileInit : Failed to get function address for library %s ", NSS_LIBRARY_NAME); | ||||
| 		ProfileExit(); | ||||
| 		return FPM_LIBRARY_LOAD_FAILED; | ||||
| 	} | ||||
|  | ||||
| 	// Get all the functions from PLC library | ||||
| 	PLBase64Encode     = ( PL_Base64Encode ) GETPROCADDRESS(libplc, "PL_Base64Encode"); | ||||
| 	PLBase64Decode     = ( PL_Base64Decode ) GETPROCADDRESS(libplc, "PL_Base64Decode"); | ||||
|  | ||||
| 	if( !PLBase64Encode || !PLBase64Decode ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\nProfileInit :  Failed to get function address for library %s ", PLC_LIBRARY_NAME); | ||||
| 		ProfileExit(); | ||||
| 		return FPM_LIBRARY_LOAD_FAILED; | ||||
| 	} | ||||
|  | ||||
| 	 | ||||
| 	// Initialize the NSS library | ||||
| 	if( (*NSSInit) (profilePath) != SECSuccess ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n ProfileInit : Initialization failed , Make sure key3.db and cert8.db"); | ||||
| 		PrintMessage(MESG_ERROR, "\n files are present in the specified directory\n"); | ||||
| 		ProfileExit(); | ||||
|  | ||||
| 		return FPM_LIBRARY_INIT_FAILED; | ||||
| 	} | ||||
|  | ||||
| 	 | ||||
| 	PrintMessage(MESG_DEBUG, "\n ProfileInit : NSS_Init success.."); | ||||
|  | ||||
| 	// Copy the profile name for later use | ||||
| 	this->profileName = (char*) malloc(strlen(profileName)+1); | ||||
| 	if( !this->profileName ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n ProfileInit :  Insufficient memory.."); | ||||
| 		return FPM_INSUFFICIENT_MEMORY;         | ||||
| 	} | ||||
| 	 | ||||
| 	strcpy(this->profileName, profileName); | ||||
|  | ||||
|  | ||||
| 	// TODO | ||||
| 	// Read the preference from the config file present in the profile... | ||||
|  | ||||
| 	isInitialized = FPM_TRUE; | ||||
|  | ||||
| 	// Setup the function pointers... | ||||
| 	void *funList[9]; | ||||
| 	 | ||||
| 	funList[0] = (void*)NULL ; //PK11SetPasswordFunc; | ||||
| 	funList[1] = (void*)PK11GetInternalKeySlot; | ||||
| 	funList[2] = (void*)PK11FreeSlot; | ||||
| 	funList[3] = (void*)PK11Authenticate; | ||||
| 	funList[4] = (void*)PK11CheckUserPassword; | ||||
| 	funList[5] = (void*)PK11SDRDecrypt; | ||||
| 	funList[6] = (void*)PK11SDREncrypt; | ||||
| 	funList[7] = (void*)PLBase64Encode; | ||||
| 	funList[8] = (void*)PLBase64Decode; | ||||
| 	 | ||||
| 	signonManager.SetupFunctions(funList); | ||||
|  | ||||
| 	return FPM_TRUE; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| void ProfileManager::ProfileExit() | ||||
| { | ||||
| 	int i; | ||||
|  | ||||
| 	PrintMessage(MESG_DEBUG, "\n ProfileExit : Shutting down the profile %s", profileName); | ||||
|  | ||||
| 	if( (isInitialized == FPM_TRUE) && NSSShutdown != NULL ) | ||||
| 	{	 | ||||
| 		PrintMessage(MESG_DEBUG, "\n ProfileExit : invoking NSSShutdown for profile", profileName); | ||||
| 		for(i=0;  (i<5) && ((*NSSShutdown)() == SECFailure); i++ ) | ||||
| 		{ | ||||
| 			PrintMessage(MESG_DEBUG, "\n ProfileExit %d: NSSShutdown : FAILURE",i); | ||||
| 			//Sleep(500); | ||||
| 		} | ||||
| 		 | ||||
| 		if( i != 5) | ||||
| 		{ | ||||
| 			PrintMessage(MESG_DEBUG, "\n ProfileExit :NSSShutdown : SUCCESS"); | ||||
| 		 | ||||
| 		} | ||||
| 		else | ||||
| 			PrintMessage(MESG_DEBUG, "\n ProfileExit : NSSShutdown : FAILURE"); | ||||
| 		 | ||||
| 	} | ||||
|  | ||||
| 	if( libnss != NULL ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_DEBUG, "\n ProfileExit : Freeing library libnss.dll"); | ||||
| 		FREELIBRARY(libnss); | ||||
| 	} | ||||
|  | ||||
| 	if( libplc != NULL ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_DEBUG, "\n ProfileExit : Freeing library libplc.dll"); | ||||
| 		FREELIBRARY(libplc); | ||||
| 	} | ||||
|  | ||||
| 	// clean up signon data... | ||||
| 	signonManager.RemoveSignonData(); | ||||
|  | ||||
| 	isInitialized = FPM_FALSE; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| int ProfileManager::IsMasterPasswordSet() | ||||
| { | ||||
| PK11SlotInfo *slot = 0; | ||||
| int retValue = 0; | ||||
| SECStatus status; | ||||
|  | ||||
| 	slot = (*PK11GetInternalKeySlot)(); | ||||
| 	 | ||||
| 	if (!slot)  | ||||
| 	{  | ||||
| 		PrintMessage(MESG_ERROR, "\n IsMasterPasswordSet PK11_GetInternalKeySlot failed  ..."); | ||||
| 		return FPM_FALSE; | ||||
| 	} | ||||
|  | ||||
| 	PrintMessage(MESG_DEBUG, "\n  PK11_GetInternalKeySlot SUCCESS ..."); | ||||
|  | ||||
| 	// Check with empty password....If it succeeds then master password is not set | ||||
|  | ||||
| 	status =  (*PK11CheckUserPassword)(slot,""); | ||||
| 	if( status == SECSuccess ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_DEBUG, "\n IsMasterPasswordSet : Master password is not set..."); | ||||
| 		retValue = FPM_FALSE; | ||||
| 	} | ||||
| 	else if(status == SECWouldBlock ) // password is wrong | ||||
| 		{ | ||||
| 			PrintMessage(MESG_DEBUG, "\n IsMasterPasswordSet : Master password is set..."); | ||||
| 			retValue = FPM_TRUE; | ||||
| 		} | ||||
| 		else  // something is wrong, may be key3.db is not initialized for crypt | ||||
| 		{ | ||||
| 			PrintMessage(MESG_DEBUG, "\n IsMasterPasswordSet : Master password is not set..."); | ||||
| 			retValue = FPM_FALSE; | ||||
| 		} | ||||
|  | ||||
| 	// Free the slot | ||||
| 	(*PK11FreeSlot) (slot); | ||||
|  | ||||
| 	return retValue; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| int ProfileManager::CheckMasterPassword(char *masterPassword, int doSave) | ||||
| { | ||||
| PK11SlotInfo *slot = 0; | ||||
| int retValue = 0; | ||||
|  | ||||
| 	slot = (*PK11GetInternalKeySlot)(); | ||||
| 	 | ||||
| 	if (!slot)  | ||||
| 	{  | ||||
| 		PrintMessage(MESG_ERROR, "\n CheckMasterPassword PK11_GetInternalKeySlot failed  ..."); | ||||
| 		return FPM_FALSE; | ||||
| 	} | ||||
|  | ||||
| 	 | ||||
| 	if( (*PK11CheckUserPassword)(slot, masterPassword) == SECSuccess ) | ||||
| 	{ | ||||
| 		// Store the password for internal use... | ||||
| 		if( doSave ) | ||||
| 		{ | ||||
| 			PrintMessage(MESG_DEBUG, "\n CheckMasterPassword : saving master password for future use ******..."); | ||||
| 		 | ||||
| 			this->masterPassword = (char *) malloc( strlen(masterPassword)+1 ); | ||||
| 		 | ||||
| 			if( !this->masterPassword ) | ||||
| 			{ | ||||
| 				PrintMessage(MESG_ERROR, "\n  CheckMasterPassword : Insufficient memory"); | ||||
| 				(*PK11FreeSlot) (slot);  // Free the slot... | ||||
| 				return FPM_INSUFFICIENT_MEMORY; | ||||
| 			} | ||||
|  | ||||
| 			strcpy(this->masterPassword, masterPassword); | ||||
| 		} | ||||
|  | ||||
| 		PrintMessage(MESG_DEBUG, "\n CheckMasterPassword : specified master password is correct..."); | ||||
| 		retValue = FPM_TRUE; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n CheckMasterPassword : specified master password is wrong..."); | ||||
| 		retValue = FPM_FALSE; | ||||
| 	} | ||||
|  | ||||
| 	// Free the slot | ||||
| 	(*PK11FreeSlot) (slot); | ||||
|  | ||||
| 	return retValue; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| int ProfileManager::GetSignonData( struct Host **host, int doRefresh) | ||||
| { | ||||
| int retValue; | ||||
|  | ||||
| 	//TODO NAG: | ||||
| 	//check if "remember password" enabled.... | ||||
| 	 | ||||
| 	 // Reload the signon data from the file... | ||||
| 	 if( doRefresh ) | ||||
| 	 { | ||||
| 		retValue = RefreshSignonData(); | ||||
| 		*host = signonManager.GetHostInfo(); | ||||
| 		return retValue; | ||||
| 	 } | ||||
|  | ||||
| 	 // if host list is null read again.... | ||||
| 	 // TODO NAG : If there is no data , this will cause refresh to happen every time... | ||||
|  | ||||
| 	 if( signonManager.GetHostInfo() == NULL ) | ||||
| 	 { | ||||
| 	 	retValue = RefreshSignonData(); | ||||
| 		*host = signonManager.GetHostInfo(); | ||||
| 		return retValue; | ||||
| 	 } | ||||
|  | ||||
| 	 // Just return the previously loaded data | ||||
| 	 *host = signonManager.GetHostInfo(); | ||||
|  | ||||
| 	 return FPM_TRUE; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| int ProfileManager::RefreshSignonData() | ||||
| { | ||||
|  | ||||
| 	// First check if master password is correct.... | ||||
| 	if( masterPassword ) | ||||
| 	{ | ||||
| 		// Just check for password , don't save.... | ||||
| 		if( CheckMasterPassword(masterPassword, 0 ) != FPM_TRUE ) | ||||
| 		{ | ||||
| 			PrintMessage(MESG_ERROR, "\n RefreshSignonData : master password is wrong..can't proceed with signon decryption" ); | ||||
| 			return FPM_MASTERPASSWORD_WRONG; | ||||
| 		} | ||||
| 	} | ||||
| 	else // check if master password is set... | ||||
| 	{ | ||||
| 		// master password is set and its not specified | ||||
| 		if( IsMasterPasswordSet() == FPM_TRUE ) | ||||
| 		{ | ||||
| 			PrintMessage(MESG_ERROR, "\n RefreshSignonData : master password is set..but its not specified " ); | ||||
| 			return FPM_MASTERPASSWORD_WRONG; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	return signonManager.LoadSignonData(profilePath); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| int ProfileManager::WriteSignonData() | ||||
| { | ||||
| 	// First check if master password is correct.... | ||||
| 	if( masterPassword ) | ||||
| 	{ | ||||
| 		// Just check for password , don't save.... | ||||
| 		if( CheckMasterPassword(masterPassword, 0 ) != FPM_TRUE ) | ||||
| 		{ | ||||
| 			PrintMessage(MESG_ERROR, "\n WriteSignonData : master password is wrong..can't proceed with signon decryption" ); | ||||
| 			return FPM_MASTERPASSWORD_WRONG; | ||||
| 		} | ||||
| 	} | ||||
| 	else // check if master password is set... | ||||
| 	{ | ||||
| 		// master password is set and its not specified | ||||
| 		if( IsMasterPasswordSet() == FPM_TRUE ) | ||||
| 		{ | ||||
| 			PrintMessage(MESG_ERROR, "\n WriteSignonData : master password is set..but its not specified " ); | ||||
| 			return FPM_MASTERPASSWORD_WRONG; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	return signonManager.WriteSignonData(profilePath); | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| int ProfileManager::AddHost(struct Host *host, int doUpdate) | ||||
| { | ||||
| int retValue; | ||||
|  | ||||
| 	if( (retValue = signonManager.AddHost(host)) != FPM_TRUE) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n AddHost : Failed to add the host %s ", host->hostName); | ||||
| 		return retValue; | ||||
| 	} | ||||
|  | ||||
| 	if( doUpdate > 0 ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n AddHost : Updating the signon file "); | ||||
| 		return WriteSignonData(); | ||||
| 	} | ||||
|  | ||||
| 	return FPM_TRUE; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| int ProfileManager::ModifyHost(struct Host *host, int doUpdate) | ||||
| { | ||||
| int retValue; | ||||
|  | ||||
| 	if( (retValue = signonManager.ModifyHost(host)) != FPM_TRUE) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n ModifyHost : Failed to modify the host %s ", host->hostName); | ||||
| 		return retValue; | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	if( doUpdate > 0) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n ModifyHost : Updating the signon file "); | ||||
| 		return WriteSignonData(); | ||||
| 	} | ||||
|  | ||||
| 	return FPM_TRUE; | ||||
| 	 | ||||
| 	 | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| int ProfileManager::RemoveHost(char *hostName, int doUpdate) | ||||
| { | ||||
| int retValue; | ||||
|  | ||||
| 	if( (retValue = signonManager.RemoveHost(hostName)) != FPM_TRUE) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n RemoveHost : Failed to remove the hsot %s ", hostName); | ||||
| 		return retValue; | ||||
| 	} | ||||
|  | ||||
| 	if( doUpdate > 0 ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n RemoveHost : Updating the signon file "); | ||||
| 		return WriteSignonData(); | ||||
| 	} | ||||
|  | ||||
| 	return FPM_TRUE; | ||||
| } | ||||
							
								
								
									
										93
									
								
								adlib/ad_ff/native/ProfileManager.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								adlib/ad_ff/native/ProfileManager.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,93 @@ | ||||
| /*********************************************************************** | ||||
|  * | ||||
|  *  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. | ||||
|  * | ||||
|  ***********************************************************************/ | ||||
|  | ||||
|  | ||||
| #ifndef __FPM_PROFILE_MANAGER_H__ | ||||
| #define __FPM_PROFILE_MANAGER_H__ | ||||
|  | ||||
| #include "FirefoxPasswordManager.h" | ||||
| #include "Common.h" | ||||
| #include "SignonManager.h" | ||||
|  | ||||
|  | ||||
| class ProfileManager | ||||
| { | ||||
| 	SignonManager signonManager; | ||||
| 	 | ||||
| 	char *profilePath; | ||||
| 	char *libraryPath; | ||||
| 	char *masterPassword; | ||||
|  | ||||
| 	HMODULE libnss; | ||||
| 	HMODULE libplc; | ||||
|  | ||||
| 	// NSS Library function pointers | ||||
| 	NSS_Init                NSSInit; | ||||
| 	NSS_Shutdown            NSSShutdown; | ||||
| 	//PK11_SetPasswordFunc    PK11SetPasswordFunc; | ||||
| 	PK11_GetInternalKeySlot PK11GetInternalKeySlot; | ||||
| 	PK11_FreeSlot           PK11FreeSlot; | ||||
| 	PK11_Authenticate       PK11Authenticate; | ||||
|     PK11_CheckUserPassword  PK11CheckUserPassword; | ||||
| 	PK11SDR_Decrypt         PK11SDRDecrypt; | ||||
| 	PK11SDR_Encrypt         PK11SDREncrypt; | ||||
|  | ||||
| 	PL_Base64Encode         PLBase64Encode; | ||||
| 	PL_Base64Decode         PLBase64Decode; | ||||
|  | ||||
| public :  | ||||
|  | ||||
| 	char *profileName; | ||||
| 	int isInitialized; | ||||
|  | ||||
| private : | ||||
|  | ||||
| 	char *GetFirefoxProfilePath(char *profileName); | ||||
| 	char *GetFirefoxLibPath(); | ||||
| 	HMODULE PMLoadLibrary(char *firefoxDir, char *libName); | ||||
| 	int RefreshSignonData(); | ||||
| 	 | ||||
|  | ||||
|  | ||||
| public: | ||||
|  | ||||
| 	ProfileManager(); | ||||
|  | ||||
| 	int IsStoreAvailable(); | ||||
| 	int ProfileInit(char *profileName); | ||||
| 	void ProfileExit(); | ||||
|  | ||||
| 	int IsMasterPasswordSet(); | ||||
| 	int CheckMasterPassword(char *masterPassword, int doSave); | ||||
|  | ||||
| 	int GetSignonData( struct Host **host, int doRefresh); | ||||
| 	int WriteSignonData(); | ||||
|  | ||||
| 	int AddHost(struct Host *host, int doUpdate); | ||||
| 	int ModifyHost(struct Host *host, int doUpdat); | ||||
| 	int RemoveHost(char *hostname, int doUpdate); | ||||
|  | ||||
| }; | ||||
|  | ||||
|  | ||||
| #endif | ||||
|  | ||||
							
								
								
									
										637
									
								
								adlib/ad_ff/native/SignonManager.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										637
									
								
								adlib/ad_ff/native/SignonManager.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,637 @@ | ||||
| /*********************************************************************** | ||||
|  * | ||||
|  *  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. | ||||
|  * | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| #include "SignonManager.h" | ||||
|  | ||||
| // Static data to keep track of buffers | ||||
| // Look at function ReadChar | ||||
|   static int last = 0; | ||||
|   static int next = 0; | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| SignonManager::SignonManager() | ||||
| { | ||||
| 	signonFile = NULL; | ||||
| } | ||||
|  | ||||
| SignonManager::~SignonManager() | ||||
| { | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| void SignonManager::SetupFunctions(void *funList[]) | ||||
| { | ||||
| 	cryptManager.SetupFunctions(funList); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| int SignonManager::OpenSignonFile(char *firefoxProfileDir, char *fileName, char *accessType ) | ||||
| { | ||||
| char *signonFilePath = NULL; | ||||
| 	 | ||||
| 	// Clean up previous buffers | ||||
| 	last = 0; | ||||
| 	next = 0; | ||||
|   | ||||
|  | ||||
| 	signonFilePath = (char*) malloc( strlen(firefoxProfileDir) + strlen(fileName) + 3 ); | ||||
|  | ||||
| 	if( signonFilePath == NULL ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n Insufficient memory ...."); | ||||
| 		return FPM_INSUFFICIENT_MEMORY; | ||||
| 	} | ||||
| 	 | ||||
| 	strcpy(signonFilePath, firefoxProfileDir); | ||||
| 	strcat(signonFilePath, "/"); | ||||
| 	strcat(signonFilePath, fileName); | ||||
|  | ||||
| 	PrintMessage(MESG_DEBUG, "\n Final signon filename is  = %s ", signonFilePath); | ||||
| 		 | ||||
| 	// Open the signon file  | ||||
| 	signonFile = fopen(signonFilePath, accessType); | ||||
|  | ||||
| 	if( signonFile == NULL ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n SignonManager : Error opening signon file %s", signonFilePath); | ||||
| 		free(signonFilePath); | ||||
| 		return FPM_SIGNON_FILE_NOT_PRESENT; | ||||
| 	} | ||||
|  | ||||
| 	// cleanup | ||||
| 	free(signonFilePath); | ||||
|  | ||||
| 	return FPM_TRUE; | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| int SignonManager::CloseSignonFile() | ||||
| { | ||||
|  | ||||
| 	if( signonFile ) | ||||
| 		fclose(signonFile); | ||||
|  | ||||
| 	return FPM_TRUE; | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| int SignonManager::ReadLine(char *buffer, int size) | ||||
| { | ||||
|   Unichar c; | ||||
|   int strLength = 0, i=0; | ||||
|    | ||||
|   buffer[0] = 0; | ||||
|  | ||||
|   while(1) | ||||
|   { | ||||
| 	  c = ReadCharUTF8();   | ||||
| 	   | ||||
| 	  /* note that eof is not set until we read past the end of the file */ | ||||
| 	  if ( c == FPM_FALSE ) // || feof(file) )  | ||||
| 		  return FPM_FALSE; | ||||
| 	   | ||||
| 	  if (c == '\n')  | ||||
| 	  { | ||||
| 		  buffer[strLength++] = 0; | ||||
| 		  break; | ||||
| 	  } | ||||
| 	   | ||||
| 	   | ||||
| 	  if (c != '\r')  | ||||
| 	  { | ||||
| 		  for(i=0; i < 4 && ( (c & 0xff) != 0 ) ; i++) | ||||
| 		  { | ||||
| 			  if( strLength >= size ) | ||||
| 			  { | ||||
| 				  // Increase the capacity dynamically | ||||
| 				  PrintMessage(MESG_ERROR, "SignonManager : Buffer is insufficient to store data"); | ||||
| 				  return FPM_FALSE; | ||||
| 			  } | ||||
| 			   | ||||
| 			  buffer[strLength++] = (char)c; | ||||
| 			  c = c >> 8; | ||||
| 		  } | ||||
| 	  } | ||||
|   } | ||||
|    | ||||
|  | ||||
|  // PrintMessage(MESG_DEBUG,"SignonManager : ReadLine = %s ",buffer); | ||||
|   return FPM_TRUE; | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| Unichar SignonManager::ReadCharUTF8() | ||||
| { | ||||
| 	Unichar c = ReadChar(); | ||||
| 	 | ||||
| 	if ((c & 0x80) == 0x00)  | ||||
| 	{ | ||||
| 		return c; | ||||
| 	}  | ||||
| 	else if ((c & 0xE0) == 0xC0)  | ||||
| 		{ | ||||
| 			return (((c & 0x1F)<<6) + (ReadChar() & 0x3F)); | ||||
| 		}  | ||||
| 		else if ((c & 0xF0) == 0xE0)  | ||||
| 			{ | ||||
| 				return (((c & 0x0F)<<12) + ((ReadChar() & 0x3F)<<6) + (ReadChar() & 0x3F)); | ||||
| 			}  | ||||
|  | ||||
|  | ||||
| 	return FPM_FALSE;  // 0 => not a utf8 character... | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| // This does buffered reading... | ||||
| // | ||||
| char SignonManager::ReadChar() | ||||
| { | ||||
|   const int buflen = 1000; | ||||
|   static char buf[buflen+1]; | ||||
|  | ||||
|   if (next >= last)  | ||||
|   { | ||||
|     next = 0; | ||||
|     last = fread(buf, 1, buflen, signonFile); | ||||
|     PrintMessage(MESG_DEBUG,"\n SignonManager : ReadChar = Read %d bytes ",last); | ||||
|  | ||||
| 	if (last <= 0) // || feof(file)   | ||||
| 	{ | ||||
|       /* note that eof is not set until we read past the end of the file */ | ||||
|       PrintMessage(MESG_DEBUG,"\n SignonManager : ReadChar = End of file..! "); | ||||
| 	  return FPM_FALSE; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   return (buf[next++]); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| int SignonManager::WriteCharUTF8(Unichar c)  | ||||
| { | ||||
|   if (c <= 0x7F)  | ||||
|   { | ||||
| 	if( fputc((char)c, signonFile) == EOF ) | ||||
| 		return FPM_SIGNON_FILE_WRITE_ERROR; | ||||
|   }  | ||||
|   else if (c <= 0x7FF)  | ||||
|   { | ||||
| 	if( fputc( ((Unichar)0xC0) | ((c>>6) & 0x1F), signonFile) == EOF ) | ||||
| 		return FPM_SIGNON_FILE_WRITE_ERROR; | ||||
|      | ||||
| 	if( fputc( ((Unichar)0x80) | (c & 0x3F), signonFile ) == EOF ) | ||||
| 		return FPM_SIGNON_FILE_WRITE_ERROR; | ||||
|  | ||||
|   }  | ||||
|   else  | ||||
|   { | ||||
|     if( fputc( ((Unichar)0xE0) | ((c>>12) & 0xF), signonFile) == EOF ) | ||||
| 		return FPM_SIGNON_FILE_WRITE_ERROR; | ||||
|     if( fputc( ((Unichar)0x80) | ((c>>6) & 0x3F), signonFile) == EOF) | ||||
| 		return FPM_SIGNON_FILE_WRITE_ERROR; | ||||
|     if( fputc( ((Unichar)0x80) | (c & 0x3F), signonFile) == EOF) | ||||
| 		return FPM_SIGNON_FILE_WRITE_ERROR; | ||||
|   } | ||||
|  | ||||
|   return FPM_TRUE; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| int SignonManager::WriteLine(char *line)  | ||||
| { | ||||
|  | ||||
|   for(int i=0; i < strlen(line); i++) | ||||
|   { | ||||
| 	if( WriteCharUTF8(line[i]) != FPM_TRUE ) | ||||
| 		return FPM_SIGNON_FILE_WRITE_ERROR; | ||||
|  | ||||
|   } | ||||
|  | ||||
|   if( WriteCharUTF8('\n') != FPM_TRUE ) | ||||
| 	  return FPM_SIGNON_FILE_WRITE_ERROR; | ||||
|  | ||||
|   return FPM_TRUE; | ||||
|    | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| /* | ||||
| *  Load the signon data from firefox signon file..... | ||||
| * | ||||
| * | ||||
| */ | ||||
| int SignonManager::LoadSignonData(char *firefoxProfileDir ) | ||||
| { | ||||
| char header[256]; | ||||
| char buffer[4096]; | ||||
| char hostName[4096]; | ||||
| char name[1024]; | ||||
| int bufferLength = 4095; | ||||
| int retValue; | ||||
| char *clearData = NULL; | ||||
| int count = 0; | ||||
|  | ||||
|  | ||||
| 	// open the signon file  | ||||
| 	if( (retValue = OpenSignonFile(firefoxProfileDir, SIGNON_FILE_NAME, "r")) != FPM_TRUE ) | ||||
| 	{ | ||||
| 		return retValue;    | ||||
| 	} | ||||
|  | ||||
| 	// Clean up any previously loaded data... | ||||
| 	dataManager.RemoveAllData(); | ||||
|  | ||||
| 	// read the signon header information  | ||||
| 	if( ReadLine(header, 256) != FPM_TRUE ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n SignonManager : Error in reading signon format header %s", header); | ||||
| 		CloseSignonFile(); | ||||
| 		return FPM_SIGNON_FILE_READ_ERROR; | ||||
| 	} | ||||
|  | ||||
| 	// check if the format is right... | ||||
| 	if( strcmp(header, HEADER_VERSION) != 0) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n SignonManager : Header version information is not proper"); | ||||
| 		CloseSignonFile(); | ||||
| 		return FPM_SIGNON_FILE_INVALID_DATA; | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	PrintMessage(MESG_DEBUG, "\n\n ****** Reject Host List *******"); | ||||
|  | ||||
|     // read the reject list  | ||||
| 	while ( ReadLine(buffer, bufferLength) == FPM_TRUE) | ||||
| 	{ | ||||
|     	// Check for end of reject list i.e full stop | ||||
| 		if (strlen(buffer) != 0 && buffer[0] == '.')  | ||||
| 		{ | ||||
| 			break; // end of reject list | ||||
| 		} | ||||
|  | ||||
| 		if( (retValue = dataManager.AddRejectHost(buffer) ) != FPM_TRUE ) | ||||
| 		{ | ||||
| 			CloseSignonFile(); | ||||
| 			dataManager.RemoveAllData();  // clean up any partial loaded data | ||||
| 			 | ||||
| 			return retValue; | ||||
| 		} | ||||
|  | ||||
| 		PrintMessage(MESG_DEBUG, "\n Reject Host : %s ", buffer); | ||||
|  | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	PrintMessage(MESG_DEBUG, "\n\n ****** Host list with username / password ****** "); | ||||
|  | ||||
|  | ||||
| 	while (ReadLine(hostName, bufferLength) == FPM_TRUE)  | ||||
| 	{ | ||||
| 		// a blank line is perfectly valid here -- corresponds to a local file  | ||||
| 		if (strlen(hostName) < 1)  | ||||
| 		{ | ||||
| 			PrintMessage(MESG_ERROR, "\n SignonManager : Host URL is not proper"); | ||||
| 			CloseSignonFile(); | ||||
| 			dataManager.RemoveAllData();  // clean up partial loaded data | ||||
|  | ||||
| 			return FPM_ILLEGAL_HOSTNAME; | ||||
| 		} | ||||
| 		 | ||||
| 		if( ( retValue = dataManager.AddHost(hostName) ) != FPM_TRUE ) | ||||
| 		{ | ||||
| 			CloseSignonFile(); | ||||
| 			dataManager.RemoveAllData();  // clean up partial loaded data | ||||
|  | ||||
| 			return retValue; | ||||
| 		} | ||||
|  | ||||
|  | ||||
| 		PrintMessage(MESG_DEBUG, "\n\n Host : %s ", hostName); | ||||
| 	 | ||||
| 		// prepare to read the name/value pairs  | ||||
| 		while( ReadLine(buffer, bufferLength) == FPM_TRUE )  | ||||
| 		{ | ||||
| 			// line starting with . terminates the pairs for this URL entry  | ||||
| 			if (buffer[0] == '.')  | ||||
| 			{ | ||||
| 				break; // end of URL entry  | ||||
| 			} | ||||
|  | ||||
| 			// save the name part and determine if it is a password  | ||||
| 			unsigned char isPassword = 0; | ||||
| 			if (buffer[0] == '*')  | ||||
| 			{ | ||||
| 				isPassword = 1; | ||||
| 				strcpy(name,&buffer[1]); | ||||
| 			    retValue = ReadLine(buffer, bufferLength); | ||||
| 			} | ||||
| 			else  | ||||
| 			{ | ||||
| 				isPassword = 0; | ||||
| 				strcpy(name, buffer); | ||||
| 				retValue = ReadLine(buffer, bufferLength); | ||||
| 		    } | ||||
|  | ||||
| 			PrintMessage(MESG_DEBUG, "\n\n name = %s and value = %s  ", name, buffer); | ||||
| 	 | ||||
| 			// read in and save the value part | ||||
| 			if ( retValue != FPM_TRUE )  | ||||
| 			{ | ||||
| 				// error in input file so give up  | ||||
| 				PrintMessage(MESG_ERROR, "\n SignonManager : Error occured while reading VALUE for : %s ", name); | ||||
| 				CloseSignonFile(); | ||||
| 				dataManager.RemoveAllData();  // clean up partial loaded data | ||||
|  | ||||
| 				return FPM_SIGNON_FILE_READ_ERROR;				 | ||||
| 			} | ||||
|  | ||||
| 			// Decrypt the encrypted value.... | ||||
| 			retValue = FPM_FALSE; | ||||
| 			if( ((retValue = cryptManager.DecryptString(buffer, &clearData)) == FPM_TRUE) && (clearData != NULL) ) | ||||
| 			{ | ||||
| 				// Add the name/value pair to the existing store.... | ||||
| 				retValue = dataManager.AddHostElement(hostName, name, clearData, isPassword); | ||||
| 				 | ||||
| 				if( retValue != FPM_TRUE ) | ||||
| 				{ | ||||
| 					CloseSignonFile(); | ||||
| 					dataManager.RemoveAllData();  // clean up partial loaded data | ||||
| 					return retValue; | ||||
| 				} | ||||
| 			} | ||||
| 			else  | ||||
| 			{ | ||||
|  | ||||
| 				CloseSignonFile(); | ||||
| 				dataManager.RemoveAllData();  // clean up partial loaded data | ||||
| 				 | ||||
| 				return retValue; | ||||
| 			} | ||||
| 			 | ||||
| 		} | ||||
|  | ||||
| 	  } | ||||
|  | ||||
|  | ||||
| 	// Now close the signon file | ||||
| 	CloseSignonFile(); | ||||
|  | ||||
| 	// Print data for cross checking | ||||
| #ifdef DEBUG	 | ||||
| 	dataManager.PrintAllRejectHosts(); | ||||
| 	dataManager.PrintAllHosts(); | ||||
| #endif | ||||
| 	return FPM_TRUE; | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| int SignonManager::WriteSignonData(char *firefoxProfileDir) | ||||
| { | ||||
| int retValue; | ||||
| char *cryptData = NULL; | ||||
| char *signonFilePath = NULL; | ||||
| char *tempFilePath = NULL; | ||||
| char fileName[256]; | ||||
|  | ||||
| Host *t; | ||||
| HostElement *h; | ||||
| RejectHost *r; | ||||
| 	 | ||||
| 	// TODO  : If signon data has not changed since last write then return... | ||||
| /*  // There may be requirement to write empty data... | ||||
| 	if( dataManager.hostList == NULL ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n WriteSignonData : Signon data is empty..."); | ||||
| 		return FPM_SIGNON_DATASTORE_EMPTY; | ||||
| 	} | ||||
| */ | ||||
|  | ||||
| 	// Generate random file name | ||||
| 	srand( (unsigned)time( NULL ) ); | ||||
| 	sprintf(fileName,"signon_fpm_%d.txt", rand()); | ||||
|  | ||||
| 	// Setup the signon and temp filename.. | ||||
| 	signonFilePath = (char*) malloc( strlen(firefoxProfileDir) + strlen(SIGNON_FILE_NAME) + 3); | ||||
| 	tempFilePath =(char*) malloc( strlen(firefoxProfileDir) + strlen(fileName) + 3); | ||||
|  | ||||
| 	if( signonFilePath == NULL || tempFilePath == NULL) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n WriteSignonData : Insufficient memory ...."); | ||||
| 		return FPM_INSUFFICIENT_MEMORY; | ||||
| 	} | ||||
| 	 | ||||
| 	strcpy(signonFilePath, firefoxProfileDir); | ||||
| 	strcat(signonFilePath, "/"); | ||||
| 	strcat(signonFilePath, SIGNON_FILE_NAME); | ||||
|  | ||||
| 	strcpy(tempFilePath, firefoxProfileDir); | ||||
| 	strcat(tempFilePath, "/"); | ||||
| 	strcat(tempFilePath, fileName); | ||||
|  | ||||
| 	// Open signon file | ||||
| 	if( (retValue = OpenSignonFile(firefoxProfileDir, fileName, "w")) != FPM_TRUE ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\nWriteSignonData :  Failed to create temp signon file : %s.", fileName); | ||||
| 		return retValue;  | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	// write out the format revision number  | ||||
| 	if( (retValue = WriteLine(HEADER_VERSION)) != FPM_TRUE) | ||||
| 		goto write_signon_error; | ||||
|  | ||||
| 	// write out reject host list  | ||||
| 	for(r=dataManager.rejectHostList; r ; r=r->next) | ||||
| 	{ | ||||
| 		if( (retValue = WriteLine(r->hostName)) != FPM_TRUE ) | ||||
| 			goto write_signon_error; | ||||
|  | ||||
| 	} | ||||
| 	 | ||||
| 	// End of reject host list | ||||
| 	if( (retValue = WriteLine(".")) != FPM_TRUE ) | ||||
| 		goto write_signon_error; | ||||
|  | ||||
| 	   | ||||
| 	/* format for cached logins shall be: | ||||
| 	* url LINEBREAK {name LINEBREAK value LINEBREAK}*  . LINEBREAK | ||||
| 	* if type is password, name is preceded by an asterisk (*) | ||||
| 	*/ | ||||
|  | ||||
|  | ||||
| 	// write out each URL node  | ||||
| 	for(t=dataManager.hostList; t ; t=t->next) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_DEBUG, "\n\nWriteSignonData :  Adding name/value pairs for host %s", t->hostName); | ||||
| 		 | ||||
| 		if( (retValue = WriteLine(t->hostName)) != FPM_TRUE ) | ||||
| 			goto write_signon_error; | ||||
|  | ||||
|  | ||||
| 		for(h=t->child; h ; h= h->next) | ||||
| 		{ | ||||
| 			PrintMessage(MESG_DEBUG, "\n nWriteSignonData : %s  : %s ", h->name, h->value); | ||||
| 			 | ||||
| 			if( h->isPassword) | ||||
| 			{ | ||||
| 				if( (retValue = WriteCharUTF8('*')) != FPM_TRUE ) | ||||
| 					goto write_signon_error; | ||||
| 			} | ||||
| 			 | ||||
| 			if( (retValue = WriteLine(h->name)) != FPM_TRUE ) | ||||
| 				goto write_signon_error; | ||||
|  | ||||
| 			 | ||||
| 			// encrypt the value | ||||
| 			retValue = FPM_FALSE; | ||||
| 			retValue = cryptManager.EncryptString(h->value, &cryptData); | ||||
|  | ||||
| 			if( (retValue == FPM_TRUE) && (cryptData != NULL )) | ||||
| 			{ | ||||
| 				if( (retValue = WriteLine(cryptData)) != FPM_TRUE ) | ||||
| 					goto write_signon_error; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				PrintMessage(MESG_ERROR, "\n nWriteSignonData : Encryption of value %s failed ", h->value); | ||||
| 				goto write_signon_error; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if( (retValue = WriteLine(".")) != FPM_TRUE ) | ||||
| 			goto write_signon_error; | ||||
| 	} | ||||
|  | ||||
| 	// close this temporary file... | ||||
| 	CloseSignonFile(); | ||||
|  | ||||
|  | ||||
| 	PrintMessage(MESG_DEBUG, "\n WriteSignonData : Removing previous signon file %s ", signonFilePath); | ||||
|  | ||||
| 	// Delete previous signon file | ||||
| 	if( remove(signonFilePath) != 0 ) | ||||
| 	{ | ||||
| 		// Either file not present or file is locked... | ||||
| 		PrintMessage(MESG_ERROR, "\n WriteSignonData : Failed to delete signon file : %s ", signonFilePath); | ||||
| 		FILE *sfile= NULL; | ||||
| 		if( (sfile = fopen(signonFilePath,"r") ) != NULL ) | ||||
| 		{ | ||||
| 			// we are able to open signon file in read only mode => file is present | ||||
| 			fclose(sfile); | ||||
| 			remove(tempFilePath);  // delete temporary signon file  | ||||
|  | ||||
| 			PrintMessage(MESG_ERROR, "\nWriteSignonData : Signon file is locked "); | ||||
| 			return FPM_SIGNON_FILE_LOCKED; | ||||
| 		} | ||||
|  | ||||
| 		// File is not present ..that's good news , so continue... | ||||
| 	} | ||||
|  | ||||
| 	PrintMessage(MESG_DEBUG, "success \n WriteSignonData : Renaming temp file %s back to signon file %s ", tempFilePath, signonFilePath); | ||||
|  | ||||
| 	// Rename temp file back to signon file | ||||
| 	if( ( retValue = rename(tempFilePath, signonFilePath) ) != 0 ) | ||||
| 	{ | ||||
| 		PrintMessage(MESG_ERROR, "\n WriteSignonData : Failed to rename the temp file %s back to signon file %s ", tempFilePath, signonFilePath); | ||||
| 		PrintMessage(MESG_ERROR, "\n WriteSignonData : Following error has occured : %d ", retValue); | ||||
| 		 | ||||
| 		return FPM_FALSE; | ||||
| 	} | ||||
|  | ||||
| 	PrintMessage(MESG_DEBUG, "\n WriteSignonData : Successfully written new signon data ..."); | ||||
|  | ||||
| 	return FPM_TRUE; | ||||
|  | ||||
| write_signon_error: | ||||
| 	 | ||||
| 	CloseSignonFile(); | ||||
| 	remove(tempFilePath);  // remove the temporary signon file.... | ||||
|  | ||||
| 	return retValue; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| int SignonManager::RemoveSignonData() | ||||
| { | ||||
|  | ||||
|   return dataManager.RemoveAllData(); | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| int SignonManager::AddHost(struct Host *host) | ||||
| { | ||||
|  | ||||
|  return dataManager.AddHost(host); | ||||
|  | ||||
| } | ||||
| 	 | ||||
|  | ||||
| int SignonManager::ModifyHost(struct Host *host) | ||||
| { | ||||
|  | ||||
|  return dataManager.ModifyHost(host); | ||||
|  | ||||
| } | ||||
| 	 | ||||
|  | ||||
|  | ||||
| int SignonManager::RemoveHost(char *hostName) | ||||
| { | ||||
| 	return dataManager.RemoveHost(hostName); | ||||
| } | ||||
| 	 | ||||
|  | ||||
|  | ||||
|  | ||||
| struct Host * SignonManager::GetHostInfo() | ||||
| { | ||||
|  | ||||
| 	return dataManager.hostList; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
							
								
								
									
										78
									
								
								adlib/ad_ff/native/SignonManager.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								adlib/ad_ff/native/SignonManager.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,78 @@ | ||||
| /*********************************************************************** | ||||
|  * | ||||
|  *  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. | ||||
|  * | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| // SignonManager.h: interface for the SignonManager class. | ||||
| // | ||||
| ////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| #ifndef __FPM_SIGNON_MANAGER_H__ | ||||
| #define __FPM_SIGNON_MANAGER_H__ | ||||
|  | ||||
|  | ||||
|  | ||||
| #include "FirefoxPasswordManager.h" | ||||
| #include "Common.h" | ||||
| #include "DataManager.h" | ||||
| #include "CryptManager.h" | ||||
|  | ||||
|  | ||||
| class SignonManager   | ||||
| { | ||||
|  | ||||
| 	DataManager dataManager; | ||||
| 	CryptManager cryptManager; | ||||
| 	FILE *signonFile; | ||||
| 	 | ||||
| public: | ||||
| 	SignonManager(); | ||||
| 	virtual ~SignonManager(); | ||||
|  | ||||
| 	int OpenSignonFile(char *firefoxProfileDir, char *fileName, char *accessType ); | ||||
| 	int CloseSignonFile(); | ||||
|  | ||||
| 	int ReadLine(char *buffer, int size); | ||||
| 	char ReadChar(); | ||||
| 	Unichar ReadCharUTF8(); | ||||
| 	int WriteCharUTF8(Unichar c); | ||||
| 	int WriteLine(char *line);  | ||||
|  | ||||
|  | ||||
| 	int LoadSignonData(char *firefoxProfileDir); | ||||
| 	int WriteSignonData(char *firefoxProfileDir); | ||||
| 	int RemoveSignonData(); | ||||
|  | ||||
| 	int AddUser(char *host, char *userName, char *password); | ||||
| 	int RemoveHost(char *hostName); | ||||
| 	int ModifyHost(struct Host *host); | ||||
| 	int AddHost(struct Host *host); | ||||
|  | ||||
| 	 | ||||
| 	struct Host* GetHostInfo(); | ||||
| 	void SetupFunctions(void *funList[]); | ||||
|  | ||||
|  | ||||
| 	int CheckSignonPref(); | ||||
|  | ||||
| }; | ||||
|  | ||||
| #endif  | ||||
|  | ||||
							
								
								
									
										5
									
								
								adlib/ad_ff/native/link.lux
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								adlib/ad_ff/native/link.lux
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| LINK = $(CPP) \ | ||||
| 	-shared \ | ||||
| 	-Wl \ | ||||
| 	-o $(LIBDIR)$(XTRA)/lib$(TARGET).so.$(BLD_VER) \ | ||||
| 	$(OBJDIR)*.$(O) | ||||
							
								
								
									
										7
									
								
								adlib/ad_ff/native/objs.lux
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								adlib/ad_ff/native/objs.lux
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| OBJS=\ | ||||
| 	Common.$(O) \ | ||||
| 	CryptManager.$(O) \ | ||||
| 	FirefoxPasswordManager.$(O) \ | ||||
| 	ProfileManager.$(O) \ | ||||
| 	SignonManager.$(O) \ | ||||
| 	DataManager.$(O) | ||||
		Reference in New Issue
	
	Block a user