webservices/wsoviplugin/src/wsoviutils.cpp
changeset 0 62f9d29f7211
child 18 b72ea8487adb
--- /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 <hash.h> 
+#include <e32math.h>
+#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; i<strLen; i++)
+		{
+		if(unreserveChars.Find(ref, charLen) < 0)
+		count++;
+		ref+=1;
+		}
+	
+	return count;	
+	}
+	
+HBufC8* CWSOviUtils::EncodeCharsLC(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)
+			{
+			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;
+    }