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"
28 FacebookAuthentication::FacebookAuthentication(QWidget *parent)
31 qDebug() << __PRETTY_FUNCTION__;
33 m_webView = new QWebView;
34 m_mainlayout = new QHBoxLayout;
36 // ToDo: use common.h etc.
37 QString facebookLoginBase = "http://www.facebook.com/login.php?";
38 QString situarePublicFacebookApiKey = "api_key=4197c64da2fb6b927236feaea32d7d81";
39 //QString situareDeveloperFacebookApiKey = "api_key=cf77865a5070f2c2ba3b52cbf3371579";
40 QString interval1 = "&connect_display=popup&v=1.0&next=";
41 QString situareLoginSuccess = "http://www.facebook.com/connect/login_success.html";
42 QString interval2 = "&cancel_url=";
43 QString situareLoginFailure = "http://www.facebook.com/connect/login_failure.html";
44 QString facebookLoginEnding = "&fbconnect=true&return_session=true&";
46 m_facebookLoginPage.append(facebookLoginBase);
47 m_facebookLoginPage.append(situarePublicFacebookApiKey);
48 m_facebookLoginPage.append(interval1);
49 m_facebookLoginPage.append(situareLoginSuccess);
50 m_facebookLoginPage.append(interval2);
51 m_facebookLoginPage.append(situareLoginFailure);
52 m_facebookLoginPage.append(facebookLoginEnding);
54 connect(m_webView, SIGNAL(urlChanged(const QUrl &)), this, SLOT(updateCredentials(const QUrl &)));
56 readCredentials(m_loginCredentials);
58 if (!verifyCredentials(m_loginCredentials))
61 emit credentialsReady();
65 FacebookAuthentication::~FacebookAuthentication()
67 qDebug() << __PRETTY_FUNCTION__;
72 void FacebookAuthentication::start()
74 qDebug() << __PRETTY_FUNCTION__;
76 const double fontSize = 1.2; // ToDo: use common.h etc.
78 m_webView->setZoomFactor(fontSize);
79 m_webView->load(m_facebookLoginPage);
80 setCentralWidget(m_webView);
84 bool FacebookAuthentication::updateCredentials(const QUrl &url)
86 qDebug() << __PRETTY_FUNCTION__;
88 bool foundSessionKey = FALSE;
89 bool foundUserID = FALSE;
90 bool foundExpires = FALSE;
91 bool foundSessionSecret = FALSE;
92 bool foundSig = FALSE;
95 qDebug() << "url is valid" << endl;
97 QString callbackUrl = url.toString();
98 QString urlEdit(callbackUrl);
99 qDebug() << "callbackUrl: " << endl << callbackUrl.toAscii() << endl;
101 if ( callbackUrl.indexOf("http://www.facebook.com/connect/login_success.html") == 0 ){
102 qDebug() << "login success" << endl;
104 // let's find out session key
105 int indexOfCredential = callbackUrl.indexOf("session_key");
107 if (indexOfCredential != -1){
108 foundSessionKey = TRUE;
110 indexOfCredential += 14; //lenght of string "session_key"%
111 urlEdit.remove(0,indexOfCredential);
112 indexOfCredential = urlEdit.indexOf("uid");
113 urlEdit.remove(indexOfCredential, urlEdit.length());
114 urlEdit.remove("\",\"");
116 qDebug() << "session_key" << endl << urlEdit.toAscii() << endl;
117 m_loginCredentials.setSessionKey(urlEdit);
120 // let's find out uid
121 urlEdit = callbackUrl;
122 indexOfCredential = callbackUrl.indexOf("uid");
124 if (indexOfCredential != -1){
127 indexOfCredential += 5; //length of string "uid":
128 urlEdit.remove(0,indexOfCredential);
129 indexOfCredential = urlEdit.indexOf("expires");
130 urlEdit.remove(indexOfCredential, urlEdit.length());
131 urlEdit.remove(",\"");
133 qDebug() << "userID" << endl << urlEdit.toAscii() << endl;
134 m_loginCredentials.setUserID(urlEdit);
137 // let's find out expires
138 urlEdit = callbackUrl;
139 indexOfCredential = callbackUrl.indexOf("expires");
141 if (indexOfCredential != -1){
144 indexOfCredential += 9; //length of string "expires"
145 urlEdit.remove(0,indexOfCredential);
146 indexOfCredential = urlEdit.indexOf("secret");
147 urlEdit.remove(indexOfCredential, urlEdit.length());
148 urlEdit.remove(",\"");
150 qDebug() << "expires" << endl << urlEdit.toAscii() << endl;
151 m_loginCredentials.setExpires(urlEdit);
154 // let's find out sessionsecret
155 urlEdit = callbackUrl;
156 indexOfCredential = callbackUrl.indexOf("secret");
158 if (indexOfCredential != -1){
159 foundSessionSecret = TRUE;
161 indexOfCredential += 9; //" length of "secret":
162 urlEdit.remove(0,indexOfCredential);
163 indexOfCredential = urlEdit.indexOf("sig");
164 urlEdit.remove(indexOfCredential, urlEdit.length());
165 urlEdit.remove("\",\"");
167 qDebug() << "sessionSecret" << endl << urlEdit.toAscii() << endl;
168 m_loginCredentials.setSessionSecret(urlEdit);
171 // let's find out sig
172 urlEdit = callbackUrl;
173 indexOfCredential = callbackUrl.indexOf("sig");
175 if (indexOfCredential != -1){
178 indexOfCredential += 6; //" length of "sig":
179 urlEdit.remove(0,indexOfCredential);
180 urlEdit.remove("\"}");
182 qDebug() << "sig" << endl << urlEdit.toAscii() << endl;
183 m_loginCredentials.setSig(urlEdit);
187 emit credentialsReady();
188 writeCredentials(m_loginCredentials);
191 else if ( callbackUrl.indexOf("https://login.facebook.com/login.php?login_attempt=") == 0){
192 qWarning() << "login failure" << endl;
196 else if ( callbackUrl.indexOf("http://www.facebook.com/login.php?api_key=") == 0){
197 qDebug() << "correct loginPage";
201 qDebug() << "totally wrong webPage";
208 qDebug() << " Loading of page failed invalid URL" << endl;
214 return (foundSessionKey && foundUserID && foundExpires && foundSessionSecret && foundSig);
217 void FacebookAuthentication::writeCredentials(const FacebookCredentials &credentials)
219 qDebug() << __PRETTY_FUNCTION__;
220 QSettings settings("Ixonos", "Situare");
222 settings.setValue("Session Key", credentials.sessionKey());
223 settings.setValue("User ID", credentials.userID());
224 settings.setValue("Expires", credentials.expires());
225 settings.setValue("Session Secret", credentials.sessionSecret());
226 settings.setValue("Sig", credentials.sig());
229 void FacebookAuthentication::readCredentials(FacebookCredentials &credentialsFromFile)
231 qDebug() << __PRETTY_FUNCTION__;
233 QSettings settings("Ixonos", "Situare");
235 credentialsFromFile.setSessionKey(settings.value("Session Key", "Error").toString());
236 credentialsFromFile.setUserID(settings.value("User ID", "Error").toString());
237 credentialsFromFile.setExpires(settings.value("Expires", "Error").toString());
238 credentialsFromFile.setSessionSecret(settings.value("Session Secret", "Error").toString());
239 credentialsFromFile.setSig(settings.value("Sig", "Error").toString());
242 FacebookCredentials FacebookAuthentication::loginCredentials() const
244 qDebug() << __PRETTY_FUNCTION__;
245 return m_loginCredentials;
248 bool FacebookAuthentication::verifyCredentials(const FacebookCredentials &credentials) const
250 qDebug() << __PRETTY_FUNCTION__;
251 QString expires = credentials.expires();
252 QDateTime expireTime;
253 expireTime.setTime_t(expires.toInt());
254 QString expiresString = expireTime.toString("dd.MM.yyyy hh:mm:ss");
255 qDebug() << expiresString.toAscii();
257 QDateTime currentTime;
258 currentTime = QDateTime::currentDateTime();
259 QString currentTimeString = currentTime.toString("dd.MM.yyyy hh:mm:ss");
260 qDebug() << currentTimeString.toAscii();
262 return currentTime < expireTime;
265 void FacebookAuthentication::closeEvent(QCloseEvent *event)
267 qDebug() << __PRETTY_FUNCTION__;
269 eventNumber = event->registerEventType();
270 qDebug() << "event number" << eventNumber;