contentpublishingsrv/contentpublishingutils/contentpublishingmap/src/cpsecuritypolicy.cpp
changeset 0 79c6a41cd166
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contentpublishingsrv/contentpublishingutils/contentpublishingmap/src/cpsecuritypolicy.cpp	Thu Dec 17 08:54:17 2009 +0200
@@ -0,0 +1,372 @@
+/*
+* Copyright (c) 2008 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:  ?Description
+ *  Version     : %version: 7 % << Don't touch! Updated by Synergy at check-out.
+ *
+*/
+
+
+#include <s32mem.h>
+#include <liwcommon.h>
+#include <e32std.h>
+
+#include "cpsecuritypolicy.h"
+#include "cpdebug.h"
+#include "cpglobals.h"
+
+_LIT( KHex, "0x" );
+_LIT( KTCB, "TCB" );
+_LIT( KLocalServices, "LocalServices" );
+_LIT( KLocation, "Location" );
+_LIT( KNetworkServices, "NetworkServices" );
+_LIT( KReadUserData, "ReadUserData" );
+_LIT( KUserEnvironment, "UserEnvironment" );
+_LIT( KWriteUserData, "WriteUserData" );
+_LIT( KAllFiles, "AllFiles" );
+_LIT( KCommDD, "CommDD" );
+_LIT( KDiskAdmin, "DiskAdmin" );
+_LIT( KDrm, "Drm" );
+_LIT( KMultimediaDD, "MultimediaDD" );
+_LIT( KNetworkControl, "NetworkControl" );
+_LIT( KPowerMgmt, "PowerMgmt" );
+_LIT( KProtServ, "ProtServ" );
+_LIT( KReadDeviceData, "ReadDeviceData" );
+_LIT( KSurroundingsDD, "SurroundingsDD" );
+_LIT( KSwEvent, "SwEvent" );
+_LIT( KTrustedUI, "TrustedUI" );
+_LIT( KWriteDeviceData, "WriteDeviceData" );
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+CCPSecurityPolicy::CCPSecurityPolicy( const RMessage2& aMessage ): 
+                                                           iMessage( aMessage )
+    {
+
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void CCPSecurityPolicy::ConstructL()
+    {
+  
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+CCPSecurityPolicy* CCPSecurityPolicy::NewL( const RMessage2& aMessage )
+    {
+    CCPSecurityPolicy* self = CCPSecurityPolicy::NewLC( aMessage );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+CCPSecurityPolicy* CCPSecurityPolicy::NewLC( const RMessage2& aMessage )
+    {
+    CCPSecurityPolicy* self = new( ELeave ) CCPSecurityPolicy( aMessage );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+CCPSecurityPolicy::~CCPSecurityPolicy()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void CCPSecurityPolicy::GetDefaultSecurityL( RBuf8& aResult ) const
+    {
+    CLiwDefaultMap* aclMap = CLiwDefaultMap::NewLC();
+    CLiwDefaultMap* writeMap = CLiwDefaultMap::NewLC();
+    CLiwDefaultMap* deleteMap = CLiwDefaultMap::NewLC();
+    
+    TUint32 publisherUid = iMessage.SecureId();
+    
+    TBuf<10> uidString;
+    uidString.Append( KHex );
+    uidString.AppendNumFixedWidth(publisherUid,EHex,8);
+    
+    writeMap->InsertL( KUIDs, TLiwVariant( uidString ) );
+    deleteMap->InsertL( KUIDs, TLiwVariant( uidString ) );
+    
+    aclMap->InsertL( KACLWrite, TLiwVariant( writeMap ) );
+    aclMap->InsertL( KACLDelete, TLiwVariant( deleteMap ) );
+
+    //externalize
+    aResult.CreateL( aclMap->Size() );
+    RDesWriteStream strm( aResult );
+    CleanupClosePushL( strm );
+    aclMap->ExternalizeL( strm );
+    strm.CommitL( );
+     
+    CleanupStack::PopAndDestroy( &strm );    
+    CleanupStack::PopAndDestroy( deleteMap );
+    CleanupStack::PopAndDestroy( writeMap );
+    CleanupStack::PopAndDestroy( aclMap );
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TBool CCPSecurityPolicy::CheckSecurityL( TPtrC8& aBinary, 
+                                        TACLPolicy aPolicy ) const
+    {
+    TBool error( ETrue );    
+    RDesReadStream datastrm( aBinary );
+    CleanupClosePushL( datastrm );
+    CLiwDefaultMap* map = CLiwDefaultMap::NewLC( datastrm );
+    TLiwVariant variant;
+    variant.PushL();
+    switch( aPolicy )
+        {
+        case ERead:
+            if( map->FindL( KACLRead, variant ) )
+                {
+                error = DoCheckSecurityL( variant.AsMap() );
+                }
+        break;
+        case EWrite:
+            if( map->FindL( KACLWrite, variant ) )
+                {
+                error = DoCheckSecurityL( variant.AsMap() );
+                }
+        break;
+        case EDelete:
+            if( map->FindL( KACLDelete, variant ) )
+                {
+                error = DoCheckSecurityL( variant.AsMap() );
+                }
+        break;
+        default:
+            User::Leave( KErrNotSupported );
+        }
+    CleanupStack::PopAndDestroy( &variant );
+    CleanupStack::PopAndDestroy( map );
+    CleanupStack::PopAndDestroy( &datastrm );
+    return error;
+    }
+    
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//    
+TBool CCPSecurityPolicy::DoCheckSecurityL( const CLiwMap* aMap ) const
+    {
+    TLiwVariant variant;
+    variant.PushL();
+    TBool denyAccess( ETrue );
+    if( aMap->FindL( KUIDs, variant ) )
+        {
+        TPtrC uidList( KNullDesC );
+        if( variant.Get( uidList) )
+            {
+            denyAccess = CheckUids( uidList );
+            }
+        }
+    if( denyAccess && aMap->FindL( KCapability, variant ) )
+        {
+        TPtrC capList( KNullDesC );
+        if( variant.Get( capList ) )
+            {
+            denyAccess = CheckCapabilities( capList );
+            }
+        }
+    CleanupStack::PopAndDestroy( &variant );
+    return !denyAccess;
+    }
+
+ // ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//   
+TBool CCPSecurityPolicy::CheckUids( const TDesC& aList ) const
+    {
+    TInt i( 1 );
+    TBool denyAccess( ETrue );
+    TPtrC singleUid( KNullDesC );
+    while( i )
+        {
+        ExctractNextToken( aList , singleUid, i );
+        TLex converter( singleUid );
+        converter.Inc( KHex().Length() );
+        TUint32 aclUid( 0 );
+        converter.Val( aclUid , EHex );
+        if( iMessage.SecureId().iId == aclUid )
+            {
+            denyAccess = EFalse;
+            break;
+            }
+        ++i;    
+        }
+    return denyAccess;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TBool CCPSecurityPolicy::CheckCapabilities( const TDesC& aList ) const
+    {
+    TInt i( 1 );
+    TBool denyAccess( EFalse );
+    TPtrC singleCap( KNullDesC );
+    while( i )
+        {
+        ExctractNextToken( aList , singleCap, i );
+        if( !iMessage.HasCapability( GetCapability( singleCap ) ) )
+            {
+            denyAccess = ETrue;
+            break;
+            }  
+        ++i;    
+        }
+    return denyAccess;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//  
+void CCPSecurityPolicy::ExctractNextToken( const TDesC& aList, 
+                                            TPtrC& aResult , TInt& aPos ) const
+    {
+    TPtrC buf( aList );
+    for( TInt x(0); x < aPos; x++ )
+        {
+        TInt pos = buf.Locate(':');
+        if( pos!= KErrNotFound )
+            {
+            aResult.Set( buf.Left( pos ) );
+            buf.Set( buf.Right( buf.Length() - pos - 1 ) );
+            }
+        else
+            {
+            aResult.Set( buf );
+            aPos = -1;
+            break;
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//  
+TCapability CCPSecurityPolicy::GetCapability( const TDesC& aCapability ) const
+    {
+    TCapability ret( ECapability_None );
+    if( aCapability == KTCB )
+        {
+        ret = ECapabilityTCB;
+        }
+    else if( aCapability == KLocalServices )
+        {
+        ret = ECapabilityLocalServices;
+        }
+    else if( aCapability == KLocation )
+        {
+        ret = ECapabilityLocation;
+        }
+    else if( aCapability == KNetworkServices )
+        {
+        ret = ECapabilityNetworkServices;
+        }
+    else if( aCapability == KReadUserData )
+        {
+        ret = ECapabilityReadUserData;
+        }
+    else if( aCapability == KUserEnvironment )
+        {
+        ret = ECapabilityUserEnvironment;
+        }
+    else if( aCapability == KWriteUserData )
+        {
+        ret = ECapabilityWriteUserData;
+        }
+    else if( aCapability == KAllFiles )
+        {
+        ret = ECapabilityAllFiles;
+        }
+    else if( aCapability == KDiskAdmin )
+        {
+        ret = ECapabilityDiskAdmin;
+        }
+    else if( aCapability == KCommDD )
+        {
+        ret = ECapabilityCommDD;
+        }
+    else if( aCapability == KDrm )
+        {
+        ret = ECapabilityDRM;
+        }
+    else if( aCapability == KMultimediaDD )
+        {
+        ret = ECapabilityMultimediaDD;
+        }
+    else if( aCapability == KNetworkControl )
+        {
+        ret = ECapabilityNetworkControl;
+        }
+    else if( aCapability == KPowerMgmt )
+        {
+        ret = ECapabilityPowerMgmt;
+        }
+    else if( aCapability == KProtServ )
+        {
+        ret = ECapabilityProtServ;
+        }                            
+    else if( aCapability == KReadDeviceData )
+        {
+        ret = ECapabilityReadDeviceData;
+        }                            
+    else if( aCapability == KSurroundingsDD )
+        {
+        ret = ECapabilitySurroundingsDD;
+        }
+    else if( aCapability == KSwEvent )
+        {
+        ret = ECapabilitySwEvent;
+        }
+    else if( aCapability == KTrustedUI )
+        {
+        ret = ECapabilityTrustedUI;
+        }                        
+    else if( aCapability == KWriteDeviceData )
+        {
+        ret = ECapabilityWriteDeviceData;
+        }
+    else ret = ECapability_None;                        
+    return ret;
+    }   
+