summaryrefslogtreecommitdiff
blob: accc8d92d91e71208f14c38a92296a88a77dcf7f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
From 90890e7d27c544e3557bed2f6624614141db0fc4 Mon Sep 17 00:00:00 2001
From: Fabian Vogt <fabian@ritter-vogt.de>
Date: Sat, 29 Sep 2018 15:34:43 +0200
Subject: [PATCH] Reintroduce the username field reading with webkit-options.d

Use WebChannel to spy on the input fields.
Use the old UserAgent to make sure the selectors match.
---
 src/browser-request.cpp | 11 +++++++++++
 src/qml/WebView.qml     | 36 ++++++++++++++++++++++++++++++++++++
 2 files changed, 47 insertions(+)

diff --git a/src/browser-request.cpp b/src/browser-request.cpp
index 1895d59..e58f302 100644
--- a/src/browser-request.cpp
+++ b/src/browser-request.cpp
@@ -31,6 +31,7 @@
 #include <QStandardPaths>
 #include <QTimer>
 #include <SignOn/uisessiondata_priv.h>
+#include <QSettings>
 
 using namespace SignOnUi;
 using namespace SignOnUi::QQuick;
@@ -43,8 +44,10 @@ class BrowserRequestPrivate: public QObject
     Q_DECLARE_PUBLIC(BrowserRequest)
     Q_PROPERTY(QUrl pageComponentUrl READ pageComponentUrl CONSTANT)
     Q_PROPERTY(QUrl currentUrl READ currentUrl WRITE setCurrentUrl)
+    Q_PROPERTY(QString username MEMBER m_username)
     Q_PROPERTY(QUrl startUrl READ startUrl CONSTANT)
     Q_PROPERTY(QUrl finalUrl READ finalUrl CONSTANT)
+    Q_PROPERTY(QString usernameSelector READ usernameSelector CONSTANT)
 
 public:
     BrowserRequestPrivate(BrowserRequest *request);
@@ -58,6 +61,7 @@ public:
     QUrl startUrl() const { return m_startUrl; }
     QUrl finalUrl() const { return m_finalUrl; }
     QUrl responseUrl() const { return m_responseUrl; }
+    QString usernameSelector() const { return m_settings->value("UsernameField").toString(); }
 
 public Q_SLOTS:
     void cancel();
@@ -77,6 +81,8 @@ private:
     QUrl m_startUrl;
     QUrl m_finalUrl;
     QUrl m_responseUrl;
+    QString m_username;
+    QSettings *m_settings;
     QTimer m_failTimer;
     mutable BrowserRequest *q_ptr;
 };
@@ -116,6 +122,9 @@ void BrowserRequestPrivate::start()
 
     m_finalUrl = params.value(SSOUI_KEY_FINALURL).toString();
     m_startUrl = params.value(SSOUI_KEY_OPENURL).toString();
+
+    m_settings = new QSettings("signon-ui/webkit-options.d/" + m_startUrl.host(), QString(), this);
+
     buildDialog(params);
 
     QObject::connect(m_dialog, SIGNAL(finished(int)),
@@ -231,6 +240,8 @@ void BrowserRequestPrivate::onFinished()
     QVariantMap reply;
     QUrl url = m_responseUrl.isEmpty() ? m_currentUrl : m_responseUrl;
     reply[SSOUI_KEY_URLRESPONSE] = url.toString();
+    if (!m_username.isEmpty())
+        reply[SSOUI_KEY_USERNAME] = m_username;
 
     m_dialog->close();
 
diff --git a/src/qml/WebView.qml b/src/qml/WebView.qml
index 33462b8..3af0239 100644
--- a/src/qml/WebView.qml
+++ b/src/qml/WebView.qml
@@ -1,4 +1,5 @@
 import QtQuick 2.0
+import QtWebChannel 1.0
 import QtWebEngine 1.1
 
 WebEngineView {
@@ -25,8 +26,43 @@ WebEngineView {
     profile: WebEngineProfile {
         cachePath: rootDir
         persistentStoragePath: rootDir
+        // For compatibility with the webkit-options.d values
+        httpUserAgent: "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.21 (KHTML, like Gecko) Safari/537.21"
     }
 
+    QtObject {
+        id: commProxy
+        WebChannel.id: "comm"
+        property string username: ""
+        property string selector: signonRequest.usernameSelector
+        onUsernameChanged: signonRequest.username = username
+    }
+
+    WebChannel {
+        id: chan
+        registeredObjects: [commProxy]
+    }
+    webChannel: chan
+
+    WebEngineScript {
+        id: qwebchannel
+        injectionPoint: WebEngineScript.DocumentCreation
+        sourceUrl: "qrc:/qtwebchannel/qwebchannel.js"
+        worldId: WebEngineScript.MainWorld
+    }
+
+    WebEngineScript {
+        id: commScript
+        injectionPoint: WebEngineScript.DocumentReady
+        sourceCode: "new QWebChannel(window.qt.webChannelTransport, function(channel) {" +
+                    "    var elem = document.querySelector(channel.objects.comm.selector);" +
+                    "    elem.addEventListener('keyup', function() { channel.objects.comm.username = elem.value; });" +
+                    "});"
+        worldId: WebEngineScript.MainWorld
+    }
+
+    userScripts: [qwebchannel, commScript]
+
     ProgressBar {
         anchors.top: parent.top
         anchors.left: parent.left
-- 
2.18.0