diff -r 000000000000 -r 62f9d29f7211 webservices/wsoviplugin/src/wsoviutils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webservices/wsoviplugin/src/wsoviutils.cpp Thu Jan 07 16:19:19 2010 +0200 @@ -0,0 +1,195 @@ +/* +* Copyright (c) 2008 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 +#include "wsoviutils.h" +#include "wsovicons.h" +#include "sencryptoutils.h" + +HBufC8* CWSOviUtils::NormalizeStringLC(const TDesC8& aMethod, const TDesC8& aUrl, const TDesC8& aHeader ) + { + + + TInt methodLen = aMethod.Length(); + TInt urlLen = aUrl.Length() + KHexWidth*CountCharsToEncode(aUrl); + TInt headerLen = aHeader.Length() + KHexWidth*CountCharsToEncode(aHeader); + TInt normalizedStringLen = methodLen + OAuth::KAmpMark().Length() + urlLen + OAuth::KAmpMark().Length() + headerLen; + + HBufC8* pNormalizedString = HBufC8::NewLC(normalizedStringLen); + + HBufC8* method = aMethod.AllocLC(); + method->Des().UpperCase(); + pNormalizedString->Des().Append(*method); + pNormalizedString->Des().Append(OAuth::KAmpMark()); + + HBufC8* urlLowercase = aUrl.AllocLC(); + _LIT8(KSlash,"/"); + _LIT8(KDoubleSlash,"//"); + _LIT8(KQuestionMark,"?"); + TInt posStart = urlLowercase->Find(KDoubleSlash) + KDoubleSlash().Length(); + TInt posEnd = urlLowercase->Mid(posStart).Find(KSlash); + if(posEnd == KErrNotFound) + { + urlLowercase->Des().LowerCase(); + } + else + { + urlLowercase->Des().LeftTPtr(posEnd).LowerCase(); + } + TPtr8 urlLowercaseBase(urlLowercase->Des()); + + //cut query & fragment, see http://oauth.net/core/1.0/ (9.1.2. Construct Request URL) + posEnd = urlLowercase->Find(KQuestionMark); + if(posEnd != KErrNotFound) + { + urlLowercaseBase.Set(urlLowercase->Des().LeftTPtr(posEnd)); + } + + + HBufC8* url = EncodeCharsLC(urlLowercaseBase); + pNormalizedString->Des().Append(*url); + CleanupStack::PopAndDestroy(url); + CleanupStack::PopAndDestroy(urlLowercase); + pNormalizedString->Des().Append(OAuth::KAmpMark()); + + HBufC8* header = EncodeCharsLC(aHeader); + pNormalizedString->Des().Append(*header); + CleanupStack::PopAndDestroy(header); + CleanupStack::PopAndDestroy(method); + + return pNormalizedString; + } + +HBufC8* CWSOviUtils::DigestAuthStringL(const TDesC8& aNonce, const TDesC8& aTimestamp, const TDesC8& aUser, const TDesC8& aPassword) + { + _LIT8(KFormatUser, "/accounts/%S/"); + HBufC8* validatorString = HBufC8::NewLC(KFormatUser().Length()+aUser.Length()); + TPtr8 validatorPtr = validatorString->Des(); + validatorPtr.Format(KFormatUser,&aUser); + CSHA1* sha1 = CSHA1::NewL(); + sha1->Update(*validatorString); + TPtrC8 validator = sha1->Final(aPassword); + CleanupStack::PopAndDestroy(validatorString); + CleanupStack::PushL(sha1); + HBufC8* base64validator = SenCryptoUtils::EncodeBase64L(validator); + sha1->Reset(); + sha1->Update(aNonce); + sha1->Update(aTimestamp); + TPtrC8 digest = sha1->Final(*base64validator); + delete base64validator; + HBufC8* digestBase64 = SenCryptoUtils::EncodeBase64L(digest); + CleanupStack::PopAndDestroy(sha1); + return digestBase64; + } + + +TInt CWSOviUtils::CountCharsToEncode(const TDesC8& aString) + { + const TUint8* ref=NULL; + const TUint8 charLen = 1; + TUint count(0); + TPtrC8 unreserveChars(OAuth::KUnReserveChars); + TUint strLen = aString.Length(); + + ref=aString.Ptr(); + for(TInt i=0; iDes(); + + for (TInt i = 0; i < len; i++) + { + if(unreserveChars.Find(ref, KCharWidth) < 0) + { + TBuf8<2> charcode; + buf.Append(OAuth::KPercent); + charcode.AppendNumFixedWidth(aString[i], EHex, KHexWidth); + charcode.UpperCase(); + buf.Append(charcode); + } + else + { + buf.Append(&aString[i], KCharWidth); + } + ref+=1; + } + + return pEncoded; + } + +HBufC8* CWSOviUtils::FormEncodeCharsLC(const TDesC8& aString) + { + TInt len = aString.Length(); + TInt encodedLength = aString.Length() + KHexWidth*CountCharsToEncode(aString); + const TUint8* ref=NULL; + TPtrC8 unreserveChars(OAuth::KUnReserveChars); + ref=aString.Ptr(); + + HBufC8* pEncoded = HBufC8::NewLC(encodedLength); + TPtr8 buf = pEncoded->Des(); + + for (TInt i = 0; i < len; i++) + { + if(unreserveChars.Find(ref, KCharWidth) < 0) + { + if (*ref == KSpaceChar) + { + buf.Append('+'); + } + else{ + TBuf8<2> charcode; + buf.Append(OAuth::KPercent); + charcode.AppendNumFixedWidth(aString[i], EHex, KHexWidth); + charcode.UpperCase(); + buf.Append(charcode); + } + } + else + { + buf.Append(&aString[i], KCharWidth); + } + ref+=1; + } + + return pEncoded; + }