From 1e2322b9387cf25eb00ce2d0a807f790fda6d3bb Mon Sep 17 00:00:00 2001 From: Kevin Yue Date: Fri, 29 May 2020 23:38:51 +0800 Subject: [PATCH] Fix saml login for portal-userauthcookie (#12) --- GPClient/gatewayauthenticator.cpp | 7 ++++++- GPClient/portalauthenticator.cpp | 11 ++++++++--- GPClient/portalauthenticator.h | 2 +- GPClient/samlloginwindow.cpp | 13 +++++++++++-- 4 files changed, 26 insertions(+), 7 deletions(-) diff --git a/GPClient/gatewayauthenticator.cpp b/GPClient/gatewayauthenticator.cpp index 4b4c993..59aa5c1 100644 --- a/GPClient/gatewayauthenticator.cpp +++ b/GPClient/gatewayauthenticator.cpp @@ -151,11 +151,16 @@ void GatewayAuthenticator::samlAuth(QString samlMethod, QString samlRequest, QSt void GatewayAuthenticator::onSAMLLoginSuccess(const QMap &samlResult) { - PLOGI << "SAML login succeeded, got the prelogin cookie " << samlResult.value("preloginCookie"); + if (samlResult.contains("preloginCookie")) { + PLOGI << "SAML login succeeded, got the prelogin-cookie " << samlResult.value("preloginCookie"); + } else { + PLOGI << "SAML login succeeded, got the portal-userauthcookie " << samlResult.value("userAuthCookie"); + } LoginParams params; params.setUser(samlResult.value("username")); params.setPreloginCookie(samlResult.value("preloginCookie")); + params.setUserAuthCookie(samlResult.value("userAuthCookie")); login(params); } diff --git a/GPClient/portalauthenticator.cpp b/GPClient/portalauthenticator.cpp index 6de27f8..043f79c 100644 --- a/GPClient/portalauthenticator.cpp +++ b/GPClient/portalauthenticator.cpp @@ -124,9 +124,13 @@ void PortalAuthenticator::samlAuth() void PortalAuthenticator::onSAMLLoginSuccess(const QMap samlResult) { - PLOGI << "SAML login succeeded, got the prelogin cookie " << samlResult.value("preloginCookie"); + if (samlResult.contains("preloginCookie")) { + PLOGI << "SAML login succeeded, got the prelogin-cookie " << samlResult.value("preloginCookie"); + } else { + PLOGI << "SAML login succeeded, got the portal-userauthcookie " << samlResult.value("userAuthCookie"); + } - fetchConfig(samlResult.value("username"), "", samlResult.value("preloginCookie")); + fetchConfig(samlResult.value("username"), "", samlResult.value("preloginCookie"), samlResult.value("userAuthCookie")); } void PortalAuthenticator::onSAMLLoginFail(const QString msg) @@ -134,13 +138,14 @@ void PortalAuthenticator::onSAMLLoginFail(const QString msg) emitFail(msg); } -void PortalAuthenticator::fetchConfig(QString username, QString password, QString preloginCookie) +void PortalAuthenticator::fetchConfig(QString username, QString password, QString preloginCookie, QString userAuthCookie) { LoginParams params; params.setServer(portal); params.setUser(username); params.setPassword(password); params.setPreloginCookie(preloginCookie); + params.setUserAuthCookie(userAuthCookie); // Save the username and password for future use. this->username = username; diff --git a/GPClient/portalauthenticator.h b/GPClient/portalauthenticator.h index 073daf3..2d52f47 100644 --- a/GPClient/portalauthenticator.h +++ b/GPClient/portalauthenticator.h @@ -47,7 +47,7 @@ private: void tryAutoLogin(); void normalAuth(); void samlAuth(); - void fetchConfig(QString username, QString password, QString preloginCookie = ""); + void fetchConfig(QString username, QString password, QString preloginCookie = "", QString userAuthCookie = ""); void emitFail(const QString& msg = ""); }; diff --git a/GPClient/samlloginwindow.cpp b/GPClient/samlloginwindow.cpp index 2d11dd6..e7de560 100644 --- a/GPClient/samlloginwindow.cpp +++ b/GPClient/samlloginwindow.cpp @@ -59,11 +59,19 @@ void SAMLLoginWindow::onResponseReceived(QJsonObject params) const QString username = headers.value("saml-username").toString(); const QString preloginCookie = headers.value("prelogin-cookie").toString(); + const QString userAuthCookie = headers.value("portal-userauthcookie").toString(); - if (!username.isEmpty() && !preloginCookie.isEmpty()) { + if (!username.isEmpty()) { samlResult.insert("username", username); + } + + if (!preloginCookie.isEmpty()) { samlResult.insert("preloginCookie", preloginCookie); } + + if (!userAuthCookie.isEmpty()) { + samlResult.insert("userAuthCookie", userAuthCookie); + } } void SAMLLoginWindow::onLoadFinished() @@ -71,7 +79,8 @@ void SAMLLoginWindow::onLoadFinished() LOGI << "Load finished " << this->webView->page()->url().toString(); // Check the SAML result - if (!samlResult.value("username").isEmpty() && !samlResult.value("preloginCookie").isEmpty()) { + if (samlResult.contains("username") + && (samlResult.contains("preloginCookie") || samlResult.contains("userAuthCookie"))) { emit success(samlResult); accept(); } else {