From 29ba3288d0d342e79d14676a02af555c6d43c3e6 Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Sat, 13 Oct 2018 14:01:01 +0200 Subject: unstable: KWallet integration --- CMakeLists.txt | 4 ++-- src/CMakeLists.txt | 10 ++++++---- src/mainwindow/mainwindow.cpp | 4 ++-- src/wallet/wallet.cpp | 44 +++++++++++++++++++++++++++++++++++++++++++ src/wallet/wallet.h | 18 ++++++++++++++++++ src/webengine/webview.cpp | 12 ++++++++++++ 6 files changed, 84 insertions(+), 8 deletions(-) create mode 100644 src/wallet/wallet.cpp create mode 100644 src/wallet/wallet.h diff --git a/CMakeLists.txt b/CMakeLists.txt index ca345fb..51983e3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,7 @@ include(${VENDOR}) option(QtDeprecatedWarnings "Qt deprecated warnings" ON) option(UseLibCpp "Use libc++ over stdlibc++ (requires clang)" OFF) option(Tests "Enable/disable some basic autotests" OFF) -option(Plasma "Enable some fancy effects on Plasma" OFF) +option(Plasma "Enable Plasma integration" OFF) option(Breakpad "Enable breakpad crash reports" OFF) # Libraries @@ -21,7 +21,7 @@ find_package(Boost 1.66 COMPONENTS program_options REQUIRED) if(Plasma) find_package(ECM 1.6.0 REQUIRED NO_MODULE) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR}) - find_package(KF5 "5.6.0" COMPONENTS WindowSystem REQUIRED) + find_package(KF5 "5.6.0" COMPONENTS Wallet WindowSystem REQUIRED) endif(Plasma) # Global C++ settings diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a44a44f..b772792 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -47,6 +47,10 @@ set(srclist webengine/webview.cpp webengine/webview.h + # wallet (form autofill) + wallet/wallet.cpp + wallet/wallet.h + # interfaces ${PROJECT_SOURCE_DIR}/include/plugininterface.h ${PROJECT_SOURCE_DIR}/include/profileinterface.h @@ -92,10 +96,8 @@ if(Breakpad) endif() if(Plasma) - target_link_libraries(${poi_exe} KF5::WindowSystem) - target_compile_definitions(${poi_exe} - PRIVATE PLASMA_BLUR # give the main window a translucent background and blur - ) + target_link_libraries(${poi_exe} KF5::Wallet KF5::WindowSystem) + target_compile_definitions(${poi_exe} PRIVATE PLASMA) endif(Plasma) target_compile_definitions(${poi_exe} diff --git a/src/mainwindow/mainwindow.cpp b/src/mainwindow/mainwindow.cpp index 1f81b86..b0c5e5e 100644 --- a/src/mainwindow/mainwindow.cpp +++ b/src/mainwindow/mainwindow.cpp @@ -37,7 +37,7 @@ #include #include #include -#ifdef PLASMA_BLUR +#ifdef PLASMA #include #endif @@ -76,7 +76,7 @@ MainWindow::MainWindow(const std::unique_ptr &config, QWidget *pa ui->setupUi(this); -#ifdef PLASMA_BLUR +#ifdef PLASMA setAttribute(Qt::WA_TranslucentBackground, true); KWindowEffects::enableBlurBehind(this->winId(), true); #endif diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp new file mode 100644 index 0000000..c795cf2 --- /dev/null +++ b/src/wallet/wallet.cpp @@ -0,0 +1,44 @@ +/* + * This file is part of smolbote. It's copyrighted by the contributors recorded + * in the version control history of the file, available from its original + * location: https://neueland.iserlohn-fortress.net/gitea/aqua/smolbote + * + * SPDX-License-Identifier: GPL-3.0 + */ + +#include "wallet.h" +#include + +#ifdef PLASMA +#include +#endif + +void Wallet::autocompleteForm(QWebEngineView *view) +{ +#ifdef PLASMA + const auto findFormFunction = QLatin1Literal("index = undefined; for(var i = 0; i < document.forms.length; ++i) { if(document.forms[i].autocomplete) { index = i } }; index"); + view->page()->runJavaScript(findFormFunction, [view](const QVariant &v) { + if(!v.isNull()) { + auto autofillFunction = QString("inputs = document.forms[%1].getElementsByTagName('input');" + "for(var i = 0; i < inputs.length; ++i) {" + " if(inputs[i].type == 'email') { inputs[i].value='%2' }" + " if(inputs[i].type == 'password') { inputs[i].value='%3' }" + "}"); + + auto *wallet = KWallet::Wallet::openWallet(KWallet::Wallet::LocalWallet(), view->window()->winId()); + if(wallet) { + wallet->setFolder("smolbote"); + QMap map; + wallet->readMap(view->url().host(), map); + qDebug() << map; + + const auto username = map.firstKey(); + QString password; + wallet->readPassword(map.value(username), password); + view->page()->runJavaScript(autofillFunction.arg(v.toString(), username, password)); + } + delete wallet; + } + }); +#endif +} diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h new file mode 100644 index 0000000..d2fdb71 --- /dev/null +++ b/src/wallet/wallet.h @@ -0,0 +1,18 @@ +/* + * This file is part of smolbote. It's copyrighted by the contributors recorded + * in the version control history of the file, available from its original + * location: https://neueland.iserlohn-fortress.net/gitea/aqua/smolbote + * + * SPDX-License-Identifier: GPL-3.0 + */ + +#ifndef SMOLBOTE_WALLET_H +#define SMOLBOTE_WALLET_H + +class QWebEngineView; + +namespace Wallet { + void autocompleteForm(QWebEngineView *view); +} + +#endif // SMOLBOTE_WALLET_H diff --git a/src/webengine/webview.cpp b/src/webengine/webview.cpp index f8be48e..59ad32a 100644 --- a/src/webengine/webview.cpp +++ b/src/webengine/webview.cpp @@ -23,6 +23,7 @@ #include #include #include "browser.h" +#include "wallet/wallet.h" inline QAction *historyAction(QWebEngineView *view, const QWebEngineHistoryItem &item) { @@ -120,6 +121,7 @@ void WebView::contextMenuEvent(QContextMenuEvent *event) QMenu *menu = new QMenu(this); const auto ctxdata = page()->contextMenuData(); + // back, forward, reload, mute buttons, added to all variants of the context menu { auto *navButtons = new QWidgetAction(this); @@ -288,6 +290,16 @@ void WebView::contextMenuEvent(QContextMenuEvent *event) menu->addAction(zoomWidgetAction); } +#ifdef QT_DEBUG + { + menu->addSeparator(); + auto *autofillAction = menu->addAction(tr("Autofill form")); + connect(autofillAction, &QAction::triggered, this, [this]() { + Wallet::autocompleteForm(this); + }); + }; +#endif + menu->setMinimumWidth(250); menu->exec(event->globalPos()); } -- cgit v1.2.1