From 2943d7a557867ff05eb5b87c9cd8134f82a485f9 Mon Sep 17 00:00:00 2001 From: Jim Norman Date: Fri, 10 Aug 2007 18:18:27 +0000 Subject: [PATCH] Bug 299017. Fix for firefox 2.0 and firefox 1.5.10, password file. --- CASA/adlib/ad_ff/FireFox.cs | 3 +- CASA/adlib/ad_ff/native/Common.h | 3 +- CASA/adlib/ad_ff/native/DataManager.cpp | 32 +++- CASA/adlib/ad_ff/native/DataManager.h | 2 +- .../ad_ff/native/FirefoxPasswordManager.h | 4 + CASA/adlib/ad_ff/native/SignonManager.cpp | 155 ++++++++++++++---- CASA/adlib/ad_ff/native/SignonManager.h | 2 +- 7 files changed, 160 insertions(+), 41 deletions(-) diff --git a/CASA/adlib/ad_ff/FireFox.cs b/CASA/adlib/ad_ff/FireFox.cs index 4e58412e..c1d2aed1 100644 --- a/CASA/adlib/ad_ff/FireFox.cs +++ b/CASA/adlib/ad_ff/FireFox.cs @@ -59,7 +59,8 @@ namespace Novell.CASA.DataEngines.FF public class HostElement { public IntPtr name; - public IntPtr value; + public IntPtr value; + public IntPtr formUrl; public int isPassword; public IntPtr next; /*public HostElement() diff --git a/CASA/adlib/ad_ff/native/Common.h b/CASA/adlib/ad_ff/native/Common.h index a96d33ef..f288d649 100644 --- a/CASA/adlib/ad_ff/native/Common.h +++ b/CASA/adlib/ad_ff/native/Common.h @@ -38,7 +38,8 @@ struct HostElement { char *name; char *value; - int isPassword; + char *formUrl; + int isPassword; struct HostElement *next; }; diff --git a/CASA/adlib/ad_ff/native/DataManager.cpp b/CASA/adlib/ad_ff/native/DataManager.cpp index 3f5ed664..062d8ce0 100644 --- a/CASA/adlib/ad_ff/native/DataManager.cpp +++ b/CASA/adlib/ad_ff/native/DataManager.cpp @@ -400,6 +400,10 @@ HostElement *t, *temp; { nh->name = (char*) malloc(strlen(t->name) + 1 ); nh->value = (char*) malloc(strlen(t->value) + 1); + if (t->formUrl != NULL) + nh->formUrl = (char*) malloc(strlen(t->formUrl) + 1); + else + nh->formUrl = NULL; } if( !nh || !nh->name || !nh->value) @@ -408,6 +412,10 @@ HostElement *t, *temp; nh->isPassword = t->isPassword; strcpy(nh->name, t->name); strcpy(nh->value, t->value); + + if (t->formUrl != NULL) + strcpy(nh->formUrl, t->formUrl); + nh->next = NULL; if( prev == NULL ) @@ -426,8 +434,9 @@ duplicate_error: // cleanup partially loaded data for(t=newHost->child; t ; ) { - if(t->name) free(t); - if(t->value) free(t); + if(t->name) free(t->name); + if(t->value) free(t->value); + if(t->formUrl) free(t->formUrl); temp = t; t = t->next; @@ -461,7 +470,7 @@ void DataManager::PrintAllHosts() -int DataManager::AddHostElement(char *hostName, char *name, char *value, unsigned char isPassword) +int DataManager::AddHostElement(char *hostName, char *name, char *value, unsigned char isPassword, char *formUrl) { Host *host; HostElement *h, *t; @@ -503,6 +512,14 @@ int DataManager::AddHostElement(char *hostName, char *name, char *value, unsigne { temp->name = (char*) malloc( strlen(name)+1 ); temp->value = (char*) malloc( strlen( value) + 1 ); + if (formUrl != NULL) + { + temp->formUrl = (char*) malloc( strlen( formUrl) + 1); + } + else + { + temp->formUrl = NULL; + } } if( !temp || !temp->name || !temp->value ) @@ -514,6 +531,11 @@ int DataManager::AddHostElement(char *hostName, char *name, char *value, unsigne strcpy(temp->name,name); strcpy(temp->value, value); temp->isPassword = isPassword; + + // save the formUrl + if (formUrl != NULL) + strcpy(temp->formUrl, formUrl); + temp->next = NULL; // Now add it to the host... @@ -570,6 +592,10 @@ int DataManager::RemoveHostElement(char *hostName, char *value) free(h->value); free(h->name); + + if (h->formUrl) + free(h->formUrl); + free(h); return FPM_TRUE; diff --git a/CASA/adlib/ad_ff/native/DataManager.h b/CASA/adlib/ad_ff/native/DataManager.h index 01376a0d..c8496448 100644 --- a/CASA/adlib/ad_ff/native/DataManager.h +++ b/CASA/adlib/ad_ff/native/DataManager.h @@ -50,7 +50,7 @@ public: int RemoveHost(char *hostName); void PrintAllHosts(); - int AddHostElement(char *hostName, char *name, char *value, unsigned char isPassword); + int AddHostElement(char *hostName, char *name, char *value, unsigned char isPassword, char *formUrl); int RemoveHostElement(char *hostName, char *clearValue); Host* DuplicateHost(Host *host); diff --git a/CASA/adlib/ad_ff/native/FirefoxPasswordManager.h b/CASA/adlib/ad_ff/native/FirefoxPasswordManager.h index 31a8013c..03be6cd5 100644 --- a/CASA/adlib/ad_ff/native/FirefoxPasswordManager.h +++ b/CASA/adlib/ad_ff/native/FirefoxPasswordManager.h @@ -89,9 +89,13 @@ #define Unichar unsigned int #define HEADER_VERSION "#2c" +// firefox 1.5.10 & greater and firefox 2.0 +#define HEADER_VERSION2 "#2d" + #define CRYPT_PREFIX "~" #define SIGNON_FILE_NAME "signons.txt" +#define SIGNON_FILE_NAME2 "signons2.txt" // Internal structure declaration taken from firefox..... typedef enum SECItemType diff --git a/CASA/adlib/ad_ff/native/SignonManager.cpp b/CASA/adlib/ad_ff/native/SignonManager.cpp index c4269392..6ea7ad32 100644 --- a/CASA/adlib/ad_ff/native/SignonManager.cpp +++ b/CASA/adlib/ad_ff/native/SignonManager.cpp @@ -50,7 +50,7 @@ void SignonManager::SetupFunctions(void *funList[]) -int SignonManager::OpenSignonFile(char *firefoxProfileDir, char *fileName, char *accessType ) +int SignonManager::OpenSignonFile(char *firefoxProfileDir, char *fileName, char *accessType, bool create ) { char *signonFilePath = NULL; @@ -76,29 +76,38 @@ char *signonFilePath = NULL; // Open the signon file signonFile = fopen(signonFilePath, accessType); - if( signonFile == NULL ) + if( signonFile == NULL) { - PrintMessage(MESG_DEBUG, "\n SignonManager : Error opening signon file %s", signonFilePath); - PrintMessage(MESG_DEBUG, "\n SignonManager : Creating new signon file %s", signonFilePath); - if((signonFile = fopen(signonFilePath, "a")) == NULL) + if (create) { - PrintMessage(MESG_ERROR, "\n SignonManager : Error creating signon file %s", signonFilePath); - free(signonFilePath); - return FPM_SIGNON_FILE_NOT_PRESENT; - } - if( WriteLine(HEADER_VERSION) != FPM_TRUE) - { - PrintMessage(MESG_ERROR, "\n SignonManager : Error writing header to new signon file %s", signonFilePath); - free(signonFilePath); + PrintMessage(MESG_DEBUG, "\n SignonManager : Error opening signon file %s", signonFilePath); + PrintMessage(MESG_DEBUG, "\n SignonManager : Creating new signon file %s", signonFilePath); + + if((signonFile = fopen(signonFilePath, "a")) == NULL) + { + PrintMessage(MESG_ERROR, "\n SignonManager : Error creating signon file %s", signonFilePath); + free(signonFilePath); + return FPM_SIGNON_FILE_NOT_PRESENT; + } + if( WriteLine(HEADER_VERSION) != FPM_TRUE) + { + PrintMessage(MESG_ERROR, "\n SignonManager : Error writing header to new signon file %s", signonFilePath); + free(signonFilePath); + fclose(signonFile); + return FPM_SIGNON_FILE_NOT_PRESENT; + } + fclose(signonFile); + signonFile = fopen(signonFilePath, accessType); + } + else + { + free(signonFilePath); return FPM_SIGNON_FILE_NOT_PRESENT; } - - fclose(signonFile); - signonFile = fopen(signonFilePath, accessType); } - + // cleanup free(signonFilePath); @@ -287,12 +296,22 @@ int retValue; char *clearData = NULL; char *newHostName, *uname; int count = 0; +bool isFireFox2 = false; +char formUrl[4096]; - - // open the signon file - if( (retValue = OpenSignonFile(firefoxProfileDir, SIGNON_FILE_NAME, "r")) != FPM_TRUE ) + + // open the signon file, try Firefox2 first + if( (retValue = OpenSignonFile(firefoxProfileDir, SIGNON_FILE_NAME2, "r", false)) != FPM_TRUE ) { - return retValue; + if( (retValue = OpenSignonFile(firefoxProfileDir, SIGNON_FILE_NAME, "r", true)) != FPM_TRUE ) + { + return retValue; + } + } + else + { + PrintMessage(MESG_DEBUG, "\n SignonManager : New Password file exists"); + isFireFox2 = true; } // Clean up any previously loaded data... @@ -307,11 +326,24 @@ int count = 0; } // check if the format is right... - if( strcmp(header, HEADER_VERSION) != 0) + if (isFireFox2) { - PrintMessage(MESG_ERROR, "\n SignonManager : Header version information is not proper"); - CloseSignonFile(); - return FPM_SIGNON_FILE_INVALID_DATA; + if( strcmp(header, HEADER_VERSION2) != 0) + { + PrintMessage(MESG_ERROR, "\n SignonManager : Header version information is not proper"); + CloseSignonFile(); + return FPM_SIGNON_FILE_INVALID_DATA; + } + } + else + { + if( strcmp(header, HEADER_VERSION) != 0) + { + PrintMessage(MESG_ERROR, "\n SignonManager : Header version information is not proper"); + CloseSignonFile(); + return FPM_SIGNON_FILE_INVALID_DATA; + } + } @@ -426,13 +458,34 @@ int count = 0; strncat(newHostName, ")", 1); dataManager.AddHost(newHostName); } - retValue = dataManager.AddHostElement(newHostName, name, clearData, isPassword); + + // read formUrl if Firefox 2 + if (isFireFox2 && isPassword) + { + retValue = ReadLine(formUrl, bufferLength); + retValue = dataManager.AddHostElement(newHostName, name, clearData, isPassword, formUrl); + } + else + { + retValue = dataManager.AddHostElement(newHostName, name, clearData, isPassword, NULL); + } if(count%2==0) free(newHostName); } else - retValue = dataManager.AddHostElement(hostName, name, clearData, isPassword); + { + // read formUrl if Firefox 2 + if (isFireFox2 && isPassword) + { + retValue = ReadLine(formUrl, bufferLength); + retValue = dataManager.AddHostElement(hostName, name, clearData, isPassword, formUrl); + } + else + { + retValue = dataManager.AddHostElement(hostName, name, clearData, isPassword, NULL); + } + } if( retValue != FPM_TRUE ) { @@ -449,8 +502,8 @@ int count = 0; return retValue; } - } + if (count >2) { newHostName = (char *)malloc((strlen(hostName)+strlen(uname)+4)*sizeof(char)); @@ -490,6 +543,7 @@ HostElement *h, *temp; RejectHost *r; char *hn2; int len; +bool isFireFox2 = false; // TODO : If signon data has not changed since last write then return... /* // There may be requirement to write empty data... @@ -505,7 +559,19 @@ int len; sprintf(fileName,"signon_fpm_%d.txt", rand()); // Setup the signon and temp filename.. - signonFilePath = (char*) malloc( strlen(firefoxProfileDir) + strlen(SIGNON_FILE_NAME) + 3); + + // Firefox 2 file? + if( (retValue = OpenSignonFile(firefoxProfileDir, SIGNON_FILE_NAME2, "r", false)) = FPM_TRUE ) + { + signonFilePath = (char*) malloc( strlen(firefoxProfileDir) + strlen(SIGNON_FILE_NAME2) + 3); + CloseSignonFile(); + isFireFox2 = true; + } + else + { + signonFilePath = (char*) malloc( strlen(firefoxProfileDir) + strlen(SIGNON_FILE_NAME) + 3); + } + tempFilePath =(char*) malloc( strlen(firefoxProfileDir) + strlen(fileName) + 3); if( signonFilePath == NULL || tempFilePath == NULL) @@ -523,7 +589,7 @@ int len; strcat(tempFilePath, fileName); // Open signon file - if( (retValue = OpenSignonFile(firefoxProfileDir, fileName, "w")) != FPM_TRUE ) + if( (retValue = OpenSignonFile(firefoxProfileDir, fileName, "w", true)) != FPM_TRUE ) { PrintMessage(MESG_ERROR, "\nWriteSignonData : Failed to create temp signon file : %s.", fileName); return retValue; @@ -531,15 +597,22 @@ int len; // write out the format revision number - if( (retValue = WriteLine(HEADER_VERSION)) != FPM_TRUE) - goto write_signon_error; + if (isFireFox2) + { + if( (retValue = WriteLine(HEADER_VERSION2)) != FPM_TRUE) + goto write_signon_error; + } + else + { + 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 @@ -636,6 +709,21 @@ int len; PrintMessage(MESG_ERROR, "\n nWriteSignonData : Encryption of value %s failed ", h->value); goto write_signon_error; } + + // is this a firefox2 password file? + if ( isFireFox2 && h->isPassword) + { + if (h->formUrl != NULL) + { + if( (retValue = WriteLine(h->formUrl)) != FPM_TRUE ) + goto write_signon_error; + } + else + { + if( (retValue = WriteLine(t->hostName)) != FPM_TRUE ) + goto write_signon_error; + } + } } if( (retValue = WriteLine(".")) != FPM_TRUE ) @@ -645,7 +733,6 @@ int len; // close this temporary file... CloseSignonFile(); - PrintMessage(MESG_DEBUG, "\n WriteSignonData : Removing previous signon file %s ", signonFilePath); // Delete previous signon file diff --git a/CASA/adlib/ad_ff/native/SignonManager.h b/CASA/adlib/ad_ff/native/SignonManager.h index 91acc036..a7e13102 100644 --- a/CASA/adlib/ad_ff/native/SignonManager.h +++ b/CASA/adlib/ad_ff/native/SignonManager.h @@ -46,7 +46,7 @@ public: SignonManager(); virtual ~SignonManager(); - int OpenSignonFile(char *firefoxProfileDir, char *fileName, char *accessType ); + int OpenSignonFile(char *firefoxProfileDir, char *fileName, char *accessType, bool create); int CloseSignonFile(); int ReadLine(char *buffer, int size);