--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/policymanagement/dmutilserver/src/DMUtilSession.cpp Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,532 @@
+/*
+* Copyright (c) 2000 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Implementation of policymanagement components
+*
+*/
+
+
+// INCLUDES
+
+#include "DMUtilSession.h"
+#include "ACLStorage.h"
+#include "DMUtilServer.h"
+#include "policymnginternalpskeys.h"
+#include "debug.h"
+
+#include "CentRepToolClient.h"
+
+
+#include <e32svr.h>
+#include <centralrepository.h>
+
+#include <coreapplicationuisdomainpskeys.h>
+
+
+
+#include <e32property.h>
+#include <f32file.h>
+
+#ifdef RD_MULTIPLE_DRIVE
+#include <driveinfo.h>
+#endif //RD_MULTIPLE_DRIVEs
+
+// CONSTANTS
+#ifndef RD_MULTIPLE_DRIVE
+const TUint8 KMMCDriveLetter = 'e';
+#endif
+_LIT( MDriveColon, ":");
+_LIT( KMMCEraseFlagFileName, "fmmc.dat");
+
+// MACROS
+
+
+// DATA TYPES
+// FUNCTION PROTOTYPES
+// FORWARD DECLARATIONS
+
+// DMUtilSession.cpp
+//
+
+// ----------------------------------------------------------------------------------------
+// CDMUtilSession::CDMUtilSession
+// ----------------------------------------------------------------------------------------
+CDMUtilSession::CDMUtilSession()
+ {
+ RDEBUG("CDMUtilSession::CDMUtilSession");
+ }
+
+// ----------------------------------------------------------------------------------------
+// CDMUtilSession::Server
+// ----------------------------------------------------------------------------------------
+CDMUtilServer& CDMUtilSession::Server()
+ {
+ return *static_cast<CDMUtilServer*>(const_cast<CServer2*>(CSession2::Server()));
+ }
+
+// ----------------------------------------------------------------------------------------
+// CDMUtilSession::CreateL
+// 2nd phase construct for sessions - called by the CServer framework
+// ----------------------------------------------------------------------------------------
+void CDMUtilSession::CreateL()
+{
+ RDEBUG("CDMUtilSession::CreateL");
+
+ iACLStorage = CDMUtilServer::ACLStorage();
+}
+
+// ----------------------------------------------------------------------------------------
+// CDMUtilSession::~CDMUtilSession
+// ----------------------------------------------------------------------------------------
+CDMUtilSession::~CDMUtilSession()
+{
+ RDEBUG("CDMUtilSession::~CDMUtilSession");
+}
+
+// ----------------------------------------------------------------------------------------
+// CDMUtilSession::PerformRFS
+// ----------------------------------------------------------------------------------------
+TInt CDMUtilSession::PerformRFSL()
+{
+ RDEBUG("CDMUtilSession: Restory factory setting operation started");
+ //RFS tasks in DMUtilServer
+ // 1. Update RFS flag status
+ // 2. Reset policy management state flags
+
+ //update RFS flag
+ CRepository* cenrep = CRepository::NewLC( KCRUidPolicyManagementUtilInternalKeys);
+
+ TInt currentValue = 0;
+ TInt err = cenrep->Get( KRFSCounterKey, currentValue);
+ if ( err == KErrNone)
+ {
+ cenrep->Set( KRFSCounterKey, ++currentValue);
+ RProperty::Set( KPolicyMngProperty, KFactoryResetCounter, currentValue);
+ }
+
+ //reset policy management state flags
+ cenrep->Set( KPolicyChangeCounter, 0);
+ RProperty::Set( KPolicyMngProperty, KPolicyChangedCounter, 0);
+
+ cenrep->Set( KTerminalSecurityStateKey, 0);
+ SetIndicatorStateL( cenrep);
+
+ CleanupStack::PopAndDestroy( cenrep);
+
+ RDEBUG("CDMUtilSession: Restory factory setting operation finished");
+
+
+ return KErrNone;
+}
+
+
+// ----------------------------------------------------------------------------------------
+// CDMUtilSession::ServiceL
+// ----------------------------------------------------------------------------------------
+void CDMUtilSession::ServiceL(const RMessage2& aMessage)
+{
+ TRAPD(err,DispatchMessageL(aMessage));
+ aMessage.Complete(err);
+}
+
+// ----------------------------------------------------------------------------------------
+// CDMUtilSession::DispatchMessageL
+// ----------------------------------------------------------------------------------------
+void CDMUtilSession::DispatchMessageL(const RMessage2& aMessage)
+{
+ RDEBUG_2("CDMUtilSession::ServiceL; %d",aMessage.Function());
+
+ switch ( aMessage.Function())
+ {
+ case ERemoveACL:
+ case ESetACL:
+ case EAddACL:
+ {
+ //read URI...
+ //check for aMessage Length if message length is negative
+ //then leave the Dispatch MessageL with KErrUnderFlow
+
+ TInt minlength = aMessage.GetDesLength(0);
+ if(minlength < 0)
+ User::Leave(KErrUnderflow);
+
+ HBufC8* uri = HBufC8::NewLC( aMessage.GetDesLength(0));
+ TPtr8 uriPtr = uri->Des();
+ aMessage.ReadL(0, uriPtr, 0);
+
+ if ( aMessage.Function() == ERemoveACL )
+ {
+ RDEBUG(" DispatchMessageL case ERemoveACL");
+ TBool restoreDefaults;
+ TPckg<TBool> restoreDefaultsPack( restoreDefaults);
+ aMessage.ReadL( 1, restoreDefaultsPack, 0);
+
+ iACLStorage->RemoveACL( *uri, restoreDefaults);
+ }
+ else
+ {
+ //destination
+ TACLDestination dest;
+ TPckg<TACLDestination> destPack( dest);
+ aMessage.ReadL(1, destPack, 0);
+
+ //ACL commands
+ TAclCommands command;
+ TPckg<TAclCommands> commandPack( command);
+ aMessage.ReadL(2, commandPack, 0);
+
+ if ( aMessage.Function() == ESetACL)
+ {
+ RDEBUG(" DispatchMessageL case ESetACL");
+ iACLStorage->SetACLForNodeL( *uri, dest, command);
+ }
+ else
+ {
+ RDEBUG(" DispatchMessageL case EAddACL");
+ iACLStorage->AddACLForNodeL( *uri, dest, command);
+ }
+ }
+
+ CleanupStack::PopAndDestroy( uri);
+ }
+ break;
+ case EMngSessionCertificate:
+ {
+ RDEBUG(" DispatchMessageL case EMngSessionCertificate");
+ //certificate information
+ TCertInfo certInfo;
+ TPckg<TCertInfo> certInfoPack( iACLStorage->MngSessionCertificate());
+ aMessage.ReadL(0, certInfoPack, 0);
+ }
+ break;
+ case ENewDMSession:
+ {
+ TInt minlength = aMessage.GetDesLength(1);
+ if(minlength < 0)
+ User::Leave(KErrUnderflow);
+
+
+ RDEBUG(" DispatchMessageL case ENewDMSession");
+ //certificate information
+ TCertInfo certInfo;
+ TPckg<TCertInfo> certInfoPack( certInfo);
+ aMessage.ReadL(0, certInfoPack, 0);
+
+ //certificate information
+ TPtr8 serverid = HBufC8::NewLC( aMessage.GetDesLength(1))->Des();
+ aMessage.ReadL(1, serverid, 0);
+
+ iACLStorage->NewSessionL( certInfo, serverid);
+ CleanupStack::PopAndDestroy(); //HBufC8
+ }
+ break;
+ case EFlush:
+ {
+ RDEBUG(" DispatchMessageL case EFlush");
+ iACLStorage->SaveACLL();
+ }
+ break;
+ case EGetDMSessionCertInfo:
+ {
+ RDEBUG(" DispatchMessageL case EGetDMSessionCertInfo");
+ //get cert info
+ TCertInfo certInfo;
+ User::LeaveIfError( Server().ACLStorage()->CertInfo( certInfo ) );
+
+ //write cert info to client side
+ TPckg<TCertInfo> certInfoPack( certInfo );
+ aMessage.WriteL(0, certInfoPack );
+ }
+ break;
+ case EGetDMSessionServerId:
+ {
+ RDEBUG(" DispatchMessageL case EGetDMSessionServerId");
+ //get server id
+ HBufC8 * serverid = Server().GetServerIDL();
+ CleanupStack::PushL( serverid);
+
+ //write server id to client side
+ aMessage.WriteL(0, *serverid);
+
+ CleanupStack::PopAndDestroy( serverid);
+ }
+ break;
+ case EUpdatePolicyMngStatusFlags:
+ {
+ RDEBUG(" DispatchMessageL case EUpdatePolicyMngStatusFlags");
+ KPolicyMngStatusFlags policyMngStatus;
+ TPckg<KPolicyMngStatusFlags> policyMngStatusPack( policyMngStatus);
+ aMessage.ReadL(0, policyMngStatusPack, 0);
+
+ UpdateStatusFlagsL( policyMngStatus);
+ }
+ break;
+ case EPerformDMUtilRFS:
+ {
+ RDEBUG(" DispatchMessageL case EPerformDMUtilRFS");
+ PerformRFSL();
+ }
+ break;
+ case EMarkMMCWipe:
+ {
+ MarkMMCWipeL();
+ }
+ default:
+ break;
+ }
+}
+
+
+// ----------------------------------------------------------------------------------------
+// CDMUtilServer::UpdateStatusFlagsL
+// Define publish&subscribe properties
+// ----------------------------------------------------------------------------------------
+
+void CDMUtilSession::UpdateStatusFlagsL( KPolicyMngStatusFlags aUpdateCommand)
+{
+ RDEBUG("CDMUtilSession::UpdateStatusFlagsL()");
+ //set initial values for properties
+ CRepository* cenrep = CRepository::NewLC( KCRUidPolicyManagementUtilInternalKeys);
+
+ switch ( aUpdateCommand )
+ {
+ case EPolicyChanged:
+ {
+ RDEBUG(" UpdateStatusFlagsL() case EPolicyChanged");
+ TInt currentValue = 0;
+ User::LeaveIfError( cenrep->Get( KPolicyChangeCounter, currentValue));
+ User::LeaveIfError( cenrep->Set( KPolicyChangeCounter, ++currentValue));
+
+ User::LeaveIfError( RProperty::Set( KPolicyMngProperty, KPolicyChangedCounter, currentValue));
+
+ }
+ break;
+ case ETerminalSecurityActive:
+ RDEBUG(" UpdateStatusFlagsL() case ETerminalSecurityActive");
+ User::LeaveIfError( cenrep->Set( KTerminalSecurityStateKey, 1));
+ SetIndicatorStateL( cenrep);
+ break;
+ case ETerminalSecurityDeactive:
+ RDEBUG(" UpdateStatusFlagsL() case ETerminalSecurityDeactive");
+ User::LeaveIfError( cenrep->Set( KTerminalSecurityStateKey, 0));
+ SetIndicatorStateL( cenrep);
+ break;
+ default:
+ break;
+ }
+
+
+ CleanupStack::PopAndDestroy( cenrep);
+}
+
+
+// ----------------------------------------------------------------------------------------
+// CDMUtilServer::UpdateSessionInfoL
+// ----------------------------------------------------------------------------------------
+void CDMUtilSession::SetIndicatorStateL( CRepository * aCenRep)
+{
+ RDEBUG8_2("CDMUtilSession::SetIndicatorStateL() 0x%x", aCenRep);
+ //get terminal security and management state from centrep
+ TInt terminalSecurity = 0;
+ TInt err( KErrNone );
+
+ if ( !aCenRep)
+ {
+ CRepository* rep = CRepository::NewLC( KCRUidPolicyManagementUtilInternalKeys);
+ err = rep->Get( KTerminalSecurityStateKey, terminalSecurity);
+ RDEBUG8_2("CDMUtilSession::SetIndicatorStateL aCenRep not found ERROR: %d",err);
+ CleanupStack::PopAndDestroy( rep);
+ }
+ else
+ {
+ err = aCenRep->Get( KTerminalSecurityStateKey, terminalSecurity);
+ RDEBUG8_2("CDMUtilSession::SetIndicatorStateL aCenRep ERROR: %d",err);
+ }
+
+ //set indicator state...
+ if ( CDMUtilServer::iManagementActive )
+ {
+ RDEBUG(" iManagementActive is ETrue -> ECoreAppUIsTarmMngActiveIndicatorOn");
+ err = RProperty::Set( KPSUidCoreApplicationUIs, KCoreAppUIsTarmIndicator, ECoreAppUIsTarmMngActiveIndicatorOn);
+ }
+ else if ( terminalSecurity )
+ {
+ RDEBUG(" terminalSecurity is ETrue -> ECoreAppUIsTarmTerminalSecurityOnIndicatorOn");
+ err = RProperty::Set( KPSUidCoreApplicationUIs, KCoreAppUIsTarmIndicator, ECoreAppUIsTarmTerminalSecurityOnIndicatorOn);
+ }
+ else
+ {
+ RDEBUG(" terminalSecurity is EFalse -> ECoreAppUIsTarmIndicatorsOff");
+ err = RProperty::Set( KPSUidCoreApplicationUIs, KCoreAppUIsTarmIndicator, ECoreAppUIsTarmIndicatorsOff);
+ }
+
+ if( err != KErrNone )
+ {
+ RDEBUG8_2("CDMUtilSession::SetIndicatorStateL ERROR: %d",err);
+ }
+
+ RDEBUG("CDMUtilSession::SetIndicatorStateL() - END");
+}
+
+
+// ----------------------------------------------------------------------------------------
+// CDMUtilServer::DefineProperties
+// Define publish&subscribe properties
+// ----------------------------------------------------------------------------------------
+void CDMUtilSession::DefinePropertiesL()
+{
+ RDEBUG("CDMUtilSession::DefinePropertiesL()");
+ //define properties...
+ TInt err = RProperty::Define( KPolicyMngProperty, KPolicyChangedCounter, RProperty::EInt);
+ if ( err != KErrNone && err != KErrAlreadyExists)
+ {
+ User::Leave( err);
+ }
+
+ err = RProperty::Define( KPolicyMngProperty, KFactoryResetCounter, RProperty::EInt);
+ if ( err != KErrNone && err != KErrAlreadyExists)
+ {
+ User::Leave( err);
+ }
+
+ //set initial values for properties
+ CRepository* cenrep = CRepository::NewLC( KCRUidPolicyManagementUtilInternalKeys);
+
+ //policy change counter
+ TInt value = 0;
+ err = cenrep->Get( KPolicyChangeCounter, value);
+ if ( err == KErrNotFound)
+ {
+ User::LeaveIfError( cenrep->Create( KPolicyChangeCounter, value));
+ }
+ User::LeaveIfError( RProperty::Set( KPolicyMngProperty, KPolicyChangedCounter, 0));
+
+ //policy change counter
+ value = 0;
+ err = cenrep->Get( KRFSCounterKey, value);
+ if ( err == KErrNotFound)
+ {
+ User::LeaveIfError( cenrep->Create( KRFSCounterKey, value));
+ }
+ User::LeaveIfError( RProperty::Set( KPolicyMngProperty, KFactoryResetCounter, 0));
+
+ //terminal security active
+ err = cenrep->Get( KTerminalSecurityStateKey, value);
+ if ( err == KErrNotFound)
+ {
+ User::LeaveIfError( cenrep->Create( KTerminalSecurityStateKey, 0));
+ }
+
+ CDMUtilSession::SetIndicatorStateL( cenrep);
+
+ CleanupStack::PopAndDestroy( cenrep);
+}
+
+
+// ----------------------------------------------------------------------------------------
+// CDMUtilSession::ServiceError
+// Handle an error from CDMUtilSession::ServiceL()
+// ----------------------------------------------------------------------------------------
+void CDMUtilSession::ServiceError(const RMessage2& aMessage,TInt aError)
+ {
+ RDEBUG_2("CDMUtilSession::ServiceError %d",aError);
+ CSession2::ServiceError(aMessage,aError);
+ }
+
+
+
+
+void CDMUtilSession::MarkMMCWipeL()
+ {
+ RDEBUG("CDMUtilSession::MarkMMCWipeL()");
+ RFs rfs;
+ User::LeaveIfError( rfs.Connect() );
+ CleanupClosePushL( rfs );
+
+ // create private directory to MMC
+#ifndef RD_MULTIPLE_DRIVE
+ TInt err = rfs.CreatePrivatePath( EDriveE );
+ if( err != KErrNone && err != KErrAlreadyExists )
+ {
+ RDEBUG_2(" **** ERROR, can not create private path on MMC drive: %d", err );
+ User::Leave( err );
+ }
+
+ TFileName fullPath;
+ fullPath.Append( KMMCDriveLetter );
+ fullPath.Append( MDriveColon );
+
+ TFileName privatePath;
+ User::LeaveIfError( rfs.PrivatePath( privatePath ) );
+ fullPath.Append( privatePath );
+
+ fullPath.Append( KMMCEraseFlagFileName );
+
+ RFile file;
+ // it is ok to leave if the file already exists
+ User::LeaveIfError( file.Create( rfs, fullPath, EFileWrite ) );
+ file.Close();
+#else
+ TDriveList driveList;
+ TInt driveCount;
+ //Get all removeable drive, both physically and logically
+ User::LeaveIfError(DriveInfo::GetUserVisibleDrives(
+ rfs, driveList, driveCount, KDriveAttRemovable ));
+
+ TInt max(driveList.Length());
+
+ for(TInt i=0; i<max;++i)
+ {
+ if (driveList[i])
+ {
+ TUint status;
+ DriveInfo::GetDriveStatus(rfs, i, status);
+ //To make sure the drive is physically removeable not logically removeable
+ //need to format internal mass memory also. So no need to check the below condition
+ // if (status & DriveInfo::EDriveRemovable)
+ {
+
+ TInt err = rfs.CreatePrivatePath( i );
+ if( err != KErrNone && err != KErrAlreadyExists )
+ {
+ RDEBUG_2(" **** ERROR, can not create private path on MMC drive: %d", err );
+ User::Leave( err );
+ }
+
+ TChar driveLetter;
+ rfs.DriveToChar(i,driveLetter);
+ TFileName fullPath;
+ fullPath.Append( driveLetter );
+ fullPath.Append( MDriveColon );
+
+ TFileName privatePath;
+ User::LeaveIfError( rfs.PrivatePath( privatePath ) );
+ fullPath.Append( privatePath );
+ fullPath.Append( KMMCEraseFlagFileName );
+
+ RFile file;
+ // it is ok to leave if the file already exists
+ User::LeaveIfError( file.Create( rfs, fullPath, EFileWrite ) );
+ file.Close();
+ }
+ }
+ }
+
+#endif //RD_MULTIPLE_DRIVE
+ RDEBUG(" MMC format marker file created successfully! MMC wipe enabled.");
+ CleanupStack::PopAndDestroy( &rfs );
+ }
+
+
+// ----------------------------------------------------------------------------------------
+// End of file