diff -r b183ec05bd8c -r 19bba8228ff0 terminalsecurity/SCP/SCPHistoryPlugin/src/SCPHistoryPlugin.cpp --- a/terminalsecurity/SCP/SCPHistoryPlugin/src/SCPHistoryPlugin.cpp Tue Aug 31 16:04:06 2010 +0300 +++ b/terminalsecurity/SCP/SCPHistoryPlugin/src/SCPHistoryPlugin.cpp Wed Sep 01 12:27:42 2010 +0100 @@ -23,9 +23,9 @@ #include #include "SCPHistoryPlugin.h" -#include +#include #include "SCP_IDs.h" -#include + // ============================= LOCAL FUNCTIONS ============================= @@ -84,240 +84,342 @@ // Status : Approved // ---------------------------------------------------------------------------- // -void CSCPHistoryPlugin :: HandleEventL( TInt aID, CSCPParamObject& aParam, CSCPParamObject& aOutParam) - { - Dprint ( ( _L( "CSCPHistoryPlugin::HandleEvent()" ) ) ); - - if ( iFs == NULL ) - { - return ; // Eventhandler not available - } - // check for Case - - switch ( aID ) +CSCPParamObject* CSCPHistoryPlugin::HandleEvent(TInt aID, + CSCPParamObject& aParam) + { + Dprint((_L("CSCPHistoryPlugin::HandleEvent()"))); + // Make the ParamObject for success ack, Delete later + CSCPParamObject* retParams = NULL; + + TBool errRaised; + errRaised = EFalse; + + TBool isInvalid = EFalse; + + if (iFs == NULL) + { + return NULL; // Eventhandler not available + } + + // check for Case + switch (aID) { - case ( KSCPEventValidate ) : - { - // Obtain the paramValue - Dprint ( ( _L( "CSCPHistoryPlugin::KSCPEventValidate" ) ) ); - TInt passhistoryParamValue; - passhistoryParamValue = GetHistoryCountParamValue(); - Dprint ( ( _L( "CSCPHistoryPlugin::HandleEvent passhistoryParamValue = %d" ), passhistoryParamValue ) ); - // if all required bounds are zero, there is nothing to do. - if ( passhistoryParamValue != 0) - { - // Get the configFile's path. - // If this fails, there is something badly wrong(Private folder is not there) - TInt errSCF = SetConfigFile (); - if (errSCF != KErrNone) - { - break; // Break out from Case - } + case (KSCPEventValidate): + { + // Obtain the paramValue + Dprint((_L("CSCPHistoryPlugin::KSCPEventValidate"))); + TInt passhistoryParamValue; + passhistoryParamValue = GetHistoryCountParamValue(); + Dprint( + (_L( + "CSCPHistoryPlugin::HandleEvent passhistoryParamValue = %d"), passhistoryParamValue)); + // if all required bounds are zero, there is nothing to do. + if (passhistoryParamValue != 0) + { + // Get the configFile's path. + // If this fails, there is something badly wrong(Private folder is not there) + TInt errSCF = SetConfigFile(); + if (errSCF != KErrNone) + { + errRaised = ETrue; + break; // Break out from Case + } + + // Get the historyItemCount, If the err is raised, the file is not there + // This will lead to KSCPEventPasswordChanged event and new history file will + // be created + TInt historyItemCounter; + TInt errHC = GetHistoryItemCount(historyItemCounter); + Dprint( + (_L( + "CSCPHistoryPlugin::HandleEvent historyItemCounter = %d"), historyItemCounter)); + if (errHC != KErrNone) + { + errRaised = ETrue; + break; // Break out from Case + } - // Get the historyItemCount, If the err is raised, the file is not there - // This will lead to KSCPEventPasswordChanged event and new history file will - // be created - TInt historyItemCounter; - TInt errHC = GetHistoryItemCount( historyItemCounter ); - Dprint ( ( _L( "CSCPHistoryPlugin::HandleEvent historyItemCounter = %d" ), historyItemCounter ) ); - if (errHC != KErrNone) - { - break; // Break out from Case - } + // continue with the KSCPEventValidate Check + + // Get the password from the paramObject + TBuf seccode; + if (aParam.Get(KSCPParamPassword, seccode) != KErrNone) + { + // Nothing to do anymore + Dprint( + (_L( + "CSCPHistoryPlugin::HandleEvent()\ + ERROR: KSCPEventValidate/KSCPParamPassword is != KErrNone"))); + errRaised = ETrue; + break; // Break out from Case + } - // continue with the KSCPEventValidate Check + // Hash the securitycode + TBuf securityhash; + iEventHandler->HashInput(seccode, securityhash); + + // get history + CDesCArrayFlat* array = NULL; + TInt errGH = KErrNone; + + array = new CDesCArrayFlat(1); + if (array != NULL) + { + TRAPD(err2, errGH = GetHistoryArrayL(*array)); + if (err2 != KErrNone) + { + errGH = err2; + } + } + else + { + errGH = KErrNoMemory; + } - // Get the password from the paramObject - TBuf seccode; - if ( aParam.Get( KSCPParamPassword, seccode ) != KErrNone ) - { - // Nothing to do anymore - Dprint( (_L("CSCPHistoryPlugin::HandleEvent()\ - ERROR: KSCPEventValidate/KSCPParamPassword is != KErrNone") )); - break; // Break out from Case - } - - // Hash the securitycode - TBuf securityhash; - iEventHandler->HashInput(seccode,securityhash); - - // get history - CDesCArrayFlat* array = NULL; - TInt errGH = KErrNone; - - array = new CDesCArrayFlat(1); - if ( array != NULL ) - { - TRAPD( err2, errGH = GetHistoryArrayL( *array ) ); - if ( err2 != KErrNone ) - { - errGH = err2; - } - } - else - { - errGH = KErrNoMemory; - } - - // If for some reason err is raised, break out - // If the Historyonfig file get deleted on the fly ex - if (errGH != KErrNone) - { - array->Reset(); - delete array; - break; // Break out from Case - } - TInt correction; - correction = 0; + // If for some reason err is raised, break out + // If the Historyonfig file get deleted on the fly ex + if (errGH != KErrNone) + { + errRaised = ETrue; + array->Reset(); + delete array; + break; // Break out from Case + } + TInt correction; + correction = 0; + + if (array->Count() >= passhistoryParamValue) + { + correction = array->Count() - passhistoryParamValue; + } + // check for match + TBuf arrayItem; + + // Set the historyobject + for (TInt i = 0 + correction; i < array->Count(); i++) + { + arrayItem = array->MdcaPoint(i); + if (arrayItem.Compare(securityhash) == KErrNone) + { + // Get the filesystem for Resource + // If fail, bail out + TInt errgGR = GetResource(); + if (errgGR != KErrNone) + { + errRaised = ETrue; + break; // Break out from the For + } + + // Prompt buf, iNote can show only 97 chars, + // without ... markings. + HBufC* hbuf = NULL; - if ( array->Count() >= passhistoryParamValue ) - { - correction = array->Count() - passhistoryParamValue; - } - // check for match - TBuf arrayItem; - - // Set the historyobject - for (TInt i= 0 + correction; i < array->Count(); i++) - { - arrayItem = array->MdcaPoint(i); - if (arrayItem.Compare(securityhash) == KErrNone) - { - aOutParam.Set( KSCPParamStatus, KErrSCPInvalidCode ); - Dprint ( ( _L( "EDeviceLockHistoryBuffer Failed" ) ) ); - aOutParam.AddtoFailedPolices(EDeviceLockHistoryBuffer); + if (passhistoryParamValue == 1) + { + isInvalid = ETrue; +TRAP_IGNORE ( + hbuf = LoadAndFormatResL( R_SET_SEC_CODE_INFO_PREVIOUS ); + ); + } + else + { + isInvalid = ETrue; + TRAP_IGNORE( + hbuf = LoadAndFormatResL( + R_SET_SEC_CODE_INFO_CHECK, + &passhistoryParamValue ); + ); + } + + if ( isInvalid ) + { + // Create the result-object to return + TRAPD( err, retParams = CSCPParamObject::NewL() ); + + if ( err == KErrNone ) + { + retParams->Set( KSCPParamStatus, KErrSCPInvalidCode ); + retParams->Set( KSCPParamAction, KSCPActionShowUI ); + retParams->Set( KSCPParamUIMode, KSCPUINote ); + + if ( hbuf != NULL ) + { + TPtr ptr = hbuf->Des(); + retParams->Set( KSCPParamPromptText, ptr ); + delete hbuf; + } + } + break; + } + } // End of compare IF } // End of For - + // kill the local array->Reset(); delete array; } // passhistoryParamValue + + else + { + retParams = NULL; + } + break; } // end of KSCPEventValidate + // Someone has changed the Seccode and I need to include it to history - case ( KSCPEventPasswordChanged ) : - { - // Get the configFile's path. - Dprint ( ( _L( "CSCPHistoryPlugin::KSCPEventPasswordChanged" ) ) ); - TInt errSCF = SetConfigFile (); - if (errSCF != KErrNone) - { - break; // Break out from the case - } - - // Get the password from the paramObject - TBuf securitycode; + case ( KSCPEventPasswordChanged ) : + { + // Get the configFile's path. + Dprint ( ( _L( "CSCPHistoryPlugin::KSCPEventPasswordChanged" ) ) ); + TInt errSCF = SetConfigFile (); + if (errSCF != KErrNone) + { + errRaised = ETrue; + break; // Break out from the case + } + + // Get the password from the paramObject + TBuf securitycode; if ( aParam.Get( KSCPParamPassword, securitycode ) != KErrNone ) { - // Nothing to do anymore - Dprint( (_L("CSCPHistoryPlugin::HandleEvent()\ + // Nothing to do anymore + Dprint( (_L("CSCPHistoryPlugin::HandleEvent()\ ERROR: KSCPEventPasswordChanged/KSCPParamPassword is != KErrNone") )); - break; // Break out from the Case - } + errRaised = ETrue; + break; // Break out from the Case + } - // Hash the securitycode - TBuf securityhash; - iEventHandler->HashInput(securitycode,securityhash); + // Hash the securitycode + TBuf securityhash; + iEventHandler->HashInput(securitycode,securityhash); - // Get the historyItemCount, If error occures, File is not there yet, Make one - TInt historyItemCounter; - TInt errHC = GetHistoryItemCount( historyItemCounter ); - Dprint ( ( _L( "CSCPHistoryPlugin::HandleEvent historyItemCounter = %d" ), historyItemCounter ) ); - if (errHC != KErrNone) - { - // The file does not exist yet (should not happen) - // Make the ParamObject, Set the New historyData with count of 1 - CSCPParamObject* historyObject = NULL; - TRAPD( err, historyObject = CSCPParamObject::NewL() ); - if ( err == KErrNone ) - { - historyObject->Set(KHistoryCounterParamID,1); - historyObject->Set(KHistoryItemParamBase,securityhash ); - + // Get the historyItemCount, If error occures, File is not there yet, Make one + TInt historyItemCounter; + TInt errHC = GetHistoryItemCount( historyItemCounter ); + Dprint ( ( _L( "CSCPHistoryPlugin::HandleEvent historyItemCounter = %d" ), historyItemCounter ) ); + if (errHC != KErrNone) + { + // The file does not exist yet (should not happen) + // Make the ParamObject, Set the New historyData with count of 1 + CSCPParamObject* historyObject = NULL; + TRAPD( err, historyObject = CSCPParamObject::NewL() ); + if ( err == KErrNone ) + { + historyObject->Set(KHistoryCounterParamID,1); + historyObject->Set(KHistoryItemParamBase,securityhash ); + TRAPD( errWC, historyObject->WriteToFileL( iCfgFilenamepath, iFs ) ); - if ( errWC != KErrNone ) - { - Dprint( (_L("CSCPHistoryPlugin::HandleEvent(): WARNING:\ + if ( errWC != KErrNone ) + { + Dprint( (_L("CSCPHistoryPlugin::HandleEvent(): WARNING:\ failed to write plugin configuration: %d"), errWC )); - break; // Break out from the Case - } - delete historyObject; - } - } - // There are passwords avail. - else - { - // Append the new passwords - TInt err = KErrNone; - TRAPD( err2, err = AppendAndWriteSecurityCodeL( securityhash ) ); - if ( ( err != KErrNone ) || ( err2 != KErrNone ) ) - { - break; // Break out from the Case - } - } - break; - } // end of KSCPEventPasswordChanged - - case ( KSCPEventConfigurationQuery ): - { + errRaised = ETrue; + break; // Break out from the Case + } + delete historyObject; + } + } + // There are passwords avail. + + else + { + // Append the new passwords + TInt err = KErrNone; + TRAPD( err2, err = AppendAndWriteSecurityCodeL( securityhash ) ); + if ( ( err != KErrNone ) || ( err2 != KErrNone ) ) + { + errRaised = ETrue; + break; // Break out from the Case + } + } + break; + } // end of KSCPEventPasswordChanged + + case ( KSCPEventConfigurationQuery ): + { Dprint ( ( _L( "CSCPHistoryPlugin::KSCPEventConfigurationQuery" ) ) ); - TInt paramID = -1; + TInt paramID = -1; // Get the ID from the paramObject if ( aParam.Get( KSCPParamID, paramID ) != KErrNone ) { // Nothing to do anymore break; - } - + } + // 1011 if ( paramID == (RTerminalControl3rdPartySession::EPasscodeHistoryBuffer)) { - // All of our params are TInts - TInt paramValue; - if ( aParam.Get( KSCPParamValue, paramValue ) != KErrNone ) - { - aOutParam.Set( KSCPParamStatus, KErrGeneral ); - break; - } - - TInt retStatus = KErrNone; - switch ( paramID ) - { - - case ( RTerminalControl3rdPartySession::EPasscodeHistoryBuffer ): - { - // Bounds are be be - if ( ( paramValue < KPasscodeHistoryBufferMinValue ) - || ( paramValue > KPasscodeHistoryBufferMaxValue ) ) - { - // This is not a valid valuerange - retStatus = KErrArgument; - } - - break; - } // end of case EPasscodeHistoryBuffer - } // end of switch ( paramID ) - - aOutParam.Set( KSCPParamStatus, retStatus ); + // OK, we're interested, check that the value is valid + TRAPD( err, retParams = CSCPParamObject::NewL() ); + if ( err != KErrNone ) + { + break; // Nothing we can do + } + + // All of our params are TInts + TInt paramValue; + if ( aParam.Get( KSCPParamValue, paramValue ) != KErrNone ) + { + retParams->Set( KSCPParamStatus, KErrGeneral ); + break; } - break; - } //End of KSCPEventConfigurationQuery Case - - - case ( KSCPEventReset ): - { - Dprint ( ( _L( "CSCPHistoryPlugin::KSCPEventReset" ) ) ); - // Reset the configuration for this plugin. - TRAP_IGNORE( FlushConfigFileL() ); - - break; - } - - } // End of switch ( aID ) + + TInt retStatus = KErrNone; + switch ( paramID ) + { + + case ( RTerminalControl3rdPartySession::EPasscodeHistoryBuffer ): + { + // Bounds are be be + if ( ( paramValue < KPasscodeHistoryBufferMinValue ) + || ( paramValue > KPasscodeHistoryBufferMaxValue ) ) + { + // This is not a valid valuerange + retStatus = KErrArgument; + } + + break; + } // end of case EPasscodeHistoryBuffer + } // end of switch ( paramID ) + + retParams->Set( KSCPParamStatus, retStatus ); + } + else + { + retParams = NULL; + } + + break; + } //End of KSCPEventConfigurationQuery Case + + + case ( KSCPEventReset ): + { + Dprint ( ( _L( "CSCPHistoryPlugin::KSCPEventReset" ) ) ); + // Reset the configuration for this plugin. + TRAP_IGNORE( FlushConfigFileL() ); + + break; + } + + } // End of switch ( aID ) + + // Check if Any errors were raised and handle it + if (errRaised) + { + if ( retParams != NULL ) + { + delete retParams; + } + retParams = NULL; + } + + return retParams; } // ---------------------------------------------------------------------------- @@ -561,6 +663,57 @@ } // ---------------------------------------------------------------------------- +// CSCPHistoryPlugin::GetResource +// GetResource +// Status : Approved +// ---------------------------------------------------------------------------- +// + +TInt CSCPHistoryPlugin::GetResource() + { + Dprint( (_L("CSCPSpecificStringsPlugin::GetResource()") )); + // The resource has to be loaded manually since it is not an application. + + TFileName resourceFile; + resourceFile.Append( KDriveZ ); + resourceFile.Append( SCPHistoryPluginSrcFile ); + BaflUtils::NearestLanguageFile( *iFs, resourceFile ); + TRAPD( err, iRf.OpenL( *iFs, resourceFile ) ); + + if ( err == KErrNone ) + { + TRAP( err, iRf.ConfirmSignatureL() ); + } + + return err; + } + + +// ---------------------------------------------------------------------------- +// CSCPHistoryPlugin::LoadResourceLC +// GetResource +// Status : Approved +// ---------------------------------------------------------------------------- +// +HBufC16* CSCPHistoryPlugin::LoadResourceLC ( TInt aResId ) + { + Dprint( (_L("CSCPHistoryPlugin::LoadResourceLC()") )); + + // load the actual resource + HBufC8* readBuffer = iRf.AllocReadLC( aResId ); + // as we are expecting HBufC16... + const TPtrC16 ptrReadBuffer( (TText16*) readBuffer->Ptr(), + ( readBuffer->Length() + 1 ) >> 1 ); + + HBufC16* textBuffer=HBufC16::NewL( ptrReadBuffer.Length() ); + *textBuffer=ptrReadBuffer; + CleanupStack::PopAndDestroy( readBuffer ); // readBuffer + CleanupStack::PushL( textBuffer ); + return textBuffer; + } + + +// ---------------------------------------------------------------------------- // CSCPHistoryPlugin::FlushConfigFile // Remove all the other passwords from the file, except the last one (current) // @@ -609,5 +762,97 @@ CleanupStack::PopAndDestroy( historyObject ); return err; - } + } + + +// ---------------------------------------------------------------------------- +// CSCPHistoryPlugin::LoadAndFormatResL +// Load the given resouce, and format the string according to the TInt parameters +// if given. +// +// Status : Approved +// ---------------------------------------------------------------------------- +// +HBufC* CSCPHistoryPlugin::LoadAndFormatResL( TInt aResId, TInt* aParam1, TInt* aParam2 ) + { + Dprint ( ( _L( "CSCPHistoryPlugin::LoadAndFormatResL()" ) ) ); + HBufC16* resource = NULL; + HBufC* hbuf = NULL; + + resource = LoadResourceLC( aResId ); + FormatResourceString (*resource); + TInt allocLen = 0; + if ( aParam1 != NULL ) + { + allocLen += KSCPMaxIntLength; + } + if ( aParam2 != NULL ) + { + allocLen += KSCPMaxIntLength; + } + + hbuf = HBufC::NewL( resource->Length() + allocLen ); + + if ( ( aParam1 == NULL ) && ( aParam2 == NULL ) ) + { + hbuf->Des().Copy( resource->Des() ); + } + else + { + if ( aParam1 == NULL ) + { + hbuf->Des().Format( resource->Des(), *aParam2 ); + } + else if ( aParam2 == NULL ) + { + hbuf->Des().Format(resource->Des(), *aParam1 ); + } + else + { + hbuf->Des().Format(resource->Des(), *aParam1, *aParam2 ); + } + } + + CleanupStack::PopAndDestroy( resource ); + return hbuf; + } + +// ---------------------------------------------------------------------------- +// CSCPHistoryPlugin::FormatResourceString +// The buffer that is passed is formatted to have only %i as a format specifier instead of %N or %0N etc. +// +// Status : Approved +// ---------------------------------------------------------------------------- +// +void CSCPHistoryPlugin::FormatResourceString(HBufC16 &aResStr) +{ + TInt pos = 0; + TInt flag = 0; + TPtr16 bufPtr = aResStr.Des(); + _LIT (mess1, "%N"); + _LIT (mess2, "%i"); + _LIT (mess3, "%0N"); + _LIT (mess4, "%1N"); + + while ((pos = bufPtr.Find(mess1)) !=KErrNotFound) + { + bufPtr.Replace(pos,2,mess2); + flag = 1; + break; + } + + if(flag == 0) + { + while ((pos = bufPtr.Find(mess3)) != KErrNotFound) + { + bufPtr.Replace(pos,3,mess2); + } + + while ((pos = bufPtr.Find(mess4)) != KErrNotFound) + { + bufPtr.Replace(pos,3,mess2); + } + } +} + // End of File