31#include <QXmlStreamWriter>
32#include <QXmlStreamReader>
33#include <QWebEngineProfile>
34#include <QWebEngineScriptCollection>
44 QWebEngineScript script;
45 script.setName(
QSL(
"_falkon_autofill"));
46 script.setInjectionPoint(QWebEngineScript::DocumentReady);
48 script.setRunsOnSubFrames(
true);
50 mApp->webProfile()->scripts()->insert(script);
61 settings.
beginGroup(QStringLiteral(
"Web-Browser-Settings"));
62 m_isStoring = settings.
value(QStringLiteral(
"SavePasswordsOnSites"),
true).toBool();
63 m_isAutoComplete = settings.
value(QStringLiteral(
"AutoCompletePasswords"),
true).toBool();
82 QString server = url.host();
83 if (server.isEmpty()) {
84 server = url.toString();
88 query.prepare(QStringLiteral(
"SELECT count(id) FROM autofill_exceptions WHERE server=?"));
89 query.addBindValue(server);
96 return query.value(0).toInt() <= 0;
101 QString server = url.host();
102 if (server.isEmpty()) {
103 server = url.toString();
107 query.prepare(QStringLiteral(
"INSERT INTO autofill_exceptions (server) VALUES (?)"));
108 query.addBindValue(server);
180 if (
mApp->isPrivate() || !page)
189 const QVector<PasswordEntry> &list =
getFormData(frameUrl);
192 if (data.username == formData.
username) {
196 if (data.password == formData.
password) {
209 if (m_lastNotification && m_lastNotificationPage == page) {
210 m_lastNotification->close();
216 m_lastNotification = aWidget;
217 m_lastNotificationPage = page;
223 QStringList usernames;
228 if (!m_isAutoComplete) {
234 if (!entries.isEmpty()) {
240 usernames.reserve(entries.size());
242 usernames.append(entry.username);
251 QXmlStreamWriter stream(&output);
252 stream.setAutoFormatting(
true);
254 stream.writeStartDocument();
255 stream.writeStartElement(QStringLiteral(
"passwords"));
256 stream.writeAttribute(QStringLiteral(
"version"), QStringLiteral(
"1.0"));
258 const QVector<PasswordEntry> entries = m_manager->
getAllEntries();
261 stream.writeStartElement(QStringLiteral(
"entry"));
262 stream.writeTextElement(QStringLiteral(
"server"), entry.host);
263 stream.writeTextElement(QStringLiteral(
"username"), entry.username);
264 stream.writeTextElement(QStringLiteral(
"password"), entry.password);
265 stream.writeTextElement(QStringLiteral(
"data"), entry.data);
266 stream.writeEndElement();
270 query.prepare(QStringLiteral(
"SELECT server FROM autofill_exceptions"));
272 while (query.next()) {
273 stream.writeStartElement(QStringLiteral(
"exception"));
274 stream.writeTextElement(QStringLiteral(
"server"), query.value(0).toString());
275 stream.writeEndElement();
278 stream.writeEndElement();
279 stream.writeEndDocument();
286 QSqlDatabase db = QSqlDatabase::database();
289 QXmlStreamReader xml(data);
291 while (!xml.atEnd()) {
294 if (xml.isStartElement()) {
295 if (xml.name() == QLatin1String(
"entry")) {
298 while (xml.readNext()) {
299 if (xml.name() == QLatin1String(
"server")) {
300 entry.
host = xml.readElementText();
302 else if (xml.name() == QLatin1String(
"username")) {
303 entry.
username = xml.readElementText();
305 else if (xml.name() == QLatin1String(
"password")) {
306 entry.
password = xml.readElementText();
308 else if (xml.name() == QLatin1String(
"data")) {
309 entry.
data = xml.readElementText().toUtf8();
312 if (xml.isEndElement() && xml.name() == QLatin1String(
"entry")) {
318 bool containsEntry =
false;
323 containsEntry =
true;
328 if (!containsEntry) {
333 else if (xml.name() == QLatin1String(
"exception")) {
336 while (xml.readNext()) {
337 if (xml.name() == QLatin1String(
"server")) {
338 server = xml.readElementText();
341 if (xml.isEndElement() && xml.name() == QLatin1String(
"exception")) {
346 if (!server.isEmpty()) {
348 query.prepare(QStringLiteral(
"SELECT id FROM autofill_exceptions WHERE server=?"));
349 query.addBindValue(server);
353 query.prepare(QStringLiteral(
"INSERT INTO autofill_exceptions (server) VALUES (?)"));
354 query.addBindValue(server);
364 return !xml.hasError();
void updateLastUsed(PasswordEntry &data)
QByteArray exportPasswords()
bool importPasswords(const QByteArray &data)
void addEntry(const QUrl &url, const QString &name, const QString &pass)
bool isStoringEnabled(const QUrl &url)
void saveForm(WebPage *page, const QUrl &frameUrl, const PageFormData &formData)
void updateEntry(const QUrl &url, const QString &name, const QString &pass)
QVector< PasswordEntry > getFormData(const QUrl &url)
void removeEntry(const PasswordEntry &entry)
AutoFill(QObject *parent=nullptr)
bool isStored(const QUrl &url)
QVector< PasswordEntry > getAllFormData()
void blockStoringforUrl(const QUrl &url)
PasswordManager * passwordManager() const
QStringList completePage(WebPage *page, const QUrl &frameUrl)
bool updateEntry(const PasswordEntry &entry)
static QString createHost(const QUrl &url)
void removeEntry(const PasswordEntry &entry)
QStringList getUsernames(const QUrl &url)
QVector< PasswordEntry > getEntries(const QUrl &url)
void updateLastUsed(PasswordEntry &entry)
QVector< PasswordEntry > getAllEntries()
void addEntry(const PasswordEntry &entry)
static QString completeFormData(const QByteArray &data)
static QString setupFormObserver()
void beginGroup(const QString &prefix)
QVariant value(const QString &key, const QVariant &defaultValue=QVariant())
static SqlDatabase * instance()
void addNotification(QWidget *notif)