mirror of
				https://github.com/yuezk/GlobalProtect-openconnect.git
				synced 2025-05-20 07:26:58 -04:00 
			
		
		
		
	Merge branch 'master' into develop
This commit is contained in:
		
							
								
								
									
										2
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							| @@ -31,6 +31,8 @@ jobs: | ||||
|       - name: Build | ||||
|         run: | | ||||
|           ./scripts/install-ubuntu.sh | ||||
|           # assert no library missing | ||||
|           test $(ldd $(which gpclient) | grep 'not found' | wc -l) -eq 0 | ||||
|  | ||||
|   snapshot-archive-all: | ||||
|     if: ${{ github.event_name != 'pull_request' && github.ref == 'refs/heads/develop' }} | ||||
|   | ||||
							
								
								
									
										6
									
								
								.github/workflows/pr.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.github/workflows/pr.yml
									
									
									
									
										vendored
									
									
								
							| @@ -17,7 +17,7 @@ jobs: | ||||
|     strategy: | ||||
|       matrix: | ||||
|         os: [ubuntu-18.04, ubuntu-20.04] | ||||
|      | ||||
|  | ||||
|     runs-on: ${{ matrix.os }} | ||||
|  | ||||
|     steps: | ||||
| @@ -28,4 +28,6 @@ jobs: | ||||
|  | ||||
|       - name: Build | ||||
|         run: | | ||||
|           ./scripts/install-ubuntu.sh | ||||
|           ./scripts/install-ubuntu.sh | ||||
|           # assert no library missing | ||||
|           test $(ldd $(which gpclient) | grep 'not found' | wc -l) -eq 0 | ||||
|   | ||||
							
								
								
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							| @@ -5,3 +5,6 @@ | ||||
| [submodule "plog"] | ||||
| 	path = 3rdparty/plog | ||||
| 	url = https://github.com/SergiusTheBest/plog.git | ||||
| [submodule "3rdparty/qtkeychain"] | ||||
| 	path = 3rdparty/qtkeychain | ||||
| 	url = git@github.com:frankosterfeld/qtkeychain.git | ||||
|   | ||||
							
								
								
									
										1
									
								
								3rdparty/qtkeychain
									
									
									
									
										vendored
									
									
										Submodule
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								3rdparty/qtkeychain
									
									
									
									
										vendored
									
									
										Submodule
									
								
							 Submodule 3rdparty/qtkeychain added at f197cdb935
									
								
							| @@ -64,6 +64,17 @@ add_3rdparty( | ||||
|         -DCMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE} | ||||
| ) | ||||
|  | ||||
| add_3rdparty( | ||||
|     qtkeychain | ||||
|     GIT_REPOSITORY https://github.com/frankosterfeld/qtkeychain.git | ||||
|     GIT_TAG master | ||||
|     CMAKE_ARGS | ||||
|         -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} | ||||
|         -DCMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE} | ||||
|         -DCMAKE_FIND_ROOT_PATH=${CMAKE_FIND_ROOT_PATH} | ||||
|         -DCMAKE_PREFIX_PATH=$ENV{CMAKE_PREFIX_PATH} | ||||
| ) | ||||
|  | ||||
| ExternalProject_Get_Property(SingleApplication-${PROJECT_NAME} SOURCE_DIR BINARY_DIR) | ||||
| set(SingleApplication_INCLUDE_DIR ${SOURCE_DIR}) | ||||
| set(SingleApplication_LIBRARY ${BINARY_DIR}/libSingleApplication.a) | ||||
| @@ -71,7 +82,16 @@ set(SingleApplication_LIBRARY ${BINARY_DIR}/libSingleApplication.a) | ||||
| ExternalProject_Get_Property(plog-${PROJECT_NAME} SOURCE_DIR) | ||||
| set(plog_INCLUDE_DIR "${SOURCE_DIR}/include") | ||||
|  | ||||
| add_dependencies(gpclient SingleApplication-${PROJECT_NAME} plog-${PROJECT_NAME}) | ||||
| ExternalProject_Get_Property(qtkeychain-${PROJECT_NAME} SOURCE_DIR BINARY_DIR) | ||||
| set(qtkeychain_INCLUDE_DIR "${SOURCE_DIR}") | ||||
| set(qtkeychain_BINARY_DIR "${BINARY_DIR}") | ||||
| set(qtkeychain_LIBRARY ${BINARY_DIR}/libqt5keychain.so) | ||||
|  | ||||
| add_dependencies(gpclient | ||||
|     SingleApplication-${PROJECT_NAME} | ||||
|     plog-${PROJECT_NAME} | ||||
|     qtkeychain-${PROJECT_NAME} | ||||
| ) | ||||
|  | ||||
| target_include_directories(gpclient PRIVATE | ||||
|     ${CMAKE_BINARY_DIR} | ||||
| @@ -79,10 +99,13 @@ target_include_directories(gpclient PRIVATE | ||||
|     ${CMAKE_CURRENT_BINARY_DIR} | ||||
|     ${SingleApplication_INCLUDE_DIR} | ||||
|     ${plog_INCLUDE_DIR} | ||||
|     ${qtkeychain_INCLUDE_DIR} | ||||
|     ${qtkeychain_BINARY_DIR} | ||||
| ) | ||||
|  | ||||
| target_link_libraries(gpclient | ||||
|     ${SingleApplication_LIBRARY} | ||||
|     ${qtkeychain_LIBRARY} | ||||
|     Qt5::Widgets | ||||
|     Qt5::Network | ||||
|     Qt5::WebSockets | ||||
|   | ||||
| @@ -61,12 +61,14 @@ void GPClient::setupSettings() | ||||
| void GPClient::onSettingsButtonClicked() | ||||
| { | ||||
|     settingsDialog->setClientos(settings::get("clientos", "Linux").toString()); | ||||
|     settingsDialog->setOsVersion(settings::get("os-version", QSysInfo::prettyProductName()).toString()); | ||||
|     settingsDialog->show(); | ||||
| } | ||||
|  | ||||
| void GPClient::onSettingsAccepted() | ||||
| { | ||||
|     settings::save("clientos", settingsDialog->clientos()); | ||||
|     settings::save("os-version", settingsDialog->osVersion()); | ||||
| } | ||||
|  | ||||
| void GPClient::on_connectButton_clicked() | ||||
| @@ -438,8 +440,14 @@ bool GPClient::connected() const | ||||
|  | ||||
| QList<GPGateway> GPClient::allGateways() const | ||||
| { | ||||
|     const QString gatewaysJson = settings::get(portal() + "_gateways").toString(); | ||||
|     return GPGateway::fromJson(gatewaysJson); | ||||
|  | ||||
|     QList<GPGateway> gateways; | ||||
|  | ||||
|     for (auto g :settings::get_all("_gateways$") ){ | ||||
|  | ||||
|     	gateways.append(GPGateway::fromJson(settings::get(g).toString())); | ||||
|     } | ||||
|     return gateways; | ||||
| } | ||||
|  | ||||
| void GPClient::setAllGateways(QList<GPGateway> gateways) | ||||
| @@ -467,6 +475,7 @@ void GPClient::setCurrentGateway(const GPGateway gateway) | ||||
|     LOGI << "Updating the current gateway to " << gateway.name(); | ||||
|  | ||||
|     settings::save(portal() + "_selectedGateway", gateway.name()); | ||||
|     ui->portalInput->setText(gateway.address()); | ||||
|     populateGatewayMenu(); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -9,9 +9,12 @@ | ||||
| #include <plog/Log.h> | ||||
| #include <QWebEngineProfile> | ||||
| #include <QWebEngineCookieStore> | ||||
| #include <keychain.h> | ||||
|  | ||||
| #include "gphelper.h" | ||||
|  | ||||
| using namespace QKeychain; | ||||
|  | ||||
| QNetworkAccessManager* gpclient::helper::networkManager = new QNetworkAccessManager; | ||||
|  | ||||
| QNetworkReply* gpclient::helper::createRequest(QString url, QByteArray params) | ||||
| @@ -115,6 +118,12 @@ QVariant gpclient::helper::settings::get(const QString &key, const QVariant &def | ||||
|     return _settings->value(key, defaultValue); | ||||
| } | ||||
|  | ||||
| QStringList gpclient::helper::settings::get_all(const QString &key, const QVariant &defaultValue) | ||||
| { | ||||
| 	QRegularExpression re(key); | ||||
| 	return 	_settings->allKeys().filter(re); | ||||
| } | ||||
|  | ||||
| void gpclient::helper::settings::save(const QString &key, const QVariant &value) | ||||
| { | ||||
|     _settings->setValue(key, value); | ||||
| @@ -132,3 +141,38 @@ void gpclient::helper::settings::clear() | ||||
|  | ||||
|     QWebEngineProfile::defaultProfile()->cookieStore()->deleteAllCookies(); | ||||
| } | ||||
|  | ||||
|  | ||||
| bool gpclient::helper::settings::secureSave(const QString &key, const QString &value) { | ||||
|     WritePasswordJob job( QLatin1String("gpclient") ); | ||||
|     job.setAutoDelete( false ); | ||||
|     job.setKey( key ); | ||||
|     job.setTextData( value ); | ||||
|     QEventLoop loop; | ||||
|     job.connect( &job, SIGNAL(finished(QKeychain::Job*)), &loop, SLOT(quit()) ); | ||||
|     job.start(); | ||||
|     loop.exec(); | ||||
|     if ( job.error() ) { | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| bool gpclient::helper::settings::secureGet(const QString &key, QString &value) { | ||||
|     ReadPasswordJob job( QLatin1String("gpclient") ); | ||||
|     job.setAutoDelete( false ); | ||||
|     job.setKey( key ); | ||||
|     QEventLoop loop; | ||||
|     job.connect( &job, SIGNAL(finished(QKeychain::Job*)), &loop, SLOT(quit()) ); | ||||
|     job.start(); | ||||
|     loop.exec(); | ||||
|  | ||||
|     const QString pw = job.textData(); | ||||
|     if ( job.error() ) { | ||||
|         return false; | ||||
|     } | ||||
|      | ||||
|     value = pw; | ||||
|     return true; | ||||
| } | ||||
| @@ -34,8 +34,12 @@ namespace gpclient { | ||||
|             static const QStringList reservedKeys {"extraArgs", "clientos"}; | ||||
|  | ||||
|             QVariant get(const QString &key, const QVariant &defaultValue = QVariant()); | ||||
|             QStringList get_all(const QString &key, const QVariant &defaultValue = QVariant()); | ||||
|             void save(const QString &key, const QVariant &value); | ||||
|             void clear(); | ||||
|  | ||||
|             bool secureSave(const QString &key, const QString &value); | ||||
|             bool secureGet(const QString &key, QString &value); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,6 +1,9 @@ | ||||
| #include <QtCore/QUrlQuery> | ||||
|  | ||||
| #include "loginparams.h" | ||||
| #include "gphelper.h" | ||||
|  | ||||
| using namespace gpclient::helper; | ||||
|  | ||||
| LoginParams::LoginParams(const QString clientos) | ||||
| { | ||||
| @@ -14,13 +17,18 @@ LoginParams::LoginParams(const QString clientos) | ||||
|     params.addQueryItem("ok", "Login"); | ||||
|     params.addQueryItem("direct", "yes"); | ||||
|     params.addQueryItem("clientVer", "4100"); | ||||
|     params.addQueryItem("os-version", QUrl::toPercentEncoding(QSysInfo::prettyProductName())); | ||||
|  | ||||
|     // add the clientos parameter if not empty | ||||
|     if (!clientos.isEmpty()) { | ||||
|         params.addQueryItem("clientos", clientos); | ||||
|     } | ||||
|  | ||||
|     auto osVersion = settings::get("os-version", "").toString(); | ||||
|     if (osVersion.isEmpty()) { | ||||
|         osVersion = QSysInfo::prettyProductName(); | ||||
|     } | ||||
|     params.addQueryItem("os-version", QUrl::toPercentEncoding(osVersion)); | ||||
|  | ||||
|     params.addQueryItem("portal-userauthcookie", ""); | ||||
|     params.addQueryItem("portal-prelogonuserauthcookie", ""); | ||||
|     params.addQueryItem("prelogin-cookie", ""); | ||||
|   | ||||
| @@ -32,3 +32,11 @@ QString SettingsDialog::clientos() | ||||
| { | ||||
|     return ui->clientosInput->text(); | ||||
| } | ||||
|  | ||||
| void SettingsDialog::setOsVersion(QString osVersion) { | ||||
|     ui->osVersionInput->setText(osVersion); | ||||
| } | ||||
|  | ||||
| QString SettingsDialog::osVersion() { | ||||
|     return ui->osVersionInput->text(); | ||||
| } | ||||
|   | ||||
| @@ -21,6 +21,9 @@ public: | ||||
|     void setClientos(QString clientos); | ||||
|     QString clientos(); | ||||
|  | ||||
|     void setOsVersion(QString osVersion); | ||||
|     QString osVersion(); | ||||
|  | ||||
| private: | ||||
|     Ui::SettingsDialog *ui; | ||||
| }; | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|     <x>0</x> | ||||
|     <y>0</y> | ||||
|     <width>488</width> | ||||
|     <height>177</height> | ||||
|     <height>220</height> | ||||
|    </rect> | ||||
|   </property> | ||||
|   <property name="sizePolicy"> | ||||
| @@ -44,7 +44,7 @@ | ||||
|    <item row="1" column="0"> | ||||
|     <widget class="QLabel" name="label_2"> | ||||
|      <property name="text"> | ||||
|       <string>Value of "clientos":</string> | ||||
|       <string>clientos:</string> | ||||
|      </property> | ||||
|     </widget> | ||||
|    </item> | ||||
| @@ -55,7 +55,7 @@ | ||||
|      </property> | ||||
|     </widget> | ||||
|    </item> | ||||
|    <item row="2" column="1"> | ||||
|    <item row="3" column="1"> | ||||
|     <widget class="QDialogButtonBox" name="buttonBox"> | ||||
|      <property name="orientation"> | ||||
|       <enum>Qt::Horizontal</enum> | ||||
| @@ -65,6 +65,16 @@ | ||||
|      </property> | ||||
|     </widget> | ||||
|    </item> | ||||
|    <item row="2" column="1"> | ||||
|     <widget class="QLineEdit" name="osVersionInput"/> | ||||
|    </item> | ||||
|    <item row="2" column="0"> | ||||
|     <widget class="QLabel" name="label_3"> | ||||
|      <property name="text"> | ||||
|       <string>os-version:</string> | ||||
|      </property> | ||||
|     </widget> | ||||
|    </item> | ||||
|   </layout> | ||||
|  </widget> | ||||
|  <resources> | ||||
|   | ||||
| @@ -2,6 +2,9 @@ | ||||
|  | ||||
| #include "standardloginwindow.h" | ||||
| #include "ui_standardloginwindow.h" | ||||
| #include "gphelper.h" | ||||
|  | ||||
| using namespace gpclient::helper; | ||||
|  | ||||
| StandardLoginWindow::StandardLoginWindow(const QString &portalAddress, const QString &labelUsername, | ||||
|                                          const QString &labelPassword, const QString &authMessage) : | ||||
| @@ -13,11 +16,24 @@ StandardLoginWindow::StandardLoginWindow(const QString &portalAddress, const QSt | ||||
|     ui->password->setPlaceholderText(labelPassword); | ||||
|     ui->authMessage->setText(authMessage); | ||||
|  | ||||
|     autocomplete(); | ||||
|  | ||||
|     setWindowTitle("GlobalProtect Login"); | ||||
|     setFixedSize(width(), height()); | ||||
|     setModal(true); | ||||
| } | ||||
|  | ||||
| void StandardLoginWindow::autocomplete() { | ||||
|     QString username, password; | ||||
|     settings::secureGet("username", username); | ||||
|     settings::secureGet("password", password); | ||||
|  | ||||
|     if (!username.isEmpty() && !password.isEmpty()) { | ||||
|         ui->username->setText(username); | ||||
|         ui->password->setText(password); | ||||
|     } | ||||
| } | ||||
|  | ||||
| void StandardLoginWindow::setProcessing(bool isProcessing) { | ||||
|     ui->username->setReadOnly(isProcessing); | ||||
|     ui->password->setReadOnly(isProcessing); | ||||
| @@ -32,6 +48,9 @@ void StandardLoginWindow::on_loginButton_clicked() { | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     settings::secureSave("username", username); | ||||
|     settings::secureSave("password", password); | ||||
|  | ||||
|     emit performLogin(username, password); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -28,6 +28,7 @@ private: | ||||
|     Ui::StandardLoginWindow *ui; | ||||
|  | ||||
|     void closeEvent(QCloseEvent *event); | ||||
|     void autocomplete(); | ||||
| }; | ||||
|  | ||||
| #endif // STANDARDLOGINWINDOW_H | ||||
|   | ||||
| @@ -199,7 +199,9 @@ void GPService::onProcessStdout() | ||||
|     QString output = openconnect->readAllStandardOutput(); | ||||
|  | ||||
|     log(output); | ||||
|     if (output.indexOf("Connected as") >= 0 || output.indexOf("Configured as") >= 0) { | ||||
|     if (output.indexOf("Connected as") >= 0 || | ||||
|         output.indexOf("Configured as") >= 0 || | ||||
|         output.indexOf("Configurado como") >= 0) { | ||||
|         vpnStatus = GPService::VpnConnected; | ||||
|         emit connected(); | ||||
|     } | ||||
|   | ||||
| @@ -97,6 +97,14 @@ git clone https://github.com/yuezk/GlobalProtect-openconnect.git | ||||
| cd GlobalProtect-openconnect | ||||
| ``` | ||||
|  | ||||
| ### MX Linux | ||||
| The following instructions are for **MX-21.2.1_x64 KDE**. | ||||
|  | ||||
| ```sh | ||||
| sudo apt install qttools5-dev libsecret-1-dev libqt5keychain1 | ||||
| ./scripts/install-debian.sh | ||||
| ``` | ||||
|  | ||||
| ### Ubuntu/Mint | ||||
|  | ||||
| > **⚠️ REQUIRED for Ubuntu 18.04 ⚠️** | ||||
| @@ -138,6 +146,7 @@ Install the Qt5 dependencies and OpenConnect: | ||||
| - QtWebSockets | ||||
| - QtDBus | ||||
| - openconnect v8.x | ||||
| - qtkeychain | ||||
|  | ||||
| ...then build and install with: | ||||
|  | ||||
|   | ||||
							
								
								
									
										14
									
								
								scripts/install-debian.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										14
									
								
								scripts/install-debian.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| #!/bin/bash -e | ||||
|  | ||||
| sudo apt-get update | ||||
| sudo apt-get install -y \ | ||||
|     build-essential \ | ||||
|     qtbase5-dev \ | ||||
|     libqt5websockets5-dev \ | ||||
|     qtwebengine5-dev \ | ||||
|     qttools5-dev \ | ||||
|     libsecret-1-dev \ | ||||
|     openconnect \ | ||||
| 	libqt5keychain1 | ||||
|  | ||||
| ./scripts/install.sh | ||||
| @@ -4,6 +4,7 @@ sudo dnf install -y \ | ||||
|     qt5-qtbase-devel \ | ||||
|     qt5-qtwebengine-devel \ | ||||
|     qt5-qtwebsockets-devel \ | ||||
|     openconnect | ||||
|     openconnect \ | ||||
| 	qtkeychain | ||||
|  | ||||
| ./scripts/install.sh | ||||
| ./scripts/install.sh | ||||
|   | ||||
| @@ -4,6 +4,7 @@ sudo zypper install -y \ | ||||
|     libqt5-qtbase-devel \ | ||||
|     libqt5-qtwebsockets-devel \ | ||||
|     libqt5-qtwebengine-devel \ | ||||
|     openconnect | ||||
|     openconnect \ | ||||
| 	qtkeychain-qt5 | ||||
|  | ||||
| ./scripts/install.sh | ||||
| ./scripts/install.sh | ||||
|   | ||||
| @@ -6,6 +6,8 @@ sudo apt-get install -y \ | ||||
|     qtbase5-dev \ | ||||
|     libqt5websockets5-dev \ | ||||
|     qtwebengine5-dev \ | ||||
|     openconnect | ||||
| 	qttools5-dev \ | ||||
|     openconnect \ | ||||
| 	libqt5keychain1 | ||||
|  | ||||
| ./scripts/install.sh | ||||
|   | ||||
		Reference in New Issue
	
	Block a user