/*
* Copyright (c) 2003-2007 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: Policy importer
*
*/
#ifndef __POLICYIMPORTER_H__
#define __POLICYIMPORTER_H__
#include <e32std.h>
#include <e32base.h>
#include "vpnapidefs.h"
#include "fileutil.h"
class CX509Certificate;
#include "pkiserviceapi.h"
class CVpnApiServant;
class CPolicyStore;
class RFs;
class CPolicyPatchInfoList;
class CIkeDataArray;
class CIkeData;
const TInt KMaxExtPolicyIdLength = 256;
const TInt KDoNotGetKeySize = -1;
typedef TBuf<KMaxExtPolicyIdLength> TExtVpnPolicyId;
/**
* Handles the importing of VPN policies to the system.
*
* @lib internal (vpnmanager.exe)
* @since S60 v3.0
*/
class CPolicyImporter : public CActive
{
public:
static CPolicyImporter* NewL(const RMessage2& aMessage,
CVpnApiServant& aVpnApiServant,
CPolicyStore& iPolicyStore, RFs& aFs);
static CPolicyImporter* NewL(TRequestStatus& aStatus,
CVpnApiServant& aVpnApiServant,
CPolicyStore& iPolicyStore, RFs& aFs);
~CPolicyImporter();
void ImportPolicyL(const TDesC& aDir);
void ImportSinglePolicyL(const TDesC& aDir, TVpnPolicyId& aNewPolicyId);
private:
CPolicyImporter(const RMessage2& aMessage, CVpnApiServant& aVpnApiServant,
CPolicyStore& iPolicyStore, RFs& aFs);
CPolicyImporter(TRequestStatus& aStatus, CVpnApiServant& aVpnApiServant,
CPolicyStore& iPolicyStore, RFs& aFs);
void ConstructL();
protected: // From CActive
void DoCancel();
void RunL();
TInt RunError(TInt aError);
private:
void DoImportPolicyL(const TDesC& aDir);
void GotoState(TInt aState);
void SetCurrState(TInt aState);
void SetNextState(TInt aState);
TInt CurrState();
TInt NextState();
void ChangeStateL();
void CancelOngoingOperation();
void ImportComplete(TInt aReturnValue);
void StateBeginPolicyImportL();
void StateImportCaCertL();
void StateAfterImportCaCertL();
void StateImportPeerCertL();
void StateAfterImportPeerCertL();
void StateImportUserPrivKeyL();
void StateAfterImportUserPrivKeyL();
void StateAttachCertificateL();
void StateAfterAttachCertificateL();
void StateImportPinAndPolL();
void StateCreateVpnDestinationL();
void StateEndPolicyImportL();
void BuildPolicyIdListL();
TPkiServiceStoreType GetStoreTypeL(CIkeData* aData);
/**
* Checks that BIN format CA certs defined in the policy can be
* found in the same directory, where the .pol and .pin files are and
* collects found certificate file names to the iCurrCaCertList list.
*
* Leaves with KVpnErrCaCertFileMissing, if a defined file is not found.
*/
void BuildCaCertListL();
/**
* Checks that BIN format peer certs defined in the policy can be
* found in the same directory, where the .pol and .pin files are and
* collects found certificate file names to the iCurrPeerCertList list.
*
* Leaves with KVpnErrCaCertFileMissing, if a defined file is not found.
*/
void BuildPeerCertListL();
/**
* Checks that BIN format user certs have and assosiated bin format
* private key. Checks that both files exists in the same directory, where
* the .pol and .pin files are. Collects the user cert file names to iCurrUserCertList
* and private key file names to iCurrUserPrivKeyList.
*
* Leaves with KVpnErrCaCertFileMissing, if a defined file is not found.
* of with KVpnErrInvalidPolicyFile if the user certificate doesn't has
* a assosiated private key.
*/
void BuildUserPrivKeyAndUserCertListL();
/**
* Checks if there is other CA certificates which are not defined in policy file
* (like intermediate CAs) and installs them to device.
*/
void BuildOtherCaCertListL();
void ParseIkeDataL();
void PatchPolicyCaCertInfoL(const TFileName& aPolicyFile);
CPolicyPatchInfoList* BuildPolicyPatchInfoListL();
HBufC8* CertSubjectNameL(const TFileName& aCertFile);
void CleanImportDirectory();
void AppendIfNotFoundL(CArrayFixFlat<TFileName>* aList,
TFileName* aFileName);
/**
* Returns subject name of the certificate and sets aKeySize.
* Parameter aKeySize is not set if aKeySize equals KDoNotGetKeySize.
*/
HBufC8* CertInfoL(const TFileName& aCertFile, TInt& aKeySize);
/**
* Returns Issuer name of certificate
*/
HBufC8* CPolicyImporter::CertIssuerL(const TFileName& aCertFile);
TFileName CPolicyImporter::GetCAFromFileListL(const TDesC8& aCertSubjectName, CArrayFixFlat<TFileName>* aCertFileArray);
private:
RMessage2 iMessage;
TRequestStatus* iExtStatus;
CVpnApiServant& iVpnApiServant;
CPolicyStore& iPolicyStore;
RFs& iFs;
TFileUtil iFileUtil;
RPKIServiceAPI iPkiService;
TFileName iImportDir;
TInt iCurrState;
TInt iNextState;
CArrayFixFlat<TExtVpnPolicyId>* iPolicyIdList;
TInt iCurrPolicyIdIndex;
TExtVpnPolicyId iCurrPolicyId;
CIkeDataArray* iCurrIkeDataArray;
TInt iCurrIkeDataIndex;
CArrayFixFlat<TFileName>* iCurrCaCertList;
TInt iCurrCaCertIndex;
CArrayFixFlat<TFileName>* iCurrPeerCertList;
TInt iCurrPeerCertIndex;
CArrayFixFlat<TFileName>* iCurrUserPrivKeyList;
TInt iCurrUserPrivKeyIndex;
CArrayFixFlat<TFileName>* iCurrUserCertList;
TInt iCurrUserCertIndex;
//for intermediate CAs
CArrayFixFlat<TFileName>* iCurrOtherCaCertList;
TInt iCurrOtherCaCertIndex;
TPKIKeyIdentifier iCurrKeyId;
HBufC8* iCertFileData;
HBufC8* iKeyFileData;
TAny* iPkiOpContext;
TBool iImportSinglePolicy;
TVpnPolicyId* iNewPolicyId;
TVpnPolicyId iPolicyId;
};
#endif // __POLICYIMPORTER_H__