--- /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 <SenIdentityProvider.h>
+
+#include "SenWsSecurityHeader.h"
+#include "sendebug.h"
+
+namespace
+ {
+ _LIT8(KColon, ":");
+
+ _LIT8(KUsernameTokenStartTagFmt, "<%S:UsernameToken>");
+
+ _LIT8(KUsernameFmt, "<%S:Username>%S</%S:Username>");
+
+ _LIT8(KPasswordStartTagDefaultFmt, "<%S:Password>%S");
+ _LIT8(KPasswordStartTagTypeFmt, "<%S:Password Type=\"%S:%S\">%S");
+ _LIT8(KPasswordEndTagFmt, "</%S:Password>");
+
+ _LIT8(KUsernameTokenEndTag, "</%S:UsernameToken>");
+
+ _LIT8(KTimestampExpiresFormatString8,
+ "<%S:Timestamp xmlns:%S=\"%S\"><%S:Created>%S</%S:Created><%S:Expires>%S</%S:Expires></%S:Timestamp>");
+
+ _LIT8(KTimestampFormatString8,
+ "<%S:Timestamp xmlns:%S=\"%S\"><%S:Created>%S</%S:Created></%S:Timestamp>");
+
+ _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</%S:BinarySecurityToken>");
+ _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</%S:BinarySecurityToken>");
+
+ /*
+ 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</%S:Username>");
+ _LIT8(KUsernameTokenEndTag, "</%S:UsernameToken>");
+
+ 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