[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    extragear/graphics/kipi-plugins/fbexport
From:       Luka Renko <lure () kubuntu ! org>
Date:       2008-12-30 17:30:28
Message-ID: 1230658228.055574.13868.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 903499 by lure:

Save Facebook session key in config file for next session: 
- if session is still valid, it will be reused for next export job 
  (no need to go to browser)
- if expired or does not work, it will go through regular login

Fix storing of current album (setting is kept between runs).


 M  +112 -3    fbtalker.cpp  
 M  +13 -5     fbtalker.h  
 M  +15 -7     fbwindow.cpp  
 M  +2 -0      fbwindow.h  


--- trunk/extragear/graphics/kipi-plugins/fbexport/fbtalker.cpp #903498:903499
@@ -61,8 +61,7 @@
 
 FbTalker::~FbTalker()
 {
-    if (loggedIn())
-        logout();
+    // do not logout - may reuse session for next upload
 
     if (m_job)
         m_job->kill();
@@ -73,6 +72,16 @@
     return !m_sessionKey.isEmpty();
 }
 
+QString FbTalker::getSessionKey() const
+{
+    return m_sessionKey;
+}
+
+unsigned int FbTalker::getSessionExpires() const
+{
+    return m_sessionExpires;
+}
+
 QString FbTalker::getDisplayName() const
 {
     return m_userName;
@@ -134,8 +143,30 @@
     return concat;
 }
 
+void FbTalker::authenticate(const QString &sessionKey, unsigned int sessionExpires)
+{
+    if (!sessionKey.isEmpty() && sessionExpires > time(0) + 900)
+    {
+        // sessionKey seems to be still valid for at least 15 minutes
+        // - check if it still works
+        m_sessionKey     = sessionKey;
+        m_sessionExpires = sessionExpires;
 
-void FbTalker::authenticate()
+        m_authProgressDlg->setLabelText(i18n("Validate previous session..."));
+        m_authProgressDlg->setMaximum(6);
+        m_authProgressDlg->setValue(1);
+
+        // get logged in user - this will check if session is still valid
+        getLoggedInUser();
+    }
+    else
+    {
+        // session expired -> get new authorization token and session
+        createToken();
+    }
+}
+
+void FbTalker::createToken()
 {
     if (m_job)
     {
@@ -205,6 +236,41 @@
     m_buffer.resize(0);
 }
 
+void FbTalker::getLoggedInUser()
+{
+    if (m_job)
+    {
+        m_job->kill();
+        m_job = 0;
+    }
+    emit signalBusy(true);
+    m_authProgressDlg->setValue(2);
+
+    QMap<QString, QString> args;
+    args["method"]      = "facebook.users.getLoggedInUser";
+    args["api_key"]     = m_apiKey;
+    args["v"]           = m_apiVersion;
+    args["call_id"]     = QString::number(m_callID.elapsed());
+    args["session_key"] = m_sessionKey;
+    args["sig"]         = getApiSig(args);
+
+    QByteArray tmp(getCallString(args).toUtf8());
+    KIO::TransferJob* job = KIO::http_post(m_apiURL, tmp, KIO::HideProgressInfo);
+    job->addMetaData("UserAgent", m_userAgent);
+    job->addMetaData("content-type",
+                     "Content-Type: application/x-www-form-urlencoded");
+
+    connect(job, SIGNAL(data(KIO::Job*, const QByteArray&)),
+            this, SLOT(data(KIO::Job*, const QByteArray&)));
+
+    connect(job, SIGNAL(result(KJob*)),
+            this, SLOT(slotResult(KJob*)));
+
+    m_state = FB_GETLOGGEDINUSER;
+    m_job   = job;
+    m_buffer.resize(0);
+}
+
 void FbTalker::getUserInfo()
 {
     if (m_job)
@@ -485,6 +551,9 @@
         case(FB_GETSESSION):
             parseResponseGetSession(m_buffer);
             break;
+        case(FB_GETLOGGEDINUSER):
+            parseResponseGetLoggedInUser(m_buffer);
+            break;
         case(FB_GETUSERINFO):
             parseResponseGetUserInfo(m_buffer);
             break;
@@ -636,6 +705,46 @@
     getUserInfo();
 }
 
+void FbTalker::parseResponseGetLoggedInUser(const QByteArray& data)
+{
+    int errCode = -1;
+    QString errMsg;
+
+    QDomDocument doc("getLoggedInUser");
+    if (!doc.setContent(data))
+        return;
+
+    m_authProgressDlg->setValue(3);
+
+    kDebug(51000) << "Parse GetLoggedInUser response:" << endl << data;
+
+    QDomElement docElem = doc.documentElement();
+    if (docElem.tagName() == "users_getLoggedInUser_response") 
+    {
+        m_uid = docElem.text().toInt();
+        errCode = 0;
+    }
+    else if (docElem.tagName() == "error_response")
+        errCode = parseErrorResponse(docElem, errMsg);
+
+    if (errCode == 0)
+    {
+        // session is still valid -> get full user info
+        getUserInfo();
+    }
+    else
+    {
+        // it seems that session expired -> create new token and session
+        m_sessionKey.clear();
+        m_sessionExpires = 0;
+        m_uid = 0;
+        m_userName.clear();
+        m_userURL.clear();
+
+        createToken();
+    }
+}
+
 void FbTalker::parseResponseGetUserInfo(const QByteArray& data)
 {
     int errCode = -1;
--- trunk/extragear/graphics/kipi-plugins/fbexport/fbtalker.h #903498:903499
@@ -48,16 +48,15 @@
     FbTalker(QWidget* parent);
     ~FbTalker();
 
+    QString         getSessionKey() const;
+    unsigned int    getSessionExpires() const;
+
     QString getDisplayName() const;
     QString getProfileURL() const;
 
     bool    loggedIn();
     void    cancel();
-    QString getApiSig(const QMap<QString, QString>& args);
-    QString getCallString(const QMap<QString, QString>& args);
-    void    authenticate();
-    void    getSession();
-    void    getUserInfo();
+    void    authenticate(const QString& sessionKey, unsigned int sessionExpires);
     void    logout(); //rename
 
     void    listAlbums();
@@ -83,6 +82,7 @@
     {
         FB_CREATETOKEN = 0,
         FB_GETSESSION,
+        FB_GETLOGGEDINUSER,
         FB_GETUSERINFO,
         FB_LOGOUT,
         FB_LISTALBUMS,
@@ -90,10 +90,18 @@
         FB_ADDPHOTO
     };
 
+    QString getApiSig(const QMap<QString, QString>& args);
+    QString getCallString(const QMap<QString, QString>& args);
+    void    createToken();
+    void    getSession();
+    void    getLoggedInUser();
+    void    getUserInfo();
+
     QString errorToText(int errCode, const QString& errMsg);
     int parseErrorResponse(const QDomElement& e, QString& errMsg);
     void parseResponseCreateToken(const QByteArray& data);
     void parseResponseGetSession(const QByteArray& data);
+    void parseResponseGetLoggedInUser(const QByteArray& data);
     void parseResponseGetUserInfo(const QByteArray& data);
     void parseResponseLogout(const QByteArray& data);
     void parseResponseAddPhoto(const QByteArray& data);
--- trunk/extragear/graphics/kipi-plugins/fbexport/fbwindow.cpp #903498:903499
@@ -183,7 +183,7 @@
 
     kDebug(51000) << "Calling Login method";
     buttonStateChange(m_talker->loggedIn());
-    m_talker->authenticate(); 
+    m_talker->authenticate(m_sessionKey, m_sessionExpires); 
 }
 
 FbWindow::~FbWindow()
@@ -200,7 +200,9 @@
 {
     KConfig config("kipirc");
     KConfigGroup grp = config.group("FbExport Settings");
-    m_currentAlbumID = grp.readEntry("Current Album", -1);
+    m_sessionKey = grp.readEntry("Session Key");
+    m_sessionExpires = grp.readEntry("Session Expires", 0);
+    m_currentAlbumID = grp.readEntry("Current Album", -1LL);
 
     if (grp.readEntry("Resize", false))
     {
@@ -225,6 +227,8 @@
 {
     KConfig config("kipirc");
     KConfigGroup grp = config.group("FbExport Settings");
+    grp.writeEntry("Session Key", m_sessionKey);
+    grp.writeEntry("Session Expires", m_sessionExpires);
     grp.writeEntry("Current Album", m_currentAlbumID);
     grp.writeEntry("Resize", m_widget->m_resizeChB->isChecked());
     grp.writeEntry("Maximum Width",  m_widget->m_dimensionSpB->value());
@@ -241,9 +245,6 @@
 
 void FbWindow::slotClose()
 {
-    if (m_talker->loggedIn())
-        m_talker->logout();
-
     writeSettings();
 
     done(Close);
@@ -259,6 +260,9 @@
 
     if (errCode == 0 && m_talker->loggedIn())
     {
+        m_sessionKey = m_talker->getSessionKey();
+        m_sessionExpires = m_talker->getSessionExpires();
+
         m_talker->listAlbums(); // get albums to fill combo box
     }
     else
@@ -316,10 +320,14 @@
     kDebug(51000) << "Slot Change User Request";
 
     if (m_talker->loggedIn())
+    {
         m_talker->logout();
+        m_sessionKey.clear();
+        m_sessionExpires = 0;
+    }
 
     kDebug(51000) << "Calling Login method";
-    m_talker->authenticate();
+    m_talker->authenticate(m_sessionKey, m_sessionExpires);
 }
 
 void FbWindow::slotReloadAlbumsRequest()
@@ -360,7 +368,7 @@
     m_uploadCount = 0;
     m_progressDlg->reset();
     m_currentAlbumID = m_widget->m_albumsCoB->itemData(
-                                m_widget->m_albumsCoB->currentIndex()).toInt();
+                               m_widget->m_albumsCoB->currentIndex()).toLongLong();
     kDebug(51000) << "m_currentAlbumID" << m_currentAlbumID;
     uploadNextPhoto();
     kDebug(51000) << "slotStartUpload done";
--- trunk/extragear/graphics/kipi-plugins/fbexport/fbwindow.h #903498:903499
@@ -101,6 +101,8 @@
     QString                     m_tmpPath;
 
     long long                   m_currentAlbumID;
+    QString                     m_sessionKey;
+    unsigned int                m_sessionExpires;
 
     QProgressDialog            *m_progressDlg;
     QProgressDialog            *m_authProgressDlg;
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic