example/TwitterAuthApp/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, 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 ///////////////////////////////////////////////////////////////////////////////////////////////////
       
    27 // global
       
    28 
       
    29 //static const QString kLoginURL = "http://www.facebook.com/login.php";
       
    30 
       
    31 ///////////////////////////////////////////////////////////////////////////////////////////////////
       
    32 void FBLoginDialog::connectToGetSession(const QString& aToken)
       
    33 {
       
    34 	qDebug()<<"Inside FBLoginDialog::connectToGetSession()";
       
    35     iGetSessionRequest = FBRequest::requestWithSession(iSession);
       
    36     
       
    37     //connect(iGetSessionRequest, SIGNAL(LoadLoginPage()), this, SLOT(LoadLoginPage()));
       
    38     connect(iGetSessionRequest, SIGNAL(requestDidLoad(QVariant)), this, SLOT(requestDidLoad(QVariant)));
       
    39     connect(iGetSessionRequest, SIGNAL(requestFailedWithNetworkError(QNetworkReply::NetworkError)), this, SLOT(requestFailedWithNetworkError(QNetworkReply::NetworkError)));
       
    40     connect(iGetSessionRequest, SIGNAL(requestFailedWithFacebookError(FBError)), this, SLOT(requestFailedWithFacebookError(FBError)));
       
    41 
       
    42     Dictionary params;
       
    43     params["auth_token"] = aToken;
       
    44 
       
    45     if (iSession->apiSecret().length())
       
    46     {
       
    47         params["generate_session_secret"]="1";
       
    48     }
       
    49 
       
    50     if (iSession->getSessionProxy().length())
       
    51     {
       
    52         iGetSessionRequest->post(iSession->getSessionProxy(),params);
       
    53     }
       
    54     else
       
    55     {
       
    56         iGetSessionRequest->call("facebook.auth.getSession", params);
       
    57     }
       
    58 }
       
    59 void FBLoginDialog::connectToGetToken()
       
    60 	{
       
    61 		qDebug()<<"Inside FBLoginDialog::connectToGetToken()";
       
    62 	    iGetSessionRequest = FBRequest::requestWithSession(iSession);
       
    63 
       
    64 	   // connect(iGetSessionRequest, SIGNAL(requestDidLoad(QVariant)), this, SLOT(requestDidLoad(QVariant)));
       
    65 	 //   connect(iGetSessionRequest, SIGNAL(requestFailedWithNetworkError(QNetworkReply::NetworkError)), this, SLOT(requestFailedWithNetworkError(QNetworkReply::NetworkError)));
       
    66 	  //  connect(iGetSessionRequest, SIGNAL(requestFailedWithFacebookError(FBError)), this, SLOT(requestFailedWithFacebookError(FBError)));
       
    67 
       
    68 	    Dictionary postParams;
       
    69 		iSession->stroauth_nonce = generateNONCE(43);
       
    70 		iSession->stroauth_timestamp = generateTimeStamp();//QString::number(generateTimeStamp());
       
    71 		qDebug()<<"iSession->stroauth_timestamp"<<iSession->stroauth_timestamp;
       
    72 		//postParams["oauth_callback"] = kBase;
       
    73 		postParams["oauth_consumer_key"] = kConsumerKey;
       
    74 		postParams["oauth_signature_method"] = "HMAC-SHA1";
       
    75 		postParams["oauth_timestamp"] = iSession->stroauth_timestamp;
       
    76 		postParams["oauth_nonce"] = iSession->stroauth_nonce;
       
    77 		postParams["oauth_version"] = "1.0";
       
    78 		FBRequest* req = FBRequest::requestWithSession(iSession);
       
    79 		iSession->stroauth_signature = req->generateSig(postParams);
       
    80 	    iGetSessionRequest->call("/uas/oauth/accessToken", postParams);
       
    81 	    
       
    82 	}
       
    83 void FBLoginDialog::loadLoginPage()
       
    84 {
       
    85     iGetSessionRequest = FBRequest::requestWithSession(iSession);
       
    86 	qDebug()<<"Inside FBLoginDialog::loadLoginPage()";
       
    87     Dictionary getParams, postParams;
       
    88     iSession->stroauth_nonce = generateNONCE(43);
       
    89 	iSession->stroauth_timestamp = generateTimeStamp();//QString::number(generateTimeStamp());
       
    90 	qDebug()<<"iSession->stroauth_timestamp"<<iSession->stroauth_timestamp;
       
    91 
       
    92     postParams["oauth_consumer_key"] = kConsumerKey;
       
    93     postParams["oauth_signature_method"] = "HMAC-SHA1";
       
    94     postParams["oauth_timestamp"] = iSession->stroauth_timestamp;
       
    95     postParams["oauth_nonce"] = iSession->stroauth_nonce;
       
    96     postParams["oauth_version"] = "1.0";
       
    97     iSession->stroauth_signature = iGetSessionRequest->generateSig(postParams);
       
    98     
       
    99     connect(iGetSessionRequest, SIGNAL(LoadLoginPage()), this, SLOT(LoadLoginPage()));
       
   100     
       
   101     iGetSessionRequest->connect();
       
   102 }
       
   103 
       
   104 QByteArray FBLoginDialog::generateTimeStamp()
       
   105 	{
       
   106 		uint time = QDateTime::currentDateTime().toTime_t();
       
   107 	    QByteArray timestamp = QByteArray::number( time );
       
   108 	    return timestamp;
       
   109 	}
       
   110 QString FBLoginDialog::generateNONCE(const qint64 Length)
       
   111 	{
       
   112 	srand(time(0));
       
   113 	
       
   114 	//read upto milliseconds
       
   115 	QString RetString;
       
   116 
       
   117 	QString Letters(
       
   118 			"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
       
   119 
       
   120 	//append a randomly generated string to RetString
       
   121 	for (int i = 0; i < Length; i++)
       
   122 		{
       
   123 		RetString.insert((i), Letters.at(rand() % Letters.size()));
       
   124 		}
       
   125 
       
   126 	return RetString;
       
   127 	}
       
   128 ///////////////////////////////////////////////////////////////////////////////////////////////////
       
   129 
       
   130 FBLoginDialog::FBLoginDialog() : FBDialog () {}
       
   131 
       
   132 FBLoginDialog::FBLoginDialog(FBSession* aSession) : FBDialog(aSession) {}
       
   133 
       
   134 ///////////////////////////////////////////////////////////////////////////////////////////////////
       
   135 // FBDialog
       
   136 
       
   137 void FBLoginDialog::load()
       
   138 {
       
   139 	qDebug()<<"Inside FBLoginDialog::load()";
       
   140     loadLoginPage();
       
   141 }
       
   142 
       
   143 void FBLoginDialog::dialogWillDisappear()
       
   144 {
       
   145 	qDebug()<<"Inside FBLoginDialog::dialogWillDisappear()";
       
   146   iGetSessionRequest->cancel();
       
   147 
       
   148   if (!iSession->isConnected())
       
   149   {
       
   150       iSession->cancelLogin();
       
   151   }
       
   152 }
       
   153 
       
   154 void FBLoginDialog::GetSessionKey(const QUrl& aUrl)
       
   155 {
       
   156 	qDebug()<<"Inside FBLoginDialog::GetSessionKey()";
       
   157     const QString authToken = "auth_token=";
       
   158     const QString url ( aUrl.toString() );
       
   159 
       
   160     int start = url.indexOf(authToken);
       
   161     if (start != -1)
       
   162     {
       
   163         QString token;
       
   164         int end = url.indexOf("&", start);
       
   165         int delta = start + authToken.size() + 1;
       
   166         if (end != -1)
       
   167         {
       
   168             token = url.mid(delta, end - delta );
       
   169         }
       
   170         else
       
   171         {
       
   172             token = url.right(url.size() - delta + 1);
       
   173         }
       
   174 
       
   175         connectToGetSession(token);
       
   176     }
       
   177 }
       
   178 void FBLoginDialog::FetchKeyFromUrl(const QUrl& aUrl)
       
   179 {
       
   180     const QString url ( aUrl.toString() );
       
   181     QStringList varList = url.split("{");
       
   182     QString newvar = varList[1];
       
   183     varList.clear();
       
   184     varList = newvar.split(",");
       
   185     QString session_key = varList[0];
       
   186     QString uid = varList[1];
       
   187     QString expires = varList[2];
       
   188     QString secret = varList[3];
       
   189     varList.clear();
       
   190     varList = session_key.split(":");
       
   191     session_key = varList[1];
       
   192     session_key = session_key.mid(1,session_key.length()-2);
       
   193     varList.clear();
       
   194     varList = uid.split(":");
       
   195     uid = varList[1];
       
   196 	varList.clear();
       
   197 	varList = expires.split(":");
       
   198 	expires = varList[1];
       
   199 	varList.clear();
       
   200 	varList = secret.split(":");
       
   201 	secret = varList[1];
       
   202 	secret = secret.mid(1,secret.length()-2);
       
   203 	varList.clear();
       
   204     qDebug()<<"session_key"<<session_key<<"\n";
       
   205     qDebug()<<"uid"<<uid<<"\n";
       
   206     qDebug()<<"expires"<<expires<<"\n";
       
   207     qDebug()<<"secret"<<secret<<"\n";
       
   208     uint expiry = expires.toUInt();//.toUInt(&conversionError);
       
   209     QDateTime expiration; expiration.setTime_t( expiry );
       
   210     iSession->beginSession(session_key, secret,expiration);
       
   211     iSession->resume();
       
   212 }
       
   213 ///////////////////////////////////////////////////////////////////////////////////////////////////
       
   214 // slots for signals from FBRequest
       
   215 
       
   216 void FBLoginDialog::requestDidLoad(const QVariant& aResult)
       
   217 {
       
   218 	qDebug()<<"Inside FBLoginDialog::requestDidLoad";
       
   219     bool conversionError = false;
       
   220     QVariantHash object = aResult.toHash();
       
   221     QString sessionKey = object.value("session_key").toString();
       
   222     QString sessionSecret = object.value("secret").toString();
       
   223 
       
   224     QVariant ex = object.value("expires");
       
   225     uint expires = object.value("expires").toUInt(&conversionError);
       
   226     QDateTime expiration; expiration.setTime_t( expires );
       
   227 
       
   228     iSession->beginSession(sessionKey, sessionSecret,expiration);
       
   229     iSession->resume();
       
   230 
       
   231     dismissWithSuccess(true, true);
       
   232 }
       
   233 
       
   234 void FBLoginDialog::requestFailedWithFacebookError (const FBError& aCode )
       
   235 {
       
   236 	qDebug()<<"Inside FBLoginDialog::requestFailedWithFacebookError()";
       
   237     dismissWithError(aCode, true);
       
   238 }
       
   239 
       
   240 void FBLoginDialog::requestFailedWithNetworkError( QNetworkReply::NetworkError aCode )
       
   241 {
       
   242 	qDebug()<<"Inside FBLoginDialog::requestFailedWithNetworkError()";
       
   243     dismissWithError(aCode, true);
       
   244 }
       
   245 void FBLoginDialog::LoadLoginPage()
       
   246 	{
       
   247 	
       
   248 	qDebug()<<"Enter: LoadLoginPage()";
       
   249 	QString LoginUrl = kAuthorizeUrl + "?oauth_token=";
       
   250 	LoginUrl += iSession->stroauth_Token;
       
   251 	
       
   252 /*	QNetworkCookieJar* cookieJar = iWebView->page()->networkAccessManager()->cookieJar();
       
   253 	iWebView->page()->networkAccessManager()->setCookieJar(cookieJar);
       
   254 	QNetworkCookie testCookie;// "test_cookie", "1");
       
   255 	
       
   256 	testCookie.setDomain ( "twitter.com" );
       
   257 	QDateTime dt = QDateTime::currentDateTime();
       
   258 	dt.addDays(1);
       
   259 	testCookie.setExpirationDate(dt);
       
   260 	testCookie.setHttpOnly(false);
       
   261 	testCookie.setName("twittercookie");
       
   262 	testCookie.setValue("1");
       
   263 	testCookie.setPath ( "/" );
       
   264 	testCookie.setSecure ( true);
       
   265 	QList<QNetworkCookie> cookieList;
       
   266 	cookieList.append(testCookie);
       
   267 	cookieJar->setCookiesFromUrl ( cookieList, QUrl("https://www.twitter.com/") );
       
   268 	QWebSettings::globalSettings()->setOfflineStoragePath("C:\\Data");*/
       
   269 	
       
   270 	iWebView->load(LoginUrl);
       
   271 	qDebug()<<"Exit: LoadLoginPage()";
       
   272 	   
       
   273 	}
       
   274 void FBLoginDialog::GetAccessToken()
       
   275 	{
       
   276 		qDebug()<<"Inside FBLoginDialog::GetAccessToken()";
       
   277 	    Dictionary postParams;
       
   278 	    iSession->stroauth_nonce = generateNONCE(43);
       
   279 		iSession->stroauth_timestamp = generateTimeStamp();
       
   280 		
       
   281 	    postParams["oauth_consumer_key"] = kConsumerKey;
       
   282 	    postParams["oauth_nonce"] = iSession->stroauth_nonce;
       
   283 	    postParams["oauth_signature_method"] = "HMAC-SHA1";
       
   284 	    postParams["oauth_token"] = iSession->stroauth_Token;
       
   285 	    postParams["oauth_timestamp"] = iSession->stroauth_timestamp;
       
   286 	    postParams["oauth_verifier"] = iSession->stroauth_verifier;
       
   287 	    postParams["oauth_version"] = "1.0";
       
   288 	    
       
   289 	    iSession->stroauth_signature = iGetSessionRequest->generateSig(postParams);
       
   290 		
       
   291 	    iGetSessionRequest->connect_req("/access_token");
       
   292 	}