mirror of
https://github.com/yuezk/GlobalProtect-openconnect.git
synced 2025-05-20 07:26:58 -04:00
Compare commits
4 Commits
d01b8838b9
...
1.x
Author | SHA1 | Date | |
---|---|---|---|
|
edc13ed14d | ||
|
dd737bc8c5 | ||
|
939f2bd94a | ||
|
abffa21268 |
@@ -96,7 +96,6 @@ target_link_libraries(gpclient
|
|||||||
Qt5::DBus
|
Qt5::DBus
|
||||||
QtSignals
|
QtSignals
|
||||||
${QTKEYCHAIN_LIBRARIES}
|
${QTKEYCHAIN_LIBRARIES}
|
||||||
inih
|
|
||||||
)
|
)
|
||||||
|
|
||||||
if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 8.0 AND CMAKE_BUILD_TYPE STREQUAL Release)
|
if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 8.0 AND CMAKE_BUILD_TYPE STREQUAL Release)
|
||||||
|
@@ -151,7 +151,7 @@ void GatewayAuthenticator::samlAuth(QString samlMethod, QString samlRequest, QSt
|
|||||||
{
|
{
|
||||||
LOGI << "Trying to perform SAML login with saml-method " << samlMethod;
|
LOGI << "Trying to perform SAML login with saml-method " << samlMethod;
|
||||||
|
|
||||||
auto *loginWindow = new SAMLLoginWindow(gateway);
|
auto *loginWindow = new SAMLLoginWindow;
|
||||||
|
|
||||||
connect(loginWindow, &SAMLLoginWindow::success, [this, loginWindow](const QMap<QString, QString> &samlResult) {
|
connect(loginWindow, &SAMLLoginWindow::success, [this, loginWindow](const QMap<QString, QString> &samlResult) {
|
||||||
this->onSAMLLoginSuccess(samlResult);
|
this->onSAMLLoginSuccess(samlResult);
|
||||||
|
@@ -118,7 +118,7 @@ void PortalAuthenticator::samlAuth()
|
|||||||
{
|
{
|
||||||
LOGI << "Trying to perform SAML login with saml-method " << preloginResponse.samlMethod();
|
LOGI << "Trying to perform SAML login with saml-method " << preloginResponse.samlMethod();
|
||||||
|
|
||||||
auto *loginWindow = new SAMLLoginWindow(this->portal);
|
auto *loginWindow = new SAMLLoginWindow;
|
||||||
|
|
||||||
connect(loginWindow, &SAMLLoginWindow::success, [this, loginWindow](const QMap<QString, QString> samlResult) {
|
connect(loginWindow, &SAMLLoginWindow::success, [this, loginWindow](const QMap<QString, QString> samlResult) {
|
||||||
this->onSAMLLoginSuccess(samlResult);
|
this->onSAMLLoginSuccess(samlResult);
|
||||||
|
@@ -4,10 +4,9 @@
|
|||||||
#include <QWebEngineCookieStore>
|
#include <QWebEngineCookieStore>
|
||||||
#include <plog/Log.h>
|
#include <plog/Log.h>
|
||||||
|
|
||||||
#include "INIReader.h"
|
|
||||||
#include "samlloginwindow.h"
|
#include "samlloginwindow.h"
|
||||||
|
|
||||||
SAMLLoginWindow::SAMLLoginWindow(QString portal, QWidget *parent)
|
SAMLLoginWindow::SAMLLoginWindow(QWidget *parent)
|
||||||
: QDialog(parent)
|
: QDialog(parent)
|
||||||
, webView(new EnhancedWebView(this))
|
, webView(new EnhancedWebView(this))
|
||||||
{
|
{
|
||||||
@@ -24,9 +23,6 @@ SAMLLoginWindow::SAMLLoginWindow(QString portal, QWidget *parent)
|
|||||||
connect(webView, &EnhancedWebView::responseReceived, this, &SAMLLoginWindow::onResponseReceived);
|
connect(webView, &EnhancedWebView::responseReceived, this, &SAMLLoginWindow::onResponseReceived);
|
||||||
connect(webView, &EnhancedWebView::loadFinished, this, &SAMLLoginWindow::onLoadFinished);
|
connect(webView, &EnhancedWebView::loadFinished, this, &SAMLLoginWindow::onLoadFinished);
|
||||||
|
|
||||||
// Portal
|
|
||||||
this->portal = portal;
|
|
||||||
|
|
||||||
// Show the login window automatically when exceeds the MAX_WAIT_TIME
|
// Show the login window automatically when exceeds the MAX_WAIT_TIME
|
||||||
QTimer::singleShot(MAX_WAIT_TIME, this, [this]() {
|
QTimer::singleShot(MAX_WAIT_TIME, this, [this]() {
|
||||||
if (failed) {
|
if (failed) {
|
||||||
@@ -112,9 +108,6 @@ void SAMLLoginWindow::onLoadFinished()
|
|||||||
{
|
{
|
||||||
LOGI << "Load finished " << webView->page()->url().toString();
|
LOGI << "Load finished " << webView->page()->url().toString();
|
||||||
webView->page()->toHtml([this] (const QString &html) { this->handleHtml(html); });
|
webView->page()->toHtml([this] (const QString &html) { this->handleHtml(html); });
|
||||||
QMap<QString, QString> credentials = this->loadCredentials();
|
|
||||||
webView->page()->runJavaScript("document.getElementById('username').value='" + credentials["username"] + "';");
|
|
||||||
webView->page()->runJavaScript("document.getElementById('password').value='" + credentials["password"] + "';");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SAMLLoginWindow::handleHtml(const QString &html)
|
void SAMLLoginWindow::handleHtml(const QString &html)
|
||||||
@@ -141,25 +134,3 @@ QString SAMLLoginWindow::parseTag(const QString &tag, const QString &html) {
|
|||||||
const QRegularExpression expression(QString("<%1>(.*)</%1>").arg(tag));
|
const QRegularExpression expression(QString("<%1>(.*)</%1>").arg(tag));
|
||||||
return expression.match(html).captured(1);
|
return expression.match(html).captured(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
QMap<QString, QString> SAMLLoginWindow::loadCredentials()
|
|
||||||
{
|
|
||||||
std::string home = getenv("HOME");
|
|
||||||
std::string iniFile = home + "/.gpclient-credentials";
|
|
||||||
INIReader reader(iniFile);
|
|
||||||
|
|
||||||
QMap<QString, QString> credentials;
|
|
||||||
if (reader.ParseError() < 0) {
|
|
||||||
LOGE << "File '" << iniFile << "' not found.";
|
|
||||||
return credentials;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (reader.HasSection(this->portal.toStdString())) {
|
|
||||||
credentials.insert(QString("username"), QString::fromStdString(reader.Get(this->portal.toStdString(), "username", "")));
|
|
||||||
credentials.insert(QString("password"), QString::fromStdString(reader.Get(this->portal.toStdString(), "password", "")));
|
|
||||||
} else {
|
|
||||||
LOGE << "No credentials found for '" << this->portal.toStdString() << "' in '" << iniFile << "'";
|
|
||||||
}
|
|
||||||
|
|
||||||
return credentials;
|
|
||||||
}
|
|
@@ -12,10 +12,9 @@ class SAMLLoginWindow : public QDialog
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit SAMLLoginWindow(QString portal, QWidget *parent = nullptr);
|
explicit SAMLLoginWindow(QWidget *parent = nullptr);
|
||||||
|
|
||||||
void login(const QString samlMethod, const QString samlRequest, const QString preloginUrl);
|
void login(const QString samlMethod, const QString samlRequest, const QString preloginUrl);
|
||||||
QMap<QString, QString> loadCredentials();
|
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void success(QMap<QString, QString> samlResult);
|
void success(QMap<QString, QString> samlResult);
|
||||||
@@ -32,7 +31,6 @@ private:
|
|||||||
bool failed { false };
|
bool failed { false };
|
||||||
EnhancedWebView *webView { nullptr };
|
EnhancedWebView *webView { nullptr };
|
||||||
QMap<QString, QString> samlResult;
|
QMap<QString, QString> samlResult;
|
||||||
QString portal;
|
|
||||||
|
|
||||||
void closeEvent(QCloseEvent *event);
|
void closeEvent(QCloseEvent *event);
|
||||||
void handleHtml(const QString &html);
|
void handleHtml(const QString &html);
|
||||||
|
@@ -23,7 +23,7 @@ A GlobalProtect VPN client (GUI) for Linux based on Openconnect and built with Q
|
|||||||
|OS|Stable version | Development version|
|
|OS|Stable version | Development version|
|
||||||
|---|--------------|--------------------|
|
|---|--------------|--------------------|
|
||||||
|Linux Mint, Ubuntu 18.04 or later|[ppa:yuezk/globalprotect-openconnect](https://launchpad.net/~yuezk/+archive/ubuntu/globalprotect-openconnect)|[ppa:yuezk/globalprotect-openconnect-snapshot](https://launchpad.net/~yuezk/+archive/ubuntu/globalprotect-openconnect-snapshot)|
|
|Linux Mint, Ubuntu 18.04 or later|[ppa:yuezk/globalprotect-openconnect](https://launchpad.net/~yuezk/+archive/ubuntu/globalprotect-openconnect)|[ppa:yuezk/globalprotect-openconnect-snapshot](https://launchpad.net/~yuezk/+archive/ubuntu/globalprotect-openconnect-snapshot)|
|
||||||
|Arch, Manjaro|[globalprotect-openconnect](https://archlinux.org/packages/community/x86_64/globalprotect-openconnect/)|[AUR: globalprotect-openconnect-git](https://aur.archlinux.org/packages/globalprotect-openconnect-git/)|
|
|Arch, Manjaro|[globalprotect-openconnect](https://archlinux.org/packages/extra/x86_64/globalprotect-openconnect/)|[AUR: globalprotect-openconnect-git](https://aur.archlinux.org/packages/globalprotect-openconnect-git/)|
|
||||||
|Fedora|[copr: yuezk/globalprotect-openconnect](https://copr.fedorainfracloud.org/coprs/yuezk/globalprotect-openconnect/)|[copr: yuezk/globalprotect-openconnect](https://copr.fedorainfracloud.org/coprs/yuezk/globalprotect-openconnect/)|
|
|Fedora|[copr: yuezk/globalprotect-openconnect](https://copr.fedorainfracloud.org/coprs/yuezk/globalprotect-openconnect/)|[copr: yuezk/globalprotect-openconnect](https://copr.fedorainfracloud.org/coprs/yuezk/globalprotect-openconnect/)|
|
||||||
|openSUSE, CentOS 8|[OBS: globalprotect-openconnect](https://build.opensuse.org/package/show/home:yuezk/globalprotect-openconnect)|[OBS: globalprotect-openconnect-snapshot](https://build.opensuse.org/package/show/home:yuezk/globalprotect-openconnect-snapshot)|
|
|openSUSE, CentOS 8|[OBS: globalprotect-openconnect](https://build.opensuse.org/package/show/home:yuezk/globalprotect-openconnect)|[OBS: globalprotect-openconnect-snapshot](https://build.opensuse.org/package/show/home:yuezk/globalprotect-openconnect-snapshot)|
|
||||||
|
|
||||||
@@ -77,8 +77,9 @@ sudo dnf install globalprotect-openconnect
|
|||||||
|
|
||||||
- openSUSE Leap
|
- openSUSE Leap
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
sudo zypper ar https://download.opensuse.org/repositories/home:/yuezk/openSUSE_Leap_15.2/home:yuezk.repo
|
sudo zypper ar https://download.opensuse.org/repositories/home:/yuezk/15.4/home:yuezk.repo
|
||||||
|
|
||||||
sudo zypper ref
|
sudo zypper ref
|
||||||
sudo zypper install globalprotect-openconnect
|
sudo zypper install globalprotect-openconnect
|
||||||
```
|
```
|
||||||
|
Reference in New Issue
Block a user