webservices/wsstar/wsstarplugin/src/wsstarcobrandinghandler.cpp
changeset 0 62f9d29f7211
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webservices/wsstar/wsstarplugin/src/wsstarcobrandinghandler.cpp	Thu Jan 07 16:19:19 2010 +0200
@@ -0,0 +1,330 @@
+/*
+* 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:    
+*
+*/
+
+
+
+
+//co-branding CR
+#include <e32std.h>
+#include "wsstarcobrandinghandler.h"
+#include "wsstarcobrandingclient.h"
+#include "senpointermap.h"
+#include "wspolicy.h"
+#include "sendebug.h"
+#include "wsstardictionary.h"
+#include "MSenServicePolicy.h"
+#include "wsstarpolicymanager.h"
+#include "senlogger.h"
+
+//---------------------------------------------------------------------------
+// Create instance of concrete ECOM interface implementation
+//---------------------------------------------------------------------------
+//
+CWSStarCoBrandingHandler* CWSStarCoBrandingHandler::NewL(TAny* aHandlerCtx)
+    {    
+    MSenHandlerContext* handlerCtx = reinterpret_cast<MSenHandlerContext*>(aHandlerCtx);
+    CWSStarCoBrandingHandler* self   = new (ELeave) CWSStarCoBrandingHandler(*handlerCtx);
+    CleanupStack::PushL (self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+
+//---------------------------------------------------------------------------
+// Constructor
+//---------------------------------------------------------------------------
+//
+CWSStarCoBrandingHandler::CWSStarCoBrandingHandler(MSenHandlerContext& aCtx):CSenSessionHandler(aCtx)
+    {
+    }
+
+//---------------------------------------------------------------------------
+// Destructor
+//---------------------------------------------------------------------------
+//
+CWSStarCoBrandingHandler::~CWSStarCoBrandingHandler()
+    {
+    TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,(_L("~CWSStarCoBrandingHandler::~CWSStarCoBrandingHandler()")));
+    }
+
+//---------------------------------------------------------------------------
+// Second phase construction.
+//---------------------------------------------------------------------------
+//
+void CWSStarCoBrandingHandler::ConstructL()
+    {
+    TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,(_L("CWSStarCoBrandingHandler::ConstructL()")));
+    }
+
+//---------------------------------------------------------------------------
+// the most emergent method in message handler interface.
+// Each sub-class must implement this method thus providing message processing routine.
+//---------------------------------------------------------------------------
+//
+TInt CWSStarCoBrandingHandler::InvokeL(MSenSessionContext& aCtx)
+    {
+    TLSLOG_L( KSenCoreServiceManagerLogChannelBase, KMinLogLevel, "CWSStarCoBrandingHandler::InvokeL(MSenMessageContext& aCtx)" );
+
+//getting data from input
+    CWSStarServiceSession* pNewSession =
+            (CWSStarServiceSession*)aCtx.GetSenRemoteServiceSessionL(
+            WSStarContextKeys::KServiceSession());
+    if (pNewSession->ProviderID() == KNullDesC8)
+        {
+        return KErrNone;
+        }
+
+//try to find identity provider for curennt webService using its ProviderId
+    CSenIdentityProvider* pIdentityProvider = IdentityProviderFromCoreL(
+            pNewSession->ProviderID());
+    if (!pIdentityProvider)
+        {
+        return KErrNotFound;
+        }
+        
+    
+    CWSStarTrustClient* pSTSClient = STSClientL(pIdentityProvider);
+    if (pSTSClient)
+            {
+ 
+ 
+            CSIF* sif = (CSIF*)iHandlerContext.GetAnyL(HandlerContextKey::KSIF());
+        
+        
+            CWSStarServiceSession* wsSTSSession =   
+                                            pSTSClient->GetSTSSessionL();                           
+ 
+            CWSStarCoBrandingClient* wsStarCoBrandingClient = 
+                                CWSStarCoBrandingClient::NewL(*sif,*Log());
+            
+            if (wsStarCoBrandingClient)
+                    {
+                    
+                    CleanupStack:: PushL(wsStarCoBrandingClient);
+                    
+                    TInt error(KErrNone);
+                    wsStarCoBrandingClient->SetHandlerCtx(&iHandlerContext);
+                    //wsStarCoBrandingClient->SetVersion(iVersion);
+                    
+                    wsStarCoBrandingClient->SetCoBrandingSessionL(wsSTSSession);
+
+                    //validate session of concrete WebService
+                    HBufC8* errorMessage = NULL;
+                    TInt leaveCode( KErrNone );
+                    TRAP( leaveCode, error = wsStarCoBrandingClient->FetchSCTL( *pNewSession, errorMessage ); )    
+#ifdef _SENDEBUG
+                    if( leaveCode )
+                        {
+                        TLSLOG_L( KSenCoreServiceManagerLogChannelBase, KMinLogLevel, "CWSStarCoBrandingHandler::InvokeL(MSenMessageContext& aCtx):" );
+                        TLSLOG_L( KSenCoreServiceManagerLogChannelBase, KMinLogLevel, "- wsStarCoBrandingClient->FetchSCTL() leaved!" );
+                        }
+#endif // _SENDEBUG                    
+                    leaveCode = 0; // not used in release builds
+                    //((MSenContext&)aCtx).Update(WSStarContextKeys::KReAuthNeeded, EFalse);
+                    if (errorMessage)
+                        {
+                       ((MSenContext&)aCtx).Update(WSStarContextKeys:: KErrMessage,  *errorMessage);
+                        }
+                    delete errorMessage;
+                    errorMessage = NULL;
+                    //if credential expired session will use validator to obtain new
+                    
+                    // Core / XML DAO takes ownership of new session (will keep in array of SD):
+                    // - new session HAS
+                    //      - credential
+                    //      - context which keep for example key for signing message        
+                    // - if duplicate (equal primary keys) exists, it is deleted
+                    
+                    CleanupStack:: PopAndDestroy(wsStarCoBrandingClient);
+                     
+                    return error;
+                    }
+               else
+                    {
+                    return KErrNotFound;
+                    }
+                     
+            }
+       else
+            {
+            return KErrNotFound;
+            }
+            
+                                
+     }
+
+//---------------------------------------------------------------------------
+// Obtain or construct STS client
+//---------------------------------------------------------------------------
+//
+  
+CWSStarTrustClient* CWSStarCoBrandingHandler::STSClientL(CSenIdentityProvider*& aIdentityProvider)
+{
+    TLSLOG(KSenCoreServiceManagerLogChannelBase  , KNormalLogLevel,(_L("CWSStarPlugin::STSClientL")));
+
+    CWSStarTrustClient* pSTSClient = NULL;
+    //providerId from Identities.xml
+    TPtrC8 providerId(KNullDesC8);
+    if(aIdentityProvider)
+        {
+        providerId.Set(aIdentityProvider->ProviderID());
+        }
+
+    RPointerArray<CSenWSDescription> serviceDescriptions;
+    CleanupClosePushL(serviceDescriptions);
+        
+    //try to find STS session in cache,some STS can be registered
+    TInt retVal(KErrNone);
+    
+    TRAPD(error, retVal = iHandlerContext.GetSenCoreServiceManager()->ServiceDescriptionsL(serviceDescriptions, KWSStarSTSContract()));
+    if(!retVal&&!error)
+        {
+        RPointerArray<CSenWSDescription> matches;
+        CleanupClosePushL(matches);
+        
+        for(TInt i = 0; i < serviceDescriptions.Count(); i++)
+            {
+            //select XMLDescription from DAO where contract = STS, so we can cast
+            pSTSClient = (CWSStarTrustClient*)serviceDescriptions[i];
+            if(providerId.Length()>0)
+                {
+                TPtrC8 providerIDFromDescription = pSTSClient->ProviderID();
+                if(providerIDFromDescription == providerId)
+                    {
+                    matches.AppendL(pSTSClient);
+                    }
+                }
+            else
+                {
+                matches.AppendL(pSTSClient);
+                }
+            }
+        if(matches.Count())
+            {
+            pSTSClient =
+                reinterpret_cast<CWSStarTrustClient*>(matches[0]);
+            pSTSClient->SetAccount(aIdentityProvider);
+            }
+        else
+            {
+            TLSLOG(KSenCoreServiceManagerLogChannelBase  , KNormalLogLevel,(_L("CWSStarValidateHandler::STSClient - No matching STS description available!")));
+            pSTSClient = NULL;
+            }
+    
+        //if we find multi sts client (different only with lifetime, probably Secure Context Token lifetime)
+        if(matches.Count() > 1)
+            {
+            // search for a instance with longest validity
+            for(TInt i = matches.Count()-1; i > 0 ; i--)
+                {
+                CWSStarTrustClient* pNewerSTSClient =
+                  reinterpret_cast<CWSStarTrustClient*>(matches[i]);
+                CWSStarServiceSession* newerSession = (CWSStarServiceSession*)pNewerSTSClient->ServiceSession();
+                CWSStarServiceSession* session = (CWSStarServiceSession*)pSTSClient->ServiceSession();
+                
+				if(newerSession && session) // STSClient Session was not set, if not validated 
+					{
+					if(newerSession->ValidUntilL() > session->ValidUntilL())
+					  	{
+					    pSTSClient = pNewerSTSClient;
+					    pSTSClient->SetAccount(aIdentityProvider);
+					    }
+					}
+                }
+            }
+            CleanupStack::PopAndDestroy(2, &serviceDescriptions);
+        }
+    else
+        {
+          CleanupStack::PopAndDestroy(&serviceDescriptions);
+        }
+    
+    
+    //no session, so we have create new STS client, temporary code 
+
+    //- if (!pSTSClient)
+    //-    {
+    //-    CSIF* sif = (CSIF*)iHandlerContext.GetAnyL(HandlerContextKey::KSIF());
+    //-    pSTSClient = CWSStarTrustClient::NewL(*sif,*Log());
+    //-    }
+    return pSTSClient;
+}
+
+
+//---------------------------------------------------------------------------
+// 
+//---------------------------------------------------------------------------
+//  
+SenHandler::THandlerDirection CWSStarCoBrandingHandler::Direction() const
+    {
+    return SenHandler::EBoth;
+    }
+
+//---------------------------------------------------------------------------
+// 
+//---------------------------------------------------------------------------
+//    
+SenHandler::THandlerPhase CWSStarCoBrandingHandler::Phase()
+    {
+    return SenHandler::EValidate;
+    }
+//---------------------------------------------------------------------------
+// 
+//---------------------------------------------------------------------------
+//   
+CSenIdentityProvider* CWSStarCoBrandingHandler::IdentityProviderFromCoreL(
+                                            const TDesC8& aProviderID)
+    {
+    TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KNormalLogLevel,"CWSStarCoBrandingHandler::IdentityProviderLFromCore");
+    CSenIdentityProvider* pIdentityProvider = NULL;
+    if(aProviderID.Length() > 0)
+        {
+        CDesC8ArrayFlat* array = new (ELeave) CDesC8ArrayFlat(1);
+        CleanupStack::PushL(array);
+        array->AppendL(aProviderID);
+        pIdentityProvider = iHandlerContext.GetSenCoreServiceManager()->
+                IdentityProviderL(*array, ETrue);
+        CleanupStack::PopAndDestroy(array);
+        }
+    return pIdentityProvider;
+    }
+
+//---------------------------------------------------------------------------
+// Init implementation
+//---------------------------------------------------------------------------
+//
+TInt CWSStarCoBrandingHandler::InitL(MSenHandlerContext& aCtx)
+    {
+    iHandlerContext = aCtx;
+    return KErrNone;
+    }
+
+//---------------------------------------------------------------------------
+// 
+//---------------------------------------------------------------------------
+//    
+RFileLogger* CWSStarCoBrandingHandler::Log() const
+    {
+    RFileLogger* pLog = NULL;
+    TRAP_IGNORE( pLog = (RFileLogger*)iHandlerContext.GetAnyL(HandlerContextKey::KLogger); )
+    return pLog;
+    }
+    
+// END OF FILE
+
+