diff -r f5050f1da672 -r 04becd199f91 javacommons/security/legacysupport/midp2permissiondb/src/Midp2PermissionDB.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javacommons/security/legacysupport/midp2permissiondb/src/Midp2PermissionDB.cpp Tue Apr 27 16:30:29 2010 +0300 @@ -0,0 +1,280 @@ +/* +* 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: +* +*/ +#include "Midp2PermissionDB.h" +#include "StorageUtils.h" +#include "javasymbianoslayer.h" +#include "javacommonutils.h" +#include "javauid.h" + +using namespace MIDP; +using namespace std; +using namespace java::security::legacysupport; +using namespace java::util; + +EXPORT_C Midp2PermissionDB* Midp2PermissionDB::NewL(const TDesC& aMidletSuiteName, + const TDesC& aMidletSuiteVendor, + const TDesC& aMidletSuiteVersion) +{ + Midp2PermissionDB* self = new(ELeave) Midp2PermissionDB(); + CleanupStack::PushL(self); + self->ConstructL(aMidletSuiteName, aMidletSuiteVendor, aMidletSuiteVersion); + CleanupStack::Pop(self); + return self; +} + +void Midp2PermissionDB::ConstructL(const TDesC& aMidletSuiteName, + const TDesC& aMidletSuiteVendor, + const TDesC& aMidletSuiteVersion) +{ + MidletSuiteInfo midletSuiteInfo; + StorageUtils* storage = StorageUtils::NewL(); + CleanupStack::PushL(storage); + storage->readMidletSuiteInfoL( + wstring((wchar_t*) aMidletSuiteName.Ptr(), aMidletSuiteName.Length()), + wstring((wchar_t*) aMidletSuiteVendor.Ptr(), aMidletSuiteVendor.Length()), + wstring((wchar_t*) aMidletSuiteVersion.Ptr(), aMidletSuiteVersion.Length()), + midletSuiteInfo); + CleanupStack::PopAndDestroy(storage); + iMidletSuiteUid = midletSuiteInfo.iUid; + iMidletSuiteProtectionDomain = midletSuiteInfo.iProtectionDomain; +} + +Midp2PermissionDB::Midp2PermissionDB() +{ +} + +Midp2PermissionDB::~Midp2PermissionDB() +{ +} + +EXPORT_C TInt Midp2PermissionDB::GetDomain(TMidp2Domain& aDomain) +{ + if (iMidletSuiteProtectionDomain.compare(L"UTPD") == 0) + { + aDomain = EDomainUntrusted; + } + else if (iMidletSuiteProtectionDomain.compare(L"ITPD") == 0) + { + aDomain = EDomainTTP; + } + else if (iMidletSuiteProtectionDomain.compare(L"MFD") == 0) + { + aDomain = EDomainManufacturer; + } + else if (iMidletSuiteProtectionDomain.compare(L"OPD") == 0) + { + aDomain = EDomainOperator; + } + else + { + return KErrNotFound; + } + return KErrNone; +} + +EXPORT_C TInt Midp2PermissionDB::GetFunctionGroupPermission( + const TMidp2FunctionGroup& aFunctionGroup, + TMidp2PermissionType& aPermissionType, + TMidp2PermissionMode& aPermissionMode, + TUint8& aAllowedModesMask) +{ + + if (aFunctionGroup <= EPhoneCall || aFunctionGroup >= ELastFunctionGroupMarker) + { + return KErrNotFound; + } + + // The allowed modes info is stored as a 4-bit constant: + // X(oneshot)X(session)X(blanket)X(no) + // e.g. 1011 (=11) means that oneshot, blanket and no are allowed. + // The following constants are used to encode/decode the allowed modes + // into/from a 4-bit number + int NO_MASK = 1; + int BLANKET_MASK = 2; + int SESSION_MASK = 4; + int ONESHOT_MASK = 8; + + wstring settingsName = wstring((wchar_t*) KJcfFunctionGroups[aFunctionGroup]); + MidletSuiteSecuritySettings securitySettings; + StorageUtils* storage = NULL; + int result = KErrNotFound; + TRAP_IGNORE( + storage = StorageUtils::NewL(); + CleanupStack::PushL(storage); + result = storage->readMidletSuiteSecuritySettings(iMidletSuiteUid, settingsName, securitySettings); + CleanupStack::PopAndDestroy(storage); + ); + if (result != KErrNone) + { + return KErrNotFound; + } + if (securitySettings.iCurrentInteractionMode <= 0 + || securitySettings.iCurrentInteractionMode > 4 + || securitySettings.iAllowedInteractionModes <= 0 + || securitySettings.iAllowedInteractionModes > 15) + { + aPermissionType = EAllowed; + return KErrNone; + } + aPermissionType = EUser; + // set current interaction mode + switch (securitySettings.iCurrentInteractionMode) + { + case 1: + aPermissionMode = EOneShot; + break; + case 2: + aPermissionMode = ESession; + break; + case 3: + aPermissionMode = EBlanket; + break; + case 4: + aPermissionMode = EDenied; + break; + } + // set the allowed interaction modes + int tmp = securitySettings.iAllowedInteractionModes & BLANKET_MASK; + if (tmp > 0) + { + aAllowedModesMask |= EBlanket; + } + tmp = securitySettings.iAllowedInteractionModes & SESSION_MASK; + if (tmp > 0) + { + aAllowedModesMask |= ESession; + } + tmp = securitySettings.iAllowedInteractionModes & ONESHOT_MASK; + if (tmp > 0) + { + aAllowedModesMask |= EOneShot; + } + tmp = securitySettings.iAllowedInteractionModes & NO_MASK; + if (tmp > 0) + { + aAllowedModesMask |= EDenied; + } + return KErrNone; +} + +EXPORT_C TInt Midp2PermissionDB::SetFunctionGroupPermission(const TMidp2FunctionGroup& aFunctionGroup, + const TMidp2PermissionType& /*aPermissionType*/, + const TMidp2PermissionMode& aPermissionMode) +{ + + if (aFunctionGroup <= EPhoneCall || aFunctionGroup >= ELastFunctionGroupMarker) + { + return KErrNotFound; + } + + wstring settingsName = wstring((wchar_t*) KJcfFunctionGroups[aFunctionGroup]); + int currentInteractionMode; + switch (aPermissionMode) + { + case EOneShot: + currentInteractionMode = 1; + break; + case ESession: + currentInteractionMode = 2; + break; + case EBlanket: + currentInteractionMode = 3; + break; + case EDenied: + currentInteractionMode = 4; + break; + default: + // oneshot + currentInteractionMode = 1; + break; + } + StorageUtils* storage = NULL; + int result = KErrNotFound; + TRAP_IGNORE( + storage = StorageUtils::NewL(); + CleanupStack::PushL(storage); + result = storage->writeMidletSuiteSecuritySettings(iMidletSuiteUid, settingsName, currentInteractionMode); + if (result == KErrNone) +{ + if (aPermissionMode == EBlanket) + { + // "blanket mode, if selected by the user, MUST NOT result in any + // additional prompts" (MIDP spec) -> mark down that the prompt + // in blanket mode was shown + storage->writeUserSecuritySettingsPromptFlag(iMidletSuiteUid, settingsName, true /* prompt is blanket mode was shown */); + } + } + CleanupStack::PopAndDestroy(storage); + ); + return result; +} + +EXPORT_C TInt Midp2PermissionDB::GetDomainFromName(const TDesC& /*aName*/, + TMidp2Domain& /*aDomain*/) +{ + return KErrNotSupported; +} + +EXPORT_C TInt Midp2PermissionDB::GetFunctionGroupFromName( + const TDesC& /*aName*/, + TMidp2FunctionGroup& /*aFunctionGroup*/) +{ + return KErrNotSupported; +} + +EXPORT_C TInt Midp2PermissionDB::GetPermissionFromName( + const TDesC& /*aName*/, TMidp2Permission& /*aPermission*/) +{ + return KErrNotSupported; +} + +EXPORT_C void Midp2PermissionDB::ReadMIDP2ConfigSetting( + const enum TMidp2ConfigKey& aKey, TInt& aKeyValue) +{ + aKeyValue = (IsFunctionGroupGranted(aKey) ? 1:0); +} + +TBool Midp2PermissionDB::IsFunctionGroupGranted(TInt aFGIndex) +{ + // boundary check + if (aFGIndex < 0 || aFGIndex >= ELastFunctionGroupMarker) + { + return EFalse; + } + StorageUtils* storage = NULL; + std::vector securitySettings; + int result = KErrNotFound; + TRAP_IGNORE( + storage = StorageUtils::NewL(); + CleanupStack::PushL(storage); + result = storage->readMidletSuiteSecuritySettings(iMidletSuiteUid, securitySettings); + CleanupStack::PopAndDestroy(storage); + ); + if (result != KErrNone) + { + return EFalse; + } + wstring settingsName = wstring((wchar_t*) KJcfFunctionGroups[aFGIndex]); + for (int i=0; i