/* ============================================================ * QupZilla - WebKit based browser * Copyright (C) 2010-2011 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "autofillmodel.h" #include "qupzilla.h" #include "webview.h" #include "mainapplication.h" #include "autofillnotification.h" AutoFillModel::AutoFillModel(QupZilla* mainClass, QObject* parent) : QObject(parent) ,p_QupZilla(mainClass) ,m_isStoring(false) { QTimer::singleShot(0, this, SLOT(loadSettings())); } void AutoFillModel::loadSettings() { QSettings settings(mApp->getActiveProfilPath()+"settings.ini", QSettings::IniFormat); settings.beginGroup("Web-Browser-Settings"); m_isStoring = settings.value("AutoFillForms",true).toBool(); settings.endGroup(); } bool AutoFillModel::isStored(const QUrl &url) { QString server = url.host(); QSqlQuery query; query.exec("SELECT count(id) FROM autofill WHERE server='"+server+"'"); query.next(); if (query.value(0).toInt()>0) return true; return false; } bool AutoFillModel::isStoringEnabled(const QUrl &url) { if (!m_isStoring) return false; QString server = url.host(); QSqlQuery query; query.exec("SELECT count(id) FROM autofill_exceptions WHERE server='"+server+"'"); query.next(); if (query.value(0).toInt()>0) return false; return true; } void AutoFillModel::blockStoringfor (const QUrl &url) { QString server = url.host(); QSqlQuery query; query.exec("INSERT INTO autofill_exceptions (server) VALUES ('"+server+"')"); } QString AutoFillModel::getUsername(const QUrl &url) { QString server = url.host(); QSqlQuery query; query.exec("SELECT username FROM autofill WHERE server='"+server+"'"); query.next(); return query.value(0).toString(); } QString AutoFillModel::getPassword(const QUrl &url) { QString server = url.host(); QSqlQuery query; query.exec("SELECT password FROM autofill WHERE server='"+server+"'"); query.next(); return query.value(0).toString(); } ///HTTP Authorization bool AutoFillModel::addEntry(const QUrl &url, const QString &name, const QString &pass) { QSqlQuery query; query.exec("SELECT username FROM autofill WHERE server='"+url.host()+"'"); if (query.next()) return false; query.prepare("INSERT INTO autofill (server, username, password) VALUES (?,?,?)"); query.bindValue(0, url.host()); query.bindValue(1, name); query.bindValue(2, pass); return query.exec(); } ///WEB Form bool AutoFillModel::addEntry(const QUrl &url, const QByteArray &data, const QString &pass) { QSqlQuery query; query.exec("SELECT data FROM autofill WHERE server='"+url.host()+"'"); if (query.next()) return false; query.prepare("INSERT INTO autofill (server, data, password) VALUES (?,?,?)"); query.bindValue(0, url.host()); query.bindValue(1, data); query.bindValue(2, pass); return query.exec(); } void AutoFillModel::completePage(WebView* view) { if (!isStored(view->url())) return; QWebElementCollection inputs; QList frames; frames.append(view->page()->mainFrame()); while (!frames.isEmpty()) { QWebFrame* frame = frames.takeFirst(); inputs.append(frame->findAllElements("input")); frames += frame->childFrames(); } QSqlQuery query; query.exec("SELECT data FROM autofill WHERE server='"+view->url().host()+"'"); query.next(); QByteArray data = query.value(0).toByteArray(); if (data.isEmpty()) return; QList > arguments = QUrl::fromEncoded(QByteArray("http://bla.com/?"+data)).queryItems(); for (int i = 0; iwebSettings()->testAttribute(QWebSettings::PrivateBrowsingEnabled)) return; m_lastOutgoingData = outgoingData; QVariant v = request.attribute((QNetworkRequest::Attribute)(QNetworkRequest::User + 100)); QWebPage* webPage = (QWebPage*)(v.value()); v = request.attribute((QNetworkRequest::Attribute)(QNetworkRequest::User + 102)); WebView* webView = (WebView*)(v.value()); if (!webPage || !webView) return; v = request.attribute((QNetworkRequest::Attribute)(QNetworkRequest::User + 101)); QWebPage::NavigationType type = (QWebPage::NavigationType)v.toInt(); if (type!=QWebPage::NavigationTypeFormSubmitted) return; QString passwordName = ""; QString passwordValue = ""; QWebElementCollection inputs; QList frames; frames.append(webPage->mainFrame()); while (!frames.isEmpty()) { QWebFrame* frame = frames.takeFirst(); inputs.append(frame->findAllElements("input[type=\"password\"]")); frames += frame->childFrames(); } foreach (QWebElement element, inputs) { passwordName = element.attribute("name"); passwordValue = element.evaluateJavaScript("this.value").toString(); if (!passwordValue.isEmpty()) break; } //Return if storing is not enabled, data for this page is already stored, no password element found in sent data if (passwordName.isEmpty() || !isStoringEnabled(request.url()) || isStored(request.url())) return; //Return if no password form has been sent if (!outgoingData.contains((QUrl(passwordName).toEncoded() + "=")) || passwordValue.isEmpty()) return; AutoFillNotification* aWidget = new AutoFillNotification(webView->url(), outgoingData, passwordValue); webView->addNotification(aWidget); }