webservices/wsstar/wsstarplugin/src/wsstarserviceupdatehandler.cpp
changeset 0 62f9d29f7211
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webservices/wsstar/wsstarplugin/src/wsstarserviceupdatehandler.cpp	Thu Jan 07 16:19:19 2010 +0200
@@ -0,0 +1,309 @@
+/*
+* 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 "wsstarserviceupdatehandler.h"
+#include "wsstartrustclient.h"
+#include "sendebug.h"
+#include "senlogger.h"
+#include "SenSoapFault.h"
+#include "SenSoapMessage.h"
+#include "wsstarservicesession.h"
+#include "SenXmlUtils.h"
+#include "wsstarrstresponse.h"
+
+namespace WSSecureConversation
+{ 
+    //---------Faults data
+    _LIT8( KBadContextToken, "BadContextToken");
+}
+namespace WSSecurity
+{ 
+    //---------Faults data
+    _LIT8( KMessageExpired, "MessageExpired");
+    _LIT8( KInvalidSecurity, "InvalidSecurity");
+}
+
+class CWSStarHandlerContext;
+// Create instance of concrete ECOM interface implementation
+CWSStarServiceUpdateHandler* CWSStarServiceUpdateHandler::NewL(TAny* aHandlerCtx)
+    {
+    
+    MSenHandlerContext* handlerCtx =
+        reinterpret_cast<MSenHandlerContext*>(aHandlerCtx);
+    CWSStarServiceUpdateHandler* self   = new (ELeave) CWSStarServiceUpdateHandler(*handlerCtx);
+    CleanupStack::PushL (self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// Constructor
+CWSStarServiceUpdateHandler::CWSStarServiceUpdateHandler(MSenHandlerContext& aCtx):CSenSessionHandler(aCtx)
+    {
+    
+    }
+
+// Destructor
+CWSStarServiceUpdateHandler::~CWSStarServiceUpdateHandler()
+    {
+    }
+
+// Second phase construction.
+void CWSStarServiceUpdateHandler::ConstructL()
+    {
+    TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,(_L("CWSStarServiceUpdateHandler::ConstructL()")));
+    const TDesC8* version = iHandlerContext.GetDesC8L(HandlerContextKey::KVersion);
+    if (version && 
+        (*version == WSTrust::KTrustNamespace200502 || *version == WSTrust::KTrustNamespace200404))
+        {
+        iVersion = version;
+        }
+    else
+        {
+        iVersion = &WSTrust::KTrustNamespace200502;
+        }
+    }
+    
+TInt CWSStarServiceUpdateHandler::InvokeL(MSenSessionContext& aCtx)
+    {
+    CSenSoapEnvelope* message = (CSenSoapEnvelope*)(aCtx.GetAnyL(SenContext::KSenCurrentSoapMessageCtxKey));//codescannerwarnings
+    CWSStarServiceSession* pNewSession = (CWSStarServiceSession*)aCtx.GetSenRemoteServiceSessionL(WSStarContextKeys::KServiceSession());
+    
+    //abstract variable which represent probelm (it is code or subcode depends of soap version)
+    TPtrC8 problem(KNullDesC8);
+    if (message)
+        {
+        if ((aCtx.Direction()==SenContext::EIncoming) ||
+            (aCtx.Direction()==SenContext::EBoth))
+            {  
+            if (message->IsFault())
+                {
+                CSenSoapFault* faultElement = message->FaultL();
+                if (faultElement)
+                    {
+                    if (message->NsUri() == KSenSoap12EnvelopeXmlns)
+                        {
+//----------------SOAP1.2
+                        TPtrC8 code = faultElement->FaultCode();
+                        const CSenNamespace* nmSpaceCode = faultElement->Namespace(SenXmlUtils::NsPrefix(code), ETrue);
+                        code.Set(SenXmlUtils::LocalName(code));
+                        
+                        if ((
+                            (nmSpaceCode && 
+                            nmSpaceCode->URI() == KSenSoap12EnvelopeXmlns) 
+                            ||
+                            !nmSpaceCode)
+                            &&
+                            code == KSender)
+                            {
+                            TPtrC8 subcode = faultElement->FaultSubcode();
+                            const CSenNamespace* nmSpace = faultElement->Namespace(SenXmlUtils::NsPrefix(subcode), ETrue);
+                            subcode.Set(SenXmlUtils::LocalName(subcode));
+                            
+                            if ((nmSpace && 
+                                nmSpace->URI() == *iVersion)
+                                ||
+                                !nmSpace) 
+                                {
+                                problem.Set(subcode);
+                                }    
+                            }
+                        else if (nmSpaceCode && nmSpaceCode->URI() == KSecurityXmlNs)
+                            {
+                            problem.Set(code);
+                            }
+                        }
+                    else if (message->NsUri() == KSenSoapEnvelopeXmlns)
+                        {
+//----------------SOAP1.1
+                        TPtrC8 code = faultElement->FaultCode();
+                        const CSenNamespace* nmSpace = faultElement->Namespace(SenXmlUtils::NsPrefix(code), ETrue);
+                        code.Set(SenXmlUtils::LocalName(code));
+                        if ((nmSpace && 
+                            nmSpace->URI() == *iVersion))
+                            {
+                            problem.Set(code);
+                            }    
+                        }
+//------------------real logic                        
+                    if (problem.Length()>0)
+                        {
+                        if( problem == WSTrust::KInvalidRequest ||
+                            problem == WSTrust::KRequestFailed  ||
+                            problem == WSTrust::KInvalidSecurityToken  ||
+                            problem == WSTrust::KAuthenticationBadElements  ||
+                                   
+                            problem == WSTrust::KBadRequest  ||
+                            problem == WSTrust::KExpiredData  ||
+                            problem == WSTrust::KInvalidTimeRange  ||
+                            problem == WSTrust::KInvalidScope  ||
+                            problem == WSTrust::KUnableToRenew
+                           )
+                           {
+                           ((MSenContext&)aCtx).Update(WSStarSession::KErrorLayer, WSStarSession::ETrust);
+                           }
+                        else if (problem == WSTrust::KRenewNeeded ||
+                        
+                                 problem == WSTrust::KFailedAuthentication ||
+                                 problem == WSTrust::KInvalidSecurityToken ||
+                                 problem == WSSecurity::KInvalidSecurity ||
+                                 problem == WSSecureConversation::KBadContextToken ||
+                                 problem == WSSecurity::KMessageExpired)
+                            {
+				TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,(_L("CWSStarServiceUpdateHandler::InvokeL")));
+				TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,problem);
+				TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,(_L("CWSStarServiceUpdateHandler::InvokeL clear credential")));
+                            ((MSenContext&)aCtx).Update(WSStarSession::KErrorLayer, WSStarSession::ETrust);
+                            ((MSenContext&)aCtx).Update(WSStarContextKeys::KReAuthNeeded, ETrue);
+                            pNewSession->ClearCredentialL();
+                            pNewSession->SetStatusL();//in order to compute state
+                            }
+                        }
+                    }
+                }
+            else if (message->HasHeader())
+                {//checking for SCT (SecureContextToken)
+                CSenElement& el = message->HeaderL();
+                //HBufC8* msg = message->HeaderL().AsXmlL();
+                                
+                CSenElement* detached = el.DetachL();
+                CleanupStack::PushL(detached);
+                CSenElement& body = message->BodyL();
+                HBufC8* msg = detached->AsXmlL();
+                CleanupStack::PushL(msg);
+                message->AsElement().InsertElementL(*detached, body);
+                CleanupStack::Pop(2, detached);
+                CleanupStack::PushL(msg);
+                
+                //in case MSP Guide v3.0, seems that SCT comes in Body (not in header)
+                CWSStarRSTResponse* rstResponse =
+                        CWSStarRSTResponse::NewLC(FALSE, KNullDesC8, iVersion);
+                //policy namespace has not be set, is not neccessary for SCT
+                CSenXmlReader* reader = const_cast<CSenXmlReader*>(aCtx.GetParser());
+                rstResponse->SetReader(*reader);
+                rstResponse->BuildFrom(*msg);
+                if (rstResponse->IsResponse())
+                    {
+                    if (rstResponse->IsContextToken())
+                        {
+                        CWSStarSessionContext* ssCtx = pNewSession->SessionContext();
+                        ssCtx->SetTokenKeysL(*rstResponse, NULL, ETrue,ETrue);
+                        #ifdef _SENDEBUG
+                                TPtrC8 endpoint = pNewSession->Endpoint();
+                                _LIT8(KCredsLogLine, "SCT has been delivered by backend TO service (%S), so present token will be replaced");
+                                CREDLOG_FORMAT((KSenCredsLogChannel, KSenCredsLogLevelNormal, KCredsLogLine,  &endpoint));
+                        #endif           
+                        //----update expires
+                        /*
+                        timestamp is calcualted
+                        
+                        if (rstResponse->CredentialExpires().Length())
+                            {
+                            ssCtx->Update(WSStarContextKeys::KTimestampExpires, rstResponse->CredentialExpires());
+                            }
+                        else
+                            {
+                            //ssCtx->Remove(WSStarContextKeys::KTimestampExpires);
+                            }
+                        //----update created
+                        if (rstResponse->CredentialCreated().Length())
+                            {
+                            ssCtx->Update(WSStarContextKeys::KTimestampCreated, rstResponse->CredentialCreated());
+                            }
+                        else
+                            {
+                            ssCtx->Remove(WSStarContextKeys::KTimestampCreated);
+                            }
+                            */
+                        //---remove SCT from BODY, it is not a bisness logic
+                        //namespace if in SOAP element still will be not visible for user 
+                        // becouse only HandleMessage(Body) is supported
+                        
+                        //after wave11 increment SCT is only in header so below logic is just for case
+                        /*CSenElement& body = message->BodyL();
+                        CSenElement* sct = GetSCTElementL(body);
+                        if (sct)
+                            {
+                            sct = sct->DetachL();
+                            delete sct;
+                            sct = NULL;
+                            }*/
+                        //----end removing SCT from BODY
+                        }
+                    }
+                CleanupStack::PopAndDestroy(2, msg);
+                }
+            }
+        }
+    return KErrNone;       
+    }
+    
+SenHandler::THandlerDirection CWSStarServiceUpdateHandler::Direction() const
+    {
+    return SenHandler::EIncoming;
+    };
+SenHandler::THandlerPhase CWSStarServiceUpdateHandler::Phase()
+    {
+    return SenHandler::EMessage;
+    };
+
+//---------------------------------------------------------------------------
+// Logger using during DEBUG mode
+//---------------------------------------------------------------------------
+//    
+RFileLogger* CWSStarServiceUpdateHandler::Log() const
+    {
+    RFileLogger* pLog = NULL;
+    TRAP_IGNORE( pLog = (RFileLogger*)iHandlerContext.GetAnyL(HandlerContextKey::KLogger); )
+    return pLog;
+    }
+
+TInt CWSStarServiceUpdateHandler::InitL(MSenHandlerContext& aCtx)
+    {
+    iHandlerContext = aCtx;
+    return KErrNone;
+    }
+
+CSenElement* CWSStarServiceUpdateHandler::GetSCTElementL(CSenElement& aParent)
+    {
+    CSenElement* sct = NULL;
+    sct = aParent.Element(*iVersion, WSTrust::KRSTResponseTag);
+    if (!sct)
+        {
+        RPointerArray<CSenElement>& elementsBody = aParent.ElementsL();
+        TInt count(elementsBody.Count());
+        TInt i=0;
+        while (i<count && !sct)
+            {
+            sct = GetSCTElementL(*elementsBody[i]);
+            i++;
+            }
+        }
+    return sct;
+    }
+// END OF FILE
+