diff -r 4af31167ea77 -r 13d7c31c74e0 terminalsecurity/SCP/SCPClient/src/SCPClient.cpp --- a/terminalsecurity/SCP/SCPClient/src/SCPClient.cpp Thu Jul 15 19:36:11 2010 +0300 +++ b/terminalsecurity/SCP/SCPClient/src/SCPClient.cpp Thu Aug 19 10:44:50 2010 +0300 @@ -19,8 +19,10 @@ // INCLUDE FILES #include +#include #include #include +#include #include #include #include @@ -39,14 +41,22 @@ #include #include #include +#include #include #include #include //#endif // DEVICE_LOCK_ENHANCEMENTS +#include #include #include "SCPDebug.h" #include +#include +#include +#include +#include +#include + /*#ifdef _DEBUG #define __SCP_DEBUG #endif // _DEBUG @@ -63,12 +73,13 @@ static const TUint KDefaultMessageSlots = 3; static const TInt KSCPConnectRetries( 2 ); - +const TInt KLockedbyLawmo (30); //#ifdef __SAP_DEVICE_LOCK_ENHANCEMENTS _LIT( KDriveZ, "Z:" ); _LIT( KSCPResourceFilename, "\\Resource\\SCPNotifier.RSC" ); _LIT( KSCPSecUIResourceFilename, "\\Resource\\SecUi.RSC" ); +_LIT( KSCPTimestampPluginResFilename, "\\Resource\\SCPTimestampPluginLang.rsc"); //#endif // __SAP_DEVICE_LOCK_ENHANCEMENTS // Uid for the application; this should match the mmp file @@ -187,7 +198,7 @@ TUint aResId = 0, TDesC* aPrompt = NULL, TBool aECSSupport = EFalse, - CSCPQueryDialog :: TKeypadContext aContext = CSCPQueryDialog :: EContextSensitive + CSCPQueryDialog :: TKeypadContext aContext = CSCPQueryDialog :: ENumeric ) { Dprint(_L("[RSCPClient]-> RunDialogL() >>> ")); @@ -465,13 +476,76 @@ EXPORT_C TInt RSCPClient::SetPhoneLock( TBool aLocked ) { Dprint( (_L("--> RSCPClient::SetPhoneLock( %d)"), aLocked )); - + TInt autolockState = -1; + RProperty aProperty; + aProperty.Get(KPSUidCoreApplicationUIs, KCoreAppUIsAutolockStatus, autolockState); + Dprint( (_L("RSCPClient::SetPhoneLock()Autolock state before %d"), autolockState )); + + if((aLocked==0)&&(autolockState != EAutolockStatusUninitialized)) + InformAutolockTask(); + Dprint( (_L("RSCPClient sendreceive") )); TInt ret = SendReceive(ESCPServSetPhoneLock, TIpcArgs( aLocked ) ); - + Dprint( (_L("RSCPClient sendreceive done") )); + aProperty.Get(KPSUidCoreApplicationUIs, KCoreAppUIsAutolockStatus, autolockState); + Dprint( (_L("RSCPClient::SetPhoneLock()Autolock state after %d"), autolockState )); + // Put it here because, we cant change autolock status before sendreceive + // Uninitialised state is Only at Bootup. + if((autolockState == EAutolockStatusUninitialized)&&(aLocked==0)&&(ret==KErrNone)) + { + Dprint( (_L("RSCPClient::SetPhoneLock()setting autolock status") )); + aProperty.Set(KPSUidCoreApplicationUIs, KCoreAppUIsAutolockStatus, EAutolockOff); + // This is startup and we are done with ISA unlock + // So set the Startup cenrep key so tht it is used in SeccodeQuery + CRepository* lRepository = NULL; + TInt returnv; + TRAP(returnv, lRepository = CRepository :: NewL(KCRUidSCPLockCode)); + returnv = lRepository->Set(KSCPStartupQuery, 1); + if(returnv==KErrNone) + Dprint( (_L("RSCPClient::SetPhoneLock()setting KSCPStartupQuery") )); + delete lRepository; + } Dprint( (_L("<-- RSCPClient::SetPhoneLock(): %d"), ret )); return ret; } +void RSCPClient::InformAutolockTask() + { + Dprint( (_L("RSCPClient::InformAutolockTask") )); + // Deactivation call, send the deactivation message to Autolock + RWsSession wsSession; + if ( wsSession.Connect() != KErrNone ) + { + Dprint( (_L("RSCPClient::InformAutolockTask():\ + WsSession connection failed") )); + User::Leave( KErrGeneral ); + } + CleanupClosePushL( wsSession ); + + TApaTaskList taskList( wsSession ); + TApaTask task = taskList.FindApp( TUid::Uid( 0x100059B5 ) ); // Autolock + + if ( task.Exists() ) + { + Dprint( (_L("RSCPClient::InformAutolockTask():\ + Autolock task found, sending msg") )); + // No parameters, just a dummy buffer + TBuf8<8> buf; + buf.Zero(); + const TPtrC8& message = buf; + User::LeaveIfError( + task.SendMessage( TUid::Uid( SCP_CMDUID_UNLOCK+1 ), message ) + ); + } + else + { + Dprint( (_L("RSCPClient::InformAutolockTask():\ + Autolock task not found") )); + User::Leave( KErrNotFound ); + } + + CleanupStack::PopAndDestroy(); // wsSession + } + // --------------------------------------------------------- // TBool RSCPClient::QueryAdminCmd( TSCPAdminCommand aCommand ) // Packs the command parameter into a buffer, and propagates @@ -586,6 +660,23 @@ } Dprint((_L("<-- RSCPClient::SecCodeQuery(): lStatus= %d, lErr= %d"), lStatus, lErr)); + CRepository* lRepository = NULL; + TInt startup = 0; + TInt returnv; + TRAP(returnv, lRepository = CRepository :: NewL(KCRUidSCPLockCode)); + returnv = lRepository->Get(KSCPStartupQuery, startup); + if(returnv == KErrNone) + Dprint( (_L("RSCPClient::SecCodeQuery()KSCPStartupQuery get done"))); + lRepository->Set(KSCPStartupQuery, 0); + delete lRepository; + Dprint((_L("RSCPClient::SecCodeQuery(): startup ? %d"), startup )); + //Check if this is Startup Query and tht device is remote unlocked now ? + if(startup) + { + Dprint((_L("[RSCPClient] SecCodeQuery() startup remote Unlocked"))); + return KErrNone; + } + else return (lErr != KErrNone) ? lErr : lStatus; } @@ -761,6 +852,7 @@ return ret; } EXPORT_C TInt RSCPClient :: PerformCleanupL(RArray& aAppIDs) { + Dprint((_L("RSCPClient::PerformCleanupL() >>>"))); TInt lCount = aAppIDs.Count(); if(lCount < 1) { @@ -779,6 +871,7 @@ lWriteStream.CommitL(); TInt lStatus = SendReceive(ESCPApplicationUninstalled, TIpcArgs(ESCPApplicationUninstalled, &lBuff->Des())); CleanupStack :: PopAndDestroy(2); // lBuff, lWriteStream + Dprint((_L("RSCPClient::PerformCleanupL() <<<"))); return lStatus; } // --------------------------------------------------------- @@ -898,16 +991,15 @@ maxLen, R_SECUI_TEXT_ENTER_NEW_SEC_CODE, NULL, - ecSupport, - CSCPQueryDialog :: EAlphaNumeric) ); + ecSupport) ); if ( ( ret ) && ( ret != ESecUiEmergencyCall ) && ( err == KErrNone ) ) { verifyCodeBuffer.Zero(); - TChar ch = static_cast(newCodeBuffer[0]); - - CSCPQueryDialog :: TKeypadContext lKPContext = - (ch.IsDigit() ? CSCPQueryDialog :: ENumeric : CSCPQueryDialog :: EAlphaNumeric); + /*TChar ch = static_cast(newCodeBuffer[0]); + + CSCPQueryDialog :: TKeypadContext lKPContext = + (ch.IsDigit() ? CSCPQueryDialog :: ENumeric : CSCPQueryDialog :: EAlphaNumeric);*/ TRAP( err, ret = RunDialogL( verifyCodeBuffer, bConfig, @@ -915,8 +1007,7 @@ maxLen, R_SECUI_TEXT_VERIFY_NEW_SEC_CODE, NULL, - ecSupport, - lKPContext)); + ecSupport)); } if ( ( !ret ) || ( err != KErrNone ) || ( ret == ESecUiEmergencyCall ) ) @@ -1070,8 +1161,28 @@ codeBuf.Zero(); ret = theParams->Get( KSCPParamPassword, codeBuf ); + if ( ret == KErrNone ) { + TInt lResFile = 0; + TFileName resFile; + resFile.Copy( KDriveZ ); + resFile.Append( KSCPTimestampPluginResFilename ); + BaflUtils :: NearestLanguageFile( CCoeEnv :: Static()->FsSession(), resFile ); + lResFile = CCoeEnv :: Static()->AddResourceFileL(resFile); + + CAknNoteDialog* lNoteDlg = new (ELeave) CAknNoteDialog(CAknNoteDialog :: ENoTone, CAknNoteDialog :: ELongTimeout); + CleanupStack :: PushL(lNoteDlg); + + HBufC* lExpNoteMsg = CEikonEnv :: Static()->AllocReadResourceLC(R_SET_SEC_CODE_AGING); + lNoteDlg->SetTextL(lExpNoteMsg->Des()); + + lNoteDlg->ExecuteLD(R_DIALOG_WARNING); + CleanupStack :: PopAndDestroy(1); //lExpNoteMsg + CleanupStack :: Pop(1); //lNoteDlg + + CCoeEnv :: Static()->DeleteResourceFile( lResFile ); + TSCPSecCode newDOSCode; ret = GetNewCodeAndChange( codeBuf, KSCPForcedChange, &newDOSCode ); @@ -1233,13 +1344,55 @@ CleanupStack :: PopAndDestroy(lRepository); return lRet; } - + TInt currentLawmoState(0); + Dprint( (_L("CSCPClient::lawmo cenrep") )); + CRepository* crep = CRepository::NewLC( KCRUidDeviceManagementInternalKeys ); + TInt reterr = crep->Get( KLAWMOPhoneLock, currentLawmoState ); + Dprint( (_L("CSCPClient::lawmo cenrep done") )); + if(reterr != KErrNone) + { + Dprint(_L("[RSCPClient]-> ERROR: Unable to perform get on CenRep lawmo, lErr=%d"), lRet); + CleanupStack :: PopAndDestroy(crep); + return reterr; + } HBufC* codeHBuf = HBufC :: NewLC(KSCPPasscodeMaxLength + 1); HBufC8* addParamsHBuf = HBufC8 :: NewLC(KSCPMaxTARMNotifParamLen); TPtr codeBuffer = codeHBuf->Des(); TPtr8 addParams = addParamsHBuf->Des(); + if(currentLawmoState!=KLockedbyLawmo) + { + // rundialog with a new resource file + Dprint((_L("[RSCPClient]-> lawmo current state !=30"))); + TBuf<255> serverId; + serverId.Zero(); + reterr = crep->Get( KLAWMOfactoryDmServerName, serverId ); + Dprint( (_L("RSCPClient::SetSecurityCode serverid: %s"), serverId.PtrZ() )); + HBufC* prompt = StringLoader::LoadLC(R_SCP_LAWMO_LOCKED, serverId); + Dprint( (_L("RSCPClient::SetSecurityCode stringval: %s"), (prompt->Des()).PtrZ() )); - if(lDefCode == 0) { + lRet = RunDialogL(codeBuffer, aButtonsShown, KSCPPasscodeMinLength, KSCPPasscodeMaxLength, + 0, prompt, aECSSupport); + if((lRet) && (lRet != ESecUiEmergencyCall) && (lRet != EAknSoftkeyEmergencyCall)) + { + Dprint(_L("[RSCPClient]-> INFO: LL User has updated the lock code...")); + + lRet = SendReceive( ESCPServAuthenticateS60, TIpcArgs( &codeBuffer, &aPassword, &addParams, aFlags)); + + Dprint((_L("[RSCPClient]-> INFO: LL addParams.Length()=%d")), addParams.Length()); + Dprint((_L("[RSCPClient]-> INFO: LL lRet=%d")), lRet); + } + else + { + switch(lRet) + { + case 0: + lRet = KErrCancel; + break; + } + } + CleanupStack::PopAndDestroy(1); + } + else if(lDefCode == 0) { Dprint(_L("[RSCPClient]-> INFO: Default lock code has been set already by the user...")); lRet = RunDialogL(codeBuffer, aButtonsShown, KSCPPasscodeMinLength, KSCPPasscodeMaxLength, @@ -1353,7 +1506,13 @@ if(lTempRet == KErrNone) { CSCPParamObject* outParams = NULL; - ProcessServerCommandsL(addParams, &outParams); + /* + * aECSSupport when passed to ProcessServerCommandsL decides if the expiry note and subsequently change device lock + * code has to be shown or not. Normally if the lock code has expired, the same has to be prompted from the user and + * has to be done only during device unlock. aECSSupport value is being passed to ensure that new lock code is prompted + * only during device unlock. + */ + ProcessServerCommandsL(addParams, &outParams, !aECSSupport); if(outParams != NULL) { TSCPSecCode newSecCode; @@ -1369,7 +1528,7 @@ CleanupStack :: PopAndDestroy(tmp); } - CleanupStack :: PopAndDestroy(3); // repository, addParamsHBuf, codeHBuf + CleanupStack :: PopAndDestroy(4); // repository * 2, addParamsHBuf, codeHBuf Dprint(_L("[RSCPClient]-> SetSecurityCodeL() <<< lRet=%d"), lRet); return lRet; }