example/LinkedInAuthApp/src/loginDialog.cpp
author cgandhi
Tue, 12 Oct 2010 15:23:52 +0530
changeset 27 b3e1347ac96a
parent 26 83d6a149c755
permissions -rw-r--r--
Updating the information for test applications and results.

/**
* Copyright (c) 2010 Sasken Communication Technologies Ltd.
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the "{License}"
* which accompanies  this distribution, and is available
* at the URL "{LicenseUrl}".
*
* Initial Contributors:
* Narasimhulu Kavadapu, Sasken Communication Technologies Ltd - Initial contribution
*
* Contributors:
* Siddhartha Chandra, Satish Kanteti Sasken Communication Technologies Ltd
* Description:
* Login Dialog class of Authentication Application
*/

#include <qdebug.h>

#include "authAppConstants.h"
#include "sessionSP.h"
#include "errorCodes.h"
#include "loginDialog.h"
#include "keys.h"
#include <QNetworkCookie>
#include <QInputDialog>
#include <QSslConfiguration>

static const QString kStringBoundary = "3i2ndDfv2rTHiSisAbouNdArYfORhtTPEefj3q2f";
///////////////////////////////////////////////////////////////////////////////////////////////////
// global

//static const QString kLoginURL = "http://www.facebook.com/login.php";

///////////////////////////////////////////////////////////////////////////////////////////////////
void FBLoginDialog::connectToGetSession(const QString& aToken)
{
	qDebug()<<"Inside FBLoginDialog::connectToGetSession()";
    iGetSessionRequest = FBRequest::requestWithSession(iSession);
    
    //connect(iGetSessionRequest, SIGNAL(LoadLoginPage()), this, SLOT(LoadLoginPage()));
    connect(iGetSessionRequest, SIGNAL(requestDidLoad(QVariant)), this, SLOT(requestDidLoad(QVariant)));
    connect(iGetSessionRequest, SIGNAL(requestFailedWithNetworkError(QNetworkReply::NetworkError)), this, SLOT(requestFailedWithNetworkError(QNetworkReply::NetworkError)));
    connect(iGetSessionRequest, SIGNAL(requestFailedWithFacebookError(FBError)), this, SLOT(requestFailedWithFacebookError(FBError)));

    Dictionary params;
    params["auth_token"] = aToken;

    if (iSession->apiSecret().length())
    {
        params["generate_session_secret"]="1";
    }

    if (iSession->getSessionProxy().length())
    {
        iGetSessionRequest->post(iSession->getSessionProxy(),params);
    }
    else
    {
        iGetSessionRequest->call("facebook.auth.getSession", params);
    }
}
void FBLoginDialog::connectToGetToken()
	{
		qDebug()<<"Inside FBLoginDialog::connectToGetToken()";
	    iGetSessionRequest = FBRequest::requestWithSession(iSession);

	   // connect(iGetSessionRequest, SIGNAL(requestDidLoad(QVariant)), this, SLOT(requestDidLoad(QVariant)));
	 //   connect(iGetSessionRequest, SIGNAL(requestFailedWithNetworkError(QNetworkReply::NetworkError)), this, SLOT(requestFailedWithNetworkError(QNetworkReply::NetworkError)));
	  //  connect(iGetSessionRequest, SIGNAL(requestFailedWithFacebookError(FBError)), this, SLOT(requestFailedWithFacebookError(FBError)));

	    Dictionary postParams;
		iSession->stroauth_nonce = generateNONCE(43);
		iSession->stroauth_timestamp = generateTimeStamp();//QString::number(generateTimeStamp());
		qDebug()<<"iSession->stroauth_timestamp"<<iSession->stroauth_timestamp;
		//postParams["oauth_callback"] = kBase;
		postParams["oauth_consumer_key"] = kConsumerKey;
		postParams["oauth_signature_method"] = "HMAC-SHA1";
		postParams["oauth_timestamp"] = iSession->stroauth_timestamp;
		postParams["oauth_nonce"] = iSession->stroauth_nonce;
		postParams["oauth_version"] = "1.0";
		FBRequest* req = FBRequest::requestWithSession(iSession);
		iSession->stroauth_signature = req->generateSig(postParams);
	    iGetSessionRequest->call("/uas/oauth/accessToken", postParams);
	    
	}
void FBLoginDialog::loadLoginPage()
{
    iGetSessionRequest = FBRequest::requestWithSession(iSession);
	qDebug()<<"Inside FBLoginDialog::loadLoginPage()";
    Dictionary getParams, postParams;
    iSession->stroauth_nonce = generateNONCE(43);
	iSession->stroauth_timestamp = generateTimeStamp();//QString::number(generateTimeStamp());
	qDebug()<<"iSession->stroauth_timestamp"<<iSession->stroauth_timestamp;
    postParams["oauth_callback"] = "oob";
    postParams["oauth_consumer_key"] = kConsumerKey;
    postParams["oauth_signature_method"] = "HMAC-SHA1";
    postParams["oauth_timestamp"] = iSession->stroauth_timestamp;
    postParams["oauth_nonce"] = iSession->stroauth_nonce;
    postParams["oauth_version"] = "1.0";
   /* FBRequest* req = FBRequest::requestWithSession(iSession);*/
    iSession->stroauth_signature = iGetSessionRequest->generateSig(postParams);
    
    connect(iGetSessionRequest, SIGNAL(LoadLoginPage()), this, SLOT(LoadLoginPage()));
    
    iGetSessionRequest->connect();
    
    
    
    
    
  
    //loadURL(kRequestTokenUrl,QNetworkAccessManager::PostOperation, getParams, postParams);

}
/*int FBLoginDialog::generateTimeStamp()
	{
		QDate oldDate;
		oldDate.setYMD(1970,1,1);
	
		QDateTime OldDateTime;
		OldDateTime.setDate(oldDate);
		QTime temp;
		temp.setHMS(0,0,0,0);
		OldDateTime.setTime(temp);
		QDateTime CurTime = QDateTime::currentDateTime();
		
		int timestamp = OldDateTime.secsTo(CurTime);
		return timestamp;
	}*/
QByteArray FBLoginDialog::generateTimeStamp()
	{
		uint time = QDateTime::currentDateTime().toTime_t();
	    QByteArray timestamp = QByteArray::number( time );
	    return timestamp;
	}
QString FBLoginDialog::generateNONCE(const qint64 Length)
	{
	srand(time(0));
	//QDateTime UniqueNumber = QDateTime::currentDateTime();

	//read upto milliseconds
	QString RetString;//(UniqueNumber.toString("hh/mm/ss/zzz"));

	QString Letters(
			"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");

	//append a randomly generated string to RetString
	for (int i = 0; i < Length; i++)
		{
		RetString.insert((i), Letters.at(rand() % Letters.size()));
		}

	return RetString;
	}
///////////////////////////////////////////////////////////////////////////////////////////////////

FBLoginDialog::FBLoginDialog() : FBDialog () {}

FBLoginDialog::FBLoginDialog(FBSession* aSession) : FBDialog(aSession) {}

///////////////////////////////////////////////////////////////////////////////////////////////////
// FBDialog

void FBLoginDialog::load()
{
	qDebug()<<"Inside FBLoginDialog::load()";
    loadLoginPage();
}

void FBLoginDialog::dialogWillDisappear()
{
	qDebug()<<"Inside FBLoginDialog::dialogWillDisappear()";
  iGetSessionRequest->cancel();

  if (!iSession->isConnected())
  {
      iSession->cancelLogin();
  }
}

void FBLoginDialog::GetSessionKey(const QUrl& aUrl)
{
	qDebug()<<"Inside FBLoginDialog::GetSessionKey()";
    const QString authToken = "auth_token=";
    const QString url ( aUrl.toString() );

    int start = url.indexOf(authToken);
    if (start != -1)
    {
        QString token;
        int end = url.indexOf("&", start);
        int delta = start + authToken.size() + 1;
        if (end != -1)
        {
            token = url.mid(delta, end - delta );
        }
        else
        {
            token = url.right(url.size() - delta + 1);
        }

        connectToGetSession(token);
    }
}
void FBLoginDialog::FetchKeyFromUrl(const QUrl& aUrl)
{
    const QString url ( aUrl.toString() );
    QStringList varList = url.split("{");
    QString newvar = varList[1];
    varList.clear();
    varList = newvar.split(",");
    QString session_key = varList[0];
    QString uid = varList[1];
    QString expires = varList[2];
    QString secret = varList[3];
    varList.clear();
    varList = session_key.split(":");
    session_key = varList[1];
    session_key = session_key.mid(1,session_key.length()-2);
    varList.clear();
    varList = uid.split(":");
    uid = varList[1];
	varList.clear();
	varList = expires.split(":");
	expires = varList[1];
	varList.clear();
	varList = secret.split(":");
	secret = varList[1];
	secret = secret.mid(1,secret.length()-2);
	varList.clear();
    qDebug()<<"session_key"<<session_key<<"\n";
    qDebug()<<"uid"<<uid<<"\n";
    qDebug()<<"expires"<<expires<<"\n";
    qDebug()<<"secret"<<secret<<"\n";
    uint expiry = expires.toUInt();//.toUInt(&conversionError);
    QDateTime expiration; expiration.setTime_t( expiry );
    iSession->beginSession(session_key, secret,expiration);
    iSession->resume();
}
///////////////////////////////////////////////////////////////////////////////////////////////////
// slots for signals from FBRequest

void FBLoginDialog::requestDidLoad(const QVariant& aResult)
{
	qDebug()<<"Inside FBLoginDialog::requestDidLoad";
    bool conversionError = false;
    QVariantHash object = aResult.toHash();
    QString sessionKey = object.value("session_key").toString();
    QString sessionSecret = object.value("secret").toString();

    QVariant ex = object.value("expires");
    uint expires = object.value("expires").toUInt(&conversionError);
    QDateTime expiration; expiration.setTime_t( expires );

    iSession->beginSession(sessionKey, sessionSecret,expiration);
    iSession->resume();

    dismissWithSuccess(true, true);
}

void FBLoginDialog::requestFailedWithFacebookError (const FBError& aCode )
{
	qDebug()<<"Inside FBLoginDialog::requestFailedWithFacebookError()";
    dismissWithError(aCode, true);
}

void FBLoginDialog::requestFailedWithNetworkError( QNetworkReply::NetworkError aCode )
{
	qDebug()<<"Inside FBLoginDialog::requestFailedWithNetworkError()";
    dismissWithError(aCode, true);
}
void FBLoginDialog::LoadLoginPage()
	{
	
	qDebug()<<"Enter: LoadLoginPage()";
	QString LoginUrl = "https://api.linkedin.com/uas/oauth/authorize?oauth_token=";//94ab03c4-ae2c-45e4-8732-0e6c4899db63";
	LoginUrl += iSession->stroauth_Token;
    proxysettings();
	qDebug()<<"LoginUrl:"<<LoginUrl;
	//TBuf<1024> sid(LoginUrl.utf16()); //uncomment to invoke browser
	//LaunchBrowserL(sid); //uncomment to invoke browser
	QNetworkRequest request;
	QSslConfiguration config = request.sslConfiguration();
	config.setProtocol(QSsl::SslV3);
	request.setSslConfiguration(config);
	request.setUrl(QUrl(LoginUrl));
	iWebView->load(request,QNetworkAccessManager::PostOperation); //uncomment to invoke browser


	qDebug()<<"Exit: LoadLoginPage()";
	   
	}
void FBLoginDialog::LaunchBrowserL(const TDesC& aUrl)
{
	qDebug()<<"Enter: LaunchBrowserL()";
	const TInt KWmlBrowserUid = 0x10008D39;
	TUid id( TUid::Uid( KWmlBrowserUid ) );
	TApaTaskList taskList( CEikonEnv::Static()->WsSession() );
	TApaTask task = taskList.FindApp( id );
	if ( task.Exists() )
	{
		qDebug()<<"Inside: if()";
		HBufC8* param = HBufC8::NewLC( aUrl.Length() + 2);
                //"4 " is to Start/Continue the browser specifying a URL
		param->Des().Append(_L("4 "));
		param->Des().Append(aUrl);
		task.SendMessage( TUid::Uid( 0 ), *param ); // Uid is not used
		CleanupStack::PopAndDestroy(param);
	}
	else
	{
		qDebug()<<"Inside: else()";
		HBufC16* param = HBufC16::NewLC( aUrl.Length() + 2);
                //"4 " is to Start/Continue the browser specifying a URL
		param->Des().Append(_L("4 "));
		param->Des().Append(aUrl);
		RApaLsSession appArcSession;
                // connect to AppArc server 
		User::LeaveIfError(appArcSession.Connect()); 
		TThreadId id;
		appArcSession.StartDocument( *param, TUid::Uid( KWmlBrowserUid)
                                                                       , id );
		appArcSession.Close(); 
		CleanupStack::PopAndDestroy(param);
	}
}
void FBLoginDialog::GetAccessToken()
	{
		/*qDebug()<<"Inside FBLoginDialog::GetAccessToken()";
	    Dictionary getParams, postParams;
	    iSession->stroauth_nonce = generateNONCE(43);
		iSession->stroauth_timestamp = generateTimeStamp();//QString::number(generateTimeStamp());
		qDebug()<<"iSession->stroauth_timestamp"<<iSession->stroauth_timestamp;
	  
	    postParams["oauth_consumer_key"] = kConsumerKey;
	    postParams["oauth_signature_method"] = "HMAC-SHA1";
	    postParams["oauth_timestamp"] = iSession->stroauth_timestamp;
	    postParams["oauth_nonce"] = iSession->stroauth_nonce;
	    postParams["oauth_version"] = "1.0";
	
	    iSession->stroauth_signature = iGetSessionRequest->generateSig(postParams);*/
	}