securitydialogs/SecUi/Src/SecUiSecuritySettings.cpp
changeset 59 881d92421467
parent 53 25dd1e8b2663
child 63 989397f9511c
--- a/securitydialogs/SecUi/Src/SecUiSecuritySettings.cpp	Fri Sep 03 16:31:27 2010 +0300
+++ b/securitydialogs/SecUi/Src/SecUiSecuritySettings.cpp	Tue Sep 28 14:03:54 2010 +0300
@@ -400,22 +400,23 @@
 
 
 		/* TODO not sure if needs to check against the typed, or the hashed */
-		/*
     RArray<TDevicelockPolicies> aFailedPolicies;
-    TDevicelockPolicies failedPolicy;
     TInt retLockcode = KErrNone;
     RMobilePhone::TMobilePassword aISACode;
     TInt scpFlags = 0;
     RDEBUG("scpClient.VerifyCurrentLockcode", 0);
-    // this validate on ISA . No need to do iPhone.VerifySecurityCode
+    // get hashed code, to verify that message is different than code
+    RSCPClient scpClient;
+    TInt ret = scpClient.Connect();
+    RDEBUG("ret", ret);
     retLockcode = scpClient.VerifyCurrentLockcode(aRemoteLockCode, aISACode, aFailedPolicies, scpFlags);
     RDEBUG("retLockcode", retLockcode);
+ 	  scpClient.Close();
 
     RDEBUG("aISACode", 0);
     RDEBUGSTR(aISACode);
-		*/
 
-    securityCode = aRemoteLockCode;
+    securityCode = aISACode;	// aRemoteLockCode;
     RDEBUG( "EMobilePhoneVerifySecurityCode", EMobilePhoneVerifySecurityCode );
     iWait->SetRequestType(EMobilePhoneVerifySecurityCode);
     RDEBUG( "VerifySecurityCode", 0 );
@@ -600,19 +601,23 @@
         case KErrAccessDenied:
             {
             // code was entered erroneously
+    				RDEBUG("KErrAccessDenied", KErrAccessDenied);
             return ChangeSimSecurityL();
             }
         case KErrGsmSSPasswordAttemptsViolation:
         case KErrLocked:
             {
+    				RDEBUG("KErrLocked", KErrLocked);
             return ChangeSimSecurityL();
             }
         case KErrAbort:
             {
+    				RDEBUG("KErrAbort", KErrAbort);
             return EFalse;
             }
         default:
             {
+    				RDEBUG("default", status);
             ShowErrorNoteL(status);
             return ChangeSimSecurityL();
             }
@@ -1454,6 +1459,10 @@
             titleTr.Append(_L("SCP server doesn't support this UID"));
             title.Append(_L("SCP server doesn't support this UID"));
             break;
+        case KErrGsm0707SIMPuk1Required:
+            titleTr.Append(_L("KErrGsm0707SIMPuk1Required"));
+            title.Append(_L("Puk 1 Required"));
+            break;
 
         default: // " "
             titleTr.Append(_L("Specific Error"));
@@ -1590,6 +1599,7 @@
 EXPORT_C TInt CSecuritySettings::ChangePinParamsL(RMobilePhone::TMobilePassword aOldPassword, RMobilePhone::TMobilePassword aNewPassword, TInt aFlags, TDes& aCaption,
         TInt aShowError)
     {
+    askChangePinParamsL:
     RDEBUG("aFlags", aFlags);
     RDEBUG("aOldPassword", 0);
     RDEBUGSTR(aOldPassword);
@@ -1650,7 +1660,13 @@
         res = KErrNone;
         }
 #endif
-
+		if(res==KErrGsm0707SIMPuk1Required)
+				{
+        CSecurityHandler* handler = new (ELeave) CSecurityHandler(iPhone);
+        CleanupStack::PushL(handler);
+        handler->HandleEventL(RMobilePhone::EPuk1Required);
+        CleanupStack::PopAndDestroy(handler); // handler    
+				}
     User::LeaveIfError(res);
 
     if (lockInfo.iSetting == RMobilePhone::ELockSetDisabled)
@@ -1720,7 +1736,9 @@
         if (res != KErrNone)
             {
             ShowResultNoteL(res, CAknNoteDialog::EErrorTone);
-            return res; // not sure if it's wise to exit now.
+		        newPassword = _L("");
+		        oldPassword = _L("");
+            goto askChangePinParamsL;
             }
 
         newPassword = _L("");
@@ -1800,8 +1818,7 @@
             {
             // code was entered erroneously. This is strange, because it was verified before
             ShowResultNoteL(R_CODE_ERROR, CAknNoteDialog::EErrorTone);
-            ChangePinParamsL(_L(""), _L(""), aFlags, aCaption, aShowError);
-            break;
+            goto askChangePinParamsL;
             }
         case KErrGsmSSPasswordAttemptsViolation:
         case KErrLocked:
@@ -1821,9 +1838,9 @@
             }
         default:
             {
+            RDEBUG("default", res);
             ShowErrorNoteL(res);
-            ChangePinParamsL(_L(""), _L(""), aFlags, aCaption, aShowError);
-            break;
+            goto askChangePinParamsL;
             }
         }
     return res;
@@ -2226,6 +2243,7 @@
 EXPORT_C TInt CSecuritySettings::ChangeSecCodeParamsL(RMobilePhone::TMobilePassword aOldPassword, RMobilePhone::TMobilePassword aNewPassword, TInt aFlags, TDes& aCaption,
         TInt aShowError)
     {
+    askChangeSecCodeParamsL:
     RDEBUG("aFlags", aFlags);
     RDEBUG("aShowError", aShowError);
     /*****************************************************
@@ -2246,17 +2264,19 @@
 		{
        RArray<TDevicelockPolicies> aFailedPolicies;
        TDevicelockPolicies failedPolicy;
-       TInt retLockcode = KErrNone;
        RSCPClient scpClient;
-       retLockcode = scpClient.Connect();
-       RDEBUG( "retLockcode", retLockcode );
-       if(retLockcode == KErrNone )
+       res = scpClient.Connect();
+       RDEBUG( "res", res );
+       if(res == KErrNone )
        	{
 	       RDEBUG( "scpClient.VerifyNewLockcodeAgainstPolicies", 0 );
-	       retLockcode = scpClient.IsLockcodeChangeAllowedNow( aFailedPolicies );
-	       RDEBUG( "retLockcode", retLockcode );
+	       TBool changeAllowed = scpClient.IsLockcodeChangeAllowedNow( aFailedPolicies );
+	       RDEBUG( "bool changeAllowed", changeAllowed );
 	       RDEBUG( "aFailedPolicies.Count()", aFailedPolicies.Count() );
-	       res = retLockcode;
+	       if(changeAllowed)
+	       	res = KErrNone;
+	       else
+	       	res = KErrAccessDenied;
 	       for(TInt i=0; i<aFailedPolicies.Count(); i++)
 		       {
 		       failedPolicy = aFailedPolicies[i];
@@ -2265,7 +2285,7 @@
 		       res = KErrTDevicelockPolicies + failedPolicy;
 		       }
 	     	 scpClient.Close();
-	     	 if(retLockcode!=KErrNone)
+	     	 if(res!=KErrNone)
 	     	 		{
 	     	 		ShowResultNoteL(res, CAknNoteDialog::EErrorTone);
      	 	 		return res;
@@ -2273,7 +2293,7 @@
 				}
 			else
 				{
-					RDEBUG( "failed connecting to SCP", retLockcode );
+					RDEBUG( "failed connecting to SCP", res );
 					// what to do? let's assume that we don't need special policies.
 				}
 		}
@@ -2385,16 +2405,15 @@
 			 // In fact this is needed for the case when newPassword is provided.
        RArray<TDevicelockPolicies> aFailedPolicies;
        TDevicelockPolicies failedPolicy;
-       TInt retLockcode = KErrNone;
        RSCPClient scpClient;
-       retLockcode = scpClient.Connect();
-       RDEBUG( "retLockcode", retLockcode );
-       if(retLockcode == KErrNone )
+       res = scpClient.Connect();
+       RDEBUG( "res", res );
+       if(res == KErrNone )
        	{
 	       RDEBUG( "scpClient.VerifyNewLockcodeAgainstPolicies", 0 );
 	       RDEBUGSTR( newPassword );
-	       retLockcode = scpClient.VerifyNewLockcodeAgainstPolicies( newPassword, aFailedPolicies );
-	       RDEBUG( "retLockcode", retLockcode );
+	       res = scpClient.VerifyNewLockcodeAgainstPolicies( newPassword, aFailedPolicies );
+	       RDEBUG( "res", res );
 	       RDEBUG( "aFailedPolicies.Count()", aFailedPolicies.Count() );
 	       for(TInt i=0; i<aFailedPolicies.Count(); i++)
 		       {
@@ -2407,140 +2426,96 @@
 				}
 			else
 				{
-					RDEBUG( "failed connecting to SCP", retLockcode );
+					RDEBUG( "failed connecting to SCP", res );
 					// what to do? let's assume that we don't need special policies.
 				}
 
     // change code
     RDEBUG("res", res);
-    if (res == KErrNone)
-        {
-        passwords.iOldPassword = oldPassword;
-        passwords.iNewPassword = newPassword;
-        iWait->SetRequestType(EMobilePhoneChangeSecurityCode);
-        RDEBUG("ChangeSecurityCode", 0);
-        iPhone.ChangeSecurityCode(iWait->iStatus, secCodeType, passwords);
-        RDEBUG("WaitForRequestL", 0);
-        res = iWait->WaitForRequestL();
-        RDEBUG("WaitForRequestL res", res);
-#ifdef __WINS__
-        if (res == KErrNotSupported)
-            res = KErrNone;
-#endif
-
-        if (res == KErrNone && 1 == 0) // TODO not possible to enable because it asks code again
-            {
-            RMobilePhone::TMobilePhoneLock lockType = RMobilePhone::ELockPhoneDevice;
-            RMobilePhone::TMobilePhoneLockSetting lockChangeSetting = RMobilePhone::ELockSetEnabled;
-            iWait->SetRequestType(EMobilePhoneSetLockSetting);
-            RDEBUG("SetLockSetting", 0);
-            iPhone.SetLockSetting(iWait->iStatus, lockType, lockChangeSetting);
-            RDEBUG("WaitForRequestL", 0);
-            res = iWait->WaitForRequestL();
-            RDEBUG("WaitForRequestL res", res);
-#ifdef __WINS__
-            if (res == KErrNotSupported || res == KErrTimedOut)
-                res = KErrNone;
-#endif
-            }
-        }
+    // let's see if TARM rejects it
+    if(res==KErrNone)
+	    {
+	    // Send the changed code to the SCP server, even with device lock enhancements.
+	    RDEBUG("scpClient.Connect", 0);
+	    RSCPClient scpClient;
+	    TBuf<32> newScpCode;
+	    TBuf<32> oldScpCode;
+	    newScpCode.Copy(newPassword);
+	    oldScpCode.Copy(oldPassword);
+	    if (scpClient.Connect() == KErrNone)
+	        {
+	        RDEBUG("scpClient.StoreLockcode", 0);
+	        // this is the old method. Obsolete now
+	        // scpClient.StoreCode( newCode );
+	        RArray<TDevicelockPolicies> aFailedPolicies;
+	        TDevicelockPolicies failedPolicy;
+	        RDEBUG("newScpCode", 0);
+	        RDEBUGSTR( newScpCode );
+	        RDEBUG("oldScpCode", 0);
+	        RDEBUGSTR( oldScpCode );
+	        RDEBUG( "StoreLockcode", 0 );
+	        res = scpClient.StoreLockcode(newScpCode, oldScpCode, aFailedPolicies);	// this does iPhone.ChangeSecurityCode
+	        RDEBUG( "res", res );
+	        RDEBUG( "KErrAccessDenied", KErrAccessDenied );
+					#ifdef __WINS__
+	        if (res == KErrNotSupported)
+	            res = KErrNone;
+					#endif
+	        RDEBUG( "aFailedPolicies.Count()", aFailedPolicies.Count() );
+	        for (TInt i = 0; i < aFailedPolicies.Count(); i++)
+	            {
+	            failedPolicy = aFailedPolicies[i];
+	            RDEBUG( "failedPolicy", failedPolicy );
+	            }
+	        scpClient.Close();
+	        // Don't know what to do if TARM fails. Hopefully it was stopped at typing, as well as VerifyNewLockcodeAgainstPolicies
+	      	switch (res)
+		        {
+		        case KErrNone:
+		            {
+	            	RDEBUG( "showing R_SECURITY_CODE_CHANGED_NOTE", R_SECURITY_CODE_CHANGED_NOTE );
+	            	ShowResultNoteL(R_SECURITY_CODE_CHANGED_NOTE, CAknNoteDialog::EConfirmationTone);
+		            break;
+		          	}
+		        case KErrAccessDenied:	// TARM has wrong UID
+		            {
+	          		res = KErrTDevicelockPolicies+EDevicelockTotalPolicies+1;
+	          		RDEBUG( "res", res );
+	          		ShowResultNoteL(res, CAknNoteDialog::EConfirmationTone);
+	          		res = KErrAccessDenied;	// no reason for retry, as it will fail again and again
+	          		break;
+	          		}
+		        case KErrGsmSSPasswordAttemptsViolation:
+		        case KErrLocked:
+		            {
+	          		RDEBUG( "KErrLocked", KErrLocked );
+		            ShowResultNoteL(R_SEC_BLOCKED, CAknNoteDialog::EErrorTone);
+		            goto askChangeSecCodeParamsL;
+		            // break;
+		            }
+		        case KErrGsm0707IncorrectPassword:
+		            {
+		            // code was entered erroneously
+	          		RDEBUG( "KErrGsm0707IncorrectPassword", KErrGsm0707IncorrectPassword );
+		            ShowResultNoteL(R_CODE_ERROR, CAknNoteDialog::EErrorTone);
+		            goto askChangeSecCodeParamsL;
+		            // break;
+		            }
+		        case KErrAbort:
+		            {
+	          		RDEBUG( "KErrAbort", KErrAbort );
+		            break;
+		            }
+		        default:
+		            {
+		            ShowErrorNoteL(res);
+		            goto askChangeSecCodeParamsL;
+		            // break;
+		            }
+		          }	// switch
+	        }	// scpClient.Connect
+	    }
 
-    RDEBUG("res", res);
-    switch (res)
-        {
-        case KErrNone:
-            {
-            // code changed ... unless TARM rejects it
-                {
-                // Send the changed code to the SCP server, even with device lock enhancements.
-                RDEBUG("scpClient.Connect", 0);
-                RSCPClient scpClient;
-                TSCPSecCode newScpCode;
-                TSCPSecCode oldScpCode;
-                newScpCode.Copy(newPassword);
-                oldScpCode.Copy(oldPassword);
-                if (scpClient.Connect() == KErrNone)
-                    {
-                    RDEBUG("scpClient.StoreLockcode", 0);
-                    // this is the old method. Obsolete now
-                    // scpClient.StoreCode( newCode );
-                    RArray<TDevicelockPolicies> aFailedPolicies;
-                    TDevicelockPolicies failedPolicy;
-                    TInt retLockcode = KErrNone;
-                    RDEBUG("newScpCode", 0);
-                    RDEBUGSTR( newScpCode );
-                    RDEBUG("oldScpCode", 0);
-                    RDEBUGSTR( oldScpCode );
-                    retLockcode = scpClient.StoreLockcode(newScpCode, oldScpCode, aFailedPolicies);
-                    RDEBUG( "retLockcode", retLockcode );
-                    RDEBUG( "KErrAccessDenied", KErrAccessDenied );
-                    RDEBUG( "aFailedPolicies.Count()", aFailedPolicies.Count() );
-                    for (TInt i = 0; i < aFailedPolicies.Count(); i++)
-                        {
-                        failedPolicy = aFailedPolicies[i];
-                        RDEBUG( "failedPolicy", failedPolicy );
-                        }
-                    // Don't know what to do if TARM fails. Hopefully it was stopped at typing, as well as VerifyNewLockcodeAgainstPolicies
-                    // The code is already changed in iPhone !
-                    // For now, just undo the changed password
-                    if(retLockcode!=KErrNone)
-                    	{
-                    	RDEBUG("Undo password change because retLockcode", retLockcode);
-                    	if(retLockcode==KErrAccessDenied)	// this happens if CSCPSession::HandleAuthenticationMessageL doesn't include the UID
-                    		retLockcode = KErrTDevicelockPolicies+EDevicelockTotalPolicies+1;
-                    	ShowResultNoteL(retLockcode, CAknNoteDialog::EConfirmationTone);
-                    	
-                    	// go back to previous password.
-	           	        passwords.iOldPassword = newPassword;
-							        passwords.iNewPassword = oldPassword;
-							        iWait->SetRequestType(EMobilePhoneChangeSecurityCode);
-							        RDEBUG("ChangeSecurityCode", 0);
-							        iPhone.ChangeSecurityCode(iWait->iStatus, secCodeType, passwords);
-							        RDEBUG("WaitForRequestL", 0);
-							        res = iWait->WaitForRequestL();	// this can't fail. ISA is always allowing to undo the password change.
-							        RDEBUG("WaitForRequestL res", res);
-											#ifdef __WINS__
-							        if (res == KErrNotSupported)
-							            res = KErrNone;
-											#endif
-	                    res = retLockcode;
-	                    }
-                    scpClient.Close();
-                    }
-                if(res==KErrNone)
-                	{
-                	RDEBUG( "showing R_SECURITY_CODE_CHANGED_NOTE", R_SECURITY_CODE_CHANGED_NOTE );
-                	ShowResultNoteL(R_SECURITY_CODE_CHANGED_NOTE, CAknNoteDialog::EConfirmationTone);
-                	}
-                }
-            break;
-            }
-        case KErrGsmSSPasswordAttemptsViolation:
-        case KErrLocked:
-            {
-            ShowResultNoteL(R_SEC_BLOCKED, CAknNoteDialog::EErrorTone);
-            ChangeSecCodeParamsL(aOldPassword, aNewPassword, aFlags, aCaption, aShowError);
-            break;
-            }
-        case KErrGsm0707IncorrectPassword:
-        case KErrAccessDenied:
-            {
-            // code was entered erroneously
-            ShowResultNoteL(R_CODE_ERROR, CAknNoteDialog::EErrorTone);
-            ChangeSecCodeParamsL(aOldPassword, aNewPassword, aFlags, aCaption, aShowError);
-            break;
-            }
-        case KErrAbort:
-            {
-            break;
-            }
-        default:
-            {
-            ShowErrorNoteL(res);
-            ChangeSecCodeParamsL(aOldPassword, aNewPassword, aFlags, aCaption, aShowError);
-            break;
-            }
-        } // switch
     RDEBUG("return res", res);
     return res;
     }
@@ -2550,6 +2525,7 @@
 // the params are changed in the settings,. This only asks for password.
 EXPORT_C TInt CSecuritySettings::ChangeAutoLockPeriodParamsL(TInt aPeriod, RMobilePhone::TMobilePassword aOldPassword, TInt aFlags, TDes& aCaption, TInt aShowError)
     {
+    askChangeAutoLockPeriodParamsL:
     RDEBUG("aPeriod", aPeriod);
     RDEBUG("aFlags", aFlags);
     /*****************************************************
@@ -2678,22 +2654,26 @@
             RDEBUG("KErrLocked", KErrLocked)
             ;
             ShowResultNoteL(KErrLocked, CAknNoteDialog::EErrorTone); // the old code didn't show messages
-            return ChangeAutoLockPeriodParamsL(oldPeriod, aOldPassword, aFlags, aCaption, aShowError); // ask again
+            goto askChangeAutoLockPeriodParamsL; // ask again
         case KErrGsm0707IncorrectPassword:
+            RDEBUG("KErrGsm0707IncorrectPassword", KErrGsm0707IncorrectPassword)
+            ShowResultNoteL(R_CODE_ERROR, CAknNoteDialog::EErrorTone); // the old code didn't show messages
+            goto askChangeAutoLockPeriodParamsL; // ask again
         case KErrAccessDenied:
             RDEBUG("KErrAccessDenied", KErrAccessDenied)
             ;
             // code was entered erroneously
             ShowResultNoteL(KErrAccessDenied, CAknNoteDialog::EErrorTone); // the old code didn't show messages
-            return ChangeAutoLockPeriodParamsL(oldPeriod, aOldPassword, aFlags, aCaption, aShowError); // ask again
+            goto askChangeAutoLockPeriodParamsL; // ask again
         case KErrAbort:
             // User pressed "cancel" in the code query dialog.
-            return oldPeriod;
+            RDEBUG("KErrAbort", KErrAbort)
+            return KErrAbort;
         default:
             RDEBUG("default", status)
             ;
             ShowResultNoteL(status, CAknNoteDialog::EErrorTone); // the old code didn't show messages
-            return ChangeAutoLockPeriodParamsL(oldPeriod, aOldPassword, aFlags, aCaption, aShowError); // ask again
+            goto askChangeAutoLockPeriodParamsL; // ask again
         }
     RDEBUG("aPeriod", aPeriod);
     return aPeriod;