X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2Ffacebookservice%2Ffacebookauthentication.cpp;h=431c4121d3a12864d3f4eacfcfe156f3750c0705;hb=e176c7696df20f5206da23fa95ebcc1a0a24b0aa;hp=555393b82a81194e36dcd2ac2ee274c2abf1f660;hpb=eabdde89adb25ae7c4de0804f59c89647bd1b36a;p=situare diff --git a/src/facebookservice/facebookauthentication.cpp b/src/facebookservice/facebookauthentication.cpp index 555393b..431c412 100644 --- a/src/facebookservice/facebookauthentication.cpp +++ b/src/facebookservice/facebookauthentication.cpp @@ -4,6 +4,7 @@ Ville Tiensuu - ville.tiensuu@ixonos.com Kaj Wallin - kaj.wallin@ixonos.com + Henri Lampela - henri.lampela@ixonos.com Situare is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -20,254 +21,198 @@ USA. */ -#include +#include + #include #include -#include "facebookauthentication.h" +#include +#include +#include +#include +#include + +#ifdef Q_WS_MAEMO_5 +#include +#endif // Q_WS_MAEMO_5 + +#include "common.h" +#include "../error.h" +#include "network/networkcookiejar.h" +#include "situareservice/situarecommon.h" +#include "ui/mainwindow.h" -FacebookAuthentication::FacebookAuthentication(QWidget *parent) - : QMainWindow(parent) -{ - qDebug() << __PRETTY_FUNCTION__; +#include "facebookauthentication.h" - m_webView = new QWebView; - m_mainlayout = new QHBoxLayout; - - // ToDo: use common.h etc. - QString facebookLoginBase = "http://www.facebook.com/login.php?"; - QString situarePublicFacebookApiKey = "api_key=4197c64da2fb6b927236feaea32d7d81"; - //QString situareDeveloperFacebookApiKey = "api_key=cf77865a5070f2c2ba3b52cbf3371579"; - QString interval1 = "&connect_display=popup&v=1.0&next="; - QString situareLoginSuccess = "http://www.facebook.com/connect/login_success.html"; - QString interval2 = "&cancel_url="; - QString situareLoginFailure = "http://www.facebook.com/connect/login_failure.html"; - QString facebookLoginEnding = "&fbconnect=true&return_session=true&"; - - m_facebookLoginPage.append(facebookLoginBase); - m_facebookLoginPage.append(situarePublicFacebookApiKey); - m_facebookLoginPage.append(interval1); - m_facebookLoginPage.append(situareLoginSuccess); - m_facebookLoginPage.append(interval2); - m_facebookLoginPage.append(situareLoginFailure); - m_facebookLoginPage.append(facebookLoginEnding); - - connect(m_webView, SIGNAL(urlChanged(const QUrl &)), this, SLOT(updateCredentials(const QUrl &))); - - readCredentials(m_loginCredentials); - - if (!verifyCredentials(m_loginCredentials)) - start(); - else - emit credentialsReady(); +const QString FB_LOGIN_SUCCESS_URL = "http://www.facebook.com/connect/login_success.html"; +const QString FB_LOGIN_URL = "https://www.facebook.com/login.php"; -} - -FacebookAuthentication::~FacebookAuthentication() +FacebookAuthentication::FacebookAuthentication(MainWindow *mainWindow, QObject *parent) + : QObject(parent), + m_loggedIn(false), + m_browser(0), + m_mainWindow(mainWindow) { qDebug() << __PRETTY_FUNCTION__; - delete m_webView; - delete m_mainlayout; } -void FacebookAuthentication::start() +void FacebookAuthentication::browserDestroyed() { - qDebug() << __PRETTY_FUNCTION__; - - const double fontSize = 1.2; // ToDo: use common.h etc. + qWarning() << __PRETTY_FUNCTION__; - m_webView->setZoomFactor(fontSize); - m_webView->load(m_facebookLoginPage); - setCentralWidget(m_webView); + m_mainWindow->toggleProgressIndicator(false); + m_browser = 0; } +void FacebookAuthentication::clearAccountInformation(bool clearUserInformation) +{ + qWarning() << __PRETTY_FUNCTION__ << "clearUserInformation:" << clearUserInformation; -bool FacebookAuthentication::updateCredentials(const QUrl &url) -{ - qDebug() << __PRETTY_FUNCTION__; - - bool foundSessionKey = FALSE; - bool foundUserID = FALSE; - bool foundExpires = FALSE; - bool foundSessionSecret = FALSE; - bool foundSig = FALSE; - - if (url.isValid()){ - qDebug() << "url is valid" << endl; - - QString callbackUrl = url.toString(); - QString urlEdit(callbackUrl); - qDebug() << "callbackUrl: " << endl << callbackUrl.toAscii() << endl; - - if ( callbackUrl.indexOf("http://www.facebook.com/connect/login_success.html") == 0 ){ - qDebug() << "login success" << endl; - - // let's find out session key - int indexOfCredential = callbackUrl.indexOf("session_key"); + QSettings settings(SETTINGS_ORGANIZATION_NAME, SETTINGS_APPLICATION_NAME); - if (indexOfCredential != -1){ - foundSessionKey = TRUE; + settings.remove(USER_UNSEND_MESSAGE); + settings.remove(USER_UNSEND_MESSAGE_PUBLISH); - indexOfCredential += 14; //lenght of string "session_key"% - urlEdit.remove(0,indexOfCredential); - indexOfCredential = urlEdit.indexOf("uid"); - urlEdit.remove(indexOfCredential, urlEdit.length()); - urlEdit.remove("\",\""); + if (clearUserInformation) { + NetworkCookieJar::clearCookiesSetting(); + settings.remove(SETTINGS_AUTOMATIC_UPDATE_ENABLED); + settings.remove(SETTINGS_AUTOMATIC_UPDATE_INTERVAL); + } +} - qDebug() << "session_key" << endl << urlEdit.toAscii() << endl; - m_loginCredentials.setSessionKey(urlEdit); - } +void FacebookAuthentication::destroyLogin() +{ + qWarning() << __PRETTY_FUNCTION__; - // let's find out uid - urlEdit = callbackUrl; - indexOfCredential = callbackUrl.indexOf("uid"); + m_mainWindow->destroyLoginDialog(); + m_browser->deleteLater(); +} - if (indexOfCredential != -1){ - foundUserID = TRUE; +bool FacebookAuthentication::isLoggedIn() const +{ + qWarning() << __PRETTY_FUNCTION__; - indexOfCredential += 5; //length of string "uid": - urlEdit.remove(0,indexOfCredential); - indexOfCredential = urlEdit.indexOf("expires"); - urlEdit.remove(indexOfCredential, urlEdit.length()); - urlEdit.remove(",\""); + return m_loggedIn; +} - qDebug() << "userID" << endl << urlEdit.toAscii() << endl; - m_loginCredentials.setUserID(urlEdit); - } +void FacebookAuthentication::login() +{ + qWarning() << __PRETTY_FUNCTION__; - // let's find out expires - urlEdit = callbackUrl; - indexOfCredential = callbackUrl.indexOf("expires"); + if (!m_browser) { + m_browser = new QWebView(m_mainWindow); - if (indexOfCredential != -1){ - foundExpires = TRUE; + if (m_browser) { + m_browser->page()->networkAccessManager()->setCookieJar(new NetworkCookieJar()); - indexOfCredential += 9; //length of string "expires" - urlEdit.remove(0,indexOfCredential); - indexOfCredential = urlEdit.indexOf("secret"); - urlEdit.remove(indexOfCredential, urlEdit.length()); - urlEdit.remove(",\""); + connect(m_browser, SIGNAL(urlChanged(QUrl)), + this, SLOT(urlChanged(QUrl))); - qDebug() << "expires" << endl << urlEdit.toAscii() << endl; - m_loginCredentials.setExpires(urlEdit); - } + connect(m_browser, SIGNAL(destroyed(QObject*)), + this, SLOT(browserDestroyed())); - // let's find out sessionsecret - urlEdit = callbackUrl; - indexOfCredential = callbackUrl.indexOf("secret"); + connect(m_browser->page()->networkAccessManager(), + SIGNAL(sslErrors(QNetworkReply*, QList)), + this, SLOT(sslErrors(QNetworkReply*, QList))); - if (indexOfCredential != -1){ - foundSessionSecret = TRUE; + connect(m_browser->page()->networkAccessManager(), SIGNAL(finished(QNetworkReply*)), + this, SLOT(networkReplyHandler(QNetworkReply*))); + } + } - indexOfCredential += 9; //" length of "secret": - urlEdit.remove(0,indexOfCredential); - indexOfCredential = urlEdit.indexOf("sig"); - urlEdit.remove(indexOfCredential, urlEdit.length()); - urlEdit.remove("\",\""); + if (m_browser) { + QString url = FB_LOGIN_URL + "?"; + url.append("api_key=" + API_KEY +"&"); + url.append("display=touch&"); + url.append("fbconnect=1&"); + url.append("next=" + FB_LOGIN_SUCCESS_URL + "&"); + url.append("return_session=1&"); + url.append("session_version=3&"); + url.append("v=1.0&"); + url.append("req_perms=publish_stream"); - qDebug() << "sessionSecret" << endl << urlEdit.toAscii() << endl; - m_loginCredentials.setSessionSecret(urlEdit); - } + m_browser->load(QUrl(url)); - // let's find out sig - urlEdit = callbackUrl; - indexOfCredential = callbackUrl.indexOf("sig"); + m_mainWindow->toggleProgressIndicator(true); + } +} - if (indexOfCredential != -1){ - foundSig = TRUE; +void FacebookAuthentication::logOut(bool clearUserInformation) +{ + qWarning() << __PRETTY_FUNCTION__; - indexOfCredential += 6; //" length of "sig": - urlEdit.remove(0,indexOfCredential); - urlEdit.remove("\"}"); + clearAccountInformation(clearUserInformation); + m_loggedIn = false; + emit loggedOut(); +} - qDebug() << "sig" << endl << urlEdit.toAscii() << endl; - m_loginCredentials.setSig(urlEdit); - } +void FacebookAuthentication::networkReplyHandler(QNetworkReply *reply) +{ + qWarning() <<__PRETTY_FUNCTION__; - m_webView->hide(); - emit credentialsReady(); - writeCredentials(m_loginCredentials); - } + if ((reply->error() != QNetworkReply::NoError) + && (reply->error() != QNetworkReply::OperationCanceledError)) { - else if ( callbackUrl.indexOf("https://login.facebook.com/login.php?login_attempt=") == 0){ - qWarning() << "login failure" << endl; - emit loginFailure(); - } + qCritical() << __PRETTY_FUNCTION__ << "error:" << reply->error() << reply->errorString(); + emit error(ErrorContext::NETWORK, reply->error()); + destroyLogin(); + } +} - else if ( callbackUrl.indexOf("http://www.facebook.com/login.php?api_key=") == 0){ - qDebug() << "correct loginPage"; - } +QString FacebookAuthentication::parseSession(const QUrl &url) +{ + qWarning() << __PRETTY_FUNCTION__; - else { - qDebug() << "totally wrong webPage"; - emit loginFailure(); - start(); - } - } + const QString BEGIN("session={"); + const QString END("}"); - else { - qDebug() << " Loading of page failed invalid URL" << endl; - emit loginFailure(); - return FALSE; - } + QString urlString = url.toString(); + int begin = urlString.indexOf(BEGIN); + int end = urlString.indexOf(END, begin); - return (foundSessionKey && foundUserID && foundExpires && foundSessionSecret && foundSig); + if ((begin > -1) && (end > -1)) + return urlString.mid(begin, end - begin + 1); + else + return QString(); } -void FacebookAuthentication::writeCredentials(const FacebookCredentials &credentials) +void FacebookAuthentication::sslErrors(QNetworkReply *reply, const QList &errors) { - qDebug() << __PRETTY_FUNCTION__; - QSettings settings("Ixonos", "Situare"); + qWarning() << __PRETTY_FUNCTION__; - settings.setValue("Session Key", credentials.sessionKey()); - settings.setValue("User ID", credentials.userID()); - settings.setValue("Expires", credentials.expires()); - settings.setValue("Session Secret", credentials.sessionSecret()); - settings.setValue("Sig", credentials.sig()); + Q_UNUSED(errors); + reply->ignoreSslErrors(); } -void FacebookAuthentication::readCredentials(FacebookCredentials &credentialsFromFile) +void FacebookAuthentication::urlChanged(const QUrl &url) { - qDebug() << __PRETTY_FUNCTION__; - - QSettings settings("Ixonos", "Situare"); - - credentialsFromFile.setSessionKey(settings.value("Session Key", "Error").toString()); - credentialsFromFile.setUserID(settings.value("User ID", "Error").toString()); - credentialsFromFile.setExpires(settings.value("Expires", "Error").toString()); - credentialsFromFile.setSessionSecret(settings.value("Session Secret", "Error").toString()); - credentialsFromFile.setSig(settings.value("Sig", "Error").toString()); + qWarning() << __PRETTY_FUNCTION__ << url.toString(); + + /* + Redirects: + * Login with cookie failed: + 1) http://m.facebook.com/login.php?api_key=cf77865a5070f2c2ba3b52cbf3371579&cancel_url=http://www.facebook.com/connect/login_failure.html&display=touch&fbconnect=1&next=http://www.facebook.com/connect/uiserver.php?app_id=286811277465&next=http%3A%2F%2Fwww.facebook.com%2Fconnect%2Flogin_success.html&display=touch&cancel_url=http%3A%2F%2Fwww.facebook.com%2Fconnect%2Flogin_failure.html&perms=publish_stream&return_session=1&session_version=3&fbconnect=1&canvas=0&legacy_return=1&method=permissions.request&return_session=1&session_version=3&v=1.0&req_perms=publish_stream&app_id=286811277465&refsrc=http://www.facebook.com/login.php&fbb=ra985c5e9 + + * Login with cookie succeeded: + 1) http://www.facebook.com/connect/uiserver.php?app_id=286811277465&next=http://www.facebook.com/connect/login_success.html&display=touch&cancel_url=http://www.facebook.com/connect/login_failure.html&perms=publish_stream&return_session=1&session_version=3&fbconnect=1&canvas=0&legacy_return=1&method=permissions.request&session={"session_key":"2.iHXi5fLKlHktva2R71xSAw__.3600.1289228400-100001006647973","uid":100001006647973,"expires":1289228400,"secret":"q4_Hn5qRdxnVT_qh3ztv5w__","sig":"c9d29ca857bacec48b952e7d2826a3ca"}&fbb=rb28f24e5 + 2) http://www.facebook.com/connect/login_success.html?perms=publish_stream&selected_profiles=100001006647973&session={"session_key":"2.iHXi5fLKlHktva2R71xSAw__.3600.1289228400-100001006647973","uid":"100001006647973","expires":1289228400,"secret":"q4_Hn5qRdxnVT_qh3ztv5w__","access_token":"286811277465|2.iHXi5fLKlHktva2R71xSAw__.3600.1289228400-100001006647973|LVTHGW82A98SGvv6Fl43DlCrFT0","sig":"8edd8d611047bcd162abbe9983b25a56"} + */ + + if (!url.toString().contains("session={")) { + // url parameter doesn't contain session data, so login with cookies failed + qWarning() << __PRETTY_FUNCTION__ << "working credentials required"; + m_mainWindow->buildLoginDialog(m_browser); + } else if (url.toString().startsWith(FB_LOGIN_SUCCESS_URL)) { + // login succeeded + const QString session = parseSession(url); + qWarning() << __PRETTY_FUNCTION__ << "login finished, parsed session:" << session; + if (!session.isEmpty()) { + destroyLogin(); + m_loggedIn = true; + emit loggedIn(session); + } + } + else { + qWarning() << __PRETTY_FUNCTION__ << "credentials accepted, getting the access_token"; + } } - - FacebookCredentials FacebookAuthentication::loginCredentials() const - { - qDebug() << __PRETTY_FUNCTION__; - return m_loginCredentials; - } - - bool FacebookAuthentication::verifyCredentials(const FacebookCredentials &credentials) const - { - qDebug() << __PRETTY_FUNCTION__; - QString expires = credentials.expires(); - QDateTime expireTime; - expireTime.setTime_t(expires.toInt()); - QString expiresString = expireTime.toString("dd.MM.yyyy hh:mm:ss"); - qDebug() << expiresString.toAscii(); - - QDateTime currentTime; - currentTime = QDateTime::currentDateTime(); - QString currentTimeString = currentTime.toString("dd.MM.yyyy hh:mm:ss"); - qDebug() << currentTimeString.toAscii(); - - return currentTime < expireTime; - } - - void FacebookAuthentication::closeEvent(QCloseEvent *event) - { - qDebug() << __PRETTY_FUNCTION__; - int eventNumber = 0; - eventNumber = event->registerEventType(); - qDebug() << "event number" << eventNumber; - emit userExit(); - event->accept(); - }