javacommons/security/legacysupport/midp2permissiondb/src/Midp2PermissionDB.cpp
branchRCL_3
changeset 14 04becd199f91
--- /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<MidletSuiteSecuritySettings> 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<securitySettings.size(); i++)
+    {
+        if (securitySettings[i].iSettingsName == settingsName)
+        {
+            return ETrue;
+        }
+    }
+    return EFalse;
+}