/** * upgrade session key to OAuth * * This method (or step) can be removed after June 2012 (a year after its * implementation), since it is only a convenience method for those people * who just upgraded and have an active session using the old authentication. */ void FbTalker::exchangeSession(const QString& sessionKey) { if (m_job) { m_job->kill(); m_job = 0; } emit signalBusy(true); emit signalLoginProgress(1, 9, i18n("Upgrading to OAuth...")); QMap<QString, QString> args; args["client_id"] = m_appID; args["client_secret"] = m_secretKey; args["sessions"] = sessionKey; QByteArray tmp(getCallString(args).toUtf8()); KIO::TransferJob* job = KIO::http_post(KUrl("https://graph.facebook.com/oauth/exchange_sessions"), 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*,QByteArray)), this, SLOT(data(KIO::Job*,QByteArray))); connect(job, SIGNAL(result(KJob*)), this, SLOT(slotResult(KJob*))); m_state = FB_EXCHANGESESSION; m_job = job; m_buffer.resize(0); }
/** * Request upload permission using OAuth * * TODO (Dirk) maybe this can go or be merged with a re-authentication function. */ void FbTalker::getUploadPermission() { if (m_job) { m_job->kill(); m_job = 0; } emit signalBusy(true); if (m_loginInProgress) emit signalLoginProgress(8); QMap<QString, QString> args; args["access_token"] = m_accessToken; args["ext_perm"] = "photo_upload"; QByteArray tmp(getCallString(args).toUtf8()); KIO::TransferJob* job = KIO::http_post(KUrl(m_apiURL,"users.hasAppPermission"), 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*,QByteArray)), this, SLOT(data(KIO::Job*,QByteArray))); connect(job, SIGNAL(result(KJob*)), this, SLOT(slotResult(KJob*))); m_state = FB_GETUPLOADPERM; m_job = job; m_buffer.resize(0); }
void FbTalker::getLoggedInUser() { if (m_job) { m_job->kill(); m_job = 0; } emit signalBusy(true); emit signalLoginProgress(3); QMap<QString, QString> args; args["access_token"] = m_accessToken; QByteArray tmp(getCallString(args).toUtf8()); KIO::TransferJob* job = KIO::http_post(KUrl(m_apiURL,"users.getLoggedInUser"), 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*,QByteArray)), this, SLOT(data(KIO::Job*,QByteArray))); connect(job, SIGNAL(result(KJob*)), this, SLOT(slotResult(KJob*))); m_state = FB_GETLOGGEDINUSER; m_job = job; m_buffer.resize(0); }
void FbTalker::authenticate(const QString &accessToken, unsigned int sessionExpires) { m_loginInProgress = true; if (!accessToken.isEmpty() && ( sessionExpires == 0 || sessionExpires > (unsigned int)(time(0) + 900) ) ) { // sessionKey seems to be still valid for at least 15 minutes // - check if it still works m_accessToken = accessToken; m_sessionExpires = sessionExpires; emit signalLoginProgress(2, 9, i18n("Validate previous session...")); // get logged in user - this will check if session is still valid getLoggedInUser(); } else { // session expired -> get new authorization token and session doOAuth(); } }
void FbTalker::parseResponseGetUploadPermission(const QByteArray& data) { int errCode = -1; QString errMsg; QDomDocument doc("getUploadPerm"); if (!doc.setContent(data)) return; if (m_loginInProgress) emit signalLoginProgress(9); kDebug() << "Parse HasAppPermission response:" << endl << data; QDomElement docElem = doc.documentElement(); if (docElem.tagName() == "users_hasAppPermission_response") { m_user.uploadPerm = docElem.text().toInt(); errCode = 0; } else if (docElem.tagName() == "error_response") { errCode = parseErrorResponse(docElem, errMsg); } if (m_loginInProgress) { authenticationDone(errCode, errorToText(errCode, errMsg)); } else { emit signalBusy(false); emit signalChangePermDone(errCode, errorToText(errCode, errMsg)); } }
void SmugTalker::login(const QString& email, const QString& password) { if (m_job) { m_job->kill(); m_job = 0; } emit signalBusy(true); emit signalLoginProgress(1, 4, i18n("Logging in to SmugMug service...")); KUrl url(m_apiURL); if (email.isEmpty()) { url.addQueryItem("method", "smugmug.login.anonymously"); url.addQueryItem("APIKey", m_apiKey); } else { url.addQueryItem("method", "smugmug.login.withPassword"); url.addQueryItem("APIKey", m_apiKey); url.addQueryItem("EmailAddress", email); url.addQueryItem("Password", password); } QByteArray tmp; KIO::TransferJob* job = KIO::http_post(url, 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*,QByteArray)), this, SLOT(data(KIO::Job*,QByteArray))); connect(job, SIGNAL(result(KJob*)), this, SLOT(slotResult(KJob*))); m_state = SMUG_LOGIN; m_job = job; m_buffer.resize(0); m_user.email = email; }
void FbTalker::getUserInfo(const QString& userIDs) { if (m_job) { m_job->kill(); m_job = 0; } if (userIDs.isEmpty()) { emit signalBusy(true); emit signalLoginProgress(6); } QMap<QString, QString> args; args["access_token"] = m_accessToken; if (userIDs.isEmpty()) args["uids"] = QString::number(m_user.id); else args["uids"] = userIDs; args["fields"] = "name,profile_url"; QByteArray tmp(getCallString(args).toUtf8()); KIO::TransferJob* job = KIO::http_post(KUrl(m_apiURL,"users.getInfo"), 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*,QByteArray)), this, SLOT(data(KIO::Job*,QByteArray))); connect(job, SIGNAL(result(KJob*)), this, SLOT(slotResult(KJob*))); if (userIDs.isEmpty()) m_state = FB_GETUSERINFO; else m_state = FB_GETUSERINFO_FRIENDS; m_job = job; m_buffer.resize(0); }
void SmugTalker::login(const QString& email, const QString& password) { if (m_reply) { m_reply->abort(); m_reply = 0; } emit signalBusy(true); emit signalLoginProgress(1, 4, i18n("Logging in to SmugMug service...")); QUrl url(m_apiURL); QUrlQuery q; if (email.isEmpty()) { q.addQueryItem(QString::fromLatin1("method"), QString::fromLatin1("smugmug.login.anonymously")); q.addQueryItem(QString::fromLatin1("APIKey"), m_apiKey); } else { q.addQueryItem(QString::fromLatin1("method"), QString::fromLatin1("smugmug.login.withPassword")); q.addQueryItem(QString::fromLatin1("APIKey"), m_apiKey); q.addQueryItem(QString::fromLatin1("EmailAddress"), email); q.addQueryItem(QString::fromLatin1("Password"), password); } url.setQuery(q); QNetworkRequest netRequest(url); netRequest.setHeader(QNetworkRequest::ContentTypeHeader, QLatin1String("application/x-www-form-urlencoded")); netRequest.setHeader(QNetworkRequest::UserAgentHeader, m_userAgent); m_reply = m_netMngr->get(netRequest); m_state = SMUG_LOGIN; m_buffer.resize(0); m_user.email = email; }
void FbTalker::parseResponseGetLoggedInUser(const QByteArray& data) { int errCode = -1; QString errMsg; QDomDocument doc("getLoggedInUser"); if (!doc.setContent(data)) return; emit signalLoginProgress(4); kDebug() << "Parse GetLoggedInUser response:" << endl << data; QDomElement docElem = doc.documentElement(); if (docElem.tagName() == "users_getLoggedInUser_response") { m_user.id = docElem.text().toLongLong(); 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_accessToken.clear(); m_sessionExpires = 0; m_user.clear(); doOAuth(); } }
void SmugTalker::parseResponseLogin(const QByteArray& data) { int errCode = -1; QString errMsg; emit signalLoginProgress(3); QDomDocument doc(QString::fromLatin1("login")); if (!doc.setContent(data)) return; qCDebug(KIPIPLUGINS_LOG) << "Parse Login response:" << endl << data; QDomElement e = doc.documentElement(); for (QDomNode node = e.firstChild(); !node.isNull(); node = node.nextSibling()) { if (!node.isElement()) continue; e = node.toElement(); if (e.tagName() == QString::fromLatin1("Login")) { m_user.accountType = e.attribute(QString::fromLatin1("AccountType")); m_user.fileSizeLimit = e.attribute(QString::fromLatin1("FileSizeLimit")).toInt(); for (QDomNode nodeL = e.firstChild(); !nodeL.isNull(); nodeL = nodeL.nextSibling()) { if (!nodeL.isElement()) continue; e = nodeL.toElement(); if (e.tagName() == QString::fromLatin1("Session")) { m_sessionID = e.attribute(QString::fromLatin1("id")); } else if (e.tagName() == QString::fromLatin1("User")) { m_user.nickName = e.attribute(QString::fromLatin1("NickName")); m_user.displayName = e.attribute(QString::fromLatin1("DisplayName")); } } errCode = 0; } else if (e.tagName() == QString::fromLatin1("err")) { errCode = e.attribute(QString::fromLatin1("code")).toInt(); errMsg = e.attribute(QString::fromLatin1("msg")); qCDebug(KIPIPLUGINS_LOG) << "Error:" << errCode << errMsg; } } emit signalLoginProgress(4); if (errCode != 0) // if login failed, reset user properties { m_sessionID.clear(); m_user.clear(); } emit signalBusy(false); emit signalLoginDone(errCode, errorToText(errCode, errMsg)); }
void FbTalker::parseResponseGetUserInfo(const QByteArray& data) { int errCode = -1; QString errMsg; QDomDocument doc("getUserInfo"); if (!doc.setContent(data)) return; if (m_state == FB_GETUSERINFO) // during login emit signalLoginProgress(7); kDebug() << "Parse GetUserInfo response:" << endl << data; QList<FbUser> friendsList; QDomElement docElem = doc.documentElement(); if (docElem.tagName() == "users_getInfo_response") { for (QDomNode node = docElem.firstChild(); !node.isNull(); node = node.nextSibling()) { if (!node.isElement()) continue; if (node.nodeName() == "user") { FbUser user; for (QDomNode nodeU = node.toElement().firstChild(); !nodeU.isNull(); nodeU = nodeU.nextSibling()) { if (!nodeU.isElement()) continue; if (nodeU.nodeName() == "uid") user.id = nodeU.toElement().text().toLongLong(); else if (nodeU.nodeName() == "name") user.name = nodeU.toElement().text(); else if (nodeU.nodeName() == "profile_url") user.profileURL = nodeU.toElement().text(); } if (m_state == FB_GETUSERINFO) { m_user.name = user.name; m_user.profileURL = user.profileURL; } else if (!user.name.isEmpty()) friendsList.append(user); } } errCode = 0; } else if (docElem.tagName() == "error_response") { errCode = parseErrorResponse(docElem, errMsg); } if (m_state == FB_GETUSERINFO) { if (errCode != 0) { authenticationDone(errCode, errorToText(errCode, errMsg)); return; } getUploadPermission(); } else { qSort(friendsList.begin(), friendsList.end()); emit signalBusy(false); emit signalListFriendsDone(errCode, errorToText(errCode, errMsg), friendsList); } }