ce8cf47dd61798437a8a978f7a17b4fbaea9e979
[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 #include "facebookcommon.h"
28
29 FacebookAuthentication::FacebookAuthentication(QWidget *parent)
30     : QMainWindow(parent)
31 {
32     qDebug() << __PRETTY_FUNCTION__;
33
34     m_webView = new QWebView;
35     m_mainlayout = new QHBoxLayout;
36
37     m_facebookLoginPage = formLoginPage(FACEBOOK_LOGINBASE, SITUARE_PUBLIC_FACEBOOKAPI_KEY,
38                                         INTERVAL1, SITUARE_LOGIN_SUCCESS, INTERVAL2,
39                                         SITUARE_LOGIN_FAILURE, FACEBOOK_LOGIN_ENDING);
40
41     connect(m_webView, SIGNAL(urlChanged(const QUrl &)),
42             this, SLOT(updateCredentials(const QUrl &)));
43
44     readCredentials(m_loginCredentials);
45
46     if (!verifyCredentials(m_loginCredentials))
47         start();
48     else
49         emit credentialsReady();
50 }
51
52 FacebookAuthentication::~FacebookAuthentication()
53 {
54     qDebug() << __PRETTY_FUNCTION__;
55     delete m_webView;
56     delete m_mainlayout;
57 }
58
59 void FacebookAuthentication::start()
60 {
61     qDebug() << __PRETTY_FUNCTION__;    
62
63     m_webView->setZoomFactor(FACEBOOK_LOGINPAGE_FONT_SIZE);
64     m_webView->load(m_facebookLoginPage);
65     setCentralWidget(m_webView);
66 }
67
68
69 bool FacebookAuthentication::updateCredentials(const QUrl &url)
70 {    
71     qDebug() << __PRETTY_FUNCTION__;
72
73     bool foundSessionKey = FALSE;
74     bool foundUserID = FALSE;
75     bool foundExpires = FALSE;
76     bool foundSessionSecret = FALSE;
77     bool foundSig = FALSE;
78
79     if (url.isValid()){
80          qDebug() << "url is valid" << endl;
81
82         QString callbackUrl = url.toString();
83         QString urlEdit(callbackUrl);
84         qDebug() << "callbackUrl:  " << endl << callbackUrl.toAscii() << endl;
85
86         if ( callbackUrl.indexOf(LOGIN_SUCCESS_REPLY) == 0 ){
87             qDebug() << "login success" << endl;
88
89             // let's find out session key            
90             int indexOfCredential = callbackUrl.indexOf(SESSION_KEY);
91
92             if (indexOfCredential != -1){
93                 foundSessionKey = TRUE;
94
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("\",\"");
100
101                 qDebug() << "Session Key" << endl << urlEdit.toAscii() << endl;
102                 m_loginCredentials.setSessionKey(urlEdit);
103             }
104
105             // let's find out uid            
106             urlEdit = callbackUrl;
107             indexOfCredential = callbackUrl.indexOf(USER_ID);
108
109             if (indexOfCredential != -1){
110                 foundUserID = TRUE;
111
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(",\"");
117
118                 qDebug() << "userID" << endl << urlEdit.toAscii() << endl;
119                 m_loginCredentials.setUserID(urlEdit);
120             }
121
122             // let's find out expires           
123             urlEdit = callbackUrl;
124             indexOfCredential = callbackUrl.indexOf(EXPIRES);
125
126             if (indexOfCredential != -1){
127                 foundExpires = TRUE;
128
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(",\"");
134
135                 qDebug() << "Expires" << endl << urlEdit.toAscii() << endl;
136                 m_loginCredentials.setExpires(urlEdit);
137             }
138
139             // let's find out sessionsecret            
140             urlEdit = callbackUrl;
141             indexOfCredential = callbackUrl.indexOf(SESSION_SECRET);
142
143             if (indexOfCredential != -1){
144                 foundSessionSecret = TRUE;
145
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("\",\"");
151
152                 qDebug() << "Session Secret" << endl << urlEdit.toAscii() << endl;
153                 m_loginCredentials.setSessionSecret(urlEdit);
154             }
155
156             // let's find out sig            
157             urlEdit = callbackUrl;
158             indexOfCredential = callbackUrl.indexOf(SIGNATURE);
159
160             if (indexOfCredential != -1){
161                 foundSig = TRUE;
162
163                 indexOfCredential += 6; //" length of SIGNATURE
164                 urlEdit.remove(0,indexOfCredential);
165                 urlEdit.remove("\"}");
166
167                 qDebug() << "Signature" << endl << urlEdit.toAscii() << endl;
168                 m_loginCredentials.setSig(urlEdit);
169             }
170
171             m_webView->hide();
172             emit credentialsReady();
173             writeCredentials(m_loginCredentials);
174         }
175
176         else if ( callbackUrl.indexOf(LOGIN_FAILURE_REPLY) == 0){
177             qWarning() << "login failure" << endl;
178             emit loginFailure();
179         }
180
181         else if ( callbackUrl.indexOf(LOGIN_PAGE) == 0){
182             qDebug() << "correct loginPage";
183         }
184
185         else {
186             qDebug() << "totally wrong webPage";
187             emit loginFailure();
188             start();
189         }
190     }
191
192     else {
193         qDebug() << " Loading of page failed invalid URL" << endl;
194         emit loginFailure();
195         return FALSE;
196     }
197
198
199     return (foundSessionKey && foundUserID && foundExpires && foundSessionSecret && foundSig);
200 }
201
202 void FacebookAuthentication::writeCredentials(const FacebookCredentials &credentials)
203 {
204     qDebug() << __PRETTY_FUNCTION__;
205     QSettings settings(DIRECTORY_NAME, FILE_NAME);
206
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());
212 }
213
214 void FacebookAuthentication::readCredentials(FacebookCredentials &credentialsFromFile)
215 {
216     qDebug() << __PRETTY_FUNCTION__;
217
218     QSettings settings(DIRECTORY_NAME, FILE_NAME);
219
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());
225 }
226
227  FacebookCredentials FacebookAuthentication::loginCredentials() const
228  {
229      qDebug() << __PRETTY_FUNCTION__;
230      return m_loginCredentials;
231  }
232
233  bool FacebookAuthentication::verifyCredentials(const FacebookCredentials &credentials) const
234  {
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();
241
242      QDateTime currentTime;
243      currentTime = QDateTime::currentDateTime();
244      QString currentTimeString = currentTime.toString("dd.MM.yyyy  hh:mm:ss");
245      qDebug() << currentTimeString.toAscii();
246
247      return currentTime < expireTime;
248  }
249
250  void FacebookAuthentication::closeEvent(QCloseEvent *event)
251  {
252      qDebug() << __PRETTY_FUNCTION__;
253      int eventNumber = 0;     
254      eventNumber = event->registerEventType();
255      qDebug() << "event number" << eventNumber;
256      emit userExit();
257      event->accept();
258  }
259
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
264  {
265      QString loginPage;
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);
274
275      return loginPage;
276  }