webservices/wsstar/wsstarplugin/src/wsstarvalidatehandler.cpp
changeset 0 62f9d29f7211
child 1 272b002df977
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webservices/wsstar/wsstarplugin/src/wsstarvalidatehandler.cpp	Thu Jan 07 16:19:19 2010 +0200
@@ -0,0 +1,310 @@
+/*
+* Copyright (c) 2006-2006 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 "wsstarvalidatehandler.h"
+#include "wsstartrustclient.h"
+#include "sendebug.h"
+#include "senlogger.h"
+
+class CWSStarHandlerContext;
+
+//---------------------------------------------------------------------------
+// Create instance of concrete ECOM interface implementation
+//---------------------------------------------------------------------------
+//
+CWSStarValidateHandler* CWSStarValidateHandler::NewL(TAny* aHandlerCtx)
+    {
+    
+    MSenHandlerContext* handlerCtx =
+        reinterpret_cast<MSenHandlerContext*>(aHandlerCtx);
+    CWSStarValidateHandler* self   = new (ELeave) CWSStarValidateHandler(*handlerCtx);
+    CleanupStack::PushL (self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+
+//---------------------------------------------------------------------------
+// Constructor
+//---------------------------------------------------------------------------
+//
+CWSStarValidateHandler::CWSStarValidateHandler(MSenHandlerContext& aCtx):CSenSessionHandler(aCtx)
+    {
+    }
+
+//---------------------------------------------------------------------------
+// Destructor
+//---------------------------------------------------------------------------
+//
+CWSStarValidateHandler::~CWSStarValidateHandler()
+    {
+    }
+
+//---------------------------------------------------------------------------
+// Second phase construction.
+//---------------------------------------------------------------------------
+//
+void CWSStarValidateHandler::ConstructL()
+    {
+    TLSLOG(KSenCoreServiceManagerLogChannelBase  , KNormalLogLevel,(_L("CWSStarValidateHandler::ConstructL()")));
+    const TDesC8* version = iHandlerContext.GetDesC8L(HandlerContextKey::KVersion);
+    if (version && 
+        (*version == WSTrust::KTrustNamespace200502 || *version == WSTrust::KTrustNamespace200404))
+        {
+        iVersion = version;
+        }
+    else
+        {
+        iVersion = &WSTrust::KTrustNamespace200502; //passport interface 2
+        //&WSTrust::KTrustNamespace200404;
+        }
+    }
+    
+
+//---------------------------------------------------------------------------
+// the most emergent method in message handler interface.
+// Each sub-class must implement this method thus providing message processing routine.
+//---------------------------------------------------------------------------
+//
+TInt CWSStarValidateHandler::InvokeL(MSenSessionContext& 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;
+        }
+    
+    //in session context we have info
+    const TBool* renewingPtr = ((MSenContext&)aCtx).GetIntL(WSStarContextKeys::KReAuthNeeded);
+    TBool renewing;
+    if (renewingPtr)
+        {
+        renewing = *renewingPtr;
+        }
+    else
+        {
+        renewing = EFalse;
+        }
+    const TBool* onlySharingPtr = ((MSenContext&)aCtx).GetIntL(WSStarContextKeys::KOnlySharing);
+    TBool onlySharing;
+    if (onlySharingPtr)
+        {
+        onlySharing = *onlySharingPtr;
+        }
+    else
+        {
+        onlySharing = ETrue;
+        }
+    
+    CWSStarTrustClient* pSTSClient = STSClientL(pIdentityProvider);
+    if (pSTSClient)
+            {
+            TInt error(KErrNone);
+            pSTSClient->SetHandlerCtx(&iHandlerContext);
+            pSTSClient->SetVersion(iVersion);
+            //validate session of concrete WebService
+            HBufC8* errorMessage = NULL;
+             // fix for compiler warning #550-D reverted back
+            TRAPD(lerror,error = pSTSClient->ValidateL(*pNewSession, renewing, errorMessage, onlySharing);)    
+            lerror = 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
+            return error;
+            }
+       else
+            {
+            return KErrNotFound;
+            }
+    
+    }
+    
+SenHandler::THandlerDirection CWSStarValidateHandler::Direction() const
+    {
+        return SenHandler::EBoth;
+    };
+SenHandler::THandlerPhase CWSStarValidateHandler::Phase()
+    {
+        return SenHandler::EValidate;
+    };
+    
+//---------------------------------------------------------------------------
+// Obtain or construct STS client
+//---------------------------------------------------------------------------
+//
+  
+CWSStarTrustClient* CWSStarValidateHandler::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 
+    // architects says:- Yes... You must have AS registered into DAO (DB) sessions db
+    /*if (!pSTSClient)
+        {
+        CSIF* sif = (CSIF*)iHandlerContext.GetAny(HandlerContextKey::KSIF());
+        pSTSClient = CWSStarTrustClient::NewL(*sif,*Log());
+        }*/
+    return pSTSClient;
+}
+
+//---------------------------------------------------------------------------
+// Create IdentityProvider from CoreManager
+//---------------------------------------------------------------------------
+//
+CSenIdentityProvider* CWSStarValidateHandler::IdentityProviderFromCoreL(
+                                            const TDesC8& aProviderID)
+    {
+    TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KNormalLogLevel,"CWSStarValidateHandler::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 CWSStarValidateHandler::InitL(MSenHandlerContext& aCtx)
+    {
+    iHandlerContext = aCtx;
+    return KErrNone;
+    }
+RFileLogger* CWSStarValidateHandler::Log() const
+    {
+    RFileLogger* pLog = NULL;
+    TRAP_IGNORE( pLog = (RFileLogger*)iHandlerContext.GetAnyL(HandlerContextKey::KLogger); )
+    return pLog;
+    }
+    
+// END OF FILE
+