webservices/wsstar/wsstarmessagehandlers/src/wsstarpassporthandler.cpp
changeset 0 62f9d29f7211
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webservices/wsstar/wsstarmessagehandlers/src/wsstarpassporthandler.cpp	Thu Jan 07 16:19:19 2010 +0200
@@ -0,0 +1,333 @@
+/*
+* 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 "wsstarpassporthandler.h"
+#include "SenXmlUtils.h"
+#include "wsstarmessageutils.h"
+#include "wsstartrustclient.h"
+#include "SenSoapFault.h"
+#include "senlogger.h"
+#include "sensaxutils.h"
+
+#ifdef RD_SEN_VTCP_SUPPORT
+#include "wsstarpassportheaderinbound.h"
+#endif//RD_SEN_VTCP_SUPPORT
+
+
+using namespace WSPassport32;
+
+// Create instance of concrete ECOM interface implementation
+CWSStarPassportHandler* CWSStarPassportHandler::NewL(TAny* aHandlerCtx)
+    {
+    MSenHandlerContext* ctx =
+        reinterpret_cast<MSenHandlerContext*>( aHandlerCtx);
+    CWSStarPassportHandler* self = new (ELeave) CWSStarPassportHandler(*ctx);
+    CleanupStack::PushL (self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+TInt CWSStarPassportHandler::InvokeL(MSenMessageContext& aCtx)
+    {
+    TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,(_L("CWSStarPassportHandler::InvokeL(MSenMessageContext& aCtx)")));
+    CSenSoapEnvelope* message = 
+        const_cast<CSenSoapEnvelope*>(aCtx.GetSenSoapEnvelopeL(
+                                                SenContext::KSenCurrentSoapMessageCtxKey));
+    const TBool* boolValue = NULL;
+    if (message)
+        {
+        _LIT8(KId,"Id");
+        boolValue = aCtx.GetIntL(WSStarContextKeys::KPassportEnabled);
+        if ((boolValue && *boolValue == (TBool)ETrue))
+            {
+            if (aCtx.Direction() == SenContext::EOutgoing)
+                {//------------------OUTGOING
+                CSenElement& header = message->HeaderL();
+                CSenElement& authInfo = header.AddElementL(KPassportXmlns,
+                                                           KAuthInfoTag,
+                                                           KAuthInfoQTag);
+                SenXmlUtils::AddAttributeL(authInfo, KId ,KPPAuthInfoAttrValue);
+                authInfo.AddElementL(KPassportXmlns, 
+                                        KHostingAppTag, 
+                                        KHostingAppQTag).SetContentL(KHostingAppTagValue);
+                authInfo.AddElementL(KPassportXmlns, 
+                                        KBinaryVersionTag, 
+                                        KBinaryVersionQTag).SetContentL(KBinaryVersionTagValue);
+                authInfo.AddElementL(KPassportXmlns, 
+                                        KUIVersionTag, 
+                                        KUIVersionQTag).SetContentL(KUIVersionTagValue);
+                authInfo.AddElementL(KPassportXmlns, 
+                                        KCookiesTag, 
+                                        KCookiesQTag).SetContentL(KCookiesTagValue);
+                authInfo.AddElementL(KPassportXmlns, 
+                                        KRequestParamsTag, 
+                                        KRequestParamsQTag).SetContentL(KRequestParamsTagValue);
+                CSenElement& body = message->BodyL();
+                CSenElement* multiEl = 
+                    CWSStarMessageUtils::GetMarkedElementL(body, WSStarContextKeys::KMultiReqTagMark, 
+                                                            EFalse);
+                if (multiEl)
+                    {
+                    multiEl->Set(KPassportXmlns, KRequestMultipleSecurityTokensTag, 
+                                    KRequestMultipleSecurityTokensQTag);
+                    }
+                        
+                }
+            else if(aCtx.Direction() == SenContext::EIncoming)
+                {//------------------INCOMING
+                TPtrC8 problem(KNullDesC8);
+                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() == WSTrust::KTrustNamespace200502())
+                                    {
+                                    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() == WSTrust::KTrustNamespace200502()))
+                                {
+                                problem.Set(code);
+                                }    
+                            }
+    //------------------real logic                        
+                        if (problem.Length()>0 && problem == WSTrust::KFailedAuthentication)
+                            {
+                            CSenElement* elem = NULL;
+                            CSenElement& env = message->AsElement();
+                            elem = CWSStarMessageUtils::FindElementL(KRedirectUrlTag, env);
+                            if (elem)
+                                {
+                                const CSenNamespace* ns = elem->Namespace();
+                                if (ns && ns->URI() == KPassportFaultNamespaceXmlns)
+                                    {
+                                    ((MSenContext&)aCtx).Update(WSStarSession::KErrorLayer, WSStarSession::ETrust);
+                                    ((MSenContext&)aCtx).Update(WSStarContextKeys::KReAuthNeeded, EFalse);
+                                    ((MSenContext&)aCtx).Update(WSStarContextKeys::KRedirect, elem->Content());        
+                                    }
+                                }
+                            }
+                        }
+                    }
+		#ifdef RD_SEN_VTCP_SUPPORT					
+                else
+                    {
+                        TPtrC8 txtMessage = aCtx.GetMessageL();
+                        if(message)
+                        {
+                            return HandleInboundL(aCtx, message);
+                        }
+                        else if(txtMessage.Length())
+                        {
+                            TInt ret(KErrNone);
+                            TInt endTagStart;
+                            TInt endTagEnd;
+                            TInt startTagStart;
+                            TInt startTagEnd;
+                            TPtrC8 prefix;
+
+                            ret = SenSaxUtils::SearchEndTagL(txtMessage,KSenSoapEnvelopeBodyName,
+                                                             endTagStart, endTagEnd, prefix);
+                            if ( ret != KErrNotFound )
+                                {
+                                ret = SenSaxUtils::SearchStartTagL(txtMessage,prefix,KSenSoapEnvelopeBodyName,
+                                                                   startTagStart, startTagEnd);
+                                }
+                            if ( ret != KErrNotFound )
+                                {
+                                    TPtrC8 startPart(txtMessage.Ptr(),startTagEnd+1);
+                                    TPtrC8 endPart(txtMessage.Ptr()+endTagStart,txtMessage.Size()-endTagStart);
+                                    HBufC8* pXmlWithoutBody = HBufC8::NewLC(startPart.Length()+endPart.Length());
+                                    pXmlWithoutBody->Des().Append(startPart);
+                                    pXmlWithoutBody->Des().Append(endPart);
+
+                                    CWSStarPassportHeaderInbound* inbound =
+                                            CWSStarPassportHeaderInbound::NewLC();
+                                    inbound->SetMessageContext(aCtx);
+                                    CSenXmlReader& reader = const_cast<CSenXmlReader&>(*aCtx.GetParser());
+                                    inbound->SetReader(reader);
+                                    inbound->BuildFrom(*pXmlWithoutBody);
+                                    CleanupStack::PopAndDestroy(inbound);
+
+
+                                    CleanupStack::PopAndDestroy(pXmlWithoutBody);
+        
+                                
+                                }
+                            else//case with empty body - <S:Body/>, so we can parse all
+                                {
+                                CWSStarPassportHeaderInbound* inbound =
+                                        CWSStarPassportHeaderInbound::NewLC();
+                                inbound->SetMessageContext(aCtx);
+                                CSenXmlReader& reader = const_cast<CSenXmlReader&>(*aCtx.GetParser());
+                                inbound->SetReader(reader);
+                                inbound->BuildFrom(txtMessage);
+                                CleanupStack::PopAndDestroy(inbound);                        
+                                }
+                        }
+					}                        
+		#endif//RD_SEN_VTCP_SUPPORT
+				
+                }
+            }
+        }
+    else
+        {
+        TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,(_L("CWSStarPassportHandler::InvokeL(MSenMessageContext& aCtx) - \
+                        Soap message in message context not exists")));
+        return KErrNotFound;
+        }
+    return KErrNone;    
+    }    
+
+TInt CWSStarPassportHandler::HandleInboundL(MSenMessageContext& aCtx, CSenSoapEnvelope* aMessage)
+    {
+
+    CSenElement& header = aMessage->HeaderL();
+
+    CWSStarMessageUtils::RArraySenElements elements;
+    CWSStarMessageUtils::FindElementL(KCredProperty, header,elements);
+    CSenElement* elem = NULL;
+    TInt count(elements.Count());
+    TInt i=0;
+    while (i<count)
+        {
+        elem = elements[i];
+        if (elem->LocalName() == WSPassport32::KCredProperty)
+            {
+            const TDesC8& nsUri = elem->NamespaceURI();
+            if ((nsUri == WSPassport32::KPassportFaultNamespaceXmlns))
+                {
+                    const TDesC8* ptr= elem->AttrValue(WSPassport32::KName);
+                    if(*ptr == WSPassport32::KMainBrandID)
+                    {
+                        ((MSenContext&)aCtx).Update(WSStarContextKeys::KMainBrandID, elem->Content());
+                    }
+                 }
+            }
+        i++;
+        }
+    elements.Reset();
+    
+    CWSStarMessageUtils::RArraySenElements credProperties;
+    CWSStarMessageUtils::FindElementL(KCredProperties, header,credProperties);
+    elem = NULL;
+    count = 0;
+    count = credProperties.Count();
+	if(count == 1)
+	{
+		elem = credProperties[0];	
+		HBufC8* xmlSnippet = elem->AsXmlL();
+		CleanupStack::PushL(xmlSnippet);
+		((MSenContext&)aCtx).Update(WSStarContextKeys::KBrandIDList,xmlSnippet->Des() );		
+ 		CleanupStack::PopAndDestroy(xmlSnippet);
+     		
+	}
+    credProperties.Reset();
+    
+    return KErrNone;
+            
+    }
+SenHandler::THandlerDirection CWSStarPassportHandler::Direction() const
+    {
+    TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,(_L("CWSStarPassportHandler::Direction()")));
+    return SenHandler::EOutgoing;
+    }
+SenHandler::THandlerPhase CWSStarPassportHandler::Phase()
+    {
+    TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,(_L("CWSStarPassportHandler::Phase()")));
+    return SenHandler::EMessage;
+    }
+
+// Constructor
+CWSStarPassportHandler::CWSStarPassportHandler(MSenHandlerContext& aCtx)
+:CSenMessageHandler(aCtx)
+    {
+    TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,(_L("CWSStarPassportHandler::CWSStarPassportHandler(MSenHandlerContext& aCtx)")));
+    }
+
+// Destructor
+CWSStarPassportHandler::~CWSStarPassportHandler()
+    {
+    TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,(_L("CWSStarPassportHandler::~CWSStarPassportHandler()")));
+    }
+
+// Second phase construction.
+void CWSStarPassportHandler::ConstructL()
+    {
+    TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,(_L("CWSStarPassportHandler::ConstructL()")));
+    }
+
+TInt CWSStarPassportHandler::InitL(MSenHandlerContext& aCtx)
+    {
+    TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,(_L("CWSStarPassportHandler::InitL(MSenHandlerContext& aCtx)")));
+    iHandlerContext = aCtx;
+    return KErrNone;
+    }
+
+RFileLogger* CWSStarPassportHandler::Log() const
+    {
+    RFileLogger* pLog = NULL;
+    TRAP_IGNORE( pLog = (RFileLogger*)iHandlerContext.GetAnyL(HandlerContextKey::KLogger); )
+    return pLog;
+    }
+
+// END OF FILE
+