diff -r 000000000000 -r 62f9d29f7211 webservices/wsutils/src/senwssecurityheader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webservices/wsutils/src/senwssecurityheader.cpp Thu Jan 07 16:19:19 2010 +0200 @@ -0,0 +1,399 @@ +/* +* Copyright (c) 2002-2005 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 FILES +#include + +#include "SenWsSecurityHeader.h" +#include "sendebug.h" + +namespace + { + _LIT8(KColon, ":"); + + _LIT8(KUsernameTokenStartTagFmt, "<%S:UsernameToken>"); + + _LIT8(KUsernameFmt, "<%S:Username>%S"); + + _LIT8(KPasswordStartTagDefaultFmt, "<%S:Password>%S"); + _LIT8(KPasswordStartTagTypeFmt, "<%S:Password Type=\"%S:%S\">%S"); + _LIT8(KPasswordEndTagFmt, ""); + + _LIT8(KUsernameTokenEndTag, ""); + + _LIT8(KTimestampExpiresFormatString8, + "<%S:Timestamp xmlns:%S=\"%S\"><%S:Created>%S<%S:Expires>%S"); + + _LIT8(KTimestampFormatString8, + "<%S:Timestamp xmlns:%S=\"%S\"><%S:Created>%S"); + + _LIT8(KBinarySecurityTokenValueTypeFmt, "<%S:BinarySecurityToken wsu:Id=\"token\" ValueType=\"%S\" xmlns:wsu=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\">%S"); + _LIT8(KBinarySecurityTokenFmt, "<%S:BinarySecurityToken wsu:Id=\"token\" xmlns:wsu=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\">%S"); + + /* + TInt TokenL(const TDesC8& aSecurityNsPrefix, const TDesC8& aUsername, HBufC8*& aToken) + { + aToken = HBufC8::NewLC( KUsernameTokenStartTagFmt().Length() + + KUsernameFmt().Length() + + KUsernameTokenEndTag().Length() + + aUsername.Length() + + aSecurityNsPrefix.Length() * 4 ); + + TPtr8 ptr = aToken->Des(); + ptr.Format(KUsernameTokenStartTagFmt, &aSecurityNsPrefix); + ptr.AppendFormat(KUsernameFmt, &aSecurityNsPrefix, &aUsername, &aSecurityNsPrefix); + ptr.AppendFormat(KUsernameTokenEndTag, &aSecurityNsPrefix); + CleanupStack::Pop(); // aToken + return KErrNone; + } + */ + + } + +EXPORT_C CSenWsSecurityHeader* CSenWsSecurityHeader::NewL() + { + CSenWsSecurityHeader* pNew = CSenWsSecurityHeader::NewLC(); + CleanupStack::Pop(); // pNew; + return pNew; + } + +EXPORT_C CSenWsSecurityHeader* CSenWsSecurityHeader::NewLC() + { + CSenWsSecurityHeader* pNew = new (ELeave) CSenWsSecurityHeader; + CleanupStack::PushL(pNew); + pNew->BaseConstructL(); + return pNew; + } + +EXPORT_C CSenWsSecurityHeader* CSenWsSecurityHeader::NewL(const TDesC8& aData) + { + CSenWsSecurityHeader* pNew = CSenWsSecurityHeader::NewLC(aData); + CleanupStack::Pop(); // pNew; + return pNew; + } + +EXPORT_C CSenWsSecurityHeader* CSenWsSecurityHeader::NewLC(const TDesC8& aData) + { + CSenWsSecurityHeader* pNew = new (ELeave) CSenWsSecurityHeader; + CleanupStack::PushL(pNew); + pNew->BaseConstructL(aData); + return pNew; + } + +EXPORT_C CSenWsSecurityHeader* CSenWsSecurityHeader::NewL(const TDesC8& aData, const TDesC8& aSecurityNs) + { + CSenWsSecurityHeader* pNew = CSenWsSecurityHeader::NewLC(aData, aSecurityNs); + CleanupStack::Pop(pNew); + return pNew; + } + +EXPORT_C CSenWsSecurityHeader* CSenWsSecurityHeader::NewLC(const TDesC8& aData, const TDesC8& aSecurityNs) + { + CSenWsSecurityHeader* pNew = new (ELeave) CSenWsSecurityHeader; + CleanupStack::PushL(pNew); + pNew->BaseConstructL(aData, aSecurityNs); + return pNew; + } + +EXPORT_C CSenWsSecurityHeader::CSenWsSecurityHeader() + { + } + +EXPORT_C void CSenWsSecurityHeader::BaseConstructL() + { + // create and push pQualifiedName + HBufC8 *pQualifiedName = HBufC8::NewLC(XmlNsPrefix().Length()+ + KColon().Length() + + KSecurityName().Length()); + + TPtr8 qualified = pQualifiedName->Des(); + qualified.Append(XmlNsPrefix()); + qualified.Append(KColon); + qualified.Append(KSecurityName); + CSenBaseFragment::BaseConstructL(XmlNs(), KSecurityName, qualified); + + CleanupStack::PopAndDestroy(); // pQualifiedName + } + +EXPORT_C void CSenWsSecurityHeader::BaseConstructL(const TDesC8& aData, const TDesC8& aSecurityNs) + { + // create and push pQualifiedName + HBufC8 *pQualifiedName = HBufC8::NewLC(XmlNsPrefix().Length()+ + KColon().Length() + + KSecurityName().Length()); + + TPtr8 qualified = pQualifiedName->Des(); + qualified.Append(XmlNsPrefix()); + qualified.Append(KColon); + qualified.Append(KSecurityName); + CSenBaseFragment::BaseConstructL(aSecurityNs, KSecurityName, qualified); + CleanupStack::PopAndDestroy(); // pQualifiedName + if (aData.Length()) + { + AsElement().SetContentL(aData); + } + } + +EXPORT_C void CSenWsSecurityHeader::BaseConstructL(const TDesC8& aData) + { + BaseConstructL(); + AsElement().SetContentL(aData); + } + +EXPORT_C CSenWsSecurityHeader::~CSenWsSecurityHeader() + { + } + +EXPORT_C HBufC8* CSenWsSecurityHeader::UsernameTokenL(CSenIdentityProvider &aIdentityProvider) + { + TPtrC8 username = aIdentityProvider.AuthzID(); + HBufC8* pToken = NULL; + User::LeaveIfError(UsernameTokenL(username, pToken)); + return pToken; + + /* + TPtrC8 nsPrefix = XmlNsPrefix(); + HBufC8* aToken = HBufC8::NewLC( KUsernameTokenStartTagFmt().Length() + + KUsernameFmt().Length() + + KUsernameTokenEndTag().Length() + + username.Length() + + nsPrefix.Length() * 4 ); + + _LIT8(KUsernameTokenStartTagFmt, "<%S:UsernameToken>"); + _LIT8(KUsernameFmt, "<%S:UsernameToken><%S:Username>%S"); + _LIT8(KUsernameTokenEndTag, ""); + + TPtr8 ptr = aToken->Des(); + ptr.Format(KUsernameTokenStartTagFmt, &nsPrefix); + ptr.AppendFormat(KUsernameFmt, &nsPrefix, &username, &nsPrefix); + ptr.AppendFormat(KUsernameTokenEndTag, &nsPrefix); + + CleanupStack::Pop(); // aToken + return aToken; + */ + } + + +EXPORT_C TPtrC8 CSenWsSecurityHeader::XmlNs() + { + // Note that AsElement() will panic, if CSenBaseFragment::ipElement == NULL + if(ipElement) + { + return AsElement().NamespaceURI(); + } + else + { + return KSecurityXmlNs(); + } + } + +EXPORT_C TPtrC8 CSenWsSecurityHeader::XmlNsPrefix() + { + // Note that AsElement() will panic, if CSenBaseFragment::ipElement == NULL + if(ipElement) + { + return AsElement().NsPrefix(); + } + else + { + return KSecurityXmlNsPrefix(); + } + } + +EXPORT_C TInt CSenWsSecurityHeader::UsernameTokenL(const TDesC8& aUsername, HBufC8*& aToken) + { + TPtrC8 nsPrefix = KSecurityXmlNsPrefix(); + aToken = HBufC8::NewLC( KUsernameTokenStartTagFmt().Length() + + KUsernameFmt().Length() + + KUsernameTokenEndTag().Length() + + aUsername.Length() + + nsPrefix.Length() * 4 ); + + TPtr8 ptr = aToken->Des(); + ptr.Format(KUsernameTokenStartTagFmt, &nsPrefix); + ptr.AppendFormat(KUsernameFmt, &nsPrefix, &aUsername, &nsPrefix); + ptr.AppendFormat(KUsernameTokenEndTag, &nsPrefix); + CleanupStack::Pop(); // aToken + return KErrNone; + } + + +EXPORT_C HBufC8* CSenWsSecurityHeader::UsernameTokenL(CSenIdentityProvider &aIdentityProvider, + CSenWsSecurityHeader::TPasswordType aType) + { + TPtrC8 username = aIdentityProvider.AuthzID(); + TPtrC8 password = aIdentityProvider.Password(); + HBufC8* pToken = NULL; + User::LeaveIfError(UsernameTokenL(username, password, aType, pToken)); + return pToken; + } + +EXPORT_C TInt CSenWsSecurityHeader::UsernameTokenL(const TDesC8& aUsername, + const TDesC8& aPassword, + HBufC8*& aToken) + { + TPtrC8 nsPrefix = KSecurityXmlNsPrefix(); + aToken = HBufC8::NewLC( KUsernameTokenStartTagFmt().Length() + + KUsernameFmt().Length() + + KUsernameTokenEndTag().Length() + + KPasswordStartTagDefaultFmt().Length() + + KPasswordEndTagFmt().Length() + + aPassword.Length() + + aUsername.Length() + + nsPrefix.Length() * 6 ); + + TPtr8 ptr = aToken->Des(); +// ptr.Format(KNameTokenFormat, &nsPrefix, &nsPrefix, &aUsername, &nsPrefix, &nsPrefix); + ptr.Format(KUsernameTokenStartTagFmt, &nsPrefix); + ptr.AppendFormat(KUsernameFmt, &nsPrefix, &aUsername, &nsPrefix); + ptr.AppendFormat(KPasswordStartTagDefaultFmt, + &nsPrefix, &aPassword); // no Type -attribute used + ptr.AppendFormat(KPasswordEndTagFmt, &nsPrefix); + ptr.AppendFormat(KUsernameTokenEndTag, &nsPrefix); + CleanupStack::Pop(); // aToken + return KErrNone; + } + +EXPORT_C TInt CSenWsSecurityHeader::UsernameTokenL(const TDesC8& aUsername, + const TDesC8& aPassword, + CSenWsSecurityHeader::TPasswordType aType, + HBufC8*& aToken) + { + switch(aType) + { + case EText: + { + return UsernameTokenL(aUsername, aPassword, aToken); + } + case EDigest: + { + TPtrC8 nsPrefix = KSecurityXmlNsPrefix(); + TPtrC8 typeAttr(KSecurityAttrTypeDigest); + + aToken = HBufC8::NewLC( KUsernameTokenStartTagFmt().Length() + + KUsernameFmt().Length() + + KUsernameTokenEndTag().Length() + + KPasswordStartTagTypeFmt().Length() + + KPasswordEndTagFmt().Length() + + aUsername.Length() + + aPassword.Length() + + typeAttr.Length() + + nsPrefix.Length() * 7 ); + TPtr8 ptr = aToken->Des(); + ptr.Format(KUsernameTokenStartTagFmt, &nsPrefix); + ptr.AppendFormat(KUsernameFmt, &nsPrefix, &aUsername, &nsPrefix); + ptr.AppendFormat(KPasswordStartTagTypeFmt, &nsPrefix, &nsPrefix, + &typeAttr, &aPassword); // Type = wsse:PasswordDigest + ptr.AppendFormat(KPasswordEndTagFmt, &nsPrefix); + ptr.AppendFormat(KUsernameTokenEndTag, &nsPrefix); + CleanupStack::Pop(); // aToken + return KErrNone; + } + default: + { + return KErrNotSupported; + } + } + } + +EXPORT_C TInt CSenWsSecurityHeader::BinarySecurityTokenL(const TDesC8& aContent, const TDesC8& aValueType, HBufC8*& aToken) + { + TPtrC8 nsPrefix = KSecurityXmlNsPrefix(); + aToken = HBufC8::NewLC( KBinarySecurityTokenValueTypeFmt().Length() + + aContent.Length() + + aValueType.Length() + + nsPrefix.Length() * 2 ); + + TPtr8 ptr = aToken->Des(); + ptr.Format(KBinarySecurityTokenValueTypeFmt, &nsPrefix, &aValueType, &aContent, &nsPrefix); + CleanupStack::Pop(); // aToken + return KErrNone; + } + +EXPORT_C TInt CSenWsSecurityHeader::BinarySecurityTokenL(const TDesC8& aContent, HBufC8*& aToken) + { + TPtrC8 nsPrefix = KSecurityXmlNsPrefix(); + aToken = HBufC8::NewLC( KBinarySecurityTokenFmt().Length() + + aContent.Length() + + nsPrefix.Length() * 2 ); + + TPtr8 ptr = aToken->Des(); + ptr.Format(KBinarySecurityTokenFmt, &nsPrefix, &aContent, &nsPrefix); + CleanupStack::Pop(); // aToken + return KErrNone; + } + +EXPORT_C TInt CSenWsSecurityHeader::TimestampL(const TDesC8& aCreated, const TDesC8& aExpires, HBufC8*& aToken) + { + TPtrC8 nsPrefix = KSecurityUtilityXmlNsPrefix(); + aToken = HBufC8::NewLC(KTimestampExpiresFormatString8().Length() + + aCreated.Length() + + aExpires.Length() + + nsPrefix.Length()*7 + + KSecurityUtilityXmlNs().Length()); + + TPtr8 ptr = aToken->Des(); + ptr.Format(KTimestampExpiresFormatString8, + &nsPrefix, + &nsPrefix, + &KSecurityUtilityXmlNs(), + &nsPrefix, + &aCreated, + &nsPrefix, + &nsPrefix, + &aExpires, + &nsPrefix, + &nsPrefix); + CleanupStack::Pop(aToken); + return KErrNone; + } + +EXPORT_C TInt CSenWsSecurityHeader::TimestampL(const TDesC8& aCreated, HBufC8*& aToken) + { + TPtrC8 nsPrefix = KSecurityUtilityXmlNsPrefix(); + aToken = HBufC8::NewLC(KTimestampFormatString8().Length() + + aCreated.Length() + + nsPrefix.Length()*5 + + KSecurityUtilityXmlNs().Length()); + + TPtr8 ptr = aToken->Des(); + ptr.Format(KTimestampFormatString8, + &nsPrefix, + &nsPrefix, + &KSecurityUtilityXmlNs(), + &nsPrefix, + &aCreated, + &nsPrefix, + &nsPrefix); + CleanupStack::Pop(aToken); + return KErrNone; + } + +//EXPORT_C TInt CSenWsSecurityHeader::SecurityTokenReferenceL(const TDesC8& aURI, HBufC8*& aToken) +// { +// //to do +// } + + +// End of File