/*
* Copyright (c) 2009 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:
*
*/
#include "rtsecmgrscriptmanager.h"
#include "rtsecmgrserverdef.h"
#include "rtsecmgrstore.h"
#include "rtsecmgrpolicy.h"
#include "rtsecmgrpolicymanager.h"
#include "rtsecmgrscriptmanager.h"
#include <e32debug.h>
//#include <centralrepository.h>
_LIT(KDefaultTrustPolicy,"UnTrusted");
CScriptManager* CScriptManager::NewL(CSecMgrStore* aSecMgrDB,CPolicyManager* aPolicyMgr)
{
CScriptManager* pThis = CScriptManager::NewLC(aSecMgrDB,aPolicyMgr);
CleanupStack::Pop(pThis);
return pThis;
}
CScriptManager* CScriptManager::NewLC(CSecMgrStore* aSecMgrDB,CPolicyManager* aPolicyMgr)
{
CScriptManager* pThis = new (ELeave) CScriptManager(aSecMgrDB,aPolicyMgr);
CleanupStack::PushL(pThis);
pThis->ConstructL();
return pThis;
}
CScriptManager::~CScriptManager()
{
if(iSecMgrDB)
{
iSecMgrDB->WriteCounter(iID);
}
iScripts.ResetAndDestroy();
}
void CScriptManager::ConstructL()
{
iSecMgrDB->ReadCounter(iID);
}
TExecutableID CScriptManager::RegisterScript(TPolicyID aPolicyID/*,const CTrustInfo& aTrustPolicy*/)
{
TInt ret(ErrPolicyIDDoesNotExist);
CPolicy* policy = iPolicyMgr->Policy(aPolicyID);
if(policy)
{
CProtectionDomain* domain = policy->ProtectionDomain(KDefaultTrustPolicy);
if(domain)
{
TExecutableID execID(GetID());
CScript* script = CScript::NewL(aPolicyID,execID);
script->SetPermissionSet(domain->PermSet());
iScripts.Append(script);
TRAPD(err,iSecMgrDB->RegisterScriptL(execID,*script));
if(KErrNone==err)
{
return execID;
}
else
{
return ret;
}
}
}
return ret;
}
TExecutableID CScriptManager::RegisterScript(TPolicyID aPolicyID,const TDesC& aHashValue/*,const CTrustInfo& aTrustPolicy*/)
{
TInt ret(ErrPolicyIDDoesNotExist);
CPolicy* policy = iPolicyMgr->Policy(aPolicyID);
if(policy)
{
CProtectionDomain* domain = policy->ProtectionDomain(KDefaultTrustPolicy);
if(domain)
{
TExecutableID execID(GetID());
CScript* script = CScript::NewLC(aPolicyID,execID);
script->SetHashMarkL(aHashValue);
script->SetPermissionSet(domain->PermSet());
iScripts.Append(script);
TRAPD(err,iSecMgrDB->RegisterScriptL(execID, *script));
if(KErrNone==err)
{
ret=execID;
}
CleanupStack::Pop(script);
}
}
return ret;
}
void CScriptManager::UnRegisterScriptL(TExecutableID aExecID,TPolicyID aPolicyID)
{
TInt ret;
CScript *scriptInfo = CScript::NewL(KInvalidPolicyID ,aExecID);
ret = ScriptInfo(*scriptInfo);
if( (KErrNone<=ret) && (scriptInfo->PolicyID() != aPolicyID))
{
ret = ErrInvalidPolicyID;
}
delete scriptInfo;
scriptInfo = NULL;
if(ret == KErrNone)
{
for(TInt i=0; i!=iScripts.Count();++i)
{
if(iScripts[i]->ScriptID()==aExecID)
{
delete iScripts[i];
iScripts.Remove(i); //remove from the cache first
break;
}
}
iSecMgrDB->UnRegisterScriptL(aExecID);
}
else
User::Leave(ret);
}
TInt CScriptManager::ScriptInfo(CScript& aScriptInfo)
{
//Check if script info is already present in the cache (iScriptStore)
//If yes,
for(TInt i=0; i!=iScripts.Count();++i)
{
if(iScripts[i]->ScriptID()==aScriptInfo.ScriptID())
{
{
aScriptInfo = *iScripts[i];
return KErrNone;
}
}
}
//Read the script file
TInt ret = iSecMgrDB->ReadScriptInfo(aScriptInfo.ScriptID(),aScriptInfo);
if(KErrNone==ret)
{
iScripts.AppendL(&aScriptInfo);
}
return ret;
}
TInt CScriptManager::GetScriptFile(TExecutableID aExecID,TDes& aScriptFile)
{
return iSecMgrDB->GetScriptFile(aExecID,aScriptFile);
}
void CScriptManager::UpdatePermGrantL(TExecutableID aExecID,TPermGrant aPermGrant,TPermGrant aPermDenied)
{
for(TInt i(0);i!=iScripts.Count();++i)
{
if(iScripts[i]->ScriptID()==aExecID)
{
iScripts[i]->SetPermGranted(aPermGrant);
iScripts[i]->SetPermDenied(aPermDenied);
iSecMgrDB->WriteScriptInfoL(aExecID,*iScripts[i]);
return;
}
}
}