upnpsharing/upnpsecurity/src/upnpsecaccesscontroller.cpp
changeset 0 7f85d04be362
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/upnpsharing/upnpsecurity/src/upnpsecaccesscontroller.cpp	Thu Dec 17 08:52:00 2009 +0200
@@ -0,0 +1,362 @@
+/** @file
+ * 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:  Defines the CUpnpSecAccessController class
+ *
+ */
+
+// INCLUDES
+#include <e32base.h>
+#include <upnpmediaserversettings.h>
+#include "upnpsecaccesscontroller.h"
+#include "upnpsecuritymanagerclientsession.h"
+
+_LIT( KComponentLogfile, "upnpsecurity.txt");
+#include "upnplog.h"
+
+// CONSTANTS
+
+_LIT8( KSecurityPluginName, "UpnpSecurityManager" );
+_LIT( KMediaServerXMLFile, "MediaServer1\\MediaServer1.xml" );
+_LIT( KConnectionManagerXMLFile, "MediaServer1\\ConnectionManager1.xml" );
+_LIT( KContentDirectoryXMLFile, "MediaServer1\\ContentDirectory1.xml" );
+_LIT( KIconFile0, "MediaServer1\\icon\\0" );
+_LIT( KIconFile1, "MediaServer1\\icon\\1" );
+_LIT( KIconFile2, "MediaServer1\\icon\\2" );
+_LIT( KIconFile3, "MediaServer1\\icon\\3" );
+_LIT8( KGetProtocolInfo, "GetProtocolInfo" );
+
+// ============================= MEMBER FUNCTIONS ==============================
+
+// -----------------------------------------------------------------------------
+// CUpnpSecAccessController::NewL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CUpnpSecAccessController* CUpnpSecAccessController::NewL()
+    {
+    __LOG( "[UpnpSecurity]\t CUpnpSecAccessController::NewL" );
+
+    CUpnpSecAccessController* self = new (ELeave) CUpnpSecAccessController;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpSecAccessController::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CUpnpSecAccessController::ConstructL()
+    {
+    iSecurityManagerClientSession = new (ELeave) RUpnpSecurityManagerClientSession();
+    User::LeaveIfError( iSecurityManagerClientSession->Connect( ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpSecAccessController::CUpnpSecAccessController
+// Constructor.
+// -----------------------------------------------------------------------------
+//
+CUpnpSecAccessController::CUpnpSecAccessController()
+    {
+    __LOG( "[UpnpSecurity]\t CUpnpSecAccessController::\
+CUpnpSecAccessController" );
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpSecAccessController::~CUpnpSecAccessController
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CUpnpSecAccessController::~CUpnpSecAccessController()
+    {
+    __LOG( "[UpnpSecurity]\t CUpnpSecAccessController::\
+~CUpnpSecAccessController" );
+    if ( iSecurityManagerClientSession )
+        {
+        iSecurityManagerClientSession->Close();
+        delete iSecurityManagerClientSession;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpSecAccessController::EnableMediaServerSecurityL
+// Enables the security plugin in Media Server.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CUpnpSecAccessController::EnableMediaServerSecurityL()
+    {
+    __LOG( "[UpnpSecurity]\t CUpnpSecAccessController::\
+EnableMediaServerSecurityL" );
+    SetSecurityManagerSettingL( KSecurityPluginName );
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpSecAccessController::DisableMediaServerSecurityL
+// Disables the security plugin in Media Server.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CUpnpSecAccessController::DisableMediaServerSecurityL()
+    {
+    __LOG( "[UpnpSecurity]\t CUpnpSecAccessController::\
+DisableMediaServerSecurityL" );
+    SetSecurityManagerSettingL( KNullDesC8 );
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpSecAccessController::SetSecurityManagerSettingL
+// -----------------------------------------------------------------------------
+//
+void CUpnpSecAccessController::SetSecurityManagerSettingL( const TDesC8& aSettingToSet )
+    {
+    CUpnpMediaServerSettings* settings = CUpnpMediaServerSettings::NewL();
+    CleanupStack::PushL( settings );
+    User::LeaveIfError( settings->SetL(
+                    UpnpMediaServerSettings::ESecurityManager, aSettingToSet ) );
+    // Clean up
+    CleanupStack::PopAndDestroy( settings );    
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpSecAccessController::IsMediaServerSecurityEnabledL
+// Returns the status of the Media Server security plugin.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CUpnpSecAccessController::IsMediaServerSecurityEnabledL()
+    {
+    __LOG( "[UpnpSecurity]\t CUpnpSecAccessController::\
+IsMediaServerSecurityEnabledL" );
+
+    TBool returnValue = EFalse;
+    CUpnpMediaServerSettings* settings = CUpnpMediaServerSettings::NewL();
+    CleanupStack::PushL( settings );
+    HBufC8* value =
+    settings->GetL( UpnpMediaServerSettings::ESecurityManager );
+    CleanupStack::PushL( value );
+    if ( value && value->Des() != KNullDesC8 )
+        {
+        returnValue = ETrue;
+        }
+    // Clean up
+    CleanupStack::PopAndDestroy( value );
+    value = NULL;
+    CleanupStack::PopAndDestroy( settings );
+    settings = NULL;
+    return returnValue;
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpSecAccessController::AddAllowedFile
+// Adds file to notifier allowed list.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CUpnpSecAccessController::AddAllowedFile(
+        const TDesC& aFileName )
+    {
+    __LOG( "[UpnpSecurity]\t CUpnpSecAccessController::AddAllowedFile" );
+
+    TInt error = KErrNone;
+    if ( !IsAllowedFile( aFileName ) )
+        {
+        TRAP(error, iSecurityManagerClientSession->AddFileL( aFileName ));
+        }
+    return error;
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpSecAccessController::RemoveAllowedFile
+// Removes file from notifier allowed list.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CUpnpSecAccessController::RemoveAllowedFile(
+        const TDesC& aFileName )
+    {
+    __LOG( "[UpnpSecurity]\t CUpnpSecAccessController::RemoveAllowedFile" );
+
+    TInt error = KErrNone;
+    if ( !IsAllowedFile( aFileName ) )
+        {
+        // We're not expecting an answer...
+        TRAP(error, iSecurityManagerClientSession->RemoveFileL( aFileName ));
+        }
+    return error;
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpSecAccessController::AddAllowedAddress
+// Adds IP Address to notifier allowed list.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CUpnpSecAccessController::AddAllowedAddress(
+        const TInetAddr& aIpAddress )
+    {
+    __LOG( "[UpnpSecurity]\t CUpnpSecAccessController::AddAllowedAddress" );
+    TInt error = KErrNone;
+    TRAP( error, iSecurityManagerClientSession->AddAddressL( aIpAddress ));
+    return error;
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpSecAccessController::RemoveAllowedAddress
+// Removes IP address from notifier allowed list.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CUpnpSecAccessController::RemoveAllowedAddress(
+        const TInetAddr& aIpAddress )
+    {
+    __LOG( "[UpnpSecurity]\t CUpnpSecAccessController::AddAllowedAddress" );
+    TInt error = KErrNone;
+    TRAP( error, iSecurityManagerClientSession->RemoveAddressL( aIpAddress ));
+    return error;
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpSecAccessController::ResetFileList
+// Resets allowed files list.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CUpnpSecAccessController::ResetFileList()
+    {
+    __LOG( "[UpnpSecurity]\t CUpnpSecAccessController::ResetFileList" );
+
+    TInt error = KErrNone;
+    TRAP( error, iSecurityManagerClientSession->ResetFileListL() );
+    return error;
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpSecAccessController::ResetAddressList
+// Resets allowed addresses list.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CUpnpSecAccessController::ResetAddressList()
+    {
+    __LOG( "[UpnpSecurity]\t CUpnpSecAccessController::ResetAddressList" );
+
+    TInt error = KErrNone;
+    TRAP( error, iSecurityManagerClientSession->ResetAddressListL());
+    return error;
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpSecAccessController::QueryAuthorizationL
+// Query user to authorize connection from an IP-address.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CUpnpSecAccessController::QueryAuthorizationL(
+        const TInetAddr& aIpAddress )
+    {
+    __LOG( "[UpnpSecurity]\t CUpnpSecAccessController:: QueryAuthorizationL" );
+
+    iSecurityManagerClientSession->QueryAuthorisationL( aIpAddress );
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpSecAccessController::CheckAuthorizationL
+// Checks if the given IP-address/action/file is authorized.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CUpnpSecAccessController::CheckAuthorizationL(
+        const TInetAddr& aIpAddress, const TDesC& aFileName,
+        const TDesC8& aActionName )
+    {
+    __LOG( "[UpnpSecurity]\t CUpnpSecAccessController::\
+CheckAuthorizationL" );
+
+    TBool authorized = EFalse;
+
+    // First, check if the access to the file can be automatically authorized
+    if ( aFileName != KNullDesC )
+        {
+        authorized = IsAllowedFile( aFileName );
+        }
+
+    // If file was not authorized, check the action
+    if ( !authorized && aActionName != KNullDesC8 )
+        {
+        authorized = IsAllowedAction( aActionName );
+        }
+
+    // If neither file or action were authorized, query the authorization
+    // from the notifier
+    if ( !authorized )
+        {
+        TAccessType accessType = iSecurityManagerClientSession->CheckAuthorizationL(
+                aIpAddress, aFileName );
+
+        // If the address, file or both are allowed, authorize the access
+        if ( accessType == EAddressAllowed || accessType == EFileAllowed
+                || accessType == EFileAndAddressAllowed )
+            {
+            authorized = ETrue;
+            }
+        }
+
+    // Leave if not authorized
+    if ( !authorized )
+        {
+        User::Leave( KErrAccessDenied );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpSecAccessController::IsAllowedFile
+// Checks if the requested file is automatically allowed.
+// -----------------------------------------------------------------------------
+//
+TBool CUpnpSecAccessController::IsAllowedFile( const TDesC& aFileName )
+    {
+    __LOG( "[UpnpSecurity]\t CUpnpSecAccessController::IsAllowedFile" );
+
+    TBool returnValue = EFalse;
+    if ( aFileName.Length( ) > 0 )
+        {
+        // Do folded find (non-case-sensitive)
+        if ( aFileName.FindF( KMediaServerXMLFile ) != KErrNotFound
+                || aFileName.FindF( KConnectionManagerXMLFile )
+                    != KErrNotFound
+                || aFileName.FindF( KContentDirectoryXMLFile )
+                    != KErrNotFound
+                || aFileName.FindF( KIconFile0 ) != KErrNotFound
+                || aFileName.FindF( KIconFile1 ) != KErrNotFound
+                || aFileName.FindF( KIconFile2 ) != KErrNotFound
+                || aFileName.FindF( KIconFile3 ) != KErrNotFound )
+            {
+            returnValue = ETrue;
+            }
+        }
+    return returnValue;
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpSecAccessController::IsAllowedAction
+// Checks if the requested action is automatically allowed.
+// -----------------------------------------------------------------------------
+//
+TBool CUpnpSecAccessController::IsAllowedAction( const TDesC8& aActionName )
+    {
+    __LOG( "[UpnpSecurity]\t CUpnpSecAccessController::IsAllowedAction" );
+
+    TBool returnValue = EFalse;
+    if ( aActionName.Length( ) > 0 )
+        {
+        if ( aActionName.CompareF( KGetProtocolInfo ) == 0 )
+            {
+            returnValue = ETrue;
+            }
+        }
+    return returnValue;
+    }
+
+//  End of File