Merge branch 'master' of https://vcs.maemo.org/git/situare
[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        Henri Lampela - henri.lampela@ixonos.com
8
9    Situare is free software; you can redistribute it and/or
10    modify it under the terms of the GNU General Public License
11    version 2 as published by the Free Software Foundation.
12
13    Situare is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with Situare; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
21    USA.
22 */
23
24 #include <QtDebug>
25 #include <QDateTime>
26 #include <QSettings>
27 #include <QStringList>
28 #include <QVariantMap>
29
30 #ifdef Q_WS_MAEMO_5
31 #include <QMaemo5InformationBox>
32 #endif // Q_WS_MAEMO_5
33
34 #include "facebookauthentication.h"
35 #include "facebookcommon.h"
36 #include "../common.h"
37 #include "parser.h"
38
39 FacebookAuthentication::FacebookAuthentication(QObject *parent)
40     : QObject(parent),
41     m_freshLogin(false)
42 {
43     qDebug() << __PRETTY_FUNCTION__;
44
45 }
46
47 void FacebookAuthentication::clearAccountInformation(bool keepUsername)
48 {
49     qDebug() << __PRETTY_FUNCTION__;
50
51     m_loginCredentials.clearCredentials();
52     QSettings settings(DIRECTORY_NAME, FILE_NAME);
53
54     if(!keepUsername) {
55         settings.remove(USERNAME);
56         settings.remove(SETTINGS_AUTOMATIC_UPDATE_ENABLED);
57         settings.remove(SETTINGS_AUTOMATIC_UPDATE_INTERVAL);
58     }
59
60     settings.remove(COOKIES);
61 }
62
63 const QString FacebookAuthentication::loadUsername()
64 {
65     qDebug() << __PRETTY_FUNCTION__;
66
67     QSettings settings(DIRECTORY_NAME, FILE_NAME);
68     return settings.value(USERNAME, EMPTY).toString();
69 }
70
71 FacebookCredentials FacebookAuthentication::loginCredentials() const
72 {
73     qDebug() << __PRETTY_FUNCTION__;
74     return m_loginCredentials;
75 }
76
77 void FacebookAuthentication::saveUsername(const QString &username)
78 {
79     qDebug() << __PRETTY_FUNCTION__;
80
81     QSettings settings(DIRECTORY_NAME, FILE_NAME);
82     settings.setValue(USERNAME, username);
83 }
84
85 void FacebookAuthentication::start()
86 {
87     qDebug() << __PRETTY_FUNCTION__;
88
89     QSettings settings(DIRECTORY_NAME, FILE_NAME);
90
91     QStringList cookies = settings.value(COOKIES).toStringList();
92     if(!cookies.isEmpty()) {
93         emit loginUsingCookies();
94     }
95     else {
96         m_freshLogin = true;
97         emit newLoginRequest();
98     }
99 }
100
101 bool FacebookAuthentication::updateCredentials(const QUrl &url)
102 {
103     qDebug() << __PRETTY_FUNCTION__ << url.toString();
104
105     bool found = false;
106
107     if (url.isValid()){
108          qDebug() << "url is valid";
109
110         QString callbackUrl = url.toString();
111         qDebug() << "callbackUrl:  " << callbackUrl.toAscii();
112
113         if (callbackUrl.indexOf(LOGIN_SUCCESS_REPLY) == 0) {
114             qDebug() << "login success";
115
116             // let's find out session credentials
117             if(callbackUrl.contains(SESSION_KEY)) {
118
119                 QJson::Parser parser;
120                 bool ok;
121
122                 // split string into string part and json part
123                 QStringList list = url.toString().split("=");
124
125                 for(int i=0;i<list.count();i++) {
126                     // if string starts with json item
127                     if(list.at(i).startsWith("{")) {
128                         QByteArray jsonString = list.at(i).toAscii();
129                         QVariantMap result = parser.parse (jsonString, &ok).toMap();
130                         if (!ok) {
131
132                             qFatal("An error occurred during parsing");
133                             exit (1);
134                         }
135                         qDebug() << "Session Key" << result[SESSION_KEY].toString();
136                         m_loginCredentials.setSessionKey(result[SESSION_KEY].toString());
137
138 //                        // commeted out until qjson parser can handle 64-bit integers
139 //                        qDebug() << "userID" << result[USER_ID].toString();
140 //                        m_loginCredentials.setUserID(result[USER_ID].toString().toAscii());
141
142                         // dirty fix, get user id from session_key
143                         QStringList list = result[SESSION_KEY].toString().split("-");
144                         m_loginCredentials.setUserID(list.at(1));
145                         qDebug() << m_loginCredentials.userID();
146
147                         qDebug() << "Expires" << result[EXPIRES].toString();
148                         m_loginCredentials.setExpires(result[EXPIRES].toString());
149
150                         qDebug() << "Session Secret" << result[SESSION_SECRET].toString();
151                         m_loginCredentials.setSessionSecret(result[SESSION_SECRET].toString());
152
153                         qDebug() << "Signature" << result[SIGNATURE].toString();
154                         m_loginCredentials.setSig(result[SIGNATURE].toString());
155                     }
156                 }
157                 found = true;
158                 m_freshLogin = false;
159                 emit saveCookiesRequest();
160             }
161             emit credentialsReady(m_loginCredentials);
162         }
163         else if ( callbackUrl.indexOf(LOGIN_FAILURE_REPLY) == 0){
164             qWarning() << "login failure" << endl;
165             qDebug() << callbackUrl;
166             clearAccountInformation(true);
167             if(m_freshLogin) {
168                 emit error(LOGIN_FAILED);
169                 emit loginFailure();
170             }
171             else {
172                 m_freshLogin = true;
173                 emit error(SESSION_EXPIRED);
174             }
175         }
176         else if(callbackUrl.indexOf(LOGIN_PAGE) == 0) {
177             qDebug() << "correct loginPage";
178         }
179         else {
180             qDebug() << "totally wrong webPage";
181             // we should not get a wrong page at this point
182             emit loginFailure();
183         }
184     }
185     else {
186         qDebug() << " Loading of page failed invalid URL" << endl;
187         // we should not get a wrong page at this point
188         emit loginFailure();
189         return false;
190     }
191     return found;
192 }