example/LinkedInAuthApp/src/loginDialog.cpp
changeset 26 83d6a149c755
equal deleted inserted replaced
25:a180113055cb 26:83d6a149c755
       
     1 /**
       
     2 * Copyright (c) 2010 Sasken Communication Technologies Ltd.
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of the "{License}"
       
     6 * which accompanies  this distribution, and is available
       
     7 * at the URL "{LicenseUrl}".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Narasimhulu Kavadapu, Sasken Communication Technologies Ltd - Initial contribution
       
    11 *
       
    12 * Contributors:
       
    13 * Siddhartha Chandra, Satish Kanteti Sasken Communication Technologies Ltd
       
    14 * Description:
       
    15 * Login Dialog class of Authentication Application
       
    16 */
       
    17 
       
    18 #include <qdebug.h>
       
    19 
       
    20 #include "authAppConstants.h"
       
    21 #include "sessionSP.h"
       
    22 #include "errorCodes.h"
       
    23 #include "loginDialog.h"
       
    24 #include "keys.h"
       
    25 #include <QNetworkCookie>
       
    26 #include <QInputDialog>
       
    27 #include <QSslConfiguration>
       
    28 
       
    29 static const QString kStringBoundary = "3i2ndDfv2rTHiSisAbouNdArYfORhtTPEefj3q2f";
       
    30 ///////////////////////////////////////////////////////////////////////////////////////////////////
       
    31 // global
       
    32 
       
    33 //static const QString kLoginURL = "http://www.facebook.com/login.php";
       
    34 
       
    35 ///////////////////////////////////////////////////////////////////////////////////////////////////
       
    36 void FBLoginDialog::connectToGetSession(const QString& aToken)
       
    37 {
       
    38 	qDebug()<<"Inside FBLoginDialog::connectToGetSession()";
       
    39     iGetSessionRequest = FBRequest::requestWithSession(iSession);
       
    40     
       
    41     //connect(iGetSessionRequest, SIGNAL(LoadLoginPage()), this, SLOT(LoadLoginPage()));
       
    42     connect(iGetSessionRequest, SIGNAL(requestDidLoad(QVariant)), this, SLOT(requestDidLoad(QVariant)));
       
    43     connect(iGetSessionRequest, SIGNAL(requestFailedWithNetworkError(QNetworkReply::NetworkError)), this, SLOT(requestFailedWithNetworkError(QNetworkReply::NetworkError)));
       
    44     connect(iGetSessionRequest, SIGNAL(requestFailedWithFacebookError(FBError)), this, SLOT(requestFailedWithFacebookError(FBError)));
       
    45 
       
    46     Dictionary params;
       
    47     params["auth_token"] = aToken;
       
    48 
       
    49     if (iSession->apiSecret().length())
       
    50     {
       
    51         params["generate_session_secret"]="1";
       
    52     }
       
    53 
       
    54     if (iSession->getSessionProxy().length())
       
    55     {
       
    56         iGetSessionRequest->post(iSession->getSessionProxy(),params);
       
    57     }
       
    58     else
       
    59     {
       
    60         iGetSessionRequest->call("facebook.auth.getSession", params);
       
    61     }
       
    62 }
       
    63 void FBLoginDialog::connectToGetToken()
       
    64 	{
       
    65 		qDebug()<<"Inside FBLoginDialog::connectToGetToken()";
       
    66 	    iGetSessionRequest = FBRequest::requestWithSession(iSession);
       
    67 
       
    68 	   // connect(iGetSessionRequest, SIGNAL(requestDidLoad(QVariant)), this, SLOT(requestDidLoad(QVariant)));
       
    69 	 //   connect(iGetSessionRequest, SIGNAL(requestFailedWithNetworkError(QNetworkReply::NetworkError)), this, SLOT(requestFailedWithNetworkError(QNetworkReply::NetworkError)));
       
    70 	  //  connect(iGetSessionRequest, SIGNAL(requestFailedWithFacebookError(FBError)), this, SLOT(requestFailedWithFacebookError(FBError)));
       
    71 
       
    72 	    Dictionary postParams;
       
    73 		iSession->stroauth_nonce = generateNONCE(43);
       
    74 		iSession->stroauth_timestamp = generateTimeStamp();//QString::number(generateTimeStamp());
       
    75 		qDebug()<<"iSession->stroauth_timestamp"<<iSession->stroauth_timestamp;
       
    76 		//postParams["oauth_callback"] = kBase;
       
    77 		postParams["oauth_consumer_key"] = kConsumerKey;
       
    78 		postParams["oauth_signature_method"] = "HMAC-SHA1";
       
    79 		postParams["oauth_timestamp"] = iSession->stroauth_timestamp;
       
    80 		postParams["oauth_nonce"] = iSession->stroauth_nonce;
       
    81 		postParams["oauth_version"] = "1.0";
       
    82 		FBRequest* req = FBRequest::requestWithSession(iSession);
       
    83 		iSession->stroauth_signature = req->generateSig(postParams);
       
    84 	    iGetSessionRequest->call("/uas/oauth/accessToken", postParams);
       
    85 	    
       
    86 	}
       
    87 void FBLoginDialog::loadLoginPage()
       
    88 {
       
    89     iGetSessionRequest = FBRequest::requestWithSession(iSession);
       
    90 	qDebug()<<"Inside FBLoginDialog::loadLoginPage()";
       
    91     Dictionary getParams, postParams;
       
    92     iSession->stroauth_nonce = generateNONCE(43);
       
    93 	iSession->stroauth_timestamp = generateTimeStamp();//QString::number(generateTimeStamp());
       
    94 	qDebug()<<"iSession->stroauth_timestamp"<<iSession->stroauth_timestamp;
       
    95     postParams["oauth_callback"] = "oob";
       
    96     postParams["oauth_consumer_key"] = kConsumerKey;
       
    97     postParams["oauth_signature_method"] = "HMAC-SHA1";
       
    98     postParams["oauth_timestamp"] = iSession->stroauth_timestamp;
       
    99     postParams["oauth_nonce"] = iSession->stroauth_nonce;
       
   100     postParams["oauth_version"] = "1.0";
       
   101    /* FBRequest* req = FBRequest::requestWithSession(iSession);*/
       
   102     iSession->stroauth_signature = iGetSessionRequest->generateSig(postParams);
       
   103     
       
   104     connect(iGetSessionRequest, SIGNAL(LoadLoginPage()), this, SLOT(LoadLoginPage()));
       
   105     
       
   106     iGetSessionRequest->connect();
       
   107     
       
   108     
       
   109     
       
   110     
       
   111     
       
   112   
       
   113     //loadURL(kRequestTokenUrl,QNetworkAccessManager::PostOperation, getParams, postParams);
       
   114 
       
   115 }
       
   116 /*int FBLoginDialog::generateTimeStamp()
       
   117 	{
       
   118 		QDate oldDate;
       
   119 		oldDate.setYMD(1970,1,1);
       
   120 	
       
   121 		QDateTime OldDateTime;
       
   122 		OldDateTime.setDate(oldDate);
       
   123 		QTime temp;
       
   124 		temp.setHMS(0,0,0,0);
       
   125 		OldDateTime.setTime(temp);
       
   126 		QDateTime CurTime = QDateTime::currentDateTime();
       
   127 		
       
   128 		int timestamp = OldDateTime.secsTo(CurTime);
       
   129 		return timestamp;
       
   130 	}*/
       
   131 QByteArray FBLoginDialog::generateTimeStamp()
       
   132 	{
       
   133 		uint time = QDateTime::currentDateTime().toTime_t();
       
   134 	    QByteArray timestamp = QByteArray::number( time );
       
   135 	    return timestamp;
       
   136 	}
       
   137 QString FBLoginDialog::generateNONCE(const qint64 Length)
       
   138 	{
       
   139 	srand(time(0));
       
   140 	//QDateTime UniqueNumber = QDateTime::currentDateTime();
       
   141 
       
   142 	//read upto milliseconds
       
   143 	QString RetString;//(UniqueNumber.toString("hh/mm/ss/zzz"));
       
   144 
       
   145 	QString Letters(
       
   146 			"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
       
   147 
       
   148 	//append a randomly generated string to RetString
       
   149 	for (int i = 0; i < Length; i++)
       
   150 		{
       
   151 		RetString.insert((i), Letters.at(rand() % Letters.size()));
       
   152 		}
       
   153 
       
   154 	return RetString;
       
   155 	}
       
   156 ///////////////////////////////////////////////////////////////////////////////////////////////////
       
   157 
       
   158 FBLoginDialog::FBLoginDialog() : FBDialog () {}
       
   159 
       
   160 FBLoginDialog::FBLoginDialog(FBSession* aSession) : FBDialog(aSession) {}
       
   161 
       
   162 ///////////////////////////////////////////////////////////////////////////////////////////////////
       
   163 // FBDialog
       
   164 
       
   165 void FBLoginDialog::load()
       
   166 {
       
   167 	qDebug()<<"Inside FBLoginDialog::load()";
       
   168     loadLoginPage();
       
   169 }
       
   170 
       
   171 void FBLoginDialog::dialogWillDisappear()
       
   172 {
       
   173 	qDebug()<<"Inside FBLoginDialog::dialogWillDisappear()";
       
   174   iGetSessionRequest->cancel();
       
   175 
       
   176   if (!iSession->isConnected())
       
   177   {
       
   178       iSession->cancelLogin();
       
   179   }
       
   180 }
       
   181 
       
   182 void FBLoginDialog::GetSessionKey(const QUrl& aUrl)
       
   183 {
       
   184 	qDebug()<<"Inside FBLoginDialog::GetSessionKey()";
       
   185     const QString authToken = "auth_token=";
       
   186     const QString url ( aUrl.toString() );
       
   187 
       
   188     int start = url.indexOf(authToken);
       
   189     if (start != -1)
       
   190     {
       
   191         QString token;
       
   192         int end = url.indexOf("&", start);
       
   193         int delta = start + authToken.size() + 1;
       
   194         if (end != -1)
       
   195         {
       
   196             token = url.mid(delta, end - delta );
       
   197         }
       
   198         else
       
   199         {
       
   200             token = url.right(url.size() - delta + 1);
       
   201         }
       
   202 
       
   203         connectToGetSession(token);
       
   204     }
       
   205 }
       
   206 void FBLoginDialog::FetchKeyFromUrl(const QUrl& aUrl)
       
   207 {
       
   208     const QString url ( aUrl.toString() );
       
   209     QStringList varList = url.split("{");
       
   210     QString newvar = varList[1];
       
   211     varList.clear();
       
   212     varList = newvar.split(",");
       
   213     QString session_key = varList[0];
       
   214     QString uid = varList[1];
       
   215     QString expires = varList[2];
       
   216     QString secret = varList[3];
       
   217     varList.clear();
       
   218     varList = session_key.split(":");
       
   219     session_key = varList[1];
       
   220     session_key = session_key.mid(1,session_key.length()-2);
       
   221     varList.clear();
       
   222     varList = uid.split(":");
       
   223     uid = varList[1];
       
   224 	varList.clear();
       
   225 	varList = expires.split(":");
       
   226 	expires = varList[1];
       
   227 	varList.clear();
       
   228 	varList = secret.split(":");
       
   229 	secret = varList[1];
       
   230 	secret = secret.mid(1,secret.length()-2);
       
   231 	varList.clear();
       
   232     qDebug()<<"session_key"<<session_key<<"\n";
       
   233     qDebug()<<"uid"<<uid<<"\n";
       
   234     qDebug()<<"expires"<<expires<<"\n";
       
   235     qDebug()<<"secret"<<secret<<"\n";
       
   236     uint expiry = expires.toUInt();//.toUInt(&conversionError);
       
   237     QDateTime expiration; expiration.setTime_t( expiry );
       
   238     iSession->beginSession(session_key, secret,expiration);
       
   239     iSession->resume();
       
   240 }
       
   241 ///////////////////////////////////////////////////////////////////////////////////////////////////
       
   242 // slots for signals from FBRequest
       
   243 
       
   244 void FBLoginDialog::requestDidLoad(const QVariant& aResult)
       
   245 {
       
   246 	qDebug()<<"Inside FBLoginDialog::requestDidLoad";
       
   247     bool conversionError = false;
       
   248     QVariantHash object = aResult.toHash();
       
   249     QString sessionKey = object.value("session_key").toString();
       
   250     QString sessionSecret = object.value("secret").toString();
       
   251 
       
   252     QVariant ex = object.value("expires");
       
   253     uint expires = object.value("expires").toUInt(&conversionError);
       
   254     QDateTime expiration; expiration.setTime_t( expires );
       
   255 
       
   256     iSession->beginSession(sessionKey, sessionSecret,expiration);
       
   257     iSession->resume();
       
   258 
       
   259     dismissWithSuccess(true, true);
       
   260 }
       
   261 
       
   262 void FBLoginDialog::requestFailedWithFacebookError (const FBError& aCode )
       
   263 {
       
   264 	qDebug()<<"Inside FBLoginDialog::requestFailedWithFacebookError()";
       
   265     dismissWithError(aCode, true);
       
   266 }
       
   267 
       
   268 void FBLoginDialog::requestFailedWithNetworkError( QNetworkReply::NetworkError aCode )
       
   269 {
       
   270 	qDebug()<<"Inside FBLoginDialog::requestFailedWithNetworkError()";
       
   271     dismissWithError(aCode, true);
       
   272 }
       
   273 void FBLoginDialog::LoadLoginPage()
       
   274 	{
       
   275 	
       
   276 	qDebug()<<"Enter: LoadLoginPage()";
       
   277 	QString LoginUrl = "https://api.linkedin.com/uas/oauth/authorize?oauth_token=";//94ab03c4-ae2c-45e4-8732-0e6c4899db63";
       
   278 	LoginUrl += iSession->stroauth_Token;
       
   279     proxysettings();
       
   280 	qDebug()<<"LoginUrl:"<<LoginUrl;
       
   281 	//TBuf<1024> sid(LoginUrl.utf16()); //uncomment to invoke browser
       
   282 	//LaunchBrowserL(sid); //uncomment to invoke browser
       
   283 	QNetworkRequest request;
       
   284 	QSslConfiguration config = request.sslConfiguration();
       
   285 	config.setProtocol(QSsl::SslV3);
       
   286 	request.setSslConfiguration(config);
       
   287 	request.setUrl(QUrl(LoginUrl));
       
   288 	iWebView->load(request,QNetworkAccessManager::PostOperation); //uncomment to invoke browser
       
   289 
       
   290 
       
   291 	qDebug()<<"Exit: LoadLoginPage()";
       
   292 	   
       
   293 	}
       
   294 void FBLoginDialog::LaunchBrowserL(const TDesC& aUrl)
       
   295 {
       
   296 	qDebug()<<"Enter: LaunchBrowserL()";
       
   297 	const TInt KWmlBrowserUid = 0x10008D39;
       
   298 	TUid id( TUid::Uid( KWmlBrowserUid ) );
       
   299 	TApaTaskList taskList( CEikonEnv::Static()->WsSession() );
       
   300 	TApaTask task = taskList.FindApp( id );
       
   301 	if ( task.Exists() )
       
   302 	{
       
   303 		qDebug()<<"Inside: if()";
       
   304 		HBufC8* param = HBufC8::NewLC( aUrl.Length() + 2);
       
   305                 //"4 " is to Start/Continue the browser specifying a URL
       
   306 		param->Des().Append(_L("4 "));
       
   307 		param->Des().Append(aUrl);
       
   308 		task.SendMessage( TUid::Uid( 0 ), *param ); // Uid is not used
       
   309 		CleanupStack::PopAndDestroy(param);
       
   310 	}
       
   311 	else
       
   312 	{
       
   313 		qDebug()<<"Inside: else()";
       
   314 		HBufC16* param = HBufC16::NewLC( aUrl.Length() + 2);
       
   315                 //"4 " is to Start/Continue the browser specifying a URL
       
   316 		param->Des().Append(_L("4 "));
       
   317 		param->Des().Append(aUrl);
       
   318 		RApaLsSession appArcSession;
       
   319                 // connect to AppArc server 
       
   320 		User::LeaveIfError(appArcSession.Connect()); 
       
   321 		TThreadId id;
       
   322 		appArcSession.StartDocument( *param, TUid::Uid( KWmlBrowserUid)
       
   323                                                                        , id );
       
   324 		appArcSession.Close(); 
       
   325 		CleanupStack::PopAndDestroy(param);
       
   326 	}
       
   327 }
       
   328 void FBLoginDialog::GetAccessToken()
       
   329 	{
       
   330 		/*qDebug()<<"Inside FBLoginDialog::GetAccessToken()";
       
   331 	    Dictionary getParams, postParams;
       
   332 	    iSession->stroauth_nonce = generateNONCE(43);
       
   333 		iSession->stroauth_timestamp = generateTimeStamp();//QString::number(generateTimeStamp());
       
   334 		qDebug()<<"iSession->stroauth_timestamp"<<iSession->stroauth_timestamp;
       
   335 	  
       
   336 	    postParams["oauth_consumer_key"] = kConsumerKey;
       
   337 	    postParams["oauth_signature_method"] = "HMAC-SHA1";
       
   338 	    postParams["oauth_timestamp"] = iSession->stroauth_timestamp;
       
   339 	    postParams["oauth_nonce"] = iSession->stroauth_nonce;
       
   340 	    postParams["oauth_version"] = "1.0";
       
   341 	
       
   342 	    iSession->stroauth_signature = iGetSessionRequest->generateSig(postParams);*/
       
   343 	}