2 Situare - A location system for Facebook
3 Copyright (C) 2010 Ixonos Plc. Authors:
5 Ville Tiensuu - ville.tiensuu@ixonos.com
6 Kaj Wallin - kaj.wallin@ixonos.com
8 Situare is free software; you can redistribute it and/or
9 modify it under the terms of the GNU General Public License
10 version 2 as published by the Free Software Foundation.
12 Situare is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with Situare; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
26 #include "facebookauthentication.h"
27 #include "facebookcommon.h"
29 FacebookAuthentication::FacebookAuthentication(QWidget *parent)
32 qDebug() << __PRETTY_FUNCTION__;
34 m_webView = new QWebView;
35 m_mainlayout = new QHBoxLayout;
37 m_facebookLoginPage = formLoginPage(FACEBOOK_LOGINBASE, SITUARE_PUBLIC_FACEBOOKAPI_KEY,
38 INTERVAL1, SITUARE_LOGIN_SUCCESS, INTERVAL2,
39 SITUARE_LOGIN_FAILURE, FACEBOOK_LOGIN_ENDING);
41 connect(m_webView, SIGNAL(urlChanged(const QUrl &)),
42 this, SLOT(updateCredentials(const QUrl &)));
44 readCredentials(m_loginCredentials);
47 FacebookAuthentication::~FacebookAuthentication()
49 qDebug() << __PRETTY_FUNCTION__;
54 void FacebookAuthentication::start()
56 qDebug() << __PRETTY_FUNCTION__;
57 if (!verifyCredentials(m_loginCredentials)){
58 m_webView->setZoomFactor(FACEBOOK_LOGINPAGE_FONT_SIZE);
59 m_webView->load(m_facebookLoginPage);
60 setCentralWidget(m_webView);
64 emit credentialsReady(m_loginCredentials);
68 bool FacebookAuthentication::updateCredentials(const QUrl &url)
70 qDebug() << __PRETTY_FUNCTION__;
72 bool foundSessionKey = FALSE;
73 bool foundUserID = FALSE;
74 bool foundExpires = FALSE;
75 bool foundSessionSecret = FALSE;
76 bool foundSig = FALSE;
79 qDebug() << "url is valid" << endl;
81 QString callbackUrl = url.toString();
82 QString urlEdit(callbackUrl);
83 qDebug() << "callbackUrl: " << endl << callbackUrl.toAscii() << endl;
85 if ( callbackUrl.indexOf(LOGIN_SUCCESS_REPLY) == 0 ){
86 qDebug() << "login success" << endl;
88 // let's find out session key
89 int indexOfCredential = callbackUrl.indexOf(SESSION_KEY);
91 if (indexOfCredential != -1){
92 foundSessionKey = TRUE;
94 indexOfCredential += 14; //lenght of SESSION_KEY
95 urlEdit.remove(0,indexOfCredential);
96 indexOfCredential = urlEdit.indexOf(USER_ID);
97 urlEdit.remove(indexOfCredential, urlEdit.length());
98 urlEdit.remove("\",\"");
100 qDebug() << "Session Key" << endl << urlEdit.toAscii() << endl;
101 m_loginCredentials.setSessionKey(urlEdit);
104 // let's find out uid
105 urlEdit = callbackUrl;
106 indexOfCredential = callbackUrl.indexOf(USER_ID);
108 if (indexOfCredential != -1){
111 indexOfCredential += 5; //length of USER_ID:
112 urlEdit.remove(0,indexOfCredential);
113 indexOfCredential = urlEdit.indexOf(EXPIRES);
114 urlEdit.remove(indexOfCredential, urlEdit.length());
115 urlEdit.remove(",\"");
117 qDebug() << "userID" << endl << urlEdit.toAscii() << endl;
118 m_loginCredentials.setUserID(urlEdit);
121 // let's find out expires
122 urlEdit = callbackUrl;
123 indexOfCredential = callbackUrl.indexOf(EXPIRES);
125 if (indexOfCredential != -1){
128 indexOfCredential += 9; //length of EXPIRES
129 urlEdit.remove(0,indexOfCredential);
130 indexOfCredential = urlEdit.indexOf(SESSION_SECRET);
131 urlEdit.remove(indexOfCredential, urlEdit.length());
132 urlEdit.remove(",\"");
134 qDebug() << "Expires" << endl << urlEdit.toAscii() << endl;
135 m_loginCredentials.setExpires(urlEdit);
138 // let's find out sessionsecret
139 urlEdit = callbackUrl;
140 indexOfCredential = callbackUrl.indexOf(SESSION_SECRET);
142 if (indexOfCredential != -1){
143 foundSessionSecret = TRUE;
145 indexOfCredential += 9; //" length of SESSION_SECRET
146 urlEdit.remove(0,indexOfCredential);
147 indexOfCredential = urlEdit.indexOf(SIGNATURE);
148 urlEdit.remove(indexOfCredential, urlEdit.length());
149 urlEdit.remove("\",\"");
151 qDebug() << "Session Secret" << endl << urlEdit.toAscii() << endl;
152 m_loginCredentials.setSessionSecret(urlEdit);
155 // let's find out sig
156 urlEdit = callbackUrl;
157 indexOfCredential = callbackUrl.indexOf(SIGNATURE);
159 if (indexOfCredential != -1){
162 indexOfCredential += 6; //" length of SIGNATURE
163 urlEdit.remove(0,indexOfCredential);
164 urlEdit.remove("\"}");
166 qDebug() << "Signature" << endl << urlEdit.toAscii() << endl;
167 m_loginCredentials.setSig(urlEdit);
171 writeCredentials(m_loginCredentials);
172 emit credentialsReady(m_loginCredentials);
175 else if ( callbackUrl.indexOf(LOGIN_FAILURE_REPLY) == 0){
176 qWarning() << "login failure" << endl;
180 else if ( callbackUrl.indexOf(LOGIN_PAGE) == 0){
181 qDebug() << "correct loginPage";
185 qDebug() << "totally wrong webPage";
192 qDebug() << " Loading of page failed invalid URL" << endl;
198 return (foundSessionKey && foundUserID && foundExpires && foundSessionSecret && foundSig);
201 void FacebookAuthentication::writeCredentials(const FacebookCredentials &credentials)
203 qDebug() << __PRETTY_FUNCTION__;
204 QSettings settings(DIRECTORY_NAME, FILE_NAME);
206 settings.setValue("Session Key", credentials.sessionKey());
207 settings.setValue("User ID", credentials.userID());
208 settings.setValue("Expires", credentials.expires());
209 settings.setValue("Session Secret", credentials.sessionSecret());
210 settings.setValue("Sig", credentials.sig());
213 void FacebookAuthentication::readCredentials(FacebookCredentials &credentialsFromFile)
215 qDebug() << __PRETTY_FUNCTION__;
217 QSettings settings(DIRECTORY_NAME, FILE_NAME);
219 credentialsFromFile.setSessionKey(settings.value("Session Key", "Error").toString());
220 credentialsFromFile.setUserID(settings.value("User ID", "Error").toString());
221 credentialsFromFile.setExpires(settings.value("Expires", "Error").toString());
222 credentialsFromFile.setSessionSecret(settings.value("Session Secret", "Error").toString());
223 credentialsFromFile.setSig(settings.value("Sig", "Error").toString());
226 FacebookCredentials FacebookAuthentication::loginCredentials() const
228 qDebug() << __PRETTY_FUNCTION__;
229 return m_loginCredentials;
232 bool FacebookAuthentication::verifyCredentials(const FacebookCredentials &credentials) const
234 qDebug() << __PRETTY_FUNCTION__;
236 // if expires value is 0, then credentials are valid forever
237 if(credentials.expires() == "0") {
241 QString expires = credentials.expires();
242 QDateTime expireTime;
243 expireTime.setTime_t(expires.toInt());
244 QString expiresString = expireTime.toString("dd.MM.yyyy hh:mm:ss");
245 qDebug() << expiresString.toAscii();
247 QDateTime currentTime;
248 currentTime = QDateTime::currentDateTime();
249 QString currentTimeString = currentTime.toString("dd.MM.yyyy hh:mm:ss");
250 qDebug() << currentTimeString.toAscii();
252 return currentTime < expireTime;
256 QString FacebookAuthentication::formLoginPage(const QString & part1, const QString & part2,
257 const QString & part3, const QString & part4,
258 const QString & part5, const QString & part6,
259 const QString & part7) const
262 loginPage.append(part1);
263 loginPage.append(part2);
264 loginPage.append(part3);
265 loginPage.append(part4);
266 loginPage.append(part5);
267 loginPage.append(part5);
268 loginPage.append(part6);
269 loginPage.append(part7);