diff -r f5050f1da672 -r 04becd199f91 javaruntimes/starterutils/src.s60/bootclasspath.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javaruntimes/starterutils/src.s60/bootclasspath.cpp Tue Apr 27 16:30:29 2010 +0300 @@ -0,0 +1,151 @@ +/* +* 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 "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: Functionality for reading extended bootclasspath in Symbian env +* +*/ + +#include + +#include "javaruntimeprivatecrkeys.h" +#include "logger.h" +#include "bootclasspath.h" + + +HBufC* GetCRepClasspathL() +{ + _LIT(KAllowedPathPrefix1, "c:\\resource\\"); + _LIT(KAllowedPathPrefix2, "c:/resource/"); + const TChar KClasspathSeparator(';'); + + JELOG2(EJavaRuntime); + CRepository* repository = CRepository::NewL(KCRUidJavaRuntime); + CleanupStack::PushL(repository); + + HBufC* path = HBufC::NewL(NCentralRepositoryConstants::KMaxUnicodeStringLength); + TPtr ptr = path->Des(); + TInt err = repository->Get(KJavaRuntimeMIDPClasspath, ptr); + CleanupStack::PopAndDestroy(repository); + + if ((err == KErrNotFound) || (ptr.Length() == 0)) + { + LOG(EJavaRuntime, EInfo, "No KJavaRuntimeMIDPClasspath key in Cen Rep"); + delete path; + return 0; + } + else if (err != KErrNone) + { + ELOG1(EJavaRuntime, "Cenral Repository error %d", err); + delete path; + return 0; + } + + // Only extensions installed to C:/resource/ are accepted. + // If KJavaRuntimeMIDPClasspath contains extensions installed + // to some other (unsafe) place, remove them from classpath + // and store the pruned classpath back to central repository + // The classpath read from central repository may be for example + // "C:/resource/java/lib/eswt.jar;;E:/Resource/java/lib/payment.jar + // ;c:\\resource\\java\\lib\\mia.jar; " + + TInt cpStart(0); // start position of class path in class paths + TInt cpLength(0); // length of of class path in class paths + TBool updateCR(EFalse); // ETrue if cen rep must be updated + + // Go through all class paths + while (cpStart < ptr.Length() && cpLength < ptr.Length()) + { + // Length of the class path, class paths are separated ';' + cpLength = ptr.MidTPtr(cpStart).LocateF(KClasspathSeparator); + if (cpLength == KErrNotFound) + { + // The class path is last one without ';', cpLength is rest from start position to total length + cpLength = ptr.Length() - cpStart; + } + else + { + // Include ';' + cpLength++; + } + + // Process class path + TPtr tmpPtr = ptr.MidTPtr(cpStart, cpLength); + + if ((tmpPtr.Left(((TDesC)KAllowedPathPrefix1).Length()).CompareF(KAllowedPathPrefix1)) && + (tmpPtr.Left(((TDesC)KAllowedPathPrefix2).Length()).CompareF(KAllowedPathPrefix2))) + { + // Unsafe class path, delete it + ptr.Delete(cpStart, cpLength); + // Start of the next class path is start of the current deleted class path + cpLength = 0; + updateCR = ETrue; + } + else + { + // Allowed class path + // Start of the next class path is end of the current class path + cpStart = cpStart + cpLength; + } + } + + if (!updateCR) + { + // Classpath does not contain any dangerous paths + return path; + } + + // Store the cleaned classpath back to central repository (to optimize + // next execution) + WLOG(EJavaRuntime, + "GetCRepClasspathL: Removing unsafe extension(s) from Cen Rep extension classpath"); + CleanupStack::PushL(path); + repository = CRepository::NewL(KCRUidJavaRuntime); + err = repository->Set(KJavaRuntimeMIDPClasspath, ptr); + delete repository; + if (err != KErrNone) + { + WLOG1(EJavaRuntime, + "GetCRepClasspathL could not store cleaned classpath, err %d", err); + } + + if (ptr.Length() > 0) + { + CleanupStack::Pop(path); + return path; + } + else + { + WLOG(EJavaRuntime, "Cleaned classpath is empty"); + // nothing to return + CleanupStack::PopAndDestroy(path); + return 0; + } +} + +void java::runtime::getExtendedBootClassPath(std::wstring& bootClassPath) +{ + JELOG2(EJavaRuntime); + HBufC* path = 0; + TRAP_IGNORE(path = GetCRepClasspathL()); + if (path != 0) + { + LOG1(EJavaRuntime, EInfo, " Length of the bcp %d", path->Length()); + if (path->Length() > 0) + { + bootClassPath.assign((wchar_t*)path->Ptr(), + path->Length()); + LOG1(EJavaRuntime, EInfo, " bcp '%S'", bootClassPath.c_str()); + } + delete path; + } +}