summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'kde-apps/libkgapi/files/libkgapi-17.04.0-auth1.patch')
-rw-r--r--kde-apps/libkgapi/files/libkgapi-17.04.0-auth1.patch168
1 files changed, 168 insertions, 0 deletions
diff --git a/kde-apps/libkgapi/files/libkgapi-17.04.0-auth1.patch b/kde-apps/libkgapi/files/libkgapi-17.04.0-auth1.patch
new file mode 100644
index 000000000000..eb426465947b
--- /dev/null
+++ b/kde-apps/libkgapi/files/libkgapi-17.04.0-auth1.patch
@@ -0,0 +1,168 @@
+From 68b89bce22d0da234345ccffb869ae6863592624 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Daniel=20Vr=C3=A1til?= <dvratil@kde.org>
+Date: Thu, 27 Apr 2017 17:22:27 +0200
+Subject: [PATCH 1/3] Auth: Adapt to changes in Google OAuth token retrieval
+ process
+
+URLs and HTML code have changed a bit, which breaks authentication. Hopefully
+they won't change it too often in the future.
+---
+ src/core/ui/authwidget_p.cpp | 109 ++++++++++++++++++++++++-------------------
+ src/core/ui/authwidget_p.h | 6 +++
+ 2 files changed, 67 insertions(+), 48 deletions(-)
+
+diff --git a/src/core/ui/authwidget_p.cpp b/src/core/ui/authwidget_p.cpp
+index 6de33f5..75d38cd 100644
+--- a/src/core/ui/authwidget_p.cpp
++++ b/src/core/ui/authwidget_p.cpp
+@@ -112,11 +112,35 @@ void AuthWidgetPrivate::emitError(const enum Error errCode, const QString& msg)
+
+ void AuthWidgetPrivate::webviewUrlChanged(const QUrl &url)
+ {
+- qCDebug(KGAPIDebug) << url;
++ qCDebug(KGAPIDebug) << "URLChange:" << url;
+
+- /* Access token here - hide browser and tell user to wait until we
+- * finish the authentication process ourselves */
+- if (url.host() == QLatin1String("accounts.google.com") && url.path() == QLatin1String("/o/oauth2/approval")) {
++ if (!isGoogleHost(url)) {
++ return;
++ }
++
++ // Username and password inputs are loaded dynamically, so we only get
++ // urlChanged, but not urlFinished.
++ if (isUsernameFrame(url)) {
++#if QT_VERSION >= QT_VERSION_CHECK(5, 7, 0)
++ if (!username.isEmpty()) {
++ webview->page()->runJavaScript(QStringLiteral("document.getElementById(\"identifierId\").value = \"%1\";").arg(username));
++ }
++#endif
++ } else if (isPasswordFrame(url)) {
++#if QT_VERSION >= QT_VERSION_CHECK(5, 7, 0)
++ if (!password.isEmpty()) {
++ webview->page()->runJavaScript(QStringLiteral("var elems = document.getElementsByTagName(\"input\");"
++ "for (var i = 0; i < elems.length; i++) {"
++ " if (elems[i].type == \"password\" && elems[i].name == \"password\") {"
++ " elems[i].value = \"%1\";"
++ " break;"
++ " }"
++ "}").arg(password));
++ }
++#endif
++ } else if (isTokenPage(url)) {
++ /* Access token here - hide browser and tell user to wait until we
++ * finish the authentication process ourselves */
+ webview->setVisible(false);
+ progressbar->setVisible(false);
+ label->setVisible(true);
+@@ -131,57 +155,46 @@ void AuthWidgetPrivate::webviewFinished(bool ok)
+ qCWarning(KGAPIDebug) << "Failed to load" << webview->url();
+ }
+
+- QUrl url = webview->url();
+- qCDebug(KGAPIDebug) << url;
+-
+- if (url.host() == QLatin1String("accounts.google.com") && url.path() == QLatin1String("/ServiceLogin")) {
+- if (username.isEmpty() && password.isEmpty()) {
+- return;
+- }
+-
+-#if QT_VERSION >= QT_VERSION_CHECK(5, 7, 0)
+- const auto js = QStringLiteral("document.getElementById(\"%1\").value = \"%2\";");
+- if (!username.isEmpty()) {
+- webview->page()->runJavaScript(js.arg(QStringLiteral("Email"), username));
+- }
+-
+- if (!password.isEmpty()) {
+- webview->page()->runJavaScript(js.arg(QStringLiteral("Passwd"), password));
+- }
+-#endif
++ const QUrl url = webview->url();
++ qCDebug(KGAPIDebug) << "URLFinished:" << url;
+
++ if (!isGoogleHost(url)) {
+ return;
+ }
+
+- if (url.host() == QLatin1String("accounts.google.com") && url.path() == QLatin1String("/o/oauth2/approval")) {
+- QString title = webview->title();
+- QString token;
+-
+- if (title.startsWith(QLatin1String("success"), Qt::CaseInsensitive)) {
+- int pos = title.indexOf(QLatin1String("code="));
+- /* Skip the 'code=' string as well */
+- token = title.mid (pos + 5);
++ if (isTokenPage(url)) {
++ const auto token = url.queryItemValue(QStringLiteral("approvalCode"));
++ if (!token.isEmpty()) {
++ qCDebug(KGAPIDebug) << "Got token: " << token;
++ auto fetch = new KGAPI2::NewTokensFetchJob(token, apiKey, secretKey);
++ connect(fetch, &Job::finished, this, &AuthWidgetPrivate::tokensReceived);
+ } else {
+- webview->page()->toHtml([title](const QString &html) {
+- qCDebug(KGAPIDebug) << "Parsing token page failed. Title:" << title;
+- qCDebug(KGAPIDebug) << html;
+- });
++#if QT_VERSION >= QT_VERSION_CHECK(5, 7, 0)
++ qCWarning(KGAPIDebug) << "Failed to parse token from URL, peaking into HTML...";
++ webview->page()->runJavaScript(
++ QStringLiteral("document.getElementById(\"code\").value;"),
++ [this](const QVariant &result) {
++ const auto token = result.toString();
++ if (token.isEmpty()) {
++ qCWarning(KGAPIDebug) << "Peaked into HTML, but cound not find token :(";
++ webview->page()->toHtml([](const QString &html) {
++ qCDebug(KGAPIDebug) << "Parsing token page failed";
++ qCDebug(KGAPIDebug) << html;
++ });
++ emitError(AuthError, tr("Parsing token page failed."));
++ return;
++ }
++ qCDebug(KGAPIDebug) << "Peaked into HTML and found token: " << token;
++ auto fetch = new KGAPI2::NewTokensFetchJob(token, apiKey, secretKey);
++ connect(fetch, &Job::finished, this, &AuthWidgetPrivate::tokensReceived);
++ });
++#else
++ qCWarning(KGAPIDebug) << "Failed to parse token from URL!";
+ emitError(AuthError, tr("Parsing token page failed."));
+- return;
+- }
+-
+- if (token.isEmpty()) {
+- webview->page()->toHtml([](const QString &html) {
+- qCDebug(KGAPIDebug) << "Failed to obtain token.";
+- qCDebug(KGAPIRaw) << html;
+- });
+- emitError(AuthError, tr("Failed to obtain token."));
+- return;
++#endif
+ }
+-
+- KGAPI2::NewTokensFetchJob *fetchJob = new KGAPI2::NewTokensFetchJob(token, apiKey, secretKey);
+- connect(fetchJob, &Job::finished,
+- this, &AuthWidgetPrivate::tokensReceived);
++ } else {
++ //qCDebug(KGAPIDebug) << "Unhandled page:" << url.host() << ", " << url.path();
+ }
+ }
+
+diff --git a/src/core/ui/authwidget_p.h b/src/core/ui/authwidget_p.h
+index 673b0cb..9c488be 100644
+--- a/src/core/ui/authwidget_p.h
++++ b/src/core/ui/authwidget_p.h
+@@ -82,6 +82,12 @@ class Q_DECL_HIDDEN AuthWidgetPrivate: public QObject {
+ void setupUi();
+ void setProgress(AuthWidget::Progress progress);
+
++ bool isGoogleHost(const QUrl &url) const { return url.host() == QLatin1String("accounts.google.com"); }
++ bool isSigninPage(const QUrl &url) const { return url.path() == QLatin1String("/signin/oauth"); }
++ bool isUsernameFrame(const QUrl &url) { return url.path() == QLatin1String("/signin/oauth/identifier"); }
++ bool isPasswordFrame(const QUrl &url) { return url.path() == QLatin1String("/signin/v2/challenge/pwd"); }
++ bool isTokenPage(const QUrl &url) { return url.path() == QLatin1String("/o/oauth2/approval/v2"); }
++
+ AuthWidget *q;
+
+ friend class AuthWidget;
+--
+2.12.2
+