diff -r 000000000000 -r 32704c33136d installationservices/swi/test/tsisregistrytest/writablesessionstep.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/installationservices/swi/test/tsisregistrytest/writablesessionstep.cpp Tue Jan 26 12:06:03 2010 +0200 @@ -0,0 +1,498 @@ +/* +* Copyright (c) 2004-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: +* +*/ + + +/** + @file + @test + @internalTechnology +*/ + +#include +#include "writablesessionstep.h" +#include "sisregistrypackage.h" +#include "sisregistrywritableentry.h" +#include "sisregistrywritablesession.h" +#include "installtypes.h" +#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK +#include +#else +#include "integrityservices.h" +#endif +#include "cleanuputils.h" +#include "dessisdataprovider.h" +#include "siscontroller.h" +#include "application.h" +#include "userselections.h" +#include "sisregistryaccess_client.h" + +_LIT(KUid, "uid"); +_LIT(KPackage, "package"); +_LIT(KVendor, "vendor"); +_LIT(KSisFile, "sis"); + +using namespace Swi; + +///////////////////////////////////////////////////////////////////// +// CSisRegistryStep +///////////////////////////////////////////////////////////////////// +TVerdict CSisRegistryWritableSessionStep::doTestStepPreambleL() + { + __UHEAP_MARK; + + // Install an active scheduler + CActiveScheduler* s = new (ELeave) CActiveScheduler; + s->Install(s); + + INFO_PRINTF1(_L("Connecting to SisRegistry..")); + User::LeaveIfError(iSisRegistry.Connect()); + INFO_PRINTF1(_L("Connected!")); + StartTimer(); + return TestStepResult(); + } + +TVerdict CSisRegistryWritableSessionStep::doTestStepPostambleL() + { + StopTimerAndPrintResultL(); + // Remove the installed active scheduler + CActiveScheduler* s = CActiveScheduler::Current(); + s->Install(NULL); + delete s; + INFO_PRINTF1(_L("Disconnecting to SisRegistry..")); + iSisRegistry.Close(); + + __UHEAP_MARKEND; + + return TestStepResult(); + } + +///////////////////////////////////////////////////////////////////// +// CPoliceSidsStep - tests specific to Sid access methods +///////////////////////////////////////////////////////////////////// +CPoliceSidsStep::CPoliceSidsStep() + { + SetTestStepName(KPoliceSids); + } + +TVerdict CPoliceSidsStep::doTestStepL() + { + // this test checks that this client would not be permitted to + // perform the operations - the drive state update methods are + // particularly important - no caps are required and hence policing on sid + // is required. + // the attempt to delete registry entries is important as a reassurance that + // the both capability and sid based policing are enforced + TInt res; + SetTestStepResult(EPass); + TInt drive = 1; + // add drive + TRAP(res, iSisRegistry.AddDriveL(drive)); + INFO_PRINTF3(_L("Add drive %d returned %d"), drive, res); + if (res != KErrPermissionDenied) + { + SetTestStepResult(EFail); + } + +#ifndef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK + // remove drive + TRAP(res, iSisRegistry.RemoveDriveL(drive)); + INFO_PRINTF3(_L("Remove drive %d returned %d"), drive, res); + if (res != KErrPermissionDenied) + { + SetTestStepResult(EFail); + } +#endif + + RPointerArray packages; + CleanupResetAndDestroy >::PushL(packages); + + iSisRegistry.InstalledPackagesL(packages); + + for(TInt index = 0; index < packages.Count(); index++) + { + INFO_PRINTF3(_L("(Vendor Name:) %S (Package Name:) %S"), + &packages[index]->Vendor(), + &packages[index]->Name()); + + TRAP(res, iSisRegistry.DeleteEntryL(*packages[index], 0)) + INFO_PRINTF3(_L("DeleteEntryL %d returned %d"), index, res); + + if (res != KErrPermissionDenied) + { + SetTestStepResult(EFail); + } + } + + CleanupStack::PopAndDestroy(&packages); + + SetTestStepResult(EPass); + return TestStepResult(); + } + +///////////////////////////////////////////////////////////////////// +// CWritableEntryMethodsStep - tests specific to entry methods +///////////////////////////////////////////////////////////////////// +CWritableEntryMethodsStep::CWritableEntryMethodsStep() + { + SetTestStepName(KWritableEntryMethods); + } + +TVerdict CWritableEntryMethodsStep::doTestStepL() + { + RPointerArray packages; + CleanupResetAndDestroy >::PushL(packages); + + iSisRegistry.InstalledPackagesL(packages); + + for(TInt index = 0; index < packages.Count(); index++) + { + INFO_PRINTF3(_L("(Vendor Name:) %S (Package Name:) %S"), + &packages[index]->Vendor(), + &packages[index]->Name()); + + Swi::RSisRegistryWritableEntry entry; + CleanupClosePushL(entry); + TInt res = entry.OpenL(iSisRegistry, *packages[index]); + if (res == KErrNone) + { + PrintWritableEntryContents(entry); + } + CleanupStack::PopAndDestroy(&entry); + } + + CleanupStack::PopAndDestroy(&packages); + + SetTestStepResult(EPass); + return TestStepResult(); + } + +void CWritableEntryMethodsStep::PrintWritableEntryContents(Swi::RSisRegistryWritableEntry &aEntry) + { + INFO_PRINTF1(_L("-------------------------------------\n")); + // get the vendor; package name + HBufC* vendor = aEntry.UniqueVendorNameL(); + CleanupStack::PushL(vendor); + HBufC* package = aEntry.PackageNameL(); + CleanupStack::PushL(package); + INFO_PRINTF3(_L("Package: %S from Vendor: %S"), package, vendor); + CleanupStack::PopAndDestroy(package); + CleanupStack::PopAndDestroy(vendor); + + // get the localised vendor name + HBufC* vendorLocal = aEntry.LocalizedVendorNameL(); + CleanupStack::PushL(vendorLocal); + INFO_PRINTF2(_L("Localised Vendor Name: %S"), vendorLocal); + CleanupStack::PopAndDestroy(vendorLocal); + + // get uid + TUid uid = aEntry.UidL(); + INFO_PRINTF3(_L("Package Uid: %d 0x%08x"), uid.iUid, uid.iUid); + + // get the version + TVersion packageVersion = aEntry.VersionL(); + INFO_PRINTF4(_L("Version %d %d %d"), packageVersion.iMajor, packageVersion.iMinor, packageVersion.iBuild ); + + // get sids + RArray sids; + CleanupClosePushL(sids); + aEntry.SidsL(sids); + if (sids.Count() <= 0) + { + INFO_PRINTF1(_L("No sids installed!")); + } + else + { + for (TInt index = 0; index < sids.Count(); index++) + { + INFO_PRINTF2(_L("Sid: 0x%08x was found!"), sids[index]); + } + } + CleanupStack::PopAndDestroy(&sids); + + // get language + TLanguage language = aEntry.LanguageL(); + INFO_PRINTF3(_L("Package Language: %d 0x%08x"), language, language); + + // get property + TInt32 propertyKey = 10; + TInt32 propertyValue = aEntry.PropertyL(propertyKey); + INFO_PRINTF3(_L("Package property: key %d value %d"), propertyKey, propertyValue); + + // is present - currenty relies on default value + TBool isPresent = aEntry.IsPresentL(); + INFO_PRINTF2(_L("Package present is %d"), isPresent); + + // is signed + TBool isSigned = aEntry.IsSignedL(); + INFO_PRINTF2(_L("Package signed is %d"), isSigned); + + if (isSigned) + { + RPointerArray certChains; + CleanupResetAndDestroy >::PushL(certChains); + aEntry.CertificateChainsL(certChains); + INFO_PRINTF2(_L("Package signed with %d chains"), certChains.Count()); + CleanupStack::PopAndDestroy(&certChains); + } + + // check Trust + switch(aEntry.TrustL()) + { + case ESisPackageUnsignedOrSelfSigned: + INFO_PRINTF1(_L("Packaged Trust: Unsigned or self signed")); + break; + case ESisPackageCertificateChainNoTrustAnchor: + INFO_PRINTF1(_L("Packaged Trust: Certificate Chain has no trust anchor in Cert store")); + break; + case ESisPackageCertificateChainValidatedToTrustAnchor: + INFO_PRINTF1(_L("Packaged Trust: Certificate Chain Validated to Trust Anchor in Cert store")); + break; + case ESisPackageChainValidatedToTrustAnchorOCSPTransientError: + INFO_PRINTF1(_L("Packaged Trust: Certificate Chain Validated and OCSP Transient Error")); + break; + case ESisPackageChainValidatedToTrustAnchorAndOCSPValid: + INFO_PRINTF1(_L("Packaged Trust: Certificate Chain Validated and OCSP Valid")); + break; + case ESisPackageBuiltIntoRom: + INFO_PRINTF1(_L("Packaged Trust: Built into ROM")); + break; + case ESisPackageValidationFailed: + INFO_PRINTF1(_L("Packaged Trust: Certificate Chain Validation Failed")); + break; + default: + INFO_PRINTF1(_L("Packaged Trust: Unknown")); + break; + }; + + // Time at which the trust was established + TTime timeStamp = aEntry.TrustTimeStampL(); + TBuf <32> dateTimeText; + TRAP_IGNORE(timeStamp.FormatL(dateTimeText, _L("%H%:1%T%:2%S on %1%/1%2%/2%3"))); + INFO_PRINTF2(_L("Package Trust Established: %S"), &dateTimeText); + + + // is in rom + TBool inRom = aEntry.IsInRomL(); + INFO_PRINTF2(_L("Package inRom is %d"), inRom); + + // is an augmentation + TBool isAug = aEntry.IsAugmentationL(); + INFO_PRINTF2(_L("Package isAug is %d"), isAug); + // is preinstalled + /* + Sis::TInstallType installType = aEntry.InstallTypeL(); + INFO_PRINTF3(_L("Package type is %d %S"), + installType, &installTypeNames[installType]); + */ + // get list of files + RPointerArray files; + CleanupResetAndDestroy >::PushL(files); + aEntry.FilesL(files); + INFO_PRINTF2(_L("Package has %d files"), files.Count()); + for (TInt i=0; i deleteUids; + CleanupClosePushL(deleteUids); + GetUidArrayFromConfigL(ConfigSection(), KUid, deleteUids); + + RArray deletePackageNames; + CleanupClosePushL(deletePackageNames); + GetStringArrayFromConfigL(ConfigSection(), KPackage, deletePackageNames); + + RArray deleteVendorNames; + CleanupClosePushL(deleteVendorNames); + GetStringArrayFromConfigL(ConfigSection(), KVendor, deleteVendorNames); + +#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK + TInt64 transactionID = -1; + Usif::RStsSession stsSession; + CleanupClosePushL(stsSession); +#else + TInt64 transactionID = 1; + _LIT(KIntegrityServicesPath, "\\sys\\install\\integrityservices\\"); +#endif + + for (TInt index = 0; index < deleteUids.Count(); index++) + { +#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK + transactionID = stsSession.CreateTransactionL(); +#else + CIntegrityServices* integrityService = CIntegrityServices::NewLC(transactionID, KIntegrityServicesPath); +#endif + INFO_PRINTF3(_L("Transaction %d Deleting registry entry with Uid 0x%08x"), + I64LOW(transactionID), deleteUids[index]); + + CSisRegistryPackage* package = CSisRegistryPackage::NewLC(deleteUids[index], deletePackageNames[index], deleteVendorNames[index]); + TRAP_IGNORE(iSisRegistry.DeleteEntryL(*package, transactionID)); + CleanupStack::PopAndDestroy(package); + +#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK + stsSession.CommitL(); +#else + integrityService->CommitL(); + CleanupStack::PopAndDestroy(integrityService); +#endif + // should not be able to find this entry + if(!iSisRegistry.IsInstalledL(deleteUids[index])) + { + SetTestStepResult(EPass); + } + } + +#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK + CleanupStack::PopAndDestroy(4, &deleteUids); //deletePackageNames, deleteVendorNames, stsSession +#else + CleanupStack::PopAndDestroy(3, &deleteUids); //deletePackageNames, deleteVendorNames +#endif + return TestStepResult(); + } + +///////////////////////////////////////////////////////////////////// +// CAddEntryStep - Adds a registry entry representing a given package +///////////////////////////////////////////////////////////////////// +CAddEntryStep::CAddEntryStep() + { + SetTestStepName(KAddEntryStep); + } + +TVerdict CAddEntryStep::doTestStepL() + { + TPtrC sisFile; + if(!GetStringFromConfig(ConfigSection(), KSisFile, sisFile)) + return PrintErrorAndReturnFailL(_L("SIS file couldn't be found in the configuration!")); + + HBufC8 *controllerData = GetControllerFromSisLC(sisFile); + const TInt controllerOffset = 4; + // The registry does not store the first 4 bytes of the controller - see CInstallationProcessor + TPtrC8 controllerDataPtr = controllerData->Mid(controllerOffset); + + RSisRegistryAccessSession sras; + User::LeaveIfError(sras.Connect()); + CleanupClosePushL(sras); + sras.AddEntryL(controllerDataPtr, iTimeMeasuredExternally); + CleanupStack::PopAndDestroy(2, controllerData); // controllerData, sras + return TestStepResult(); + } + +///////////////////////////////////////////////////////////////////////////// +// CUpdateEntryStep - Updates the registry entry representing a given package +///////////////////////////////////////////////////////////////////////////// +CUpdateEntryStep::CUpdateEntryStep() + { + SetTestStepName(KUpdateEntryStep); + } + +TVerdict CUpdateEntryStep::doTestStepL() + { + TPtrC sisFile; + if(!GetStringFromConfig(ConfigSection(), KSisFile, sisFile)) + return PrintErrorAndReturnFailL(_L("SIS file couldn't be found in the configuration!")); + + HBufC8 *controllerData = GetControllerFromSisLC(sisFile); + const TInt controllerOffset = 4; + // The registry does not store the first 4 bytes of the controller - see CInstallationProcessor + TPtrC8 controllerDataPtr = controllerData->Mid(controllerOffset); + + RSisRegistryAccessSession sras; + User::LeaveIfError(sras.Connect()); + CleanupClosePushL(sras); + sras.UpdateEntryL(controllerDataPtr, iTimeMeasuredExternally); + CleanupStack::PopAndDestroy(2, controllerData); // controllerData, sras + return TestStepResult(); + } + +///////////////////////////////////////////////////////////////////////////// +// CSingleEntryDeleteStep - Deletes the registry entry representing a given package uid +///////////////////////////////////////////////////////////////////////////// +CSingleEntryDeleteStep::CSingleEntryDeleteStep() + { + SetTestStepName(KDeleteSingleEntry); + } + +TVerdict CSingleEntryDeleteStep::doTestStepL() + { + TUid uid; + if(!GetUidFromConfig(ConfigSection(), KUid, uid)) + return PrintErrorAndReturnFailL(_L("Uid is missing in the configuration file!")); + + TPtrC package; + if(!GetStringFromConfig(ConfigSection(), KPackage, package)) + return PrintErrorAndReturnFailL(_L("Package couldn't be found in the configuration!")); + + TPtrC vendor; + if(!GetStringFromConfig(ConfigSection(), KVendor, vendor)) + return PrintErrorAndReturnFailL(_L("Vendor couldn't be found in the configuration!")); + + CSisRegistryPackage *sisPackage = CSisRegistryPackage::NewLC(uid, package, vendor); + + RSisRegistryAccessSession sras; + User::LeaveIfError(sras.Connect()); + CleanupClosePushL(sras); + sras.DeleteEntryL(*sisPackage, iTimeMeasuredExternally); + CleanupStack::PopAndDestroy(2, sisPackage); // sisPackage, sras + return TestStepResult(); + } + +///////////////////////////////////////////////////////////////////////////// +// CPackageExistsInRomStep - Returns ETrue if any ROM stub in the filesystem has the package uid specified +///////////////////////////////////////////////////////////////////////////// +CPackageExistsInRomStep::CPackageExistsInRomStep() + { + SetTestStepName(KIsPackageExistInRomStep); + } + +TVerdict CPackageExistsInRomStep::doTestStepL() + { + TUid uid; + if(!GetUidFromConfig(ConfigSection(), KUid, uid)) + { + ERR_PRINTF1(_L("Uid is missing in the configuration file!")); + SetTestStepResult(EFail); + return TestStepResult(); + } + TBool ret = iSisRegistry.PackageExistsInRomL(uid); + + return TestStepResult(); + } + + +