Some cleanup for FacebookServices and SituareServices
[situare] / src / facebookservice / facebookauthentication.cpp
1 /*
2    Situare - A location system for Facebook
3    Copyright (C) 2010  Ixonos Plc. Authors:
4
5        Ville Tiensuu - ville.tiensuu@ixonos.com
6        Kaj Wallin - kaj.wallin@ixonos.com
7
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.
11
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.
16
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,
20    USA.
21 */
22
23 #include <QtGui>
24 #include <QtDebug>
25 #include <QDateTime>
26 #include "facebookauthentication.h"
27
28 FacebookAuthentication::FacebookAuthentication(QWidget *parent)
29     : QMainWindow(parent)
30 {
31     qDebug() << __PRETTY_FUNCTION__;
32
33     m_webView = new QWebView;
34     m_mainlayout = new QHBoxLayout;
35
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&";
45
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);
53
54     connect(m_webView, SIGNAL(urlChanged(const QUrl &)), this, SLOT(updateCredentials(const QUrl &)));
55
56     readCredentials(m_loginCredentials);
57
58     if (!verifyCredentials(m_loginCredentials))
59         start();
60     else
61         emit credentialsReady();
62
63 }
64
65 FacebookAuthentication::~FacebookAuthentication()
66 {
67     qDebug() << __PRETTY_FUNCTION__;
68     delete m_webView;
69     delete m_mainlayout;
70 }
71
72 void FacebookAuthentication::start()
73 {
74     qDebug() << __PRETTY_FUNCTION__;
75
76     const double fontSize = 1.2; // ToDo: use common.h etc.
77
78     m_webView->setZoomFactor(fontSize);
79     m_webView->load(m_facebookLoginPage);
80     setCentralWidget(m_webView);
81 }
82
83
84 bool FacebookAuthentication::updateCredentials(const QUrl &url)
85 {    
86     qDebug() << __PRETTY_FUNCTION__;
87
88     bool foundSessionKey = FALSE;
89     bool foundUserID = FALSE;
90     bool foundExpires = FALSE;
91     bool foundSessionSecret = FALSE;
92     bool foundSig = FALSE;
93
94     if (url.isValid()){
95          qDebug() << "url is valid" << endl;
96
97         QString callbackUrl = url.toString();
98         QString urlEdit(callbackUrl);
99         qDebug() << "callbackUrl:  " << endl << callbackUrl.toAscii() << endl;
100
101         if ( callbackUrl.indexOf("http://www.facebook.com/connect/login_success.html") == 0 ){
102             qDebug() << "login success" << endl;
103
104             // let's find out session key            
105             int indexOfCredential = callbackUrl.indexOf("session_key");
106
107             if (indexOfCredential != -1){
108                 foundSessionKey = TRUE;
109
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("\",\"");
115
116                 qDebug() << "session_key" << endl << urlEdit.toAscii() << endl;
117                 m_loginCredentials.setSessionKey(urlEdit);
118             }
119
120             // let's find out uid            
121             urlEdit = callbackUrl;
122             indexOfCredential = callbackUrl.indexOf("uid");
123
124             if (indexOfCredential != -1){
125                 foundUserID = TRUE;
126
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(",\"");
132
133                 qDebug() << "userID" << endl << urlEdit.toAscii() << endl;
134                 m_loginCredentials.setUserID(urlEdit);
135             }
136
137             // let's find out expires           
138             urlEdit = callbackUrl;
139             indexOfCredential = callbackUrl.indexOf("expires");
140
141             if (indexOfCredential != -1){
142                 foundExpires = TRUE;
143
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(",\"");
149
150                 qDebug() << "expires" << endl << urlEdit.toAscii() << endl;
151                 m_loginCredentials.setExpires(urlEdit);
152             }
153
154             // let's find out sessionsecret            
155             urlEdit = callbackUrl;
156             indexOfCredential = callbackUrl.indexOf("secret");
157
158             if (indexOfCredential != -1){
159                 foundSessionSecret = TRUE;
160
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("\",\"");
166
167                 qDebug() << "sessionSecret" << endl << urlEdit.toAscii() << endl;
168                 m_loginCredentials.setSessionSecret(urlEdit);
169             }
170
171             // let's find out sig            
172             urlEdit = callbackUrl;
173             indexOfCredential = callbackUrl.indexOf("sig");
174
175             if (indexOfCredential != -1){
176                 foundSig = TRUE;
177
178                 indexOfCredential += 6; //" length of "sig":
179                 urlEdit.remove(0,indexOfCredential);
180                 urlEdit.remove("\"}");
181
182                 qDebug() << "sig" << endl << urlEdit.toAscii() << endl;
183                 m_loginCredentials.setSig(urlEdit);
184             }
185
186             m_webView->hide();
187             emit credentialsReady();
188             writeCredentials(m_loginCredentials);
189         }
190
191         else if ( callbackUrl.indexOf("https://login.facebook.com/login.php?login_attempt=") == 0){
192             qWarning() << "login failure" << endl;
193             emit loginFailure();
194         }
195
196         else if ( callbackUrl.indexOf("http://www.facebook.com/login.php?api_key=") == 0){
197             qDebug() << "correct loginPage";
198         }
199
200         else {
201             qDebug() << "totally wrong webPage";
202             emit loginFailure();
203             start();
204         }
205     }
206
207     else {
208         qDebug() << " Loading of page failed invalid URL" << endl;
209         emit loginFailure();
210         return FALSE;
211     }
212
213
214     return (foundSessionKey && foundUserID && foundExpires && foundSessionSecret && foundSig);
215 }
216
217 void FacebookAuthentication::writeCredentials(const FacebookCredentials &credentials)
218 {
219     qDebug() << __PRETTY_FUNCTION__;
220     QSettings settings("Ixonos", "Situare");
221
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());
227 }
228
229 void FacebookAuthentication::readCredentials(FacebookCredentials &credentialsFromFile)
230 {
231     qDebug() << __PRETTY_FUNCTION__;
232
233     QSettings settings("Ixonos", "Situare");
234
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());
240 }
241
242  FacebookCredentials FacebookAuthentication::loginCredentials() const
243  {
244      qDebug() << __PRETTY_FUNCTION__;
245      return m_loginCredentials;
246  }
247
248  bool FacebookAuthentication::verifyCredentials(const FacebookCredentials &credentials) const
249  {
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();
256
257      QDateTime currentTime;
258      currentTime = QDateTime::currentDateTime();
259      QString currentTimeString = currentTime.toString("dd.MM.yyyy  hh:mm:ss");
260      qDebug() << currentTimeString.toAscii();
261
262      return currentTime < expireTime;
263  }
264
265  void FacebookAuthentication::closeEvent(QCloseEvent *event)
266  {
267      qDebug() << __PRETTY_FUNCTION__;
268      int eventNumber = 0;     
269      eventNumber = event->registerEventType();
270      qDebug() << "event number" << eventNumber;
271      emit userExit();
272      event->accept();
273  }