diff -r 000000000000 -r 99ef825efeca rtsecuritymanager/rtsecuritymanagerserver/src/rtsecmgrstore.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rtsecuritymanager/rtsecuritymanagerserver/src/rtsecmgrstore.cpp Mon Mar 30 12:51:20 2009 +0300 @@ -0,0 +1,593 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Definition of security manager store class + * +*/ + + + + + + +#include +#include +#include +#include +#include +#include "rtsecmgrstore.h" +#include "rtsecmgrdata.h" + +const TReal DEFAULT_VERSION(1.0); +CSecMgrStore* CSecMgrStore::NewL() + { + CSecMgrStore* self = CSecMgrStore::NewLC (); + CleanupStack::Pop (self); + return self; + } + +CSecMgrStore* CSecMgrStore::NewLC() + { + CSecMgrStore* self = new (ELeave)CSecMgrStore(); + CleanupStack::PushL (self); + self->ConstructL (); + return self; + } + +void CSecMgrStore::StorePolicyL(const CPolicy& aPolicy) + { + __UHEAP_MARK; + + HBufC *policyFile = HBufC::NewLC(KMaxName); + TPtr ptr(policyFile->Des()); + GetPolicyFile (ptr, aPolicy.PolicyID ()); + + CFileStore* store = CPermanentFileStore::ReplaceLC (iFsSession, ptr, + EFileWrite); + store->SetTypeL (KPermanentFileStoreLayoutUid); + + // Construct the output stream. + RStoreWriteStream outstream; + TStreamId id = outstream.CreateLC (*store); + //Write version of the policy + outstream.WriteReal32L (TReal(DEFAULT_VERSION)); + + TInt aliasCnt(aPolicy.AliasGroup().Count()); + outstream.WriteInt32L (aliasCnt); + RAliasGroup aliasGroups = aPolicy.AliasGroup(); + for (TInt i(0); i!=aliasCnt;++i) + { + CPermission* alias = aliasGroups[i]; + alias->ExternalizeL (outstream); + } + + TInt domainCnt(aPolicy.ProtectionDomain().Count ()); + outstream.WriteInt32L (domainCnt); + RProtectionDomains domains = aPolicy.ProtectionDomain (); + for (TInt i(0); i!=domainCnt;++i) + { + CProtectionDomain* domain = domains[i]; + domain->ExternalizeL (outstream); + } + + // Commit changes to the stream + outstream.CommitL (); + + CleanupStack::PopAndDestroy (&outstream); + + // Set this stream id as the root + store->SetRootL (id); + + // Commit changes to the store + store->CommitL (); + + CleanupStack::PopAndDestroy (store); + CleanupStack::PopAndDestroy (policyFile); + __UHEAP_MARKEND; + } + + +TInt CSecMgrStore::RemovePolicy(TPolicyID aPolicyID) + { + HBufC *policyFile = HBufC::NewLC(KMaxName); + TPtr ptr(policyFile->Des()); + TInt ret(KErrNone); + + ret = GetPolicyFile(ptr, aPolicyID); + + if(KErrNone==ret) + ret = iFsSession.Delete (ptr); + CleanupStack::PopAndDestroy(policyFile); + return ret; + } + +void CSecMgrStore::RestorePoliciesL(RPolicies& aPolicy) + { + //Fetch all the individual policy files from "epoc32\winscw\c\private\\policy" directory + //Iteratively internalise the policy files, with the policyID (PolicyID is = to filename) + HBufC *privateDir = HBufC::NewLC(KMaxName); + TPtr privateDirptr(privateDir->Des()); + GetPolicyPath (privateDirptr); + + // create search string + HBufC* searchBuf = privateDirptr.AllocLC (); + TPtr searchPtr(searchBuf->Des()); + + CDir* dir= NULL; + iFsSession.GetDir (searchPtr, KEntryAttNormal, + ESortByName | EAscending, dir); + + if ( dir) + { + CleanupStack::PushL (dir); + for (TInt i=0; i!=dir->Count ();++i) + { + TEntry entry = dir->operator[] (i); + HBufC *fileName = HBufC::NewLC(KMaxName); + TPtr ptr(fileName->Des()); + ptr = entry.iName; + + HBufC *policyFile = HBufC::NewLC(KMaxName); + TPtr policyFileptr(policyFile->Des()); + policyFileptr.Copy(privateDirptr) ; + policyFileptr.Append (ptr); + + CFileStore* store = CPermanentFileStore::OpenLC (iFsSession, + policyFileptr, EFileShareAny); + + RStoreReadStream instream; + instream.OpenLC (*store, store->Root ()); + + TLex16 lexer(ptr); + TPolicyID pID; + lexer.Val (pID); + + CPolicy* policy = CPolicy::NewL (pID, instream); + aPolicy.Append (policy); + + CleanupStack::PopAndDestroy (&instream); //instream + CleanupStack::PopAndDestroy (store); //store + CleanupStack::PopAndDestroy (policyFile); + CleanupStack::PopAndDestroy (fileName); + } + + CleanupStack::PopAndDestroy (dir); + } + + CleanupStack::PopAndDestroy (searchBuf); + CleanupStack::PopAndDestroy (privateDir); + } + +void CSecMgrStore::RegisterScriptL(TExecutableID aExecID, const CScript& aScript) + { + HBufC *scriptFile = HBufC::NewLC(KMaxName); + TPtr ptr(scriptFile->Des()); + User::LeaveIfError(GetScriptFile(ptr,aExecID)); + + CFileStore* store = CPermanentFileStore::ReplaceLC (iFsSession, ptr, + EFileWrite); + + // Must say what kind of file store. + store->SetTypeL (KPermanentFileStoreLayoutUid); + + // Construct the output stream. + RStoreWriteStream outstream; + TStreamId id = outstream.CreateLC (*store); + + aScript.ExternalizeL (outstream); + + // Commit changes to the stream + outstream.CommitL (); + + // Cleanup the stream object + CleanupStack::PopAndDestroy (&outstream); + + // Set this stream id as the root + store->SetRootL (id); + + // Commit changes to the store + store->CommitL (); + + CleanupStack::PopAndDestroy (store); + CleanupStack::PopAndDestroy (scriptFile); + + } + +void CSecMgrStore::UnRegisterScriptL(TExecutableID aExecID) + { + HBufC *scriptFile = HBufC::NewLC(KMaxName); + TPtr ptr(scriptFile->Des()); + User::LeaveIfError (GetScriptFile (ptr,aExecID)); + + if ( BaflUtils::FileExists (iFsSession, ptr)) + iFsSession.Delete (ptr); + else + { + User::Leave(ErrInvalidScriptID); + } + CleanupStack::PopAndDestroy (scriptFile); + } + +TInt CSecMgrStore::ReadScriptInfo(TExecutableID aExecID, CScript& aScriptInfo) + { + __UHEAP_MARK; + + HBufC *scriptFile = HBufC::NewLC(KMaxName); + TPtr ptr(scriptFile->Des()); + TInt ret(GetScriptFile (ptr, aExecID)); + + if ( KErrNone==ret) + { + if ( !BaflUtils::FileExists(iFsSession, ptr)) + { + return ErrInvalidScriptID; + } + + CFileStore* store= NULL; + store=CPermanentFileStore::OpenLC (iFsSession, ptr, + EFileShareAny); + + if ( KErrNone==ret) + { + RStoreReadStream instream; + instream.OpenLC (*store, store->Root ()); + + aScriptInfo.InternalizeL (instream); + + CleanupStack::PopAndDestroy (&instream); + CleanupStack::PopAndDestroy (store); + } + return ret; + } + CleanupStack::PopAndDestroy (scriptFile); + __UHEAP_MARKEND; + + return ret; + } + +TInt CSecMgrStore::GetScriptFile(TExecutableID aExecID, TDes& aScriptFile) + { + TInt ret(GetScriptFile (aScriptFile,aExecID)); + + if ( KErrNone==ret) + { + if ( !BaflUtils::FileExists(iFsSession, aScriptFile)) + { + return ErrInvalidScriptID; + } + } + + return ret; + } + +void CSecMgrStore::WriteScriptInfoL(TExecutableID aExecID, CScript& aScriptInfo) + { + __UHEAP_MARK; + + HBufC *scriptFile = HBufC::NewLC(KMaxName); + TPtr ptr(scriptFile->Des()); + User::LeaveIfError (GetScriptFile (ptr,aExecID)); + + CFileStore* store = CPermanentFileStore::ReplaceLC (iFsSession, ptr, + EFileWrite); + + // Must say what kind of file store. + store->SetTypeL (KPermanentFileStoreLayoutUid); + + // Construct the output stream. + RStoreWriteStream outstream; + TStreamId id = outstream.CreateLC (*store); + + aScriptInfo.ExternalizeL (outstream); + + // Commit changes to the stream + outstream.CommitL (); + + // Cleanup the stream object + CleanupStack::PopAndDestroy (&outstream); + + // Set this stream id as the root + store->SetRootL (id); + + // Commit changes to the store + store->CommitL (); + + CleanupStack::PopAndDestroy (store); + CleanupStack::PopAndDestroy (scriptFile); + __UHEAP_MARKEND; + } + +TInt CSecMgrStore::ReadCounter(TExecutableID& aExecID) + { + HBufC *configFile = HBufC::NewLC(KMaxName); + TPtr ptr(configFile->Des()); + TInt ret(GetConfigFile (ptr)); + + if ( KErrNone==ret) + { + if ( !BaflUtils::FileExists(iFsSession,*configFile)) + { + aExecID = (TExecutableID)KCRUIdSecMgr.iUid; + BaflUtils::EnsurePathExistsL (iFsSession, *configFile); + CleanupStack::PopAndDestroy (configFile); + return WriteCounter (aExecID); + } + + CFileStore* store = CPermanentFileStore::OpenLC (iFsSession, + *configFile, EFileRead); + + RStoreReadStream instream; + instream.OpenLC (*store, store->Root ()); + + aExecID = instream.ReadInt32L (); + + CleanupStack::PopAndDestroy (&instream); + CleanupStack::PopAndDestroy (store); + } + CleanupStack::PopAndDestroy (configFile); + return ret; + } + +TInt CSecMgrStore::WriteCounter(TExecutableID aExecID) + { + HBufC *configFile = HBufC::NewLC(KMaxName); + TPtr ptr(configFile->Des()); + TInt ret(GetConfigFile (ptr)); + + if ( KErrNone==ret) + { + CFileStore* store = CPermanentFileStore::ReplaceLC (iFsSession, + *configFile, EFileWrite); + + // Must say what kind of file store. + store->SetTypeL (KPermanentFileStoreLayoutUid); + + // Construct the output stream. + RStoreWriteStream outstream; + TStreamId id = outstream.CreateLC (*store); + + outstream.WriteInt32L (aExecID); + + // Commit changes to the stream + outstream.CommitL (); + + // Cleanup the stream object + CleanupStack::PopAndDestroy (&outstream); + + // Set this stream id as the root + store->SetRootL (id); + + // Commit changes to the store + store->CommitL (); + + CleanupStack::PopAndDestroy (store); + } + CleanupStack::PopAndDestroy (configFile); + return ret; + } + +TInt CSecMgrStore::GetPrivatePath(TDes& aPrivatePath) + { + TInt ret(KErrNone); + aPrivatePath.Append (KCDrive); + + HBufC *privateDir = HBufC::NewLC(KMaxName); + TPtr ptr(privateDir->Des()); + ret = iFsSession.PrivatePath (ptr); + + if ( KErrNone==ret) + { + aPrivatePath.Append (ptr); + } + CleanupStack::PopAndDestroy (privateDir); + return ret; + } + +TInt CSecMgrStore::GetConfigFile(TDes& aConfigFile) + { + TInt ret(KErrNone); + + aConfigFile.Append (KCDrive); + + HBufC *privateDir = HBufC::NewLC(KMaxName); + TPtr ptr(privateDir->Des()); + ret = iFsSession.PrivatePath (ptr); + + if ( KErrNone==ret) + { + aConfigFile.Append (ptr); + + ret = iFsSession.MkDirAll (ptr); + + if ( KErrAlreadyExists==ret) + ret=KErrNone; + + aConfigFile.Append (KConfigFile); + } + CleanupStack::PopAndDestroy (privateDir); + return ret; + } + +TInt CSecMgrStore::GetPolicyPath(TDes& aFile) + { + TInt ret(GetPrivatePath (aFile)); + + if ( KErrNone==ret) + { + aFile.Append (KPolicyDir); + aFile.Append (KDirSeparator); + + TRAP (ret, BaflUtils::EnsurePathExistsL (iFsSession, aFile)); + } + + return ret; + } + +TInt CSecMgrStore::GetScriptPath(TDes& aFile) + { + TInt ret(GetPrivatePath (aFile)); + + if ( KErrNone==ret) + { + aFile.Append (KScriptDir); + aFile.Append (KDirSeparator); + + TRAP (ret, BaflUtils::EnsurePathExistsL (iFsSession, aFile)); + + if ( KErrAlreadyExists==ret) + ret = KErrNone; + } + + return ret; + } + +TInt CSecMgrStore::GetScriptFile(TDes& aFile, TExecutableID aExecID) + { + TInt ret(GetScriptPath (aFile)); + + if ( (KErrNone==ret) || (KErrAlreadyExists==ret)) + { + if ( KAnonymousScript!=aExecID) + { + HBufC *fSuffix = HBufC::NewLC(KMaxName); + TPtr fSuffixPtr(fSuffix->Des()); + fSuffixPtr.Num (aExecID); + + aFile.Append (fSuffixPtr); + aFile.Append (KDatExtn); + CleanupStack::PopAndDestroy (fSuffix); + } + } + + if ( KErrAlreadyExists==ret) + ret=KErrNone; + + return ret; + } + +TInt CSecMgrStore::GetPolicyFile(TDes& aFile, TPolicyID aPolicyID) + { + TInt ret(GetPolicyPath (aFile)); + + if ( (KErrNone==ret) || (KErrAlreadyExists==ret)) + { + HBufC *fPolicyName = HBufC::NewLC(KMaxName); + TPtr policyNamePtr(fPolicyName->Des()); + policyNamePtr.Num (aPolicyID); + + aFile.Append (policyNamePtr); + aFile.Append (KDatExtn); + CleanupStack::PopAndDestroy (fPolicyName); + } + + return ret; + } + + +TInt CSecMgrStore::BackupFile(TPolicyID aPolicyID) +{ + HBufC *policyFile = HBufC::NewLC(KMaxName); + TPtr policyFilePtr(policyFile->Des()); + + HBufC *tempPolicyFile = HBufC::NewLC(KMaxName); + TPtr tempPolicyFilePtr(tempPolicyFile->Des()); + + TInt ret(GetPolicyFile(policyFilePtr, aPolicyID)); + + ret= GetPolicyPath (tempPolicyFilePtr); + + if ( (KErrNone==ret) || (KErrAlreadyExists==ret)) + { + HBufC *fPolicyName = HBufC::NewLC(KMaxName); + TPtr policyNamePtr(fPolicyName->Des()); + policyNamePtr.Num (aPolicyID); + + tempPolicyFilePtr.Append (policyNamePtr); + tempPolicyFilePtr.Append (_L("_temp")); + tempPolicyFilePtr.Append (KDatExtn); + + CleanupStack::PopAndDestroy(fPolicyName); + } + + CFileMan *fm = CFileMan::NewL(iFsSession); + TInt backupResult = fm->Copy(policyFilePtr, tempPolicyFilePtr, CFileMan::EOverWrite); + delete fm; + + CleanupStack::PopAndDestroy(tempPolicyFile); + CleanupStack::PopAndDestroy(policyFile); + + return backupResult; +} + +TInt CSecMgrStore::RemoveTempPolicy(TPolicyID aPolicyID) +{ + HBufC *tempPolicyFile = HBufC::NewLC(KMaxName); + TPtr tempPolicyFilePtr(tempPolicyFile->Des()); + + TInt ret= GetPolicyPath (tempPolicyFilePtr); + + if ( (KErrNone==ret) || (KErrAlreadyExists==ret)) + { + HBufC *fPolicyName = HBufC::NewLC(KMaxName); + TPtr policyNamePtr(fPolicyName->Des()); + policyNamePtr.Num (aPolicyID); + + tempPolicyFilePtr.Append (policyNamePtr); + tempPolicyFilePtr.Append (_L("_temp")); + tempPolicyFilePtr.Append (KDatExtn); + + CleanupStack::PopAndDestroy(fPolicyName); + } + + CFileMan *fm = CFileMan::NewL(iFsSession); + TInt rmTempResult = fm->Delete(tempPolicyFilePtr); + delete fm; + + CleanupStack::PopAndDestroy(tempPolicyFile); + + return rmTempResult; +} + +TInt CSecMgrStore::RestoreTempPolicy(TPolicyID aPolicyID) +{ + HBufC *policyFile = HBufC::NewLC(KMaxName); + TPtr policyFilePtr(policyFile->Des()); + + HBufC *tempPolicyFile = HBufC::NewLC(KMaxName); + TPtr tempPolicyFilePtr(tempPolicyFile->Des()); + + TInt ret(GetPolicyFile(policyFilePtr, aPolicyID)); + + ret= GetPolicyPath (tempPolicyFilePtr); + + if ( (KErrNone==ret) || (KErrAlreadyExists==ret)) + { + HBufC *fPolicyName = HBufC::NewLC(KMaxName); + TPtr policyNamePtr(fPolicyName->Des()); + policyNamePtr.Num (aPolicyID); + + tempPolicyFilePtr.Append (policyNamePtr); + tempPolicyFilePtr.Append (_L("_temp")); + tempPolicyFilePtr.Append (KDatExtn); + + CleanupStack::PopAndDestroy(fPolicyName); + } + + CFileMan *fm = CFileMan::NewL(iFsSession); + TInt restoreResult = fm->Copy(tempPolicyFilePtr, policyFilePtr, CFileMan::EOverWrite); + delete fm; + + CleanupStack::PopAndDestroy(tempPolicyFile); + CleanupStack::PopAndDestroy(policyFile); + return restoreResult; +}