terminalsecurity/tcadapter/inc/tcadapter.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 09:07:52 +0200
changeset 0 b497e44ab2fc
permissions -rw-r--r--
Revision: 200949 Kit: 200951

/*
* Copyright (c) 2002 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:  Terminal Control DM Adapter 
*
*/



#ifndef __SMLTCADAPTER_H__
#define __SMLTCADAPTER_H__

// ---------------------------------------------------------------------
// Includes
// ---------------------------------------------------------------------
// symbian
#include <e32base.h>
#include <smldmadapter.h>
// s60
#include "TARMDmAdapter.h"
#include "TerminalControlClient.h"
#include <PolicyEngineClient.h>

#define TCADAPTER_FILESCAN_EXECUTE_LEAF

const TUint KSmlDMTCAdapterImplUid = 0x10207824;

#ifndef MAX_NUMBER_OF_DIGITS_IN_10BASE_INT64
#define MAX_NUMBER_OF_DIGITS_IN_10BASE_INT64 21
#endif

// The string value for true/false
_LIT8( KTCValueTrue, "true" );
_LIT8( KTCValueFalse, "false" );

// Passcode min/max length
const TInt KTCPassCodeMinLen = 4;
const TInt KTCPassCodeMaxLen = 255;

// the DDF version must be changed if any changes in 
// DDF structure ( built in DDFStructureL() function )
_LIT8( KSmlTCDDFVersion, "1.0" ); 

_LIT8( KSmlTCTextPlain, "text/plain" );
_LIT8( KSmlTCTextXml, "text/xml" );

_LIT8( KTCNodeName, "TerminalSecurity" );
_LIT8( KTCNodeDescription, 
	"This node is the root node for all terminal control functionality" );

_LIT8( KTCFileScanNodeName, "FileScan" );
_LIT8( KTCFileScanNodeDescription, 
	"The file scan feature delivers to admin a list of files or \
	folders found in device" );

#ifdef TCADAPTER_FILESCAN_EXECUTE_LEAF
_LIT8( KTCFileScanExecuteNodeName, "Execute" );
_LIT8( KTCFileScanExecuteNodeDescription, 
	"This node can be used to execute file scan operation." );
#endif

_LIT8( KTCFileScanResultsNodeName, "Results" );
_LIT8( KTCFileScanResultsNodeDescription, 
	"This node will hold the scan results" );

_LIT8( KTCFileDeleteNodeName, "FileDelete" );
_LIT8( KTCFileDeleteNodeDescription, "Deletes a file or empty folder" );

_LIT8( KTCDeviceLockNodeName, "DeviceLock" );
_LIT8( KTCDeviceLockNodeDescription, 
	"The parent node for all DeviceLock related nodes" );

_LIT8( KTCAutoLockPeriodNodeName, "AutoLockPeriod" );
_LIT8( KTCAutoLockPeriodNodeDescription, 
	"AutoLockPeriod is an integer that tells after how many minutes the device \
	will be automatically locked if not used" );

_LIT8( KTCMaxAutoLockPeriodNodeName, "MaxAutoLockPeriod" );
_LIT8( KTCMaxAutoLockPeriodNodeDescription, 
	"MaxAutoLockPeriod is an integer that tells maximum value of AutoLockPeriod" );

_LIT8( KTCLockLevelNodeName, "LockLevel" );
_LIT8( KTCLockLevelNodeDescription, 
	"Lock level tells whether lock is enabled, and what type of lock it is" );

_LIT8( KTCLockCodeNodeName, "LockCode" );
_LIT8( KTCLockCodeNodeDescription, 
	"LockCode is the character sequence that is needed to open locked device" );

//#ifdef __SAP_DEVICE_LOCK_ENHANCEMENTS
// -------- Enhanced features BEGIN
	
_LIT8( KTCLockCodeMinLengthNodeName, "LockCodeMinLength" );
_LIT8( KTCLockCodeMinLengthNodeDescription, 
	"LockCode minimum length, 4-256 characters" );

_LIT8( KTCLockCodeMaxLengthNodeName, "LockCodeMaxLength" );
_LIT8( KTCLockCodeMaxLengthNodeDescription, 
	"LockCode maximum length, 4-256 characters" );

_LIT8( KTCLockCodeRequireUpperAndLowerNodeName, 
	"LockCodeRequireUpperAndLower" );
_LIT8( KTCLockCodeRequireUpperAndLowerNodeDescription, 
	"If enabled the LockCode must contain both upper and lower case letters" );

_LIT8( KTCLockCodeRequireCharsAndNumbersNodeName, 
	"LockCodeRequireCharsAndNumbers" );
_LIT8( KTCLockCodeRequireCharsAndNumbersNodeDescription, 
	"If enabled the LockCode must contain both chars and numbers" );

_LIT8( KTCLockCodeMaxRepeatedCharactersNodeName, 
	"LockCodeMaxRepeatedCharacters" );
_LIT8( KTCLockCodeMaxRepeatedCharactersNodeDescription, 
	"Tells how many times a single character can be used in a password. \
	Values between 0 and 4, 0 = no restriction" );

_LIT8( KTCLockCodeHistoryBufferNodeName, "LockCodeHistoryBuffer" );
_LIT8( KTCLockCodeHistoryBufferNodeDescription, 
	"History buffer for previously used lock codes. 0 = no restriction, \
	1-X = the lock code can not match the previous X lock codes" );

_LIT8( KTCLockCodeExpirationNodeName, "LockCodeExpiration" );
_LIT8( KTCLockCodeExpirationNodeDescription, 
	"The password expires after X days, 0 = no restriction, 1-365" );

_LIT8( KTCLockCodeMinChangeToleranceNodeName, "LockCodeMinChangeTolerance" );
_LIT8( KTCLockCodeMinChangeToleranceNodeDescription, 
	"The user can change the password only X times before 'minimum change \
	interval' hours has passed" );

_LIT8( KTCLockCodeMinChangeIntervalNodeName, "LockCodeMinChangeInterval" );
_LIT8( KTCLockCodeMinChangeIntervalNodeDescription, 
	"The user cannot change the password more than 'minimum change tolerance' \
	times before X hours have passed since the previous change" );

_LIT8( KTCLockCodeCheckSpecificStringsNodeName,"LockCodeCheckSpecificStrings" );
_LIT8( KTCLockCodeCheckSpecificStringsNodeDescription, 
	"0 = No restriction, 1 = The password cannot match a string in the set of \
	strings given by the next three calls" );

_LIT8( KTCLockCodeDisallowSpecificNodeName, "LockCodeDisallowSpecific" );
_LIT8( KTCLockCodeDisallowSpecificNodeDescription, 
	"Disallow the specific string/strings given. Individual strings can be \
	separated with ';'" );

_LIT8( KTCLockCodeAllowSpecificNodeName, "LockCodeAllowSpecific" );
_LIT8( KTCLockCodeAllowSpecificNodeDescription, 
	"Re-allow the specific string/strings given. \
	Individual strings can be separated with ';'" );

_LIT8( KTCLockCodeClearSpecificStringsNodeName, "LockCodeClearSpecificStrings" );
_LIT8( KTCLockCodeClearSpecificStringsNodeDescription, 
	"Clear the specific string -buffer" );

_LIT8( KTCLockCodeMaxAttemptsNodeName, "LockCodeMaxAttempts" );
_LIT8( KTCLockCodeMaxAttemptsNodeDescription, 
	"0 = No restriction, 3-100 = The device is 'hard' reset after the user has \
	consecutively failed X times to answer the password query" );

_LIT8( KTCLockCodeConsecutiveNumbersNodeName, "LockCodeConsecutiveNumbers" );
_LIT8( KTCLockCodeConsecutiveNumbersNodeDescription, 
 "0 = No restriction, 1 = The password cannot contain two consecutive numbers" );

_LIT8( KTCLockCodeMinSpecialCharactersNodeName, 
    "LockCodeMinSpecialCharacters" );
_LIT8( KTCLockCodeMinSpecialCharactersNodeDescription, 
    "Tells the least number of special characters that must be present in the lock code. \
    Values between 0 and 255, 0 = no restriction" );

_LIT8( KTCLockCodeDisallowSimpleNodeName, "LockCodeDisallowSimple" );
_LIT8( KTCLockCodeDisallowSimpleNodeDescription, 
 "0 = No restriction, 1 = The password cannot be a simple string" );



// -------- Enhanced features END
//#endif

_LIT8( KTCDeviceWipeNodeName, "DeviceWipe" );
_LIT8( KTCDeviceWipeNodeDescription, 
	"This node is the root node for all terminal control functionality" );

_LIT8( KTCLocalOperationsNodeName, "LocalOperations" );
_LIT8( KTCLocalOperationsNodeDescription, 
	"This node is common parent for all local operations" );

_LIT8( KTCStartNodeName, "Start" );
_LIT8( KTCStartNodeDescription, 
	"Exec command causes device to start an application" );

_LIT8( KTCStopNodeName, "Stop" );
_LIT8( KTCStopNodeDescription, 
	"Exec command causes device to stop an application or process" );

_LIT8( KTCProcessesNodeName, "Processes" );
_LIT8( KTCProcessesNodeDescription, 
	"TThis is root for all process related information that is \
	available for the admin" );

_LIT8( KTCProcessesDynaNodeDescription, 
	"This node is placeholder for an identity of a process" );

_LIT8( KTCIDNodeName, "ID" );
_LIT8( KTCIDNodeDescription, 
	"This leaf node holds the unique id of the process" );

_LIT8( KTCFromRAMNodeName, "FromRAM" );
_LIT8( KTCFromRAMNodeDescription, 
	"This leaf holds knowledge whether the process has been loaded from \
	RAM or ROM. " );

_LIT8( KTCMemoryInfoNodeName, "MemoryInfo" );
_LIT8( KTCMemoryInfoNodeDescription, 
	"This node holds some extra information about memory usage of the process." );

_LIT8( KTCProcessFilenameNodeName, "Filename" );
_LIT8( KTCProcessFilenameNodeDescription, 
	"This node holds the filename of the process" );

_LIT8( KTCRebootNodeName, "Reboot" );
_LIT8( KTCRebootNodeDescription, 
	"This node is the root node for all terminal control functionality" );

_LIT8( KTCDynamicNodeName, "" );
_LIT(  KTCSeparator16, "/" );

_LIT8( KTCSeparator8, "/" );

// -------------------------------------------------------------------
// CSmlDmEmailAdapter 
// -------------------------------------------------------------------
class CTcAdapter : public CTARMDmAdapter//, public MMsvSessionObserver
    {
private:
    enum TTcNodeIdentifier
        {
        ETcNodeTerminalControl = 0,
        ETcNodeFileScan,
#ifdef TCADAPTER_FILESCAN_EXECUTE_LEAF
        ETcNodeFileScanExecute,
#endif
        ETcNodeFileScanResults,
        ETcNodeFileDelete,
        ETcNodeDeviceLock,
        ETcNodeAutoLockPeriod,
        ETcNodeMaxAutoLockPeriod,
        ETcNodeLockLevel,
        ETcNodeLockCode,						
// --------- Enhanced features BEGIN ------------------
//#ifdef __SAP_DEVICE_LOCK_ENHANCEMENTS
        ETcNodeLockCodeMinLength,
        ETcNodeLockCodeMaxLength,
        ETcNodeLockCodeRequireUpperAndLower,
        ETcNodeLockCodeRequireCharsAndNumbers,
        ETcNodeLockCodeMaxRepeatedCharacters,
        ETcNodeLockCodeHistoryBuffer,
        ETcNodeLockCodeExpiration,
        ETcNodeLockCodeMinChangeTolerance,
        ETcNodeLockCodeMinChangeInterval,
        ETcNodeLockCodeCheckSpecificStrings,
        ETcNodeLockCodeDisallowSpecific,
        ETcNodeLockCodeAllowSpecific,
        ETcNodeLockCodeClearSpecificStrings,
        ETcNodeLockCodeMaxAttempts,
        ETcNodeLockConsecutiveNumbers,
        ETcNodeLockCodeMinSpecialCharacters,
        ETcNodeLockDisallowSimple,        
//#endif
// --------- Enhanced features END --------------------
        ETcNodeDeviceWipe,
        ETcNodeProcesses,
        ETcNodeProcessesX,
        ETcNodeID,
        ETcNodeFromRAM,
        ETcNodeMemoryInfo,
        ETcNodeFilename,
        ETcNodeReboot,
        ETcNodeLocalOperations,
        ETcNodeStart,
        ETcNodeStop,
        ETcNodeNotUsedAndAlwaysLast
        };

    enum TTcNodeAccessType
        {
        ENoAccess = 0,
        EExecute  = 1,
        EGet      = 2,
        EReplace  = 4,
        };

    static const TInt iAccessTypeList[ETcNodeNotUsedAndAlwaysLast+1];
    
    TInt iAccessHistory[ETcNodeNotUsedAndAlwaysLast+1];

public:
    CTcAdapter(TAny* aEcomArguments);
    
    static CTcAdapter* NewL(MSmlDmCallback* aDmCallback );
    static CTcAdapter* NewLC(MSmlDmCallback* aDmCallback );

    virtual ~CTcAdapter();

    // Pure virtual methods
    void DDFVersionL( CBufBase& aVersion );
    
    void DDFStructureL( MSmlDmDDFObject& aDDF );
    
    CSmlDmAdapter::TError FetchLeafObjectL( const TDesC8& aURI, 
    	const TDesC8& aLUID, const TDesC8& aType, 
    	CBufFlat* aObject, CBufFlat* aRetMime );

    // From CTARMDmAdapter
    void _UpdateLeafObjectL( const TDesC8& aURI, 
    	const TDesC8& aLUID, const TDesC8& aObject, 
    	const TDesC8& aType, TInt aStatusRef );
    void _UpdateLeafObjectL( const TDesC8& aURI, 
    	const TDesC8& aLUID, RWriteStream*& aStream, 
    	const TDesC8& aType, TInt aStatusRef );
    void _DeleteObjectL( const TDesC8& aURI, 
    	const TDesC8& aLUID, TInt aStatusRef );
    void _FetchLeafObjectL( const TDesC8& aURI, 
    	const TDesC8& aLUID, const TDesC8& aType, 
    	TInt aResultsRef, TInt aStatusRef );
    void _FetchLeafObjectSizeL( const TDesC8& aURI, 
    	const TDesC8& aLUID, const TDesC8& aType, 
    	TInt aResultsRef, TInt aStatusRef );
    void _ChildURIListL( const TDesC8& aURI, 
    	const TDesC8& aLUID, 
    	const CArrayFix<TSmlDmMappingInfo>& aPreviousURISegmentList, 
    	TInt aResultsRef, TInt aStatusRef );
    void _AddNodeObjectL( const TDesC8& aURI, 
    	const TDesC8& aParentLUID, TInt aStatusRef );
    void _ExecuteCommandL( const TDesC8& aURI, 
    	const TDesC8& aLUID, const TDesC8& aArgument, 
    	const TDesC8& aType, TInt aStatusRef );
    void _ExecuteCommandL( const TDesC8& aURI, 
    	const TDesC8& aLUID, RWriteStream*& aStream, 
    	const TDesC8& aType, TInt aStatusRef );
    void _CopyCommandL( const TDesC8& aTargetURI, 
    	const TDesC8& aTargetLUID, const TDesC8& aSourceURI, 
    	const TDesC8& aSourceLUID, const TDesC8& aType, 
    	TInt aStatusRef );
    
    void StartAtomicL();   
    void CommitAtomicL();
    void RollbackAtomicL();
    TBool StreamingSupport( TInt& aItemSize );
#ifdef __TARM_SYMBIAN_CONVERGENCY	
		virtual void StreamCommittedL( RWriteStream& aStream );
#else
		virtual void StreamCommittedL();
#endif	
    void CompleteOutstandingCmdsL();

    TInt StartProcessL(const TDesC8& aURI);
    TInt StopProcessL(const TDesC8& aURI);

private:
    void ConstructL(MSmlDmCallback* aDmCallback);

    void FillNodeInfoL(MSmlDmDDFObject& aNode,TSmlDmAccessTypes aAccTypes,
            MSmlDmDDFObject::TOccurence aOccurrence,
            MSmlDmDDFObject::TScope aScope,
            MSmlDmDDFObject::TDFFormat aFormat,
            const TDesC8& aDescription,
            const TDesC8& aMimeType);

    void CopyAndTrimMimeType(TDes8& aNewMime, const TDesC8& aType);
    void CopyAndTrimURI(TDes8& aNewURI, const TDesC8& aURI);
    void ParseStartPathL(const TDesC8 &aArguments, 
    	TDes8 &aStartPath, TBool &aRecursive);

    TTcNodeIdentifier GetNodeIdentifier(const TDesC8& aURI);
    TInt NewTerminalControlSession();
    TInt CheckTerminalControlSession();
    TPtrC8 PolicyRequestResourceL( const TDesC8& aURI );

	void _UpdateLeafObjectToBeTrappedL( const TDesC8& aURI, 
														 const TDesC8& aLUID,
                             const TDesC8& aObject, const TDesC8& aType,
                             const TInt aStatusRef);
                             
	void FetchLeafObjectToBeTrappedL( const TDesC8& aURI, 
																			const TDesC8& aLUID,
                                      const TDesC8& aType, 
                                      CBufFlat* aObject,
                                      CBufFlat* aRetMime );
                                      
	void _ExecuteCommandToBeTrappedL( const TDesC8& aURI, 
																			const TDesC8& aLUID,
                                  	  const TDesC8& aArgument, 
                                  	  const TDesC8& aType,
                                  	  TInt aStatusRef );                                      
                                                                                 
private:

    RTerminalControl iTC;
    RTerminalControlSession iTCSession;
    TBool iConnected;

    // Rollback information
    TInt32 iAutoLockPeriod;
    TInt32 iLockLevel;
    TInt32 iMaxAutoLockPeriod;
// --------- Enhanced features BEGIN ------------------
//#ifdef __SAP_DEVICE_LOCK_ENHANCEMENTS
    TInt32  iLockCodeMinLength;
    TInt32  iLockCodeMaxLength;
    TBool   iLockCodeRequireUpperAndLower;
    TInt32  iLockCodeRequireUpperAndLowerInt;
    TBool   iLockCodeRequireCharsAndNumbers;
    TInt32  iLockCodeRequireCharsAndNumbersInt;
    TInt32  iLockCodeMaxRepeatedCharacters;
    TInt32  iLockCodeHistoryBuffer;
    TInt32  iLockCodeExpiration;
    TInt32  iLockCodeMinChangeTolerance;
    TInt32  iLockCodeMinChangeInterval;
    TBool   iLockCodeCheckSpecificStrings;
    TInt32  iLockCodeCheckSpecificStringsInt;
    TInt32  iLockCodeMaxAttempts;
    TBool   iLockCodeConsecutiveNumbers;
    TInt32  iLockCodeConsecutiveNumbersInt;
    TInt32  iLockCodeMinSpecialCharacters;
    TBool   iLockCodeDisallowSimple;
    TInt32  iLockCodeDisallowSimpleInt;

//#endif
// --------- Enhanced features END --------------------

};

#endif // __SMLTCADAPTER_H__