Changing to new authentication mechanism ongoing
authorSami Rämö <sami.ramo@ixonos.com>
Mon, 27 Sep 2010 09:57:00 +0000 (12:57 +0300)
committerSami Rämö <sami.ramo@ixonos.com>
Mon, 27 Sep 2010 09:57:00 +0000 (12:57 +0300)
 - disabled old FB authentication mechanism

 - changed login url & changed from parsing the access token to
   parsing the whole session

 - Interface for sending requests to Situare server. Appends
   parameters and session information. Enqueues requests if
   session information is not available.

 - sorting SituareService.cpp

 - fetching locations is currently only one using the new interface

src/common.h
src/engine/engine.cpp
src/facebookservice/facebookauthentication.cpp
src/situareservice/situarecommon.h
src/situareservice/situareservice.cpp
src/situareservice/situareservice.h

index 8d74ac9..8733932 100644 (file)
@@ -47,6 +47,7 @@ const QColor COLOR_GRAY = QColor(152, 152, 152);                        ///< Gra
 const QFont NOKIA_FONT_NORMAL = QFont("Nokia Sans", 18, QFont::Normal); ///< Normal font
 const QFont NOKIA_FONT_SMALL = QFont("Nokia Sans", 13, QFont::Normal);  ///< Small font
 
+///< @todo remove / change old fb login url stuff
 // Facebook login page pieces
 const QString FACEBOOK_LOGINBASE = "http://www.facebook.com/login.php?";
 const QString API_KEY_PARAMETER_NAME = "api_key=";
index bb9a7a1..befe8d6 100644 (file)
@@ -127,7 +127,7 @@ SituareEngine::SituareEngine()
     m_mapEngine->init();
     m_ui->show();
 
-    m_facebookAuthenticator->start();
+//    m_facebookAuthenticator->start();
 
     m_gps->setMode(GPSPosition::Default);
     initializeGpsAndAutocentering();
@@ -377,7 +377,20 @@ void SituareEngine::login()
     connect(browser, SIGNAL(urlChanged(QUrl)),
             m_facebookAuthenticator, SLOT(urlChanged(QUrl)));
 
-    browser->load(QUrl("https://graph.facebook.com/oauth/authorize?client_id=4197c64da2fb6b927236feaea32d7d81&redirect_uri=http://www.facebook.com/connect/login_success.html&display=touch&type=user_agent"));
+//    browser->load(QUrl("https://graph.facebook.com/oauth/authorize?client_id=4197c64da2fb6b927236feaea32d7d81&redirect_uri=http://www.facebook.com/connect/login_success.html&display=touch&type=user_agent"));
+
+    QString url = "https://www.facebook.com/login.php?";
+    url.append("api_key=cf77865a5070f2c2ba3b52cbf3371579&"); ///< @todo hard coded test server api key
+    url.append("cancel_url=http://www.facebook.com/connect/login_failure.html&");
+    url.append("display=touch&");
+    url.append("fbconnect=1&");
+    url.append("next=http://www.facebook.com/connect/login_success.html&");
+    url.append("return_session=1&");
+    url.append("session_version=3&");
+    url.append("v=1.0&");
+    url.append("req_perms=publish_stream");
+
+    browser->load(QUrl(url));
 }
 
 void SituareEngine::loggedIn()
@@ -385,6 +398,8 @@ void SituareEngine::loggedIn()
     qWarning() << __PRETTY_FUNCTION__;
 
     m_ui->destroyFacebookLoginBrowser();
+
+    loginOk();
 }
 
 void SituareEngine::loginActionPressed()
@@ -633,6 +648,9 @@ void SituareEngine::signalsFromFacebookAuthenticator()
             m_ui, SLOT(loginUsingCookies()));
 
     connect(m_facebookAuthenticator, SIGNAL(loggedIn(QString)),
+            m_situareService, SLOT(updateAccessToken(QString)));
+
+    connect(m_facebookAuthenticator, SIGNAL(loggedIn(QString)),
             this, SLOT(loggedIn()));
 }
 
index 65a9023..3670712 100644 (file)
@@ -92,16 +92,29 @@ QString FacebookAuthentication::parseAccessToken(const QUrl &url)
 {
     qWarning() << __PRETTY_FUNCTION__;
 
-    const QString ACCESS_TOKEN_PARAMETER("#access_token=");
-    const QString EXPIRATION_PARAMETER("&expires_in=");
+//    const QString ACCESS_TOKEN_PARAMETER("#access_token=");
+//    const QString EXPIRATION_PARAMETER("&expires_in=");
+
+//    QString urlString = url.toString();
+
+//    int begin = urlString.indexOf(ACCESS_TOKEN_PARAMETER) + ACCESS_TOKEN_PARAMETER.length();
+//    int end = urlString.indexOf(EXPIRATION_PARAMETER);
+
+//    if ((begin > -1) && (end > begin))
+//        return urlString.mid(begin, end - begin);
+//    else
+//        return QString();
+
+    const QString BEGIN("session={");
+    const QString END("}");
 
     QString urlString = url.toString();
 
-    int begin = urlString.indexOf(ACCESS_TOKEN_PARAMETER) + ACCESS_TOKEN_PARAMETER.length();
-    int end = urlString.indexOf(EXPIRATION_PARAMETER);
+    int begin = urlString.indexOf(BEGIN);
+    int end = urlString.indexOf(END, begin);
 
-    if ((begin > -1) && (end > begin))
-        return urlString.mid(begin, end - begin);
+    if ((begin > -1) && (end > -1))
+        return urlString.mid(begin, end - begin +1);
     else
         return QString();
 }
index 0f7b4a2..1d627da 100644 (file)
@@ -41,8 +41,7 @@ const QString NORMAL_SIZE_PROFILE_IMAGE = "pic";
 // Situare PHP scripts
 const QString UPDATE_LOCATION = "updateLocation.php";
 const QString REVERSE_GEO = "reversegeo.php";
-const QString GET_LOCATIONS =
-        QString("getLocations.php?extra_user_data=%1").arg(NORMAL_SIZE_PROFILE_IMAGE);
+const QString GET_LOCATIONS = "getLocations.php";
 
 // Cookies
 const QString COOKIE = "Cookie";
index 12b56eb..624838c 100644 (file)
@@ -67,46 +67,92 @@ SituareService::~SituareService()
     m_friendsList.clear();
 }
 
-void SituareService::fetchLocations()
+void SituareService::addProfileImages(const QList<QUrl> &imageUrlList)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    QString cookie = formCookie(API_KEY, m_credentials.expires(), m_credentials.userID(),
-                                m_credentials.sessionKey(), m_credentials.sessionSecret(),
-                                m_credentials.sig(), EN_LOCALE);
+    foreach(QUrl url, imageUrlList) {
+        emit fetchImage(url);
+    }
+}
 
-    QUrl url = formUrl(SITUARE_URL, GET_LOCATIONS);
-    sendRequest(url, COOKIE, cookie);
+void SituareService::appendAccessToken(QString &requestUrl)
+{
+    qWarning() << __PRETTY_FUNCTION__;
+
+//    requestUrl.append("access_token=");
+    requestUrl.append(m_accessToken);
+
+//    qWarning() << __PRETTY_FUNCTION__ << "request url with parameters and access token:" << requestUrl;
 }
 
-void SituareService::reverseGeo(const GeoCoordinate &coordinates)
+void SituareService::buildRequest(const QString &script, const QHash<QString, QString> &parameters)
+{
+    qWarning() << __PRETTY_FUNCTION__;
+
+    QString url = SITUARE_URL;
+    url.append(script);
+    url.append("?");
+
+    // append parameters
+    if (!parameters.isEmpty()) {
+        QHash<QString, QString>::const_iterator i = parameters.constBegin();
+        while (i != parameters.constEnd()) {
+            url.append(i.key());
+            url.append("=");
+            url.append(i.value());
+            url.append("&");
+            i++;
+        }
+    }
+
+//    qWarning() << __PRETTY_FUNCTION__ << "request url with parameters:" << url;
+
+    if (!m_accessToken.isEmpty()) {
+        appendAccessToken(url);
+        sendRequest(url);
+    } else {
+        m_requestsWaitingAccessToken.append(url);
+        ///< @todo emit login request
+    }
+}
+
+void SituareService::clearUserData()
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    QString cookie = formCookie(API_KEY, m_credentials.expires(),m_credentials.userID(),
-                                m_credentials.sessionKey(), m_credentials.sessionSecret(),
-                                m_credentials.sig(), EN_LOCALE);
+    qDeleteAll(m_friendsList.begin(), m_friendsList.end());
+    m_friendsList.clear();
 
-    QString urlParameters = formUrlParameters(coordinates);
-    urlParameters.append(JSON_FORMAT);
-    QUrl url = formUrl(SITUARE_URL, REVERSE_GEO, urlParameters);
+    if(m_user) {
+        delete m_user;
+        m_user = 0;
+    }
+    emit userDataChanged(m_user, m_friendsList);
+}
 
-    sendRequest(url, COOKIE, cookie);
+void SituareService::credentialsReady(const FacebookCredentials &credentials)
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    m_credentials = credentials;
 }
 
-void SituareService::updateLocation(const GeoCoordinate &coordinates, const QString &status,
-                                    const bool &publish)
+void SituareService::fetchLocations()
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    QString urlParameters = formUrlParameters(coordinates, status, publish);
-    QUrl url = formUrl(SITUARE_URL, UPDATE_LOCATION, urlParameters);
+//    QString cookie = formCookie(API_KEY, m_credentials.expires(), m_credentials.userID(),
+//                                m_credentials.sessionKey(), m_credentials.sessionSecret(),
+//                                m_credentials.sig(), EN_LOCALE);
 
-    QString cookie = formCookie(API_KEY, m_credentials.expires(), m_credentials.userID(),
-                                m_credentials.sessionKey(), m_credentials.sessionSecret(),
-                                m_credentials.sig(), EN_LOCALE);
+//    QUrl url = formUrl(SITUARE_URL, GET_LOCATIONS);
+//    sendRequest(url, COOKIE, cookie);
 
-    sendRequest(url, COOKIE, cookie);
+    QHash<QString, QString> parameters;
+    parameters.insert("extra_user_data", NORMAL_SIZE_PROFILE_IMAGE);
+
+    buildRequest(GET_LOCATIONS, parameters);
 }
 
 QString SituareService::formCookie(const QString &apiKeyValue, QString expiresValue,
@@ -222,70 +268,36 @@ QString SituareService::formUrlParameters(const GeoCoordinate &coordinates, QStr
     return parameters;
 }
 
-void SituareService::sendRequest(const QUrl &url, const QString &cookieType, const QString &cookie)
-{
-    qDebug() << __PRETTY_FUNCTION__;
-
-    QNetworkRequest request;
-
-    request.setUrl(url);
-    request.setAttribute(QNetworkRequest::CacheSaveControlAttribute, false);
-    request.setRawHeader(cookieType.toAscii(), cookie.toUtf8());
-
-    QNetworkReply *reply = m_networkManager->get(request, true);
-
-    m_currentRequests.append(reply);
-}
-
-void SituareService::requestFinished(QNetworkReply *reply)
+void SituareService::imageReceived(const QUrl &url, const QPixmap &image)
 {
     qDebug() << __PRETTY_FUNCTION__;
+    qDebug() << "Image URL: " << url << " size :" << image.size();
 
-    //Reply from situare
-    if (m_currentRequests.contains(reply)) {
-
-        qDebug() << "BytesAvailable: " << reply->bytesAvailable();
-
-        if (reply->error()) {
-            emit error(ErrorContext::NETWORK, reply->error());
-        } else {
-            QByteArray replyArray = reply->readAll();
-            qDebug() << "Reply from: " << reply->url() << "reply " << replyArray;
-
-            if(replyArray == ERROR_LAT.toAscii()) {
-                qDebug() << "Error: " << ERROR_LAT;
-                emit error(ErrorContext::SITUARE, SituareError::UPDATE_FAILED);
-            } else if(replyArray == ERROR_LON.toAscii()) {
-                qDebug() << "Error: " << ERROR_LON;
-                emit error(ErrorContext::SITUARE, SituareError::UPDATE_FAILED);
-            } else if(replyArray.contains(ERROR_SESSION.toAscii())) {
-                qDebug() << "Error: " << ERROR_SESSION;
-                emit error(ErrorContext::SITUARE, SituareError::SESSION_EXPIRED);
-            } else if(replyArray.startsWith(OPENING_BRACE_MARK.toAscii())) {
-                qDebug() << "JSON string";
-                parseUserData(replyArray);
-            } else if(replyArray.isEmpty()) {
-                if(reply->url().toString().contains(UPDATE_LOCATION.toAscii())) {
-                    emit updateWasSuccessful();
-                } else {
-                    // session credentials are invalid
-                    emit error(ErrorContext::SITUARE, SituareError::SESSION_EXPIRED);
-                }
-            } else {
-                // unknown reply
-                emit error(ErrorContext::SITUARE, SituareError::ERROR_GENERAL);
+    // assign facebook silhouette image to all who doesn't have a profile image
+    if(url == QUrl(SILHOUETTE_URL)) {
+        if(m_user->profileImageUrl().isEmpty()) {
+            m_user->setProfileImage(AvatarImage::create(image, AvatarImage::Large));
+            emit imageReady(m_user);
+        }
+        foreach(User *friendItem, m_friendsList) {
+            if(friendItem->profileImageUrl().isEmpty()) {
+                friendItem->setProfileImage(AvatarImage::create(image, AvatarImage::Small));
+                emit imageReady(friendItem);
             }
         }
-        m_currentRequests.removeAll(reply);
-        reply->deleteLater();
     }
-}
 
-void SituareService::credentialsReady(const FacebookCredentials &credentials)
-{
-    qDebug() << __PRETTY_FUNCTION__;
+    if (m_user->profileImageUrl() == url) {
+        m_user->setProfileImage(AvatarImage::create(image, AvatarImage::Large));
+        emit imageReady(m_user);
+    }
 
-    m_credentials = credentials;
+    foreach(User *friendItem, m_friendsList) {
+        if(friendItem->profileImageUrl() == url) {
+            friendItem->setProfileImage(AvatarImage::create(image, AvatarImage::Small));
+            emit imageReady(friendItem);
+        }
+    }
 }
 
 void SituareService::parseUserData(const QByteArray &jsonReply)
@@ -448,57 +460,117 @@ void SituareService::parseUserData(const QByteArray &jsonReply)
     }
 }
 
-void SituareService::imageReceived(const QUrl &url, const QPixmap &image)
+void SituareService::requestFinished(QNetworkReply *reply)
 {
     qDebug() << __PRETTY_FUNCTION__;
-    qDebug() << "Image URL: " << url << " size :" << image.size();
 
-    // assign facebook silhouette image to all who doesn't have a profile image
-    if(url == QUrl(SILHOUETTE_URL)) {
-        if(m_user->profileImageUrl().isEmpty()) {
-            m_user->setProfileImage(AvatarImage::create(image, AvatarImage::Large));
-            emit imageReady(m_user);
-        }
-        foreach(User *friendItem, m_friendsList) {
-            if(friendItem->profileImageUrl().isEmpty()) {
-                friendItem->setProfileImage(AvatarImage::create(image, AvatarImage::Small));
-                emit imageReady(friendItem);
+    //Reply from situare
+    if (m_currentRequests.contains(reply)) {
+
+        qDebug() << "BytesAvailable: " << reply->bytesAvailable();
+
+        if (reply->error()) {
+            emit error(ErrorContext::NETWORK, reply->error());
+        } else {
+            QByteArray replyArray = reply->readAll();
+            qDebug() << "Reply from: " << reply->url() << "reply " << replyArray;
+
+            if(replyArray == ERROR_LAT.toAscii()) {
+                qDebug() << "Error: " << ERROR_LAT;
+                emit error(ErrorContext::SITUARE, SituareError::UPDATE_FAILED);
+            } else if(replyArray == ERROR_LON.toAscii()) {
+                qDebug() << "Error: " << ERROR_LON;
+                emit error(ErrorContext::SITUARE, SituareError::UPDATE_FAILED);
+            } else if(replyArray.contains(ERROR_SESSION.toAscii())) {
+                qDebug() << "Error: " << ERROR_SESSION;
+                emit error(ErrorContext::SITUARE, SituareError::SESSION_EXPIRED);
+            } else if(replyArray.startsWith(OPENING_BRACE_MARK.toAscii())) {
+                qDebug() << "JSON string";
+                parseUserData(replyArray);
+            } else if(replyArray.isEmpty()) {
+                if(reply->url().toString().contains(UPDATE_LOCATION.toAscii())) {
+                    emit updateWasSuccessful();
+                } else {
+                    // session credentials are invalid
+                    emit error(ErrorContext::SITUARE, SituareError::SESSION_EXPIRED);
+                }
+            } else {
+                // unknown reply
+                emit error(ErrorContext::SITUARE, SituareError::ERROR_GENERAL);
             }
         }
+        m_currentRequests.removeAll(reply);
+        reply->deleteLater();
     }
+}
 
-    if (m_user->profileImageUrl() == url) {
-        m_user->setProfileImage(AvatarImage::create(image, AvatarImage::Large));
-        emit imageReady(m_user);
-    }
+void SituareService::reverseGeo(const GeoCoordinate &coordinates)
+{
+    qDebug() << __PRETTY_FUNCTION__;
 
-    foreach(User *friendItem, m_friendsList) {
-        if(friendItem->profileImageUrl() == url) {
-            friendItem->setProfileImage(AvatarImage::create(image, AvatarImage::Small));
-            emit imageReady(friendItem);
-        }
-    }
+    QString cookie = formCookie(API_KEY, m_credentials.expires(),m_credentials.userID(),
+                                m_credentials.sessionKey(), m_credentials.sessionSecret(),
+                                m_credentials.sig(), EN_LOCALE);
+
+    QString urlParameters = formUrlParameters(coordinates);
+    urlParameters.append(JSON_FORMAT);
+    QUrl url = formUrl(SITUARE_URL, REVERSE_GEO, urlParameters);
+
+    sendRequest(url, COOKIE, cookie);
 }
 
-void SituareService::addProfileImages(const QList<QUrl> &imageUrlList)
+void SituareService::sendRequest(const QUrl &url, const QString &cookieType, const QString &cookie)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    foreach(QUrl url, imageUrlList) {
-        emit fetchImage(url);
+    QNetworkRequest request;
+
+    request.setUrl(url);
+    request.setAttribute(QNetworkRequest::CacheSaveControlAttribute, false);
+    request.setRawHeader(cookieType.toAscii(), cookie.toUtf8());
+
+    QNetworkReply *reply = m_networkManager->get(request, true);
+
+    m_currentRequests.append(reply);
+}
+
+void SituareService::sendRequest(const QString &requestUrl)
+{
+    qWarning() << __PRETTY_FUNCTION__ << requestUrl;
+
+    // make and send the request
+    QNetworkRequest request;
+    request.setUrl(QUrl(requestUrl));
+    request.setAttribute(QNetworkRequest::CacheSaveControlAttribute, false);
+    QNetworkReply *reply = m_networkManager->get(request, true);
+    m_currentRequests.append(reply);
+}
+
+void SituareService::updateAccessToken(const QString &accessToken)
+{
+    qWarning() << __PRETTY_FUNCTION__;
+
+    m_accessToken = accessToken;
+
+    foreach (QString request, m_requestsWaitingAccessToken) {
+        appendAccessToken(request);
+        sendRequest(request);
     }
+
+    m_requestsWaitingAccessToken.clear();
 }
 
-void SituareService::clearUserData()
+void SituareService::updateLocation(const GeoCoordinate &coordinates, const QString &status,
+                                    const bool &publish)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    qDeleteAll(m_friendsList.begin(), m_friendsList.end());
-    m_friendsList.clear();
+    QString urlParameters = formUrlParameters(coordinates, status, publish);
+    QUrl url = formUrl(SITUARE_URL, UPDATE_LOCATION, urlParameters);
 
-    if(m_user) {
-        delete m_user;
-        m_user = 0;
-    }
-    emit userDataChanged(m_user, m_friendsList);
+    QString cookie = formCookie(API_KEY, m_credentials.expires(), m_credentials.userID(),
+                                m_credentials.sessionKey(), m_credentials.sessionSecret(),
+                                m_credentials.sig(), EN_LOCALE);
+
+    sendRequest(url, COOKIE, cookie);
 }
index d34b357..d38bd4b 100644 (file)
@@ -107,6 +107,8 @@ public slots:
     */
     void requestFinished(QNetworkReply *reply);
 
+    void updateAccessToken(const QString &accessToken);
+
 private:
 
     /**
@@ -117,6 +119,8 @@ private:
     */
     void addProfileImages(const QList<QUrl> &imageUrlList);
 
+    void appendAccessToken(QString &requestUrl);
+
     /**
     * @brief Forms a http cookie
     *
@@ -171,6 +175,11 @@ private:
     */
     void sendRequest(const QUrl &url, const QString &cookieType, const QString &cookie);
 
+
+    void buildRequest(const QString &script, const QHash<QString,QString> &parameters);
+
+    void sendRequest(const QString &requestUrl);
+
 private slots:
 
     /**
@@ -239,8 +248,11 @@ private:
     bool m_defaultImage;    ///< Indicates if some of the friends/user doesn't have a image
 
     QList<QNetworkReply *> m_currentRequests;   ///< List of current http requests
+    QList<QString> m_requestsWaitingAccessToken;
     QList<User *> m_friendsList;                ///< List of friends(User)
 
+    QString m_accessToken;
+
     NetworkAccessManager *m_networkManager;    ///< Pointer to QNetworkAccessManager
 
     FacebookCredentials m_credentials;          ///< handle for FacebookCredentials