mirror of
				https://github.com/yuezk/GlobalProtect-openconnect.git
				synced 2025-05-20 07:26:58 -04:00 
			
		
		
		
	Compare commits
	
		
			13 Commits
		
	
	
		
			3daad748ae
			...
			18d4e1ea28
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 18d4e1ea28 | ||
|  | 8ec07c0486 | ||
|  | 09e4a5c227 | ||
|  | bd29c20f4c | ||
|  | 016e1a4494 | ||
|  | a55616b66a | ||
|  | 9db62448d9 | ||
|  | c20ab0f393 | ||
|  | e1af1da764 | ||
|  | 3d3d7038db | ||
|  | d1ec358b8a | ||
|  | 354f50b671 | ||
|  | e8a64539aa | 
							
								
								
									
										433
									
								
								.github/workflows/build.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										433
									
								
								.github/workflows/build.yaml
									
									
									
									
										vendored
									
									
								
							| @@ -33,9 +33,11 @@ jobs: | ||||
|       uses: actions/upload-artifact@v3 | ||||
|       with: | ||||
|         name: artifact-tarball | ||||
|         if-no-files-found: error | ||||
|         path: | | ||||
|           globalprotect-openconnect-*.tar.gz | ||||
|   deb: | ||||
|           gp/.build/tarball/*.tar.gz | ||||
|  | ||||
|   build-deb: | ||||
|     runs-on: ubuntu-latest | ||||
|     needs: [tarball] | ||||
|     container: | ||||
| @@ -50,12 +52,14 @@ jobs: | ||||
|         name: artifact-tarball | ||||
|     - name: Build DEB package | ||||
|       run: | | ||||
|         tar -xzf globalprotect-openconnect-*.tar.gz | ||||
|         tar -xzf *.tar.gz | ||||
|         cd globalprotect-openconnect-* | ||||
|         make deb | ||||
|  | ||||
|         make deb BUILD_FE=0 | ||||
|     - name: Install DEB package | ||||
|       run: | | ||||
|         sudo dpkg -i globalprotect-openconnect_*.deb | ||||
|         cd globalprotect-openconnect-*/ | ||||
|         sudo dpkg -i .build/deb/*.deb | ||||
|  | ||||
|         gpclient --version | ||||
|         gpservice --version | ||||
| @@ -65,10 +69,11 @@ jobs: | ||||
|       uses: actions/upload-artifact@v3 | ||||
|       with: | ||||
|         name: artifact-deb | ||||
|         if-no-files-found: error | ||||
|         path: | | ||||
|           globalprotect-openconnect_*.deb | ||||
|           globalprotect-openconnect-*/.build/deb/*.deb | ||||
|  | ||||
|   rpm: | ||||
|   build-rpm: | ||||
|     runs-on: ubuntu-latest | ||||
|     needs: [tarball] | ||||
|     container: | ||||
| @@ -85,7 +90,8 @@ jobs: | ||||
|       run: | | ||||
|         tar -xzf globalprotect-openconnect-*.tar.gz | ||||
|         cd globalprotect-openconnect-*/ | ||||
|         make rpm | ||||
|  | ||||
|         make rpm BUILD_FE=0 | ||||
|     - name: Install RPM package | ||||
|       run: | | ||||
|         cd globalprotect-openconnect-*/ | ||||
| @@ -101,300 +107,147 @@ jobs: | ||||
|       uses: actions/upload-artifact@v3 | ||||
|       with: | ||||
|         name: artifact-rpm | ||||
|         if-no-files-found: error | ||||
|         path: | | ||||
|           globalprotect-openconnect-*/.build/rpm/*.rpm | ||||
|  | ||||
|   # Include arm64 if ref is a tag | ||||
|   # setup-matrix: | ||||
|   #   runs-on: ubuntu-latest | ||||
|   #   outputs: | ||||
|   #     matrix: ${{ steps.set-matrix.outputs.matrix }} | ||||
|   #   steps: | ||||
|   #     - name: Set up matrix | ||||
|   #       id: set-matrix | ||||
|   #       run: | | ||||
|   #         if [[ "${{ github.ref }}" == "refs/tags/"* ]]; then | ||||
|   #           echo "matrix=[\"amd64\", \"arm64\"]" >> $GITHUB_OUTPUT | ||||
|   #         else | ||||
|   #           echo "matrix=[\"amd64\"]" >> $GITHUB_OUTPUT | ||||
|   #         fi | ||||
|   build-pkgbuild: | ||||
|     runs-on: ubuntu-latest | ||||
|     needs: [tarball] | ||||
|     container: | ||||
|       image: yuezk/gpdev:pkgbuild | ||||
|       credentials: | ||||
|         username: ${{ secrets.DOCKER_HUB_USERNAME }} | ||||
|         password: ${{ secrets.DOCKER_HUB_TOKEN }} | ||||
|     steps: | ||||
|     - name: Download tarball | ||||
|       uses: actions/download-artifact@v3 | ||||
|       with: | ||||
|         name: artifact-tarball | ||||
|     - name: Build PKGBUILD package | ||||
|       run: | | ||||
|         tar -xzf globalprotect-openconnect-*.tar.gz | ||||
|         cd globalprotect-openconnect-*/ | ||||
|  | ||||
|   # build-fe: | ||||
|   #   runs-on: ubuntu-latest | ||||
|   #   steps: | ||||
|   #     - name: Checkout gpgui repo | ||||
|   #       uses: actions/checkout@v3 | ||||
|   #       with: | ||||
|   #         token: ${{ secrets.GH_PAT }} | ||||
|   #         repository: yuezk/gpgui | ||||
|         make pkgbuild BUILD_FE=0 | ||||
|     - name: Install PKGBUILD package | ||||
|       run: | | ||||
|         cd globalprotect-openconnect-*/ | ||||
|         sudo pacman -U --noconfirm .build/pkgbuild/*.pkg.tar.zst | ||||
|  | ||||
|   #     - name: Install Node.js | ||||
|   #       uses: actions/setup-node@v4 | ||||
|   #       with: | ||||
|   #         node-version: 18 | ||||
|         gpclient --version | ||||
|         gpservice --version | ||||
|         gpauth --version | ||||
|         gpgui-helper --version | ||||
|     - name: Upload PKGBUILD package | ||||
|       uses: actions/upload-artifact@v3 | ||||
|       with: | ||||
|         name: artifact-pkgbuild | ||||
|         if-no-files-found: error | ||||
|         path: | | ||||
|           globalprotect-openconnect-*/.build/pkgbuild/*.pkg.tar.zst | ||||
|  | ||||
|   #     - uses: pnpm/action-setup@v2 | ||||
|   #       with: | ||||
|   #         version: 8 | ||||
|   build-binary: | ||||
|     runs-on: ubuntu-latest | ||||
|     needs: [tarball] | ||||
|     container: | ||||
|       image: yuezk/gpdev:main | ||||
|       credentials: | ||||
|         username: ${{ secrets.DOCKER_HUB_USERNAME }} | ||||
|         password: ${{ secrets.DOCKER_HUB_TOKEN }} | ||||
|     steps: | ||||
|       - name: Download tarball | ||||
|         uses: actions/download-artifact@v3 | ||||
|         with: | ||||
|           name: artifact-tarball | ||||
|       - name: Build binary using OFFLINE mode | ||||
|         run: | | ||||
|           tar -xzf globalprotect-openconnect-*.tar.gz | ||||
|           cd globalprotect-openconnect-*/ | ||||
|  | ||||
|   #     - name: Install dependencies | ||||
|   #       run: | | ||||
|   #         cd app | ||||
|   #         pnpm install | ||||
|   #     - name: Build | ||||
|   #       run: | | ||||
|   #         cd app | ||||
|   #         pnpm run build | ||||
|           make binary OFFLINE=1 | ||||
|       - name: Install binary | ||||
|         run: | | ||||
|           cd globalprotect-openconnect-*/ | ||||
|           cd .build/binary/globalprotect-openconnect_*_$(uname -m) | ||||
|  | ||||
|   #     - name: Upload artifacts | ||||
|   #       uses: actions/upload-artifact@v3 | ||||
|   #       with: | ||||
|   #         name: gpgui-fe | ||||
|   #         path: app/dist | ||||
|           sudo make install | ||||
|           gpclient --version | ||||
|           gpservice --version | ||||
|           gpauth --version | ||||
|           gpgui-helper --version | ||||
|       - name: Upload binary | ||||
|         uses: actions/upload-artifact@v3 | ||||
|         with: | ||||
|           name: artifact-binary | ||||
|           if-no-files-found: error | ||||
|           path: | | ||||
|             globalprotect-openconnect-*/.build/binary/*.bin.tar.xz* | ||||
|  | ||||
|   # build-tauri-amd64: | ||||
|   #   needs: [build-fe] | ||||
|   #   runs-on: ubuntu-latest | ||||
|   #   steps: | ||||
|   #     - name: Checkout gpgui repo | ||||
|   #       uses: actions/checkout@v3 | ||||
|   #       with: | ||||
|   #         token: ${{ secrets.GH_PAT }} | ||||
|   #         repository: yuezk/gpgui | ||||
|   #         path: gpgui | ||||
|   build-gpgui: | ||||
|     runs-on: ubuntu-latest | ||||
|     container: | ||||
|       image: yuezk/gpdev:main | ||||
|       credentials: | ||||
|         username: ${{ secrets.DOCKER_HUB_USERNAME }} | ||||
|         password: ${{ secrets.DOCKER_HUB_TOKEN }} | ||||
|     steps: | ||||
|     - uses: pnpm/action-setup@v2 | ||||
|       with: | ||||
|         version: 8 | ||||
|     - name: Checkout GlobalProtect-openconnect | ||||
|       uses: actions/checkout@v3 | ||||
|       with: | ||||
|         token: ${{ secrets.GH_PAT }} | ||||
|         repository: yuezk/GlobalProtect-openconnect | ||||
|         path: gp | ||||
|     - name: Checkout gpgui | ||||
|       uses: actions/checkout@v3 | ||||
|       with: | ||||
|         token: ${{ secrets.GH_PAT }} | ||||
|         repository: yuezk/gpgui | ||||
|         path: gpgui | ||||
|     - name: Build gpgui | ||||
|       run: | | ||||
|         cd gpgui | ||||
|         make package | ||||
|  | ||||
|   #     - name: Checkout gp repo | ||||
|   #       uses: actions/checkout@v3 | ||||
|   #       with: | ||||
|   #         token: ${{ secrets.GH_PAT }} | ||||
|   #         repository: yuezk/GlobalProtect-openconnect | ||||
|   #         path: gp | ||||
|         ./target/release/gpgui --version | ||||
|     - name: Upload gpgui | ||||
|       uses: actions/upload-artifact@v3 | ||||
|       with: | ||||
|         name: artifact-gpgui | ||||
|         if-no-files-found: error | ||||
|         path: | | ||||
|           gpgui/.build/package/*.tar.xz* | ||||
|  | ||||
|   #     - name: Download gpgui-fe artifact | ||||
|   #       uses: actions/download-artifact@v3 | ||||
|   #       with: | ||||
|   #         name: gpgui-fe | ||||
|   #         path: gpgui/app/dist | ||||
|  | ||||
|   #     - name: Login to Docker Hub | ||||
|   #       uses: docker/login-action@v3 | ||||
|   #       with: | ||||
|   #         username: ${{ secrets.DOCKER_HUB_USERNAME }} | ||||
|   #         password: ${{ secrets.DOCKER_HUB_TOKEN }} | ||||
|  | ||||
|   #     - name: Build Tauri in Docker | ||||
|   #       run: | | ||||
|   #         docker run \ | ||||
|   #           --rm \ | ||||
|   #           -v $(pwd):/${{ github.workspace }} \ | ||||
|   #           -w ${{ github.workspace }} \ | ||||
|   #           -e CI=true \ | ||||
|   #           yuezk/gpdev:main \ | ||||
|   #           "./gpgui/scripts/build.sh" | ||||
|  | ||||
|   #     - name: Upload artifacts | ||||
|   #       uses: actions/upload-artifact@v3 | ||||
|   #       with: | ||||
|   #         name: artifact-amd64-tauri | ||||
|   #         path: | | ||||
|   #           gpgui/.tmp/artifact | ||||
|  | ||||
|   # build-tauri-arm64: | ||||
|   gh-release: | ||||
|     # if: startsWith(github.ref, 'refs/tags/') | ||||
|   #   needs: [build-fe] | ||||
|   #   runs-on: self-hosted | ||||
|   #   steps: | ||||
|   #     - name: Checkout gpgui repo | ||||
|   #       uses: actions/checkout@v3 | ||||
|   #       with: | ||||
|   #         token: ${{ secrets.GH_PAT }} | ||||
|   #         repository: yuezk/gpgui | ||||
|   #         path: gpgui | ||||
|     runs-on: ubuntu-latest | ||||
|     needs: | ||||
|       - build-deb | ||||
|       - build-rpm | ||||
|       - build-pkgbuild | ||||
|       - build-binary | ||||
|       - build-gpgui | ||||
|  | ||||
|   #     - name: Checkout gp repo | ||||
|   #       uses: actions/checkout@v3 | ||||
|   #       with: | ||||
|   #         token: ${{ secrets.GH_PAT }} | ||||
|   #         repository: yuezk/GlobalProtect-openconnect | ||||
|   #         path: gp | ||||
|     steps: | ||||
|       - name: Download all artifacts | ||||
|         uses: actions/download-artifact@v3 | ||||
|         with: | ||||
|           path: artifact | ||||
|  | ||||
|   #     - name: Download gpgui-fe artifact | ||||
|   #       uses: actions/download-artifact@v3 | ||||
|   #       with: | ||||
|   #         name: gpgui-fe | ||||
|   #         path: gpgui/app/dist | ||||
|   #     - name: Build Tauri | ||||
|   #       run: | | ||||
|   #         ./gpgui/scripts/build.sh | ||||
|  | ||||
|   #     - name: Upload artifacts | ||||
|   #       uses: actions/upload-artifact@v3 | ||||
|   #       with: | ||||
|   #         name: artifact-arm64-tauri | ||||
|   #         path: | | ||||
|   #           gpgui/.tmp/artifact | ||||
|  | ||||
|   # package-tarball: | ||||
|   #   needs: [build-tauri-amd64, build-tauri-arm64] | ||||
|   #   runs-on: ubuntu-latest | ||||
|   #   steps: | ||||
|   #     - name: Checkout gpgui repo | ||||
|   #       uses: actions/checkout@v3 | ||||
|   #       with: | ||||
|   #         token: ${{ secrets.GH_PAT }} | ||||
|   #         repository: yuezk/gpgui | ||||
|   #         path: gpgui | ||||
|  | ||||
|   #     - name: Download artifact-amd64-tauri | ||||
|   #       uses: actions/download-artifact@v3 | ||||
|   #       with: | ||||
|   #         name: artifact-amd64-tauri | ||||
|   #         path: gpgui/.tmp/artifact | ||||
|  | ||||
|   #     - name: Download artifact-arm64-tauri | ||||
|   #       uses: actions/download-artifact@v3 | ||||
|   #       with: | ||||
|   #         name: artifact-arm64-tauri | ||||
|   #         path: gpgui/.tmp/artifact | ||||
|  | ||||
|   #     - name: Create tarball | ||||
|   #       run: | | ||||
|   #         ./gpgui/scripts/build-tarball.sh | ||||
|  | ||||
|   #     - name: Upload tarball | ||||
|   #       uses: actions/upload-artifact@v3 | ||||
|   #       with: | ||||
|   #         name: artifact-tarball | ||||
|   #         path: | | ||||
|   #           gpgui/.tmp/tarball/*.tar.gz | ||||
|  | ||||
|   # package-rpm: | ||||
|   #   needs: [setup-matrix, package-tarball] | ||||
|   #   runs-on: ubuntu-latest | ||||
|   #   strategy: | ||||
|   #     matrix: | ||||
|   #       arch: ${{ fromJson(needs.setup-matrix.outputs.matrix) }} | ||||
|   #   steps: | ||||
|   #     - name: Checkout gpgui repo | ||||
|   #       uses: actions/checkout@v3 | ||||
|   #       with: | ||||
|   #         token: ${{ secrets.GH_PAT }} | ||||
|   #         repository: yuezk/gpgui | ||||
|   #         path: gpgui | ||||
|  | ||||
|   #     - name: Download package tarball | ||||
|   #       uses: actions/download-artifact@v3 | ||||
|   #       with: | ||||
|   #         name: artifact-tarball | ||||
|   #         path: gpgui/.tmp/artifact | ||||
|  | ||||
|   #     - name: Set up QEMU | ||||
|   #       uses: docker/setup-qemu-action@v3 | ||||
|   #       with: | ||||
|   #         platforms: ${{ matrix.arch }} | ||||
|  | ||||
|   #     - name: Login to Docker Hub | ||||
|   #       uses: docker/login-action@v3 | ||||
|   #       with: | ||||
|   #         username: ${{ secrets.DOCKER_HUB_USERNAME }} | ||||
|   #         password: ${{ secrets.DOCKER_HUB_TOKEN }} | ||||
|  | ||||
|   #     - name: Create RPM package | ||||
|   #       run: | | ||||
|   #         docker run \ | ||||
|   #           --rm \ | ||||
|   #           -v $(pwd):/${{ github.workspace }} \ | ||||
|   #           -w ${{ github.workspace }} \ | ||||
|   #           --platform linux/${{ matrix.arch }} \ | ||||
|   #           yuezk/gpdev:rpm-builder \ | ||||
|   #           "./gpgui/scripts/build-rpm.sh" | ||||
|  | ||||
|   #     - name: Upload rpm artifacts | ||||
|   #       uses: actions/upload-artifact@v3 | ||||
|   #       with: | ||||
|   #         name: artifact-${{ matrix.arch }}-rpm | ||||
|   #         path: | | ||||
|   #           gpgui/.tmp/artifact/*.rpm | ||||
|  | ||||
|   # package-pkgbuild: | ||||
|   #   needs: [setup-matrix, build-tauri-amd64, build-tauri-arm64] | ||||
|   #   runs-on: ubuntu-latest | ||||
|   #   strategy: | ||||
|   #     matrix: | ||||
|   #       arch: ${{ fromJson(needs.setup-matrix.outputs.matrix) }} | ||||
|   #   steps: | ||||
|   #     - name: Checkout gpgui repo | ||||
|   #       uses: actions/checkout@v3 | ||||
|   #       with: | ||||
|   #         token: ${{ secrets.GH_PAT }} | ||||
|   #         repository: yuezk/gpgui | ||||
|   #         path: gpgui | ||||
|  | ||||
|   #     - name: Download artifact-${{ matrix.arch }} | ||||
|   #       uses: actions/download-artifact@v3 | ||||
|   #       with: | ||||
|   #         name: artifact-${{ matrix.arch }}-tauri | ||||
|   #         path: gpgui/.tmp/artifact | ||||
|  | ||||
|   #     - name: Set up QEMU | ||||
|   #       uses: docker/setup-qemu-action@v3 | ||||
|   #       with: | ||||
|   #         platforms: ${{ matrix.arch }} | ||||
|  | ||||
|   #     - name: Login to Docker Hub | ||||
|   #       uses: docker/login-action@v3 | ||||
|   #       with: | ||||
|   #         username: ${{ secrets.DOCKER_HUB_USERNAME }} | ||||
|   #         password: ${{ secrets.DOCKER_HUB_TOKEN }} | ||||
|  | ||||
|   #     - name: Generate PKGBUILD | ||||
|   #       run: | | ||||
|   #         export CI_ARCH=${{ matrix.arch }} | ||||
|   #         ./gpgui/scripts/generate-pkgbuild.sh | ||||
|  | ||||
|   #     - name: Build PKGBUILD package | ||||
|   #       run: | | ||||
|   #         # Build package | ||||
|   #         docker run \ | ||||
|   #           --rm \ | ||||
|   #           -v $(pwd)/gpgui/.tmp/pkgbuild:/pkgbuild \ | ||||
|   #           --platform linux/${{ matrix.arch }} \ | ||||
|   #           yuezk/gpdev:pkgbuild | ||||
|  | ||||
|   #     - name: Upload pkgbuild artifacts | ||||
|   #       uses: actions/upload-artifact@v3 | ||||
|   #       with: | ||||
|   #         name: artifact-${{ matrix.arch }}-pkgbuild | ||||
|   #         path: | | ||||
|   #           gpgui/.tmp/pkgbuild/*.pkg.tar.zst | ||||
|  | ||||
|   # gh-release: | ||||
|   #   if: startsWith(github.ref, 'refs/tags/') | ||||
|   #   runs-on: ubuntu-latest | ||||
|   #   needs: | ||||
|   #     - package-rpm | ||||
|   #     - package-pkgbuild | ||||
|  | ||||
|   #   steps: | ||||
|   #     - name: Download artifact | ||||
|   #       uses: actions/download-artifact@v3 | ||||
|   #       with: | ||||
|   #         path: artifact | ||||
|   #         # pattern: artifact-* | ||||
|   #         # merge-multiple: true | ||||
|  | ||||
|   #     # - name: Generate checksum | ||||
|   #     #   uses: jmgilman/actions-generate-checksum@v1 | ||||
|   #     #   with: | ||||
|   #     #     output: checksums.txt | ||||
|   #     #     patterns: | | ||||
|   #     #       artifact/* | ||||
|  | ||||
|   #     - name: Create GH release | ||||
|   #       uses: softprops/action-gh-release@v1 | ||||
|   #       with: | ||||
|   #         token: ${{ secrets.GH_PAT }} | ||||
|       - name: Create GH release | ||||
|         uses: softprops/action-gh-release@v1 | ||||
|         with: | ||||
|           token: ${{ secrets.GH_PAT }} | ||||
|           # prerelease: ${{ contains(github.ref, 'latest') }} | ||||
|   #         fail_on_unmatched_files: true | ||||
|   #         files: | | ||||
|   #           artifact/artifact-*/* | ||||
|           prerelease: true | ||||
|           fail_on_unmatched_files: true | ||||
|           files: | | ||||
|             artifact/**/*.deb | ||||
|             artifact/**/*.rpm | ||||
|             artifact/**/*.pkg.tar.zst | ||||
|             artifact/**/*.bin.tar.xz | ||||
|             artifact/**/*.tar.gz | ||||
|             artifact/**/*.sha256 | ||||
|   | ||||
							
								
								
									
										22
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										22
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							| @@ -1527,8 +1527,10 @@ dependencies = [ | ||||
|  "openconnect", | ||||
|  "serde", | ||||
|  "serde_json", | ||||
|  "tar", | ||||
|  "tokio", | ||||
|  "tokio-util", | ||||
|  "xz2", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| @@ -2198,6 +2200,17 @@ dependencies = [ | ||||
|  "tracing-subscriber", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "lzma-sys" | ||||
| version = "0.1.20" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "5fda04ab3764e6cde78b9974eec4f779acaba7c4e84b36eca3cf77c581b85d27" | ||||
| dependencies = [ | ||||
|  "cc", | ||||
|  "libc", | ||||
|  "pkg-config", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "mac" | ||||
| version = "0.1.1" | ||||
| @@ -5124,6 +5137,15 @@ version = "0.13.6" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" | ||||
|  | ||||
| [[package]] | ||||
| name = "xz2" | ||||
| version = "0.1.7" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "388c44dc09d76f1536602ead6d325eb532f5c122f17782bd57fb47baeeb767e2" | ||||
| dependencies = [ | ||||
|  "lzma-sys", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "zeroize" | ||||
| version = "1.7.0" | ||||
|   | ||||
							
								
								
									
										157
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										157
									
								
								Makefile
									
									
									
									
									
								
							| @@ -1,4 +1,5 @@ | ||||
| OFFLINE ?= 0 | ||||
| BUILD_FE ?= 1 | ||||
| CARGO ?= cargo | ||||
|  | ||||
| VERSION = $(shell $(CARGO) metadata --no-deps --format-version 1 | jq -r '.packages[0].version') | ||||
| @@ -7,6 +8,7 @@ PPA_REVISION ?= 1 | ||||
| PKG_NAME = globalprotect-openconnect | ||||
| PKG = $(PKG_NAME)-$(VERSION) | ||||
| SERIES ?= $(shell lsb_release -cs) | ||||
| PUBLISH ?= 0 | ||||
|  | ||||
| export DEBEMAIL = k3vinyue@gmail.com | ||||
| export DEBFULLNAME = Kevin Yue | ||||
| @@ -22,28 +24,40 @@ default: build | ||||
| version: | ||||
| 	@echo $(VERSION) | ||||
|  | ||||
| # Generate a vendor tarball and a .cargo/config.toml file | ||||
| cargo-vendor: | ||||
| 	mkdir -p .cargo | ||||
| clean-tarball: | ||||
| 	rm -rf .build/tarball | ||||
| 	rm -rf .vendor | ||||
| 	rm -rf vendor.tar.xz | ||||
| 	rm -rf .cargo | ||||
|  | ||||
| 	$(CARGO) vendor .vendor > .cargo/config.toml | ||||
| 	tar -cJf vendor.tar.xz .vendor | ||||
| # Create a tarball, include the cargo dependencies if OFFLINE is set to 1 | ||||
| tarball: clean-tarball | ||||
| 	if [ $(BUILD_FE) -eq 1 ]; then \ | ||||
| 		cd apps/gpgui-helper && pnpm install && pnpm build; \ | ||||
| 	fi | ||||
|  | ||||
| tarball: clean clean-tarball build-fe cargo-vendor | ||||
| 	# Remove node_modules to reduce the tarball size | ||||
| 	rm -rf apps/gpgui-helper/node_modules | ||||
|  | ||||
| 	tar --transform 's,^,${PKG}/,' -czf ../${PKG}.tar.gz * .cargo | ||||
| 	mkdir -p .cargo | ||||
| 	mkdir -p .build/tarball | ||||
|  | ||||
| # Extract the vendor tarball to the .vendor directory if it exists | ||||
| extract-vendor: | ||||
| 	if [ -f vendor.tar.xz ]; then tar -xJf vendor.tar.xz; fi | ||||
| 	# If OFFLINE is set to 1, vendor all cargo dependencies | ||||
| 	if [ $(OFFLINE) -eq 1 ]; then \ | ||||
| 		$(CARGO) vendor .vendor > .cargo/config.toml; \ | ||||
| 		tar -cJf vendor.tar.xz .vendor; \ | ||||
| 	fi | ||||
|  | ||||
| 	tar --exclude .vendor --exclude target --transform 's,^,${PKG}/,' -czf .build/tarball/${PKG}.tar.gz * .cargo | ||||
|  | ||||
| build: build-fe build-rs | ||||
|  | ||||
| # Install and build the frontend | ||||
| # If OFFLINE is set to 1, skip it | ||||
| build-fe: | ||||
| 	if [ $(OFFLINE) -eq 0 ]; then \ | ||||
| 	if [ $(OFFLINE) -eq 1 ] || [ $(BUILD_FE) -eq 0 ]; then \ | ||||
| 		echo "Skipping frontend build (OFFLINE=1 or BUILD_FE=0)"; \ | ||||
| 	else \ | ||||
| 		cd apps/gpgui-helper && pnpm install && pnpm build; \ | ||||
| 	fi | ||||
|  | ||||
| @@ -52,9 +66,13 @@ build-fe: | ||||
| 		exit 1; \ | ||||
| 	fi | ||||
|  | ||||
| build-rs: extract-vendor | ||||
| 	$(CARGO) build $(CARGO_BUILD_ARGS) -p gpauth | ||||
| 	# $(CARGO) build $(CARGO_BUILD_ARGS) -p gpgui-helper --features "tauri/custom-protocol" | ||||
| build-rs: | ||||
| 	if [ $(OFFLINE) -eq 1 ]; then \ | ||||
| 		tar -xJf vendor.tar.xz; \ | ||||
| 	fi | ||||
|  | ||||
| 	$(CARGO) build $(CARGO_BUILD_ARGS) -p gpclient -p gpservice -p gpauth | ||||
| 	$(CARGO) build $(CARGO_BUILD_ARGS) -p gpgui-helper --features "tauri/custom-protocol" | ||||
|  | ||||
| clean: | ||||
| 	$(CARGO) clean | ||||
| @@ -62,11 +80,9 @@ clean: | ||||
| 	rm -rf .vendor | ||||
| 	rm -rf apps/gpgui-helper/node_modules | ||||
|  | ||||
| clean-tarball: | ||||
| 	rm -rf vendor.tar.xz | ||||
| 	rm -rf ../$(PKG).tar.gz | ||||
|  | ||||
| install: | ||||
| 	@echo "Installing $(PKG_NAME)..." | ||||
|  | ||||
| 	install -Dm755 target/release/gpclient $(DESTDIR)/usr/bin/gpclient | ||||
| 	install -Dm755 target/release/gpauth $(DESTDIR)/usr/bin/gpauth | ||||
| 	install -Dm755 target/release/gpservice $(DESTDIR)/usr/bin/gpservice | ||||
| @@ -80,10 +96,13 @@ install: | ||||
| 	install -Dm644 packaging/files/usr/share/polkit-1/actions/com.yuezk.gpgui.policy $(DESTDIR)/usr/share/polkit-1/actions/com.yuezk.gpgui.policy | ||||
|  | ||||
| uninstall: | ||||
| 	@echo "Uninstalling $(PKG_NAME)..." | ||||
|  | ||||
| 	rm -f $(DESTDIR)/usr/bin/gpclient | ||||
| 	rm -f $(DESTDIR)/usr/bin/gpauth | ||||
| 	rm -f $(DESTDIR)/usr/bin/gpservice | ||||
| 	rm -f $(DESTDIR)/usr/bin/gpgui-helper | ||||
| 	rm -f $(DESTDIR)/usr/bin/gpgui | ||||
|  | ||||
| 	rm -f $(DESTDIR)/usr/share/applications/gpgui.desktop | ||||
| 	rm -f $(DESTDIR)/usr/share/icons/hicolor/scalable/apps/gpgui.svg | ||||
| @@ -92,25 +111,41 @@ uninstall: | ||||
| 	rm -f $(DESTDIR)/usr/share/icons/hicolor/256x256@2/apps/gpgui.png | ||||
| 	rm -f $(DESTDIR)/usr/share/polkit-1/actions/com.yuezk.gpgui.policy | ||||
|  | ||||
| init-debian: | ||||
| 	rm -rf .vendor | ||||
| 	rm -rf debian | ||||
| clean-debian: | ||||
| 	rm -rf .build/deb | ||||
|  | ||||
| 	debmake | ||||
| # Generate the debian package structure, without the changelog | ||||
| init-debian: clean-debian tarball | ||||
| 	mkdir -p .build/deb | ||||
| 	cp .build/tarball/${PKG}.tar.gz .build/deb | ||||
|  | ||||
| 	cp -f packaging/deb/control.in debian/control | ||||
| 	cp -f packaging/deb/rules debian/rules | ||||
| 	rm -f debian/changelog | ||||
| 	tar -xzf .build/deb/${PKG}.tar.gz -C .build/deb | ||||
| 	cd .build/deb/${PKG} && debmake | ||||
|  | ||||
| 	cp -f packaging/deb/control.in .build/deb/$(PKG)/debian/control | ||||
| 	cp -f packaging/deb/rules .build/deb/$(PKG)/debian/rules | ||||
|  | ||||
| 	sed -i "s/@OFFLINE@/$(OFFLINE)/g" .build/deb/$(PKG)/debian/rules | ||||
|  | ||||
| 	rm -f .build/deb/$(PKG)/debian/changelog | ||||
|  | ||||
| deb: init-debian | ||||
| 	sed -i "s/@RUST@//g" debian/control | ||||
| 	# Remove the rust build depdency from the control file | ||||
| 	sed -i "s/@RUST@//g" .build/deb/$(PKG)/debian/control | ||||
|  | ||||
| 	dch --create --distribution unstable --package $(PKG_NAME) --newversion $(VERSION)-$(REVISION) "Bugfix and improvements." | ||||
| 	cd .build/deb/$(PKG) && dch --create --distribution unstable --package $(PKG_NAME) --newversion $(VERSION)-$(REVISION) "Bugfix and improvements." | ||||
|  | ||||
| 	debuild --preserve-env -e PATH -us -uc -b | ||||
| 	cd .build/deb/$(PKG) && debuild --preserve-env -e PATH -us -uc -b | ||||
|  | ||||
| check-ppa: | ||||
| 	if [ $(OFFLINE) -eq 0 ]; then \ | ||||
| 		echo "Error: ppa build requires offline mode (OFFLINE=1)"; \ | ||||
| 	fi | ||||
|  | ||||
| # Usage: make ppa SERIES=focal OFFLINE=1 PUBLISH=1 | ||||
| ppa: check-ppa init-debian | ||||
| 	cd .build/deb/${PKG} | ||||
|  | ||||
| # Usage: make ppa SERIES=focal | ||||
| ppa: init-debian | ||||
| 	sed -i "s/@RUST@/rust-all(>=1.70)/g" debian/control | ||||
|  | ||||
| 	$(eval SERIES_VER = $(shell distro-info --series $(SERIES) -r | cut -d' ' -f1)) | ||||
| @@ -120,12 +155,17 @@ ppa: init-debian | ||||
|  | ||||
| 	echo "y" | debuild -e PATH -S -sa -k"$(GPG_KEY_ID)" -p"gpg --batch --passphrase $(GPG_KEY_PASS) --pinentry-mode loopback" | ||||
|  | ||||
| publish-ppa: ppa | ||||
| 	dput ppa:yuezk/globalprotect-openconnect ../*.changes | ||||
| 	if [ $(PUBLISH) -eq 1 ]; then \ | ||||
| 		dput ppa:yuezk/globalprotect-openconnect ../*.changes; \ | ||||
| 	else | ||||
| 		echo "Skipping ppa publish (PUBLISH=0)" | ||||
| 	fi | ||||
|  | ||||
| clean-rpm: | ||||
| 	rm -rf .build/rpm | ||||
|  | ||||
| # Generate RPM sepc file | ||||
| init-rpm: | ||||
| 	rm -rf .build/rpm | ||||
| init-rpm: clean-rpm | ||||
| 	mkdir -p .build/rpm | ||||
|  | ||||
| 	cp packaging/rpm/globalprotect-openconnect.spec.in .build/rpm/globalprotect-openconnect.spec | ||||
| @@ -133,26 +173,20 @@ init-rpm: | ||||
|  | ||||
| 	sed -i "s/@VERSION@/$(VERSION)/g" .build/rpm/globalprotect-openconnect.spec | ||||
| 	sed -i "s/@REVISION@/$(REVISION)/g" .build/rpm/globalprotect-openconnect.spec | ||||
| 	sed -i "s/@OFFLINE@/$(OFFLINE)/g" .build/rpm/globalprotect-openconnect.spec | ||||
| 	sed -i "s/@DATE@/$(shell date "+%a %b %d %Y")/g" .build/rpm/globalprotect-openconnect.spec | ||||
|  | ||||
| 	sed -i "s/@VERSION@/$(VERSION)/g" .build/rpm/globalprotect-openconnect.changes | ||||
| 	sed -i "s/@DATE@/$(shell LC_ALL=en.US date -u "+%a %b %e %T %Z %Y")/g" .build/rpm/globalprotect-openconnect.changes | ||||
|  | ||||
| # Ensure ../globalprotect-openconnect-*.tar.gz exists. | ||||
| rpm: init-rpm | ||||
| 	if [ ! -f ../$(PKG).tar.gz ]; then \ | ||||
| 		echo "Missing ../$(PKG).tar.gz"; \ | ||||
| 		exit 1; \ | ||||
| 	fi | ||||
|  | ||||
| rpm: init-rpm tarball | ||||
| 	rm -rf $(HOME)/rpmbuild | ||||
| 	rpmdev-setuptree | ||||
|  | ||||
| 	cp ../$(PKG).tar.gz $(HOME)/rpmbuild/SOURCES/$(PKG_NAME).tar.gz | ||||
|  | ||||
| 	cp .build/tarball/${PKG}.tar.gz $(HOME)/rpmbuild/SOURCES/${PKG_NAME}.tar.gz | ||||
| 	rpmbuild -ba .build/rpm/globalprotect-openconnect.spec | ||||
|  | ||||
| 	# Copy RPM package | ||||
| 	# Copy RPM package from build directory | ||||
| 	cp $(HOME)/rpmbuild/RPMS/$(shell uname -m)/$(PKG_NAME)*.rpm .build/rpm | ||||
|  | ||||
| 	# Copy the SRPM only for x86_64. | ||||
| @@ -160,20 +194,41 @@ rpm: init-rpm | ||||
| 		cp $(HOME)/rpmbuild/SRPMS/$(PKG_NAME)*.rpm .build/rpm; \ | ||||
| 	fi | ||||
|  | ||||
| init-pkgbuild: | ||||
| clean-pkgbuild: | ||||
| 	rm -rf .build/pkgbuild | ||||
|  | ||||
| init-pkgbuild: clean-pkgbuild tarball | ||||
| 	mkdir -p .build/pkgbuild | ||||
|  | ||||
| 	if [ ! -f ../$(PKG).tar.gz ]; then \ | ||||
| 		echo "Missing ../$(PKG).tar.gz"; \ | ||||
| 		exit 1; \ | ||||
| 	fi | ||||
| 	cp ../$(PKG).tar.gz .build/pkgbuild | ||||
|  | ||||
| 	cp .build/tarball/${PKG}.tar.gz .build/pkgbuild | ||||
| 	cp packaging/pkgbuild/PKGBUILD.in .build/pkgbuild/PKGBUILD | ||||
|  | ||||
| 	sed -i "s/@PKG_NAME@/$(PKG_NAME)/g" .build/pkgbuild/PKGBUILD | ||||
| 	sed -i "s/@VERSION@/$(VERSION)/g" .build/pkgbuild/PKGBUILD | ||||
| 	sed -i "s/@REVISION@/$(REVISION)/g" .build/pkgbuild/PKGBUILD | ||||
| 	sed -i "s/@OFFLINE@/$(OFFLINE)/g" .build/pkgbuild/PKGBUILD | ||||
|  | ||||
| pkgbuild: init-pkgbuild | ||||
| 	cd .build/pkgbuild && makepkg -s --noconfirm | ||||
|  | ||||
| clean-binary: | ||||
| 	rm -rf .build/binary | ||||
|  | ||||
| binary: clean-binary tarball | ||||
| 	mkdir -p .build/binary | ||||
|  | ||||
| 	cp .build/tarball/${PKG}.tar.gz .build/binary | ||||
| 	tar -xzf .build/binary/${PKG}.tar.gz -C .build/binary | ||||
|  | ||||
| 	mkdir -p .build/binary/$(PKG_NAME)_$(VERSION)_$(shell uname -m)/artifacts | ||||
|  | ||||
| 	make -C .build/binary/${PKG} build OFFLINE=$(OFFLINE) | ||||
| 	make -C .build/binary/${PKG} install DESTDIR=$(PWD)/.build/binary/$(PKG_NAME)_$(VERSION)_$(shell uname -m)/artifacts | ||||
|  | ||||
| 	cp packaging/binary/Makefile.in .build/binary/$(PKG_NAME)_$(VERSION)_$(shell uname -m)/Makefile | ||||
|  | ||||
| 	# Create a tarball for the binary package | ||||
| 	tar -cJf .build/binary/$(PKG_NAME)_$(VERSION)_$(shell uname -m).bin.tar.xz -C .build/binary $(PKG_NAME)_$(VERSION)_$(shell uname -m) | ||||
|  | ||||
| 	# Generate sha256sum | ||||
| 	cd .build/binary && sha256sum $(PKG_NAME)_$(VERSION)_$(shell uname -m).bin.tar.xz | cut -d' ' -f1 > $(PKG_NAME)_$(VERSION)_$(shell uname -m).bin.tar.xz.sha256 | ||||
|   | ||||
| @@ -81,11 +81,14 @@ impl GuiUpdater { | ||||
|     info!("Update GUI, version: {}", self.version); | ||||
|  | ||||
|     #[cfg(target_arch = "x86_64")] | ||||
|     let arch = "amd64"; | ||||
|     let arch = "x86_64"; | ||||
|     #[cfg(target_arch = "aarch64")] | ||||
|     let arch = "arm64"; | ||||
|     let arch = "aarch64"; | ||||
|  | ||||
|     let file_url = format!("https://github.com/yuezk/GlobalProtect-openconnect/releases/download/v{}/gpgui-linux-{}", self.version, arch); | ||||
|     let file_url = format!( | ||||
|       "https://github.com/yuezk/GlobalProtect-openconnect/releases/download/v{}/gpgui_{}_{}.bin.tar.xz", | ||||
|       self.version, self.version, arch | ||||
|     ); | ||||
|     let checksum_url = format!("{}.sha256", file_url); | ||||
|  | ||||
|     info!("Downloading file: {}", file_url); | ||||
|   | ||||
| @@ -18,3 +18,5 @@ serde_json.workspace = true | ||||
| env_logger.workspace = true | ||||
| log.workspace = true | ||||
| compile-time.workspace = true | ||||
| xz2 = "0.1" | ||||
| tar = "0.4" | ||||
|   | ||||
| @@ -1,4 +1,12 @@ | ||||
| use std::{borrow::Cow, fs::Permissions, ops::ControlFlow, os::unix::fs::PermissionsExt, path::PathBuf, sync::Arc}; | ||||
| use std::{ | ||||
|   borrow::Cow, | ||||
|   fs::{File, Permissions}, | ||||
|   io::BufReader, | ||||
|   ops::ControlFlow, | ||||
|   os::unix::fs::PermissionsExt, | ||||
|   path::PathBuf, | ||||
|   sync::Arc, | ||||
| }; | ||||
|  | ||||
| use anyhow::bail; | ||||
| use axum::{ | ||||
| @@ -17,7 +25,9 @@ use gpapi::{ | ||||
|   GP_GUI_BINARY, | ||||
| }; | ||||
| use log::{info, warn}; | ||||
| use tar::Archive; | ||||
| use tokio::fs; | ||||
| use xz2::read::XzDecoder; | ||||
|  | ||||
| use crate::ws_server::WsServerContext; | ||||
|  | ||||
| @@ -60,6 +70,7 @@ pub async fn update_gui(State(ctx): State<Arc<WsServerContext>>, body: Bytes) -> | ||||
|   Ok(()) | ||||
| } | ||||
|  | ||||
| // Unpack GPGUI archive, gpgui_2.0.0_{arch}.bin.tar.xz and install it | ||||
| async fn install_gui(src: &str) -> anyhow::Result<()> { | ||||
|   let path = PathBuf::from(GP_GUI_BINARY); | ||||
|   let Some(dir) = path.parent() else { | ||||
| @@ -68,8 +79,27 @@ async fn install_gui(src: &str) -> anyhow::Result<()> { | ||||
|  | ||||
|   fs::create_dir_all(dir).await?; | ||||
|  | ||||
|   // Copy the file to the final location and make it executable | ||||
|   fs::copy(src, GP_GUI_BINARY).await?; | ||||
|   // Unpack the archive | ||||
|   info!("Unpacking GUI archive"); | ||||
|   let tar = XzDecoder::new(BufReader::new(File::open(src)?)); | ||||
|   let mut ar = Archive::new(tar); | ||||
|  | ||||
|   for entry in ar.entries()? { | ||||
|     let mut entry = entry?; | ||||
|     let path = entry.path()?; | ||||
|  | ||||
|     if let Some(name) = path.file_name() { | ||||
|       let name = name.to_string_lossy(); | ||||
|  | ||||
|       if name == "gpgui" { | ||||
|         let mut file = File::create(GP_GUI_BINARY)?; | ||||
|         std::io::copy(&mut entry, &mut file)?; | ||||
|         break; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   // Make the binary executable | ||||
|   fs::set_permissions(GP_GUI_BINARY, Permissions::from_mode(0o755)).await?; | ||||
|  | ||||
|   Ok(()) | ||||
|   | ||||
							
								
								
									
										30
									
								
								packaging/binary/Makefile.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								packaging/binary/Makefile.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | ||||
| install: | ||||
| 	@echo "===> Installing..." | ||||
|  | ||||
| 	install -Dm755 artifacts/usr/bin/gpclient $(DESTDIR)/usr/bin/gpclient | ||||
| 	install -Dm755 artifacts/usr/bin/gpservice $(DESTDIR)/usr/bin/gpservice | ||||
| 	install -Dm755 artifacts/usr/bin/gpauth $(DESTDIR)/usr/bin/gpauth | ||||
| 	install -Dm755 artifacts/usr/bin/gpgui-helper $(DESTDIR)/usr/bin/gpgui-helper | ||||
|  | ||||
| 	install -Dm644 artifacts/usr/share/applications/gpgui.desktop $(DESTDIR)/usr/share/applications/gpgui.desktop | ||||
| 	install -Dm644 artifacts/usr/share/icons/hicolor/scalable/apps/gpgui.svg $(DESTDIR)/usr/share/icons/hicolor/scalable/apps/gpgui.svg | ||||
| 	install -Dm644 artifacts/usr/share/icons/hicolor/32x32/apps/gpgui.png $(DESTDIR)/usr/share/icons/hicolor/32x32/apps/gpgui.png | ||||
| 	install -Dm644 artifacts/usr/share/icons/hicolor/128x128/apps/gpgui.png $(DESTDIR)/usr/share/icons/hicolor/128x128/apps/gpgui.png | ||||
| 	install -Dm644 artifacts/usr/share/icons/hicolor/256x256@2/apps/gpgui.png $(DESTDIR)/usr/share/icons/hicolor/256x256@2/apps/gpgui.png | ||||
| 	install -Dm644 artifacts/usr/share/polkit-1/actions/com.yuezk.gpgui.policy $(DESTDIR)/usr/share/polkit-1/actions/com.yuezk.gpgui.policy | ||||
|  | ||||
| uninstall: | ||||
| 	@echo "===> Uninstalling from $(DESTDIR)..." | ||||
|  | ||||
| 	rm -f $(DESTDIR)/usr/bin/gpclient | ||||
| 	rm -f $(DESTDIR)/usr/bin/gpservice | ||||
| 	rm -f $(DESTDIR)/usr/bin/gpauth | ||||
| 	rm -f $(DESTDIR)/usr/bin/gpgui-helper | ||||
| 	rm -f $(DESTDIR)/usr/bin/gpgui | ||||
|  | ||||
| 	rm -f $(DESTDIR)/usr/share/applications/gpgui.desktop | ||||
| 	rm -f $(DESTDIR)/usr/share/icons/hicolor/scalable/apps/gpgui.svg | ||||
| 	rm -f $(DESTDIR)/usr/share/icons/hicolor/32x32/apps/gpgui.png | ||||
| 	rm -f $(DESTDIR)/usr/share/icons/hicolor/128x128/apps/gpgui.png | ||||
| 	rm -f $(DESTDIR)/usr/share/icons/hicolor/256x256@2/apps/gpgui.png | ||||
| 	rm -f $(DESTDIR)/usr/share/polkit-1/actions/com.yuezk.gpgui.policy | ||||
| @@ -1,6 +1,6 @@ | ||||
| #!/usr/bin/make -f | ||||
|  | ||||
| export OFFLINE = 1 | ||||
| export OFFLINE = @OFFLINE@ | ||||
|  | ||||
| %: | ||||
| 	dh $@ | ||||
|   | ||||
| @@ -21,10 +21,15 @@ options=('!strip') | ||||
|  | ||||
| build() { | ||||
|   cd "$pkgname-$pkgver" | ||||
|   make build OFFLINE=1 | ||||
|  | ||||
|   # Must unset the CFLAGS, otherwise the build fails | ||||
|   unset CFLAGS | ||||
|  | ||||
|   make build OFFLINE=@OFFLINE@ | ||||
| } | ||||
|  | ||||
| package() { | ||||
|   cd "$pkgname-$pkgver" | ||||
|  | ||||
|   make install DESTDIR="$pkgdir" | ||||
| } | ||||
|   | ||||
| @@ -35,7 +35,7 @@ A GUI for GlobalProtect VPN, based on OpenConnect, supports the SSO authenticati | ||||
| %setup | ||||
|  | ||||
| %build | ||||
| make build OFFLINE=1 | ||||
| make build OFFLINE=@OFFLINE@ | ||||
|  | ||||
| %install | ||||
| %make_install | ||||
|   | ||||
		Reference in New Issue
	
	Block a user