This commit is contained in:
parent
28ece0abc4
commit
dde3fd2be0
@ -1,91 +0,0 @@
|
|||||||
|
|
||||||
|
|
||||||
#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
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,53 +0,0 @@
|
|||||||
|
|
||||||
#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
|
|
||||||
|
|
||||||
|
|
@ -1,432 +0,0 @@
|
|||||||
|
|
||||||
#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");
|
|
||||||
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 ...");
|
|
||||||
return FPM_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
*cryptData = (char*)reply.data;
|
|
||||||
*cryptDataLen = reply.len;
|
|
||||||
|
|
||||||
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");
|
|
||||||
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 ...");
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,41 +0,0 @@
|
|||||||
|
|
||||||
|
|
||||||
#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
|
|
||||||
|
|
||||||
|
|
@ -1,587 +0,0 @@
|
|||||||
|
|
||||||
#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;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,44 +0,0 @@
|
|||||||
|
|
||||||
#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
|
|
||||||
|
|
||||||
|
|
@ -1,591 +0,0 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "FirefoxPasswordManager.h"
|
|
||||||
#include "Common.h"
|
|
||||||
#include "ProfileManager.h"
|
|
||||||
|
|
||||||
|
|
||||||
ProfileManager profileManager[MAX_PROFILE_COUNT];
|
|
||||||
int profileCount = 0;
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Gets the list of profile names...
|
|
||||||
*
|
|
||||||
* @param[in/out] profiles pointer to array of profile names
|
|
||||||
* @param[in/out] profileFlag Indicates if default profile or not.
|
|
||||||
* @return count count of profiles
|
|
||||||
* 0 no profiles found
|
|
||||||
* < 0 on error
|
|
||||||
*
|
|
||||||
* If one or more profiles found then profiles array is filled with
|
|
||||||
* the profile names and count of profiles is returned. ProfileFlag[]
|
|
||||||
* array is filled with 1 or 0 to indicate if the respective profile
|
|
||||||
* is default profile or not.If no profiles found then value 0 is
|
|
||||||
* returned and negative values is returned if there is an error.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
extern "C" APIEXPORT int FPM_GetProfileList(char **profileList[], int *profileFlag[])
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
|
|
||||||
char profileDir[MAX_PATH] = "";
|
|
||||||
char partialPath[] = "Application Data\\Mozilla\\Firefox";
|
|
||||||
char profilePath[MAX_PATH];
|
|
||||||
char line[1024];
|
|
||||||
|
|
||||||
DWORD pathSize = MAX_PATH;
|
|
||||||
char *finalProfilePath = NULL;
|
|
||||||
int profileCount = 0;
|
|
||||||
unsigned int i;
|
|
||||||
HANDLE token;
|
|
||||||
|
|
||||||
|
|
||||||
// Get current user's profile directory
|
|
||||||
if( OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token) == FALSE )
|
|
||||||
{
|
|
||||||
PrintMessage(MESG_ERROR, "\n GetProfileList : Failed to get current process token ");
|
|
||||||
return FPM_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( GetUserProfileDirectory(token, profileDir, &pathSize) == FALSE )
|
|
||||||
{
|
|
||||||
PrintMessage(MESG_ERROR, "\n GetProfileList : Failed to get user profile directory");
|
|
||||||
return FPM_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
PrintMessage(MESG_DEBUG, "\n GetProfileList : User Profile directory = %s", profileDir);
|
|
||||||
|
|
||||||
// Get firefox profile directory
|
|
||||||
strcpy(profilePath, profileDir);
|
|
||||||
strcat(profilePath,"\\");
|
|
||||||
strcat(profilePath,partialPath);
|
|
||||||
strcat(profilePath,"\\profiles.ini");
|
|
||||||
|
|
||||||
PrintMessage(MESG_DEBUG, "\n GetProfileList : Firefox profile dir path = %s ", profilePath);
|
|
||||||
|
|
||||||
|
|
||||||
#else // Linux platform....
|
|
||||||
|
|
||||||
char profileDir[] ="/.mozilla/firefox";
|
|
||||||
char profileFile[] ="/.mozilla/firefox/profiles.ini";
|
|
||||||
|
|
||||||
char line[1024];
|
|
||||||
char *profilePath = NULL;
|
|
||||||
char *homeDir = NULL;
|
|
||||||
char *finalProfilePath = NULL;
|
|
||||||
int profileCount = 0;
|
|
||||||
unsigned int i;
|
|
||||||
|
|
||||||
// Get home directory
|
|
||||||
homeDir = getenv("HOME");
|
|
||||||
|
|
||||||
if(homeDir == NULL )
|
|
||||||
{
|
|
||||||
PrintMessage(MESG_ERROR, "\n GetProfileList : Unable to get home directory ");
|
|
||||||
return FPM_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
profilePath = (char*) malloc( strlen(homeDir) + strlen(profileFile) + 3 );
|
|
||||||
if( profilePath == NULL )
|
|
||||||
{
|
|
||||||
PrintMessage(MESG_ERROR, "\n GetProfileList : Insufficient memory ");
|
|
||||||
return FPM_FALSE;
|
|
||||||
}
|
|
||||||
strcpy(profilePath,homeDir);
|
|
||||||
strcat(profilePath,profileFile);
|
|
||||||
|
|
||||||
PrintMessage(MESG_DEBUG, "\n GetProfileList : Firefox profile dir path = %s ", profilePath);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Open the firefox profile setting file
|
|
||||||
FILE *profile = fopen(profilePath, "r");
|
|
||||||
|
|
||||||
if( profile == NULL )
|
|
||||||
{
|
|
||||||
PrintMessage(MESG_ERROR, "\n GetProfileList : Unable to find firefox profile file : %s ", profilePath);
|
|
||||||
return FPM_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// First find out the count of profiles....
|
|
||||||
profileCount = 0;
|
|
||||||
while(fgets(line, 1024, profile))
|
|
||||||
{
|
|
||||||
// Remove trailing end of line character
|
|
||||||
line[strlen(line)-1]= 0;
|
|
||||||
|
|
||||||
// Convert to smaller case until "=" found....
|
|
||||||
for(i=0; i<strlen(line); i++)
|
|
||||||
{
|
|
||||||
if( line[i] == '=' )
|
|
||||||
break;
|
|
||||||
|
|
||||||
if( line[i] >=65 && line[i]<=90 )
|
|
||||||
line[i]+=32;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( strstr(line, "name=") != NULL )
|
|
||||||
profileCount++;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
PrintMessage(MESG_DEBUG, "\n GetProfileList : Total profiles found = %d ", profileCount);
|
|
||||||
|
|
||||||
if( profileCount == 0 )
|
|
||||||
{
|
|
||||||
fclose(profile);
|
|
||||||
return FPM_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
*profileList = ( char**) malloc(profileCount * sizeof (char *));
|
|
||||||
*profileFlag = ( int * ) malloc(profileCount * sizeof(int));
|
|
||||||
|
|
||||||
if( *profileList == NULL || *profileFlag == NULL )
|
|
||||||
{
|
|
||||||
PrintMessage(MESG_ERROR, "\n GetProfileList : Insufficient memory ");
|
|
||||||
fclose(profile);
|
|
||||||
return FPM_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
char **profList = *profileList;
|
|
||||||
int *profFlag = *profileFlag;
|
|
||||||
|
|
||||||
// Now read the profile names and store it..
|
|
||||||
fseek(profile, 0, SEEK_SET);
|
|
||||||
|
|
||||||
profileCount = 0;
|
|
||||||
while(fgets(line, 1024, profile))
|
|
||||||
{
|
|
||||||
// Remove trailing end of line character
|
|
||||||
line[strlen(line)-1]= 0;
|
|
||||||
|
|
||||||
// Convert to smaller case until "=" found....
|
|
||||||
for(i=0; i<strlen(line); i++)
|
|
||||||
{
|
|
||||||
if( line[i] == '=' )
|
|
||||||
break;
|
|
||||||
|
|
||||||
if( line[i] >=65 && line[i]<=90 )
|
|
||||||
line[i]+=32;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( strstr(line, "name=") != NULL )
|
|
||||||
{
|
|
||||||
char *temp = strchr(line,'=') + 1;
|
|
||||||
profList[profileCount] = (char*) malloc(strlen(temp)+1);
|
|
||||||
|
|
||||||
if( profList[profileCount] == NULL )
|
|
||||||
{
|
|
||||||
PrintMessage(MESG_ERROR, "\n GetProfileList : Insufficient memory ");
|
|
||||||
fclose(profile);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
strcpy(profList[profileCount],temp);
|
|
||||||
profFlag[profileCount] = 0;
|
|
||||||
|
|
||||||
PrintMessage(MESG_ERROR, "\n GetProfileList : Found profile = [%s]", profList[profileCount]);
|
|
||||||
profileCount++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// check if the current profile is default
|
|
||||||
if( strstr(line, "default=1") != NULL )
|
|
||||||
{
|
|
||||||
profFlag[profileCount-1] = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
fclose(profile);
|
|
||||||
|
|
||||||
// if there is only one profile then set it default profile
|
|
||||||
if( profileCount == 1 )
|
|
||||||
{
|
|
||||||
**profileFlag = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return profileCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
extern "C" APIEXPORT int FPM_FirefoxProfileInit(char *profileName)
|
|
||||||
{
|
|
||||||
int retValue;
|
|
||||||
int profileIndex = -1;
|
|
||||||
int isObjectExist = FPM_FALSE;
|
|
||||||
|
|
||||||
// check if the profile is already initialized...
|
|
||||||
for(int i=0; i< profileCount; i++)
|
|
||||||
{
|
|
||||||
if( profileManager[i].profileName != NULL )
|
|
||||||
{
|
|
||||||
if( STRCMPI(profileManager[i].profileName, profileName) == 0 )
|
|
||||||
{
|
|
||||||
PrintMessage(MESG_ERROR, "\n FirefoxProfileInit : Specified profile object [%s] is already present ", profileName);
|
|
||||||
profileIndex = i;
|
|
||||||
isObjectExist = FPM_TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// This is new profile...
|
|
||||||
if( (profileIndex == -1) && ( (profileCount + 1) >= MAX_PROFILE_COUNT) )
|
|
||||||
{
|
|
||||||
PrintMessage(MESG_ERROR, "\n FirefoxProfileInit : Max profile count exceeded.");
|
|
||||||
return FPM_PROFILE_LIMIT_EXCEEDED;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(profileIndex == -1 )
|
|
||||||
{
|
|
||||||
profileIndex = profileCount;
|
|
||||||
profileCount++;
|
|
||||||
}
|
|
||||||
// If not already initialized then go and initialize it...
|
|
||||||
if( profileManager[profileIndex].isInitialized == FPM_FALSE )
|
|
||||||
{
|
|
||||||
if( (retValue = profileManager[profileIndex].ProfileInit(profileName)) != FPM_TRUE )
|
|
||||||
{
|
|
||||||
PrintMessage(MESG_ERROR, "\n FirefoxProfileInit : Failed to initialize the profile %s ", profileName);
|
|
||||||
return retValue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PrintMessage(MESG_DEBUG, "\n FirefoxProfileInit : Firefox profile %s is already initialized ", profileName);
|
|
||||||
return FPM_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
PrintMessage(MESG_DEBUG, "\n FirefoxProfileInit : Firefox profile %s initialized successfully ", profileName);
|
|
||||||
|
|
||||||
return FPM_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
extern "C" APIEXPORT int FPM_FirefoxProfileExit(char *profileName)
|
|
||||||
{
|
|
||||||
// Find the profile...
|
|
||||||
for(int i=0; i< profileCount; i++)
|
|
||||||
{
|
|
||||||
if( profileManager[i].profileName != NULL )
|
|
||||||
{
|
|
||||||
if( STRCMPI(profileManager[i].profileName, profileName) == 0 )
|
|
||||||
{
|
|
||||||
// check if its initialized
|
|
||||||
if( profileManager[i].isInitialized == FPM_TRUE )
|
|
||||||
{
|
|
||||||
PrintMessage(MESG_DEBUG, "\n FirefoxProfileExit : Exiting the firefox profile %s ", profileName);
|
|
||||||
profileManager[i].ProfileExit();
|
|
||||||
return FPM_TRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PrintMessage(MESG_ERROR, "\n FirefoxProfileExit : Specified profile %s is not initialized , cannot exit the profile", profileName);
|
|
||||||
return FPM_PROFILE_NOT_INITIALIZED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
PrintMessage(MESG_ERROR, "\n FirefoxProfileExit : Specified profile %s is not found", profileName);
|
|
||||||
|
|
||||||
return FPM_PROFILE_NOT_PRESENT;
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
extern "C" APIEXPORT int FPM_IsMasterPasswordSet(char *profileName)
|
|
||||||
{
|
|
||||||
|
|
||||||
// Find the profile...
|
|
||||||
for(int i=0; i< profileCount; i++)
|
|
||||||
{
|
|
||||||
if( profileManager[i].profileName != NULL )
|
|
||||||
{
|
|
||||||
if( STRCMPI(profileManager[i].profileName, profileName) == 0 )
|
|
||||||
{
|
|
||||||
// check if its initialized
|
|
||||||
if( profileManager[i].isInitialized == FPM_TRUE )
|
|
||||||
{
|
|
||||||
PrintMessage(MESG_DEBUG, "\n IsMasterPasswordSet : invoking IsMasterPasswordSet for profile %s", profileName);
|
|
||||||
return profileManager[i].IsMasterPasswordSet();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PrintMessage(MESG_ERROR, "\n IsMasterPasswordSet : Specified profile %s is not initialized ", profileName);
|
|
||||||
return FPM_PROFILE_NOT_INITIALIZED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
PrintMessage(MESG_ERROR, "\n IsMasterPasswordSet : Specified profile %s is not found", profileName);
|
|
||||||
|
|
||||||
return FPM_PROFILE_NOT_PRESENT;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
extern "C" APIEXPORT int FPM_CheckMasterPassword(char *profileName, char *masterPassword)
|
|
||||||
{
|
|
||||||
|
|
||||||
// Find the profile...
|
|
||||||
for(int i=0; i< profileCount; i++)
|
|
||||||
{
|
|
||||||
if( profileManager[i].profileName != NULL )
|
|
||||||
{
|
|
||||||
if( STRCMPI(profileManager[i].profileName, profileName) == 0 )
|
|
||||||
{
|
|
||||||
// check if its initialized
|
|
||||||
if( profileManager[i].isInitialized == FPM_TRUE )
|
|
||||||
{
|
|
||||||
PrintMessage(MESG_DEBUG, "\n CheckMasterPassword : invoking CheckMasterPassword for profile %s", profileName);
|
|
||||||
return profileManager[i].CheckMasterPassword(masterPassword, 1);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PrintMessage(MESG_ERROR, "\n CheckMasterPassword : Specified profile %s is not initialized ", profileName);
|
|
||||||
return FPM_PROFILE_NOT_INITIALIZED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
PrintMessage(MESG_ERROR, "\n CheckMasterPassword : Specified profile %s is not found", profileName);
|
|
||||||
|
|
||||||
return FPM_PROFILE_NOT_PRESENT;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
extern "C" APIEXPORT int FPM_GetSignonData(char *profileName,struct Host **host, int doRefresh)
|
|
||||||
{
|
|
||||||
|
|
||||||
// Find the profile...
|
|
||||||
for(int i=0; i< profileCount; i++)
|
|
||||||
{
|
|
||||||
if( profileManager[i].profileName != NULL )
|
|
||||||
{
|
|
||||||
if( STRCMPI(profileManager[i].profileName, profileName) == 0 )
|
|
||||||
{
|
|
||||||
// check if its initialized
|
|
||||||
if( profileManager[i].isInitialized == FPM_TRUE )
|
|
||||||
{
|
|
||||||
PrintMessage(MESG_DEBUG, "\n GetSignonData : invoking GetSignonData for profile %s", profileName);
|
|
||||||
return profileManager[i].GetSignonData(host, doRefresh);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PrintMessage(MESG_ERROR, "\n GetSignonData : Specified profile %s is not initialized", profileName);
|
|
||||||
return FPM_PROFILE_NOT_INITIALIZED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
PrintMessage(MESG_ERROR, "\n GetSignonData : Specified profile %s is not found", profileName);
|
|
||||||
|
|
||||||
return FPM_PROFILE_NOT_PRESENT;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
extern "C" APIEXPORT int FPM_WriteSignonData(char *profileName)
|
|
||||||
{
|
|
||||||
|
|
||||||
// Find the profile...
|
|
||||||
for(int i=0; i< profileCount; i++)
|
|
||||||
{
|
|
||||||
if( profileManager[i].profileName != NULL )
|
|
||||||
{
|
|
||||||
if( STRCMPI(profileManager[i].profileName, profileName) == 0 )
|
|
||||||
{
|
|
||||||
// check if its initialized
|
|
||||||
if( profileManager[i].isInitialized == FPM_TRUE )
|
|
||||||
{
|
|
||||||
PrintMessage(MESG_DEBUG, "\n WriteSignonData : invoking WriteSignonData for profile %s", profileName);
|
|
||||||
return profileManager[i].WriteSignonData();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PrintMessage(MESG_ERROR, "\n WriteSignonData : Specified profile %s is not initialized", profileName);
|
|
||||||
return FPM_PROFILE_NOT_INITIALIZED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
PrintMessage(MESG_ERROR, "\n WriteSignonData : Specified profile %s is not found", profileName);
|
|
||||||
|
|
||||||
return FPM_PROFILE_NOT_PRESENT;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
extern "C" APIEXPORT int FPM_AddHost(char *profileName, struct Host *host, int doUpdate)
|
|
||||||
{
|
|
||||||
|
|
||||||
// Find the profile...
|
|
||||||
for(int i=0; i< profileCount; i++)
|
|
||||||
{
|
|
||||||
if( profileManager[i].profileName != NULL )
|
|
||||||
{
|
|
||||||
if( STRCMPI(profileManager[i].profileName, profileName) == 0 )
|
|
||||||
{
|
|
||||||
// check if its initialized
|
|
||||||
if( profileManager[i].isInitialized == FPM_TRUE )
|
|
||||||
{
|
|
||||||
PrintMessage(MESG_DEBUG, "\n AddHost : invoking AddHost for profile %s", profileName);
|
|
||||||
return profileManager[i].AddHost(host, doUpdate);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PrintMessage(MESG_ERROR, "\n AddHost : Specified profile %s is not initialized", profileName);
|
|
||||||
return FPM_PROFILE_NOT_INITIALIZED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
PrintMessage(MESG_ERROR, "\n AddHost : Specified profile %s is not found", profileName);
|
|
||||||
|
|
||||||
return FPM_PROFILE_NOT_PRESENT;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
extern "C" APIEXPORT int FPM_ModifyHost(char *profileName, struct Host *host, int doUpdate)
|
|
||||||
{
|
|
||||||
// Find the profile...
|
|
||||||
for(int i=0; i< profileCount; i++)
|
|
||||||
{
|
|
||||||
if( profileManager[i].profileName != NULL )
|
|
||||||
{
|
|
||||||
if( STRCMPI(profileManager[i].profileName, profileName) == 0 )
|
|
||||||
{
|
|
||||||
// check if its initialized
|
|
||||||
if( profileManager[i].isInitialized == FPM_TRUE )
|
|
||||||
{
|
|
||||||
PrintMessage(MESG_DEBUG, "\n ModifyHost : invoking ModifyHost for profile %s", profileName);
|
|
||||||
return profileManager[i].ModifyHost(host, doUpdate);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PrintMessage(MESG_ERROR, "\n ModifyHost : Specified profile %s is not initialized", profileName);
|
|
||||||
return FPM_PROFILE_NOT_INITIALIZED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
PrintMessage(MESG_ERROR, "\n ModifyHost : Specified profile %s is not found", profileName);
|
|
||||||
|
|
||||||
return FPM_PROFILE_NOT_PRESENT;
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
extern "C" APIEXPORT int FPM_RemoveHost(char *profileName, char *hostName, int doUpdate)
|
|
||||||
{
|
|
||||||
// Find the profile...
|
|
||||||
for(int i=0; i< profileCount; i++)
|
|
||||||
{
|
|
||||||
if( profileManager[i].profileName != NULL )
|
|
||||||
{
|
|
||||||
if( STRCMPI(profileManager[i].profileName, profileName) == 0 )
|
|
||||||
{
|
|
||||||
// check if its initialized
|
|
||||||
if( profileManager[i].isInitialized == FPM_TRUE )
|
|
||||||
{
|
|
||||||
PrintMessage(MESG_DEBUG, "\n RemoveHost : invoking RemoveHost for profile %s", profileName);
|
|
||||||
return profileManager[i].RemoveHost(hostName, doUpdate);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PrintMessage(MESG_ERROR, "\n RemoveHost : Specified profile %s is not initialized", profileName);
|
|
||||||
return FPM_PROFILE_NOT_INITIALIZED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
PrintMessage(MESG_ERROR, "\n RemoveHost : Specified profile %s is not found", profileName);
|
|
||||||
|
|
||||||
return FPM_PROFILE_NOT_PRESENT;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
int main(int argc, char* argv[])
|
|
||||||
{
|
|
||||||
char **profileList;
|
|
||||||
int *profileFlag;
|
|
||||||
int profCount;
|
|
||||||
|
|
||||||
profCount = FPM_GetProfileList(&profileList, &profileFlag);
|
|
||||||
|
|
||||||
if( profCount > 0)
|
|
||||||
{
|
|
||||||
printf("\n Profile names are as follows...");
|
|
||||||
for(int i=0; i< profCount; i++)
|
|
||||||
{
|
|
||||||
printf("\n %d => [%s] [%d]", i+1, profileList[i], profileFlag[i]);
|
|
||||||
|
|
||||||
// Load the default profile...
|
|
||||||
if( profileFlag[i] == 1 )
|
|
||||||
{
|
|
||||||
ProfileManager *pm = new ProfileManager();
|
|
||||||
printf("\n ***************************************");
|
|
||||||
|
|
||||||
if( pm->ProfileInit(profileList[i]) == 1)
|
|
||||||
{
|
|
||||||
pm->CheckMasterPassword("test123", 1);
|
|
||||||
struct Host *hostInfo;
|
|
||||||
pm->GetSignonData(&hostInfo, 1);
|
|
||||||
|
|
||||||
// Print all the data
|
|
||||||
PrintMessage(MESG_PRINT, "\n\n List of hosts ");
|
|
||||||
|
|
||||||
for(Host *t=hostInfo; t ; t=t->next)
|
|
||||||
{
|
|
||||||
PrintMessage(MESG_PRINT, "\n\n %s", t->hostName);
|
|
||||||
for(HostElement *h=t->child; h ; h= h->next)
|
|
||||||
{
|
|
||||||
PrintMessage(MESG_PRINT, "\n %s : %s ", h->name, h->value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pm->WriteSignonData();
|
|
||||||
|
|
||||||
pm->ProfileExit();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("\n ***************************************");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,164 +0,0 @@
|
|||||||
|
|
||||||
|
|
||||||
#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_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
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,818 +0,0 @@
|
|||||||
|
|
||||||
#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_ERROR, "\n\n LoadLibrary : Failed to load library %s ", loadPath);
|
|
||||||
free(loadPath);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
free(loadPath);
|
|
||||||
|
|
||||||
return libtmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// 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 library from directory %s", libraryPath);
|
|
||||||
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()
|
|
||||||
{
|
|
||||||
PrintMessage(MESG_DEBUG, "\n ProfileExit : Shutting down the profile %s", profileName);
|
|
||||||
|
|
||||||
if( (isInitialized == FPM_TRUE) && NSSShutdown != NULL )
|
|
||||||
(*NSSShutdown)();
|
|
||||||
|
|
||||||
if( libnss != NULL )
|
|
||||||
FREELIBRARY(libnss);
|
|
||||||
|
|
||||||
if( libplc != NULL )
|
|
||||||
FREELIBRARY(libplc);
|
|
||||||
|
|
||||||
// clean up signon data...
|
|
||||||
signonManager.RemoveSignonData();
|
|
||||||
|
|
||||||
isInitialized = FPM_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int ProfileManager::IsMasterPasswordSet()
|
|
||||||
{
|
|
||||||
PK11SlotInfo *slot = 0;
|
|
||||||
int retValue = 0;
|
|
||||||
|
|
||||||
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
|
|
||||||
if( (*PK11CheckUserPassword)(slot,"") == SECSuccess )
|
|
||||||
{
|
|
||||||
PrintMessage(MESG_DEBUG, "\n IsMasterPasswordSet : Master password is not set...");
|
|
||||||
retValue = FPM_FALSE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PrintMessage(MESG_DEBUG, "\n IsMasterPasswordSet : Master password is set...");
|
|
||||||
retValue = FPM_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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;
|
|
||||||
}
|
|
@ -1,71 +0,0 @@
|
|||||||
|
|
||||||
|
|
||||||
#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 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
|
|
||||||
|
|
@ -1,650 +0,0 @@
|
|||||||
|
|
||||||
#include "SignonManager.h"
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
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];
|
|
||||||
static int last = 0;
|
|
||||||
static int next = 0;
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int SignonManager::AddUser(char *host, char *userName, char *password)
|
|
||||||
{
|
|
||||||
char checkString[]="test123";
|
|
||||||
char *cryptData = NULL;
|
|
||||||
char *clearData = NULL;
|
|
||||||
char *newdata = NULL;
|
|
||||||
/*
|
|
||||||
// TODO : check if signon preference enabled....
|
|
||||||
if( CheckSignonPref() == FPM_FALSE )
|
|
||||||
{
|
|
||||||
PrintMessage(MESG_ERROR, "\n MCSignonManager : Signon preference is not enabled...");
|
|
||||||
return FPM_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if( EncryptString ("test123", &cryptData) == FPM_FALSE )
|
|
||||||
{
|
|
||||||
PrintMessage(MESG_ERROR, "\n MCSignonManager : fAILED TO EncryptString");
|
|
||||||
return FPM_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
newdata = (char*) malloc(strlen(cryptData) + 1);
|
|
||||||
strcpy(newdata, cryptData);
|
|
||||||
|
|
||||||
if( DecryptString(newdata, &clearData) == FPM_FALSE )
|
|
||||||
{
|
|
||||||
PrintMessage(MESG_ERROR, "\n MCSignonManager : Failed to DecryptString");
|
|
||||||
return FPM_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("\n final decrypted string is : %s ", clearData);
|
|
||||||
|
|
||||||
if( strcmp(checkString, clearData) == 0 )
|
|
||||||
{
|
|
||||||
printf("\n Encryption - decryption test is success ");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
printf("\n Encryption - decryption test is FAILED ");
|
|
||||||
*/
|
|
||||||
return FPM_TRUE;
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,56 +0,0 @@
|
|||||||
// 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
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user