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);
46 if (!verifyCredentials(m_loginCredentials))
49 emit credentialsReady();
52 FacebookAuthentication::~FacebookAuthentication()
54 qDebug() << __PRETTY_FUNCTION__;
59 void FacebookAuthentication::start()
61 qDebug() << __PRETTY_FUNCTION__;
63 m_webView->setZoomFactor(FACEBOOK_LOGINPAGE_FONT_SIZE);
64 m_webView->load(m_facebookLoginPage);
65 setCentralWidget(m_webView);
69 bool FacebookAuthentication::updateCredentials(const QUrl &url)
71 qDebug() << __PRETTY_FUNCTION__;
73 bool foundSessionKey = FALSE;
74 bool foundUserID = FALSE;
75 bool foundExpires = FALSE;
76 bool foundSessionSecret = FALSE;
77 bool foundSig = FALSE;
80 qDebug() << "url is valid" << endl;
82 QString callbackUrl = url.toString();
83 QString urlEdit(callbackUrl);
84 qDebug() << "callbackUrl: " << endl << callbackUrl.toAscii() << endl;
86 if ( callbackUrl.indexOf(LOGIN_SUCCESS_REPLY) == 0 ){
87 qDebug() << "login success" << endl;
89 // let's find out session key
90 int indexOfCredential = callbackUrl.indexOf(SESSION_KEY);
92 if (indexOfCredential != -1){
93 foundSessionKey = TRUE;
95 indexOfCredential += 14; //lenght of SESSION_KEY
96 urlEdit.remove(0,indexOfCredential);
97 indexOfCredential = urlEdit.indexOf(USER_ID);
98 urlEdit.remove(indexOfCredential, urlEdit.length());
99 urlEdit.remove("\",\"");
101 qDebug() << "Session Key" << endl << urlEdit.toAscii() << endl;
102 m_loginCredentials.setSessionKey(urlEdit);
105 // let's find out uid
106 urlEdit = callbackUrl;
107 indexOfCredential = callbackUrl.indexOf(USER_ID);
109 if (indexOfCredential != -1){
112 indexOfCredential += 5; //length of USER_ID:
113 urlEdit.remove(0,indexOfCredential);
114 indexOfCredential = urlEdit.indexOf(EXPIRES);
115 urlEdit.remove(indexOfCredential, urlEdit.length());
116 urlEdit.remove(",\"");
118 qDebug() << "userID" << endl << urlEdit.toAscii() << endl;
119 m_loginCredentials.setUserID(urlEdit);
122 // let's find out expires
123 urlEdit = callbackUrl;
124 indexOfCredential = callbackUrl.indexOf(EXPIRES);
126 if (indexOfCredential != -1){
129 indexOfCredential += 9; //length of EXPIRES
130 urlEdit.remove(0,indexOfCredential);
131 indexOfCredential = urlEdit.indexOf(SESSION_SECRET);
132 urlEdit.remove(indexOfCredential, urlEdit.length());
133 urlEdit.remove(",\"");
135 qDebug() << "Expires" << endl << urlEdit.toAscii() << endl;
136 m_loginCredentials.setExpires(urlEdit);
139 // let's find out sessionsecret
140 urlEdit = callbackUrl;
141 indexOfCredential = callbackUrl.indexOf(SESSION_SECRET);
143 if (indexOfCredential != -1){
144 foundSessionSecret = TRUE;
146 indexOfCredential += 9; //" length of SESSION_SECRET
147 urlEdit.remove(0,indexOfCredential);
148 indexOfCredential = urlEdit.indexOf(SIGNATURE);
149 urlEdit.remove(indexOfCredential, urlEdit.length());
150 urlEdit.remove("\",\"");
152 qDebug() << "Session Secret" << endl << urlEdit.toAscii() << endl;
153 m_loginCredentials.setSessionSecret(urlEdit);
156 // let's find out sig
157 urlEdit = callbackUrl;
158 indexOfCredential = callbackUrl.indexOf(SIGNATURE);
160 if (indexOfCredential != -1){
163 indexOfCredential += 6; //" length of SIGNATURE
164 urlEdit.remove(0,indexOfCredential);
165 urlEdit.remove("\"}");
167 qDebug() << "Signature" << endl << urlEdit.toAscii() << endl;
168 m_loginCredentials.setSig(urlEdit);
172 emit credentialsReady();
173 writeCredentials(m_loginCredentials);
176 else if ( callbackUrl.indexOf(LOGIN_FAILURE_REPLY) == 0){
177 qWarning() << "login failure" << endl;
181 else if ( callbackUrl.indexOf(LOGIN_PAGE) == 0){
182 qDebug() << "correct loginPage";
186 qDebug() << "totally wrong webPage";
193 qDebug() << " Loading of page failed invalid URL" << endl;
199 return (foundSessionKey && foundUserID && foundExpires && foundSessionSecret && foundSig);
202 void FacebookAuthentication::writeCredentials(const FacebookCredentials &credentials)
204 qDebug() << __PRETTY_FUNCTION__;
205 QSettings settings(DIRECTORY_NAME, FILE_NAME);
207 settings.setValue("Session Key", credentials.sessionKey());
208 settings.setValue("User ID", credentials.userID());
209 settings.setValue("Expires", credentials.expires());
210 settings.setValue("Session Secret", credentials.sessionSecret());
211 settings.setValue("Sig", credentials.sig());
214 void FacebookAuthentication::readCredentials(FacebookCredentials &credentialsFromFile)
216 qDebug() << __PRETTY_FUNCTION__;
218 QSettings settings(DIRECTORY_NAME, FILE_NAME);
220 credentialsFromFile.setSessionKey(settings.value("Session Key", "Error").toString());
221 credentialsFromFile.setUserID(settings.value("User ID", "Error").toString());
222 credentialsFromFile.setExpires(settings.value("Expires", "Error").toString());
223 credentialsFromFile.setSessionSecret(settings.value("Session Secret", "Error").toString());
224 credentialsFromFile.setSig(settings.value("Sig", "Error").toString());
227 FacebookCredentials FacebookAuthentication::loginCredentials() const
229 qDebug() << __PRETTY_FUNCTION__;
230 return m_loginCredentials;
233 bool FacebookAuthentication::verifyCredentials(const FacebookCredentials &credentials) const
235 qDebug() << __PRETTY_FUNCTION__;
236 QString expires = credentials.expires();
237 QDateTime expireTime;
238 expireTime.setTime_t(expires.toInt());
239 QString expiresString = expireTime.toString("dd.MM.yyyy hh:mm:ss");
240 qDebug() << expiresString.toAscii();
242 QDateTime currentTime;
243 currentTime = QDateTime::currentDateTime();
244 QString currentTimeString = currentTime.toString("dd.MM.yyyy hh:mm:ss");
245 qDebug() << currentTimeString.toAscii();
247 return currentTime < expireTime;
250 void FacebookAuthentication::closeEvent(QCloseEvent *event)
252 qDebug() << __PRETTY_FUNCTION__;
254 eventNumber = event->registerEventType();
255 qDebug() << "event number" << eventNumber;
260 QString FacebookAuthentication::formLoginPage(const QString & part1, const QString & part2,
261 const QString & part3, const QString & part4,
262 const QString & part5, const QString & part6,
263 const QString & part7) const
266 loginPage.append(part1);
267 loginPage.append(part2);
268 loginPage.append(part3);
269 loginPage.append(part4);
270 loginPage.append(part5);
271 loginPage.append(part5);
272 loginPage.append(part6);
273 loginPage.append(part7);