--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vpnui/vpnpolins/src/vpnbundlehandler.cpp Thu Dec 17 09:14:51 2009 +0200
@@ -0,0 +1,332 @@
+/*
+* Copyright (c) 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: Utility class for .VPN bundle content analysis
+*
+*/
+
+
+
+#include <e32std.h>
+
+#include "vpnbundlehandler.h"
+#include "policyinstaller_constants.h"
+#include "logvpncommon.h"
+
+
+CVpnBundleHandler* CVpnBundleHandler::NewL(const TDesC& aBundleDir)
+ {
+ LOG_("-> CVpnBundleHandler::NewL()");
+
+ CVpnBundleHandler* self = new (ELeave) CVpnBundleHandler(aBundleDir);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+
+ LOG_("<- CVpnBundleHandler::NewL()");
+
+ return self;
+ }
+
+CVpnBundleHandler* CVpnBundleHandler::NewLC(const TDesC& aBundleDir)
+ {
+ LOG_("-> CVpnBundleHandler::NewLC()");
+
+ CVpnBundleHandler* self = new (ELeave) CVpnBundleHandler(aBundleDir);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+
+ LOG_("<- CVpnBundleHandler::NewLC()");
+
+ return self;
+ }
+
+CVpnBundleHandler::CVpnBundleHandler(const TDesC& aBundleDir) : iBundleFileDir(aBundleDir)
+ {
+ }
+
+CVpnBundleHandler::~CVpnBundleHandler()
+ {
+ LOG_("-> CVpnBundleHandler::~CVpnBundleHandler()");
+
+ delete iPKCS12FileName;
+ delete iCommandFileName;
+ iFileServer.Close();
+
+ LOG_("<- CVpnBundleHandler::~CVpnBundleHandler()");
+ }
+
+void CVpnBundleHandler::ConstructL()
+ {
+ LOG_("-> CVpnBundleHandler::ConstructL()");
+
+ User::LeaveIfError(iFileServer.Connect());
+
+ LOG_("<- CVpnBundleHandler::ConstructL()");
+ }
+
+void CVpnBundleHandler::AnalyzeBundleContentsL()
+ {
+ LOG_("-> CVpnBundleHandler::AnalyzeBundleContentsL()");
+
+ // Check whether a command file exists. Leave if more than one exist.
+ LocateCommandFileL();
+
+ // Check whether a PKCS#12 file exists. Leave if more than one exist.
+ LocatePKCS12FileL();
+
+ LOG_("<- CVpnBundleHandler::AnalyzeBundleContentsL()");
+ }
+
+TBool CVpnBundleHandler::CommandFileExists() const
+ {
+ LOG_("-> CVpnBundleHandler::CommandFileExists()");
+
+ TBool ret(EFalse);
+ if (iCommandFileName)
+ {
+ ret = ETrue;
+ }
+
+ LOG_1("<- CVpnBundleHandler::CommandFileExists() ret: %d", ret);
+
+ return ret;
+ }
+
+TBool CVpnBundleHandler::PKCS12FileExists() const
+ {
+ LOG_("-> CVpnBundleHandler::PKCS12FileExists() ");
+
+ TBool ret(EFalse);
+ if (iPKCS12FileName)
+ {
+ ret = ETrue;
+ }
+
+ LOG_1("<- CVpnBundleHandler::PKCS12FileExists() ret: %d", ret);
+
+ return ret;
+ }
+
+HBufC8* CVpnBundleHandler::ExtractPKCS12DataL()
+ {
+ LOG_("-> CVpnBundleHandler::ExtractPKCS12DataL()");
+
+ TInt dataLen(0);
+ HBufC8* ret(NULL);
+
+ ASSERT(iPKCS12FileName);
+
+ // Read binary PKCS#12 data from file and into an 8bit descr
+ RFile file;
+ CleanupClosePushL(file);
+
+ LOG_(" Opening command file for reading");
+ User::LeaveIfError(file.Open(iFileServer,
+ *iPKCS12FileName,
+ EFileStream|EFileRead));
+ User::LeaveIfError(file.Size(dataLen));
+
+ LOG_1(" File data length: %d bytes", dataLen);
+
+ ret = HBufC8::NewLC(dataLen);
+ TPtr8 dataptr = ret->Des();
+
+ LOG_1(" Data length before read: %d B", dataptr.Length());
+
+ LOG_(" Reading...");
+ User::LeaveIfError(file.Read(dataptr));
+
+ LOG_1(" Data length after read: %d B", dataptr.Length());
+
+ CleanupStack::Pop(ret); // control transferred
+
+ LOG_(" Closing file");
+ CleanupStack::PopAndDestroy(); // file
+
+ LOG_1("<- CVpnBundleHandler::ExtractPKCS12DataL() len: %d", dataLen);
+
+ return ret;
+ }
+
+HBufC8* CVpnBundleHandler::ExtractCommandFileDataL()
+ {
+ LOG_("-> CVpnBundleHandler::ExtractCommandFileDataL()");
+
+ TInt dataLen(0);
+ HBufC8* ret(NULL);
+
+
+ ASSERT(iCommandFileName);
+
+ // Read ASCII cmd file data from file and into an 8bit descr
+ RFile file;
+ CleanupClosePushL(file);
+
+ LOG_(" Opening command file for reading");
+ User::LeaveIfError(file.Open(iFileServer,
+ *iCommandFileName,
+ EFileStreamText|EFileRead));
+ User::LeaveIfError(file.Size(dataLen));
+
+ LOG_1(" File data length: %d bytes", dataLen);
+
+ ret = HBufC8::NewLC(dataLen);
+ TPtr8 dataptr = ret->Des();
+
+ LOG_1(" Data length before read: %d B", dataptr.Length());
+
+ LOG_(" Reading...");
+ User::LeaveIfError(file.Read(dataptr));
+
+ LOG_1(" Data length after read: %d B", dataptr.Length());
+
+ CleanupStack::Pop(ret); // control transferred
+ LOG_(" Closing file");
+ CleanupStack::PopAndDestroy(); // file
+
+ LOG_1("<- CVpnBundleHandler::ExtractCommandFileDataL() len: %d", dataLen);
+
+ return ret;
+ }
+
+/**
+ * Find PKCS#12 file from the temp dir the .vpn file was extracted to.
+ */
+void CVpnBundleHandler::LocateCommandFileL()
+ {
+ LOG_("-> CVpnBundleHandler::LocateCommandFileL()");
+
+ TFindFile fileFinder(iFileServer);
+ CDir* fileList(NULL);
+
+
+
+ LOG_1(" Search argument: '%S'", &(KCommandFilePattern()));
+ LOG_1(" Search path: '%S'", &iBundleFileDir);
+
+ // Find the command file using the pattern .p12
+ TInt ret = fileFinder.FindWildByDir(KCommandFilePattern,
+ iBundleFileDir, fileList);
+
+ if (ret == KErrNone)
+ {
+ CleanupStack::PushL(fileList);
+
+ // Only allow one or less command files in the VPN bundle
+ if (fileList->Count() > 1)
+ {
+ LOG_("<- CVpnBundleHandler::LocateCommandFileL() LEAVE: multiple command files");
+ User::Leave(KErrArgument);
+ }
+
+ // At the moment, there may be exactly 0 or 1 command files,
+ // so the loop isn't strictly necessary. However,
+ // in the future it may be deemed necessary to support
+ // multiple command files.
+ for (TInt i = 0; i < fileList->Count(); i++)
+ {
+ LOG_1(" Processing cmdfile number %d", (i+1));
+ TParse fileNameParser;
+ fileNameParser.Set((*fileList)[i].iName, NULL, NULL);
+
+ LOG_1(" Found cmdfile: '%S'", &(fileNameParser.FullName()));
+ if (iCommandFileName)
+ {
+ delete iCommandFileName;
+ iCommandFileName = NULL;
+ }
+
+ // Allocate heap for the filename
+ iCommandFileName = HBufC::NewL(fileNameParser.FullName().Length() +
+ iBundleFileDir.Length());
+ //Concatenate the path + filename
+ iCommandFileName->Des().Append(iBundleFileDir);
+ iCommandFileName->Des().Append(fileNameParser.FullName());
+ }
+
+ CleanupStack::PopAndDestroy(fileList);
+ }
+ else if (ret != KErrNotFound)
+ {
+ User::Leave(ret);
+ }
+
+ LOG_("<- CVpnBundleHandler::LocateCommandFileL()");
+ }
+
+/**
+ * Find PKCS#12 file from the temp dir the .vpn file was extracted to.
+ */
+void CVpnBundleHandler::LocatePKCS12FileL()
+ {
+ LOG_("-> CVpnBundleHandler::LocatePKCS12FileL()");
+
+ TFindFile fileFinder(iFileServer);
+ CDir* fileList(NULL);
+
+ LOG_1(" Search argument: '%S'", &(KPKCS12Pattern()));
+ LOG_1(" Search path: '%S'", &iBundleFileDir);
+
+ // Find the PCKS#12 file using the pattern .p12
+ TInt ret = fileFinder.FindWildByDir(KPKCS12Pattern,
+ iBundleFileDir,
+ fileList);
+
+ if (ret == KErrNone)
+ {
+ CleanupStack::PushL(fileList);
+
+ // Only allow one or less command files in the VPN bundle
+ if (fileList->Count() > 1)
+ {
+ LOG_("<- CVpnBundleHandler::LocatePKCS12FileL() LEAVE: multiple p12 files");
+ User::Leave(KErrArgument);
+ }
+
+ // At the moment, there may be exactly 0 or 1 p12 files,
+ // so the loop isn't strictly necessary. However,
+ // in the future it may be deemed necessary to support
+ // multiple p12 files.
+ for (TInt i = 0; i < fileList->Count(); i++)
+ {
+ LOG_1(" Processing p12 number %d", (i+1));
+ TParse fileNameParser;
+ fileNameParser.Set((*fileList)[i].iName, NULL, NULL);
+
+ LOG_1(" Found p12: '%S'", &(fileNameParser.FullName()));
+ if (iPKCS12FileName)
+ {
+ delete iPKCS12FileName;
+ iPKCS12FileName = NULL;
+ }
+
+ // Allocate heap for the filename
+ iPKCS12FileName = HBufC::NewL(fileNameParser.FullName().Length() +
+ iBundleFileDir.Length());
+ //Concatenate the path + filename
+ iPKCS12FileName->Des().Append(iBundleFileDir);
+ iPKCS12FileName->Des().Append(fileNameParser.FullName());
+ }
+
+ CleanupStack::PopAndDestroy(fileList);
+ }
+ else if (ret != KErrNotFound)
+ {
+ User::Leave(ret);
+ }
+
+ LOG_("<- CVpnBundleHandler::LocatePKCS12FileL()");
+ }
+
+