diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index f196e58c..8a8ea11b 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -44,8 +44,9 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: + lfs: 'true' submodules: recursive # Initializes the CodeQL tools for scanning. @@ -91,36 +92,23 @@ jobs: cd ${{github.workspace}} - name: Cache Qt - id: cache-qt - uses: actions/cache@v1 + id: cache-qt-6 + uses: actions/cache@v3 with: path: ../Qt - key: ${{ runner.os }}-QtCache + key: ${{ runner.os }}-qt-cache-6 - name: Install Qt - uses: jurplel/install-qt-action@v2 + uses: jurplel/install-qt-action@v3 with: + version: '6.4.2' + modules: 'qt5compat' cached: ${{ steps.cache-qt.outputs.cache-hit }} - - name: Configure CMake - # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make. - # See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type - run: cmake -G Ninja -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DGPGFRONTEND_BUILD_TYPE_TEST_UI=ON - - - name: Build GpgFrontend - # Build your program with the given configuration - run: cmake --build ${{github.workspace}}/build --config {{$env.BUILD_TYPE}} -- -v - - # ℹī¸ Command-line programs to run using the OS shell. - # 📚 https://git.io/JvXDl - - # ✏ī¸ If the Autobuild fails above, remove it and uncomment the following three lines - # and modify them (or add more) to build your code if your project - # uses a compiled language - - #- run: | - # make bootstrap - # make release + - name: Configure CMake && Build GpgFrontend + run: | + cmake -G Ninja -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DGPGFRONTEND_BUILD_TYPE_TEST_UI=ON + cmake --build ${{github.workspace}}/build --config {{$env.BUILD_TYPE}} -- -v - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 + uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/debug.yml b/.github/workflows/debug.yml index 055347f0..3750f915 100644 --- a/.github/workflows/debug.yml +++ b/.github/workflows/debug.yml @@ -34,8 +34,9 @@ jobs: git config --global core.eol lf if: matrix.os == 'windows-latest' || matrix.os == 'macos-11' || matrix.os == 'macos-12' - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: + lfs: 'true' submodules: recursive - name: Install Dependence (Linux) @@ -88,7 +89,7 @@ jobs: - name: Cache Qt id: cache-qt - uses: actions/cache@v1 + uses: actions/cache@v3 with: path: ../Qt key: ${{ runner.os }}-qt-cache-6 @@ -99,7 +100,7 @@ jobs: with: version: '6.4.2' modules: 'qt5compat' - cached: ${{ steps.cache-qt.outputs.cache-hit }} + cache: ${{ steps.cache-qt.outputs.cache-hit }} if: matrix.os == 'ubuntu-latest' || matrix.os == 'macos-11' || matrix.os == 'macos-12' - name: Set up MinGW (Windows) @@ -145,25 +146,25 @@ jobs: - name: Get Short SHA of Commit id: vars - run: echo "::set-output name=sha_short::$(git rev-parse --short HEAD)" + run: echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_ENV - name: Upload Artifact(Linux) uses: actions/upload-artifact@master with: - name: gpgfrontend-${{matrix.os}}-${{env.BUILD_TYPE}}-${{steps.vars.outputs.sha_short}} + name: gpgfrontend-${{matrix.os}}-${{env.BUILD_TYPE}}-${{env.sha_short}} path: ${{github.workspace}}/build/release/* if: matrix.os == 'ubuntu-latest' - name: Upload Artifact(macOS) uses: actions/upload-artifact@master with: - name: gpgfrontend-${{matrix.os}}-${{env.BUILD_TYPE}}-${{steps.vars.outputs.sha_short}} + name: gpgfrontend-${{matrix.os}}-${{env.BUILD_TYPE}}-${{env.sha_short}} path: ${{github.workspace}}/build/release/* if: matrix.os == 'macos-11' || matrix.os == 'macos-12' - name: Upload Artifact(Windows) uses: actions/upload-artifact@master with: - name: gpgfrontend-${{matrix.os}}-${{env.BUILD_TYPE}}-${{steps.vars.outputs.sha_short}} + name: gpgfrontend-${{matrix.os}}-${{env.BUILD_TYPE}}-${{env.sha_short}} path: ${{github.workspace}}/build/release/* if: matrix.os == 'windows-latest' diff --git a/.github/workflows/release-deb-package.yml b/.github/workflows/release-deb-package.yml index 63cacb6f..446ca3b1 100644 --- a/.github/workflows/release-deb-package.yml +++ b/.github/workflows/release-deb-package.yml @@ -28,13 +28,15 @@ jobs: continue-on-error: true steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: + lfs: 'true' submodules: 'recursive' - name: Get Short SHA of Commit id: vars - run: echo "::set-output name=sha_short::$(git rev-parse --short HEAD)" + run: echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_ENV + - name: Install Dependence (Ubuntu 20.04) run: | @@ -91,5 +93,5 @@ jobs: - name: Upload Artifact(Linux DEB) uses: actions/upload-artifact@master with: - name: gpgfrontend-${{matrix.os}}-${{env.BUILD_TYPE}}-${{steps.vars.outputs.sha_short}}-deb-${{matrix.os}} + name: gpgfrontend-${{matrix.os}}-${{env.BUILD_TYPE}}-${{env.sha_short}}-deb-${{matrix.os}} path: ${{github.workspace}}/build-deb-${{matrix.os}}/gpgfrontend*.deb* diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d10dde2a..b4f8f875 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -33,13 +33,14 @@ jobs: git config --global core.eol lf if: matrix.os == 'windows-2019' || matrix.os == 'macos-11' || matrix.os == 'macos-12' - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: + lfs: 'true' submodules: recursive - name: Get Short SHA of Commit id: vars - run: echo "::set-output name=sha_short::$(git rev-parse --short HEAD)" + run: echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_ENV - name: Install Dependence (Linux) run: | @@ -96,7 +97,7 @@ jobs: - name: Cache Qt (macOS) id: cache-qt-6 - uses: actions/cache@v1 + uses: actions/cache@v3 with: path: ../Qt key: ${{ runner.os }}-qt-cache-6 @@ -107,7 +108,7 @@ jobs: with: version: '6.4.2' modules: 'qt5compat' - cached: ${{ steps.cache-qt.outputs.cache-hit }} + cache: ${{ steps.cache-qt.outputs.cache-hit }} if: matrix.os == 'macos-11' || matrix.os == 'macos-12' - name: Install Dependence (macOS) @@ -147,7 +148,7 @@ jobs: - name: Cache Qt id: cache-qt - uses: actions/cache@v1 + uses: actions/cache@v3 with: path: ../Qt key: ${{ runner.os }}-QtCache @@ -156,7 +157,7 @@ jobs: - name: Install Qt uses: jurplel/install-qt-action@v2 with: - cached: ${{ steps.cache-qt.outputs.cache-hit }} + cache: ${{ steps.cache-qt.outputs.cache-hit }} if: matrix.os == 'ubuntu-18.04' - name: Set up MinGW (Windows) @@ -213,15 +214,15 @@ jobs: hdiutil convert ${{github.workspace}}/build/tmp.dmg -format UDZO -o ${{github.workspace}}/build/artifactOut/GpgFrontend.dmg codesign -s "${{secrets.GPGFRONTEND_XOCDE_CODE_SIGN_IDENTITY}}" ${{github.workspace}}/build/artifactOut/GpgFrontend.dmg mv ${{github.workspace}}/build/artifactOut/GpgFrontend.dmg \ - ${{github.workspace}}/build/artifactOut/GpgFrontend-${{steps.vars.outputs.sha_short}}-x86_64.dmg + ${{github.workspace}}/build/artifactOut/GpgFrontend-${{env.sha_short}}-x86_64.dmg mv ${{github.workspace}}/build/GpgFrontend.app.zip \ - ${{github.workspace}}/build/GpgFrontend-${{steps.vars.outputs.sha_short}}-x86_64.zip + ${{github.workspace}}/build/GpgFrontend-${{env.sha_short}}-x86_64.zip if: matrix.os == 'macos-11' || matrix.os == 'macos-12' - name: Notarize Release Build (macOS) run: | xcrun altool --notarize-app \ - -f ${{github.workspace}}/build/GpgFrontend-${{steps.vars.outputs.sha_short}}-x86_64.zip \ + -f ${{github.workspace}}/build/GpgFrontend-${{env.sha_short}}-x86_64.zip \ --primary-bundle-id ${{secrets.GPGFRONTEND_XOCDE_APPID}} \ -u ${{secrets.APPLE_DEVELOPER_ID}} \ -p ${{secrets.APPLE_DEVELOPER_ID_SECRET}} @@ -249,20 +250,20 @@ jobs: - name: Upload Artifact(Linux) uses: actions/upload-artifact@master with: - name: gpgfrontend-${{matrix.os}}-${{env.BUILD_TYPE}}-${{steps.vars.outputs.sha_short}} + name: gpgfrontend-${{matrix.os}}-${{env.BUILD_TYPE}}-${{env.sha_short}} path: ${{github.workspace}}/build/artifactOut/GpgFrontend*.AppImage* if: matrix.os == 'ubuntu-18.04' - name: Upload Artifact(macOS) uses: actions/upload-artifact@master with: - name: gpgfrontend-${{matrix.os}}-${{env.BUILD_TYPE}}-${{steps.vars.outputs.sha_short}} + name: gpgfrontend-${{matrix.os}}-${{env.BUILD_TYPE}}-${{env.sha_short}} path: ${{github.workspace}}/build/artifactOut/* if: matrix.os == 'macos-11' || matrix.os == 'macos-12' - name: Upload Artifact(Windows) uses: actions/upload-artifact@master with: - name: gpgfrontend-${{matrix.os}}-${{env.BUILD_TYPE}}-${{steps.vars.outputs.sha_short}} + name: gpgfrontend-${{matrix.os}}-${{env.BUILD_TYPE}}-${{env.sha_short}} path: ${{github.workspace}}/build/release/* if: matrix.os == 'windows-2019' diff --git a/README.md b/README.md index 54a18a2b..ab2075b2 100644 --- a/README.md +++ b/README.md @@ -217,14 +217,8 @@ $ ./linuxdeployqt-continuous-x86_64.AppImage ../release/gpgfrontend/usr/share/ap ## Languages Support -<<<<<<< HEAD The supported languages are listed here. Some languages use machine translation and have not been verified. If you want to join translation and verification work, please refer to [HERE](https://gpgfrontend.pub/#/translate-interface). -======= -The supported languages are listed here. Some translations use machine translation and have not been verified. If you want -to join translation or verification work, please refer to [HERE](https://gpgfrontend.pub/#/translate-interface). - -> > > > > > > main ### Supported Languages diff --git a/gpgfrontend.qrc b/gpgfrontend.qrc index 7f4a9c68..59859444 100644 --- a/gpgfrontend.qrc +++ b/gpgfrontend.qrc @@ -1,79 +1,79 @@ - resource/icons/keymgmt.png - resource/icons/help.png - resource/icons/button_copy.png - resource/icons/gpgfrontend-logo.png - resource/icons/wizard_banner.png - resource/icons/gpgfrontend-logo_small.png - resource/icons/keys12.jpg - resource/icons/keys13.jpg - resource/icons/error.png - resource/icons/info.png - resource/icons/inbox.png - resource/icons/warning.png - resource/icons/archive.png - resource/icons/button_cancel.png - resource/icons/button_cut.png - resource/icons/button_ok.png - resource/icons/button_paste.png - resource/icons/button_delete.png - resource/icons/configure.png - resource/icons/decrypted.png - resource/icons/drafts.png - resource/icons/edit.png - resource/icons/email.png - resource/icons/encrypted.png - resource/icons/encrypted_signed.png - resource/icons/decrypted_verified.png - resource/icons/exit.png - resource/icons/export_key_to_file.png - resource/icons/file.png - resource/icons/fileencrytion.png - resource/icons/file-browser.png - resource/icons/fileopen.png - resource/icons/fileprint.png - resource/icons/filesave.png - resource/icons/filesaveas.png - resource/icons/flag-fill.png - resource/icons/folder.png - resource/icons/format-line-spacing-double.png - resource/icons/format-line-spacing-normal.png - resource/icons/format-line-spacing-triple.png - resource/icons/gnupg.png - resource/icons/gpgfrontend.png - resource/icons/importance.png - resource/icons/importkey_editor.png - resource/icons/import_key_from_clipboard.png - resource/icons/import_key_from_file.png - resource/icons/import_key_from_server.png - resource/icons/junk.png - resource/icons/key_export.png - resource/icons/key_generate.png - resource/icons/key_import.png - resource/icons/kgpg_key2.png - resource/icons/key_package.png - resource/icons/misc_doc.png - resource/icons/quote.png - resource/icons/receive_email.png - resource/icons/sent.png - resource/icons/server.png - resource/icons/signature.png - resource/icons/ssh-key.png - resource/icons/statusbar_icon.png - resource/icons/trash.png - resource/icons/txt.png - resource/icons/undo.png - resource/icons/verify.png - resource/icons/export_key_to_clipboard.png - resource/icons/mimetypes/application-pdf.png - resource/icons/mimetypes/image-x-generic.png - resource/icons/mimetypes/text-plain.png - resource/icons/mimetypes/unknown.png - resource/icons/button_previous.png - resource/icons/button_next.png - resource/icons/refresh.png - resource/icons/up.png + resource/lfs/icons/keymgmt.png + resource/lfs/icons/help.png + resource/lfs/icons/button_copy.png + resource/lfs/icons/gpgfrontend-logo.png + resource/lfs/icons/wizard_banner.png + resource/lfs/icons/gpgfrontend-logo_small.png + resource/lfs/icons/keys12.jpg + resource/lfs/icons/keys13.jpg + resource/lfs/icons/error.png + resource/lfs/icons/info.png + resource/lfs/icons/inbox.png + resource/lfs/icons/warning.png + resource/lfs/icons/archive.png + resource/lfs/icons/button_cancel.png + resource/lfs/icons/button_cut.png + resource/lfs/icons/button_ok.png + resource/lfs/icons/button_paste.png + resource/lfs/icons/button_delete.png + resource/lfs/icons/configure.png + resource/lfs/icons/decrypted.png + resource/lfs/icons/drafts.png + resource/lfs/icons/edit.png + resource/lfs/icons/email.png + resource/lfs/icons/encrypted.png + resource/lfs/icons/encrypted_signed.png + resource/lfs/icons/decrypted_verified.png + resource/lfs/icons/exit.png + resource/lfs/icons/export_key_to_file.png + resource/lfs/icons/file.png + resource/lfs/icons/fileencrytion.png + resource/lfs/icons/file-browser.png + resource/lfs/icons/fileopen.png + resource/lfs/icons/fileprint.png + resource/lfs/icons/filesave.png + resource/lfs/icons/filesaveas.png + resource/lfs/icons/flag-fill.png + resource/lfs/icons/folder.png + resource/lfs/icons/format-line-spacing-double.png + resource/lfs/icons/format-line-spacing-normal.png + resource/lfs/icons/format-line-spacing-triple.png + resource/lfs/icons/gnupg.png + resource/lfs/icons/gpgfrontend.png + resource/lfs/icons/importance.png + resource/lfs/icons/importkey_editor.png + resource/lfs/icons/import_key_from_clipboard.png + resource/lfs/icons/import_key_from_file.png + resource/lfs/icons/import_key_from_server.png + resource/lfs/icons/junk.png + resource/lfs/icons/key_export.png + resource/lfs/icons/key_generate.png + resource/lfs/icons/key_import.png + resource/lfs/icons/kgpg_key2.png + resource/lfs/icons/key_package.png + resource/lfs/icons/misc_doc.png + resource/lfs/icons/quote.png + resource/lfs/icons/receive_email.png + resource/lfs/icons/sent.png + resource/lfs/icons/server.png + resource/lfs/icons/signature.png + resource/lfs/icons/ssh-key.png + resource/lfs/icons/statusbar_icon.png + resource/lfs/icons/trash.png + resource/lfs/icons/txt.png + resource/lfs/icons/undo.png + resource/lfs/icons/verify.png + resource/lfs/icons/export_key_to_clipboard.png + resource/lfs/icons/mimetypes/application-pdf.png + resource/lfs/icons/mimetypes/image-x-generic.png + resource/lfs/icons/mimetypes/text-plain.png + resource/lfs/icons/mimetypes/unknown.png + resource/lfs/icons/button_previous.png + resource/lfs/icons/button_next.png + resource/lfs/icons/refresh.png + resource/lfs/icons/up.png diff --git a/resource/gpgfrontend/usr/share/applications/gpgfrontend.desktop b/resource/gpgfrontend/usr/share/applications/gpgfrontend.desktop deleted file mode 100644 index 8530e1d6..00000000 --- a/resource/gpgfrontend/usr/share/applications/gpgfrontend.desktop +++ /dev/null @@ -1,7 +0,0 @@ -[Desktop Entry] -Type=Application -Name=GpgFrontend -Comment=A Cross-Platform OpenPGP Frontend Software -Exec=GpgFrontend -Icon=GpgFrontend -Categories=Utility; diff --git a/resource/gpgfrontend/usr/share/icons/hicolor/128x128/apps/GpgFrontend.png b/resource/gpgfrontend/usr/share/icons/hicolor/128x128/apps/GpgFrontend.png deleted file mode 100644 index 5c24791f..00000000 Binary files a/resource/gpgfrontend/usr/share/icons/hicolor/128x128/apps/GpgFrontend.png and /dev/null differ diff --git a/resource/gpgfrontend/usr/share/icons/hicolor/256x256/apps/GpgFrontend.png b/resource/gpgfrontend/usr/share/icons/hicolor/256x256/apps/GpgFrontend.png deleted file mode 100644 index b3268b01..00000000 Binary files a/resource/gpgfrontend/usr/share/icons/hicolor/256x256/apps/GpgFrontend.png and /dev/null differ diff --git a/resource/gpgfrontend/usr/share/icons/hicolor/32x32/apps/GpgFrontend.png b/resource/gpgfrontend/usr/share/icons/hicolor/32x32/apps/GpgFrontend.png deleted file mode 100644 index c90e1d1d..00000000 Binary files a/resource/gpgfrontend/usr/share/icons/hicolor/32x32/apps/GpgFrontend.png and /dev/null differ diff --git a/resource/gpgfrontend/usr/share/metainfo/pub.gpgfrontend.gpgfrontend.metainfo.xml b/resource/gpgfrontend/usr/share/metainfo/pub.gpgfrontend.gpgfrontend.metainfo.xml deleted file mode 100644 index 49d409e5..00000000 --- a/resource/gpgfrontend/usr/share/metainfo/pub.gpgfrontend.gpgfrontend.metainfo.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - pub.gpgfrontend.gpgfrontend - FSFAP - GPL-3.0+ - GpgFrontend - Take the initiative to protect privacy in your own hands - - -

- GpgFrontend is a Powerful, Easy-to-Use, Compact, Cross-Platform, and Installation-Free OpenPGP Crypto Tool. -

-

- By using GpgFrontend, you can quickly encrypt and decrypt text or files. - Or at the same time as the above operations, you can add your own signature - to let others know that this document or this paragraph of text was issued by you. -

-

For moew information visit https://gpgfrontend.pub/

- -
- - gpgfrontend.desktop - - - - Main Window - https://raw.githubusercontent.com/saturneric/Blob/master/screenshots/keygen_ubuntu.png - - - - https://gpgfrontend.pub/ - GNOME - Saturneric -
\ No newline at end of file diff --git a/resource/hicolor/128x128/apps/pub.gpgfrontend.gpgfrontend.png b/resource/hicolor/128x128/apps/pub.gpgfrontend.gpgfrontend.png deleted file mode 100644 index 5c24791f..00000000 Binary files a/resource/hicolor/128x128/apps/pub.gpgfrontend.gpgfrontend.png and /dev/null differ diff --git a/resource/hicolor/256x256/apps/pub.gpgfrontend.gpgfrontend.png b/resource/hicolor/256x256/apps/pub.gpgfrontend.gpgfrontend.png deleted file mode 100644 index b3268b01..00000000 Binary files a/resource/hicolor/256x256/apps/pub.gpgfrontend.gpgfrontend.png and /dev/null differ diff --git a/resource/hicolor/32x32/apps/pub.gpgfrontend.gpgfrontend.png b/resource/hicolor/32x32/apps/pub.gpgfrontend.gpgfrontend.png deleted file mode 100644 index c90e1d1d..00000000 Binary files a/resource/hicolor/32x32/apps/pub.gpgfrontend.gpgfrontend.png and /dev/null differ diff --git a/resource/icons/archive.png b/resource/icons/archive.png deleted file mode 100644 index 37a87950..00000000 Binary files a/resource/icons/archive.png and /dev/null differ diff --git a/resource/icons/button_cancel.png b/resource/icons/button_cancel.png deleted file mode 100644 index 57e2c6cf..00000000 Binary files a/resource/icons/button_cancel.png and /dev/null differ diff --git a/resource/icons/button_copy.png b/resource/icons/button_copy.png deleted file mode 100644 index 03bcd93b..00000000 Binary files a/resource/icons/button_copy.png and /dev/null differ diff --git a/resource/icons/button_cut.png b/resource/icons/button_cut.png deleted file mode 100644 index a5e0c2d8..00000000 Binary files a/resource/icons/button_cut.png and /dev/null differ diff --git a/resource/icons/button_delete.png b/resource/icons/button_delete.png deleted file mode 100644 index 50e7098d..00000000 Binary files a/resource/icons/button_delete.png and /dev/null differ diff --git a/resource/icons/button_next.png b/resource/icons/button_next.png deleted file mode 100644 index b642910e..00000000 Binary files a/resource/icons/button_next.png and /dev/null differ diff --git a/resource/icons/button_ok.png b/resource/icons/button_ok.png deleted file mode 100644 index 50310aed..00000000 Binary files a/resource/icons/button_ok.png and /dev/null differ diff --git a/resource/icons/button_paste.png b/resource/icons/button_paste.png deleted file mode 100644 index 260fa568..00000000 Binary files a/resource/icons/button_paste.png and /dev/null differ diff --git a/resource/icons/button_previous.png b/resource/icons/button_previous.png deleted file mode 100644 index 67980245..00000000 Binary files a/resource/icons/button_previous.png and /dev/null differ diff --git a/resource/icons/check.png b/resource/icons/check.png deleted file mode 100644 index e793ced2..00000000 Binary files a/resource/icons/check.png and /dev/null differ diff --git a/resource/icons/configure.png b/resource/icons/configure.png deleted file mode 100644 index b2c3c62f..00000000 Binary files a/resource/icons/configure.png and /dev/null differ diff --git a/resource/icons/decrypted.png b/resource/icons/decrypted.png deleted file mode 100644 index 9fe6970a..00000000 Binary files a/resource/icons/decrypted.png and /dev/null differ diff --git a/resource/icons/decrypted_verified.png b/resource/icons/decrypted_verified.png deleted file mode 100644 index 5e45f625..00000000 Binary files a/resource/icons/decrypted_verified.png and /dev/null differ diff --git a/resource/icons/down.png b/resource/icons/down.png deleted file mode 100644 index e3531e0f..00000000 Binary files a/resource/icons/down.png and /dev/null differ diff --git a/resource/icons/drafts.png b/resource/icons/drafts.png deleted file mode 100644 index bc44f88a..00000000 Binary files a/resource/icons/drafts.png and /dev/null differ diff --git a/resource/icons/edit.png b/resource/icons/edit.png deleted file mode 100644 index 01a6662b..00000000 Binary files a/resource/icons/edit.png and /dev/null differ diff --git a/resource/icons/email.png b/resource/icons/email.png deleted file mode 100644 index f0517848..00000000 Binary files a/resource/icons/email.png and /dev/null differ diff --git a/resource/icons/encrypted.png b/resource/icons/encrypted.png deleted file mode 100644 index 45bbf696..00000000 Binary files a/resource/icons/encrypted.png and /dev/null differ diff --git a/resource/icons/encrypted_signed.png b/resource/icons/encrypted_signed.png deleted file mode 100644 index ffb57196..00000000 Binary files a/resource/icons/encrypted_signed.png and /dev/null differ diff --git a/resource/icons/error.png b/resource/icons/error.png deleted file mode 100644 index 3137becb..00000000 Binary files a/resource/icons/error.png and /dev/null differ diff --git a/resource/icons/exit.png b/resource/icons/exit.png deleted file mode 100644 index 8ed3161d..00000000 Binary files a/resource/icons/exit.png and /dev/null differ diff --git a/resource/icons/export_key_to_clipboard.png b/resource/icons/export_key_to_clipboard.png deleted file mode 100644 index 74cc910a..00000000 Binary files a/resource/icons/export_key_to_clipboard.png and /dev/null differ diff --git a/resource/icons/export_key_to_file.png b/resource/icons/export_key_to_file.png deleted file mode 100644 index d083f63e..00000000 Binary files a/resource/icons/export_key_to_file.png and /dev/null differ diff --git a/resource/icons/file-browser.png b/resource/icons/file-browser.png deleted file mode 100644 index 29dba7e1..00000000 Binary files a/resource/icons/file-browser.png and /dev/null differ diff --git a/resource/icons/file.png b/resource/icons/file.png deleted file mode 100644 index d8562029..00000000 Binary files a/resource/icons/file.png and /dev/null differ diff --git a/resource/icons/fileencrytion.png b/resource/icons/fileencrytion.png deleted file mode 100644 index b4546e2a..00000000 Binary files a/resource/icons/fileencrytion.png and /dev/null differ diff --git a/resource/icons/fileopen.png b/resource/icons/fileopen.png deleted file mode 100644 index 461abcdc..00000000 Binary files a/resource/icons/fileopen.png and /dev/null differ diff --git a/resource/icons/fileprint.png b/resource/icons/fileprint.png deleted file mode 100644 index 1b780552..00000000 Binary files a/resource/icons/fileprint.png and /dev/null differ diff --git a/resource/icons/filesave.png b/resource/icons/filesave.png deleted file mode 100644 index ce80e05f..00000000 Binary files a/resource/icons/filesave.png and /dev/null differ diff --git a/resource/icons/filesaveas.png b/resource/icons/filesaveas.png deleted file mode 100644 index 14ce8aee..00000000 Binary files a/resource/icons/filesaveas.png and /dev/null differ diff --git a/resource/icons/flag-fill.png b/resource/icons/flag-fill.png deleted file mode 100644 index b8723616..00000000 Binary files a/resource/icons/flag-fill.png and /dev/null differ diff --git a/resource/icons/folder.png b/resource/icons/folder.png deleted file mode 100644 index b0e7989c..00000000 Binary files a/resource/icons/folder.png and /dev/null differ diff --git a/resource/icons/format-line-spacing-double.png b/resource/icons/format-line-spacing-double.png deleted file mode 100644 index 813c393c..00000000 Binary files a/resource/icons/format-line-spacing-double.png and /dev/null differ diff --git a/resource/icons/format-line-spacing-normal.png b/resource/icons/format-line-spacing-normal.png deleted file mode 100644 index f3d48aca..00000000 Binary files a/resource/icons/format-line-spacing-normal.png and /dev/null differ diff --git a/resource/icons/format-line-spacing-triple.png b/resource/icons/format-line-spacing-triple.png deleted file mode 100644 index e83ee98f..00000000 Binary files a/resource/icons/format-line-spacing-triple.png and /dev/null differ diff --git a/resource/icons/gnupg.png b/resource/icons/gnupg.png deleted file mode 100644 index 2a209e21..00000000 Binary files a/resource/icons/gnupg.png and /dev/null differ diff --git a/resource/icons/gpgfrontend-logo.png b/resource/icons/gpgfrontend-logo.png deleted file mode 100644 index 7e9841be..00000000 Binary files a/resource/icons/gpgfrontend-logo.png and /dev/null differ diff --git a/resource/icons/gpgfrontend-logo_small (copy).png b/resource/icons/gpgfrontend-logo_small (copy).png deleted file mode 100644 index d34c6c31..00000000 Binary files a/resource/icons/gpgfrontend-logo_small (copy).png and /dev/null differ diff --git a/resource/icons/gpgfrontend-logo_small.png b/resource/icons/gpgfrontend-logo_small.png deleted file mode 100644 index d34c6c31..00000000 Binary files a/resource/icons/gpgfrontend-logo_small.png and /dev/null differ diff --git a/resource/icons/gpgfrontend.png b/resource/icons/gpgfrontend.png deleted file mode 100644 index c90e1d1d..00000000 Binary files a/resource/icons/gpgfrontend.png and /dev/null differ diff --git a/resource/icons/help.png b/resource/icons/help.png deleted file mode 100644 index 54821e49..00000000 Binary files a/resource/icons/help.png and /dev/null differ diff --git a/resource/icons/import_key_from_clipboard.png b/resource/icons/import_key_from_clipboard.png deleted file mode 100644 index 2e45baed..00000000 Binary files a/resource/icons/import_key_from_clipboard.png and /dev/null differ diff --git a/resource/icons/import_key_from_file.png b/resource/icons/import_key_from_file.png deleted file mode 100644 index 5db35a6f..00000000 Binary files a/resource/icons/import_key_from_file.png and /dev/null differ diff --git a/resource/icons/import_key_from_server.png b/resource/icons/import_key_from_server.png deleted file mode 100644 index 06034660..00000000 Binary files a/resource/icons/import_key_from_server.png and /dev/null differ diff --git a/resource/icons/importance.png b/resource/icons/importance.png deleted file mode 100644 index e59ff133..00000000 Binary files a/resource/icons/importance.png and /dev/null differ diff --git a/resource/icons/importkey_editor.png b/resource/icons/importkey_editor.png deleted file mode 100644 index 406b29c4..00000000 Binary files a/resource/icons/importkey_editor.png and /dev/null differ diff --git a/resource/icons/inbox.png b/resource/icons/inbox.png deleted file mode 100644 index 5d0fbf2f..00000000 Binary files a/resource/icons/inbox.png and /dev/null differ diff --git a/resource/icons/info.png b/resource/icons/info.png deleted file mode 100644 index 82bfa824..00000000 Binary files a/resource/icons/info.png and /dev/null differ diff --git a/resource/icons/junk.png b/resource/icons/junk.png deleted file mode 100644 index 3fa05c63..00000000 Binary files a/resource/icons/junk.png and /dev/null differ diff --git a/resource/icons/key_export.png b/resource/icons/key_export.png deleted file mode 100644 index 6703498e..00000000 Binary files a/resource/icons/key_export.png and /dev/null differ diff --git a/resource/icons/key_generate.png b/resource/icons/key_generate.png deleted file mode 100644 index c67edd21..00000000 Binary files a/resource/icons/key_generate.png and /dev/null differ diff --git a/resource/icons/key_import.png b/resource/icons/key_import.png deleted file mode 100644 index 98384fba..00000000 Binary files a/resource/icons/key_import.png and /dev/null differ diff --git a/resource/icons/key_package.png b/resource/icons/key_package.png deleted file mode 100644 index 6464cb9d..00000000 Binary files a/resource/icons/key_package.png and /dev/null differ diff --git a/resource/icons/keymgmt.png b/resource/icons/keymgmt.png deleted file mode 100644 index ae44ad9c..00000000 Binary files a/resource/icons/keymgmt.png and /dev/null differ diff --git a/resource/icons/keys12.jpg b/resource/icons/keys12.jpg deleted file mode 100644 index acf8f8d0..00000000 Binary files a/resource/icons/keys12.jpg and /dev/null differ diff --git a/resource/icons/keys13.jpg b/resource/icons/keys13.jpg deleted file mode 100644 index 0b76c5c6..00000000 Binary files a/resource/icons/keys13.jpg and /dev/null differ diff --git a/resource/icons/kgpg_key2.png b/resource/icons/kgpg_key2.png deleted file mode 100644 index 129c55d5..00000000 Binary files a/resource/icons/kgpg_key2.png and /dev/null differ diff --git a/resource/icons/mimetypes/application-pdf.png b/resource/icons/mimetypes/application-pdf.png deleted file mode 100644 index c78b86c5..00000000 Binary files a/resource/icons/mimetypes/application-pdf.png and /dev/null differ diff --git a/resource/icons/mimetypes/image-x-generic.png b/resource/icons/mimetypes/image-x-generic.png deleted file mode 100644 index b0c9a3c9..00000000 Binary files a/resource/icons/mimetypes/image-x-generic.png and /dev/null differ diff --git a/resource/icons/mimetypes/text-plain.png b/resource/icons/mimetypes/text-plain.png deleted file mode 100644 index adc28836..00000000 Binary files a/resource/icons/mimetypes/text-plain.png and /dev/null differ diff --git a/resource/icons/mimetypes/unknown.png b/resource/icons/mimetypes/unknown.png deleted file mode 100644 index 6a84b799..00000000 Binary files a/resource/icons/mimetypes/unknown.png and /dev/null differ diff --git a/resource/icons/misc_doc.png b/resource/icons/misc_doc.png deleted file mode 100644 index 57878ba3..00000000 Binary files a/resource/icons/misc_doc.png and /dev/null differ diff --git a/resource/icons/quote.png b/resource/icons/quote.png deleted file mode 100644 index 8d792b85..00000000 Binary files a/resource/icons/quote.png and /dev/null differ diff --git a/resource/icons/receive_email.png b/resource/icons/receive_email.png deleted file mode 100644 index eaa060fb..00000000 Binary files a/resource/icons/receive_email.png and /dev/null differ diff --git a/resource/icons/refresh.png b/resource/icons/refresh.png deleted file mode 100644 index 54745560..00000000 Binary files a/resource/icons/refresh.png and /dev/null differ diff --git a/resource/icons/sent.png b/resource/icons/sent.png deleted file mode 100644 index b11d0425..00000000 Binary files a/resource/icons/sent.png and /dev/null differ diff --git a/resource/icons/server.png b/resource/icons/server.png deleted file mode 100644 index 2efc30ef..00000000 Binary files a/resource/icons/server.png and /dev/null differ diff --git a/resource/icons/signature.png b/resource/icons/signature.png deleted file mode 100644 index 3aea526b..00000000 Binary files a/resource/icons/signature.png and /dev/null differ diff --git a/resource/icons/ssh-key.png b/resource/icons/ssh-key.png deleted file mode 100644 index c3563e43..00000000 Binary files a/resource/icons/ssh-key.png and /dev/null differ diff --git a/resource/icons/statusbar_icon.png b/resource/icons/statusbar_icon.png deleted file mode 100644 index 6bb93bb8..00000000 Binary files a/resource/icons/statusbar_icon.png and /dev/null differ diff --git a/resource/icons/trash.png b/resource/icons/trash.png deleted file mode 100644 index 9cf606b8..00000000 Binary files a/resource/icons/trash.png and /dev/null differ diff --git a/resource/icons/txt.png b/resource/icons/txt.png deleted file mode 100644 index 8db7ba45..00000000 Binary files a/resource/icons/txt.png and /dev/null differ diff --git a/resource/icons/undo.png b/resource/icons/undo.png deleted file mode 100644 index 19717cc8..00000000 Binary files a/resource/icons/undo.png and /dev/null differ diff --git a/resource/icons/up-arrow.png b/resource/icons/up-arrow.png deleted file mode 100644 index 12451e50..00000000 Binary files a/resource/icons/up-arrow.png and /dev/null differ diff --git a/resource/icons/up.png b/resource/icons/up.png deleted file mode 100644 index 46c47c70..00000000 Binary files a/resource/icons/up.png and /dev/null differ diff --git a/resource/icons/verify.png b/resource/icons/verify.png deleted file mode 100644 index e359b69f..00000000 Binary files a/resource/icons/verify.png and /dev/null differ diff --git a/resource/icons/warning.png b/resource/icons/warning.png deleted file mode 100644 index cc802e8d..00000000 Binary files a/resource/icons/warning.png and /dev/null differ diff --git a/resource/icons/wizard_banner.png b/resource/icons/wizard_banner.png deleted file mode 100644 index 7e19aeab..00000000 Binary files a/resource/icons/wizard_banner.png and /dev/null differ diff --git a/resource/lfs/app-image/gpgfrontend/usr/share/applications/gpgfrontend.desktop b/resource/lfs/app-image/gpgfrontend/usr/share/applications/gpgfrontend.desktop new file mode 100644 index 00000000..27045dc8 --- /dev/null +++ b/resource/lfs/app-image/gpgfrontend/usr/share/applications/gpgfrontend.desktop @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:370d5e78f3c3035e770b1641163fbf945e0a293155a6fecee0808d70ccba59ac +size 155 diff --git a/resource/lfs/app-image/gpgfrontend/usr/share/icons/hicolor/128x128/apps/GpgFrontend.png b/resource/lfs/app-image/gpgfrontend/usr/share/icons/hicolor/128x128/apps/GpgFrontend.png new file mode 100644 index 00000000..0bf71516 --- /dev/null +++ b/resource/lfs/app-image/gpgfrontend/usr/share/icons/hicolor/128x128/apps/GpgFrontend.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c2807ed648e7321ae8cfa4edff7673bfd3f829ca0921ef8d301273ea7967b04a +size 3819 diff --git a/resource/lfs/app-image/gpgfrontend/usr/share/icons/hicolor/256x256/apps/GpgFrontend.png b/resource/lfs/app-image/gpgfrontend/usr/share/icons/hicolor/256x256/apps/GpgFrontend.png new file mode 100644 index 00000000..a669fc87 --- /dev/null +++ b/resource/lfs/app-image/gpgfrontend/usr/share/icons/hicolor/256x256/apps/GpgFrontend.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:33a7dda6cb7d65c94a944a20d2133218e0c6371b3f879e031838179bdbda9afd +size 9155 diff --git a/resource/lfs/app-image/gpgfrontend/usr/share/icons/hicolor/32x32/apps/GpgFrontend.png b/resource/lfs/app-image/gpgfrontend/usr/share/icons/hicolor/32x32/apps/GpgFrontend.png new file mode 100644 index 00000000..ddae98d3 --- /dev/null +++ b/resource/lfs/app-image/gpgfrontend/usr/share/icons/hicolor/32x32/apps/GpgFrontend.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0cfd63568e29d989b8558b8c5d8a8dfb2cf29413f72d358004beadd0ad8fedfa +size 3533 diff --git a/resource/lfs/app-image/gpgfrontend/usr/share/metainfo/pub.gpgfrontend.gpgfrontend.metainfo.xml b/resource/lfs/app-image/gpgfrontend/usr/share/metainfo/pub.gpgfrontend.gpgfrontend.metainfo.xml new file mode 100644 index 00000000..840eaeef --- /dev/null +++ b/resource/lfs/app-image/gpgfrontend/usr/share/metainfo/pub.gpgfrontend.gpgfrontend.metainfo.xml @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:41f6b634156a5b0f199e13a5e5d016ee81b9561415725f813e9811f03ac5d03e +size 1315 diff --git a/resource/lfs/hicolor/128x128/apps/pub.gpgfrontend.gpgfrontend.png b/resource/lfs/hicolor/128x128/apps/pub.gpgfrontend.gpgfrontend.png new file mode 100644 index 00000000..0bf71516 --- /dev/null +++ b/resource/lfs/hicolor/128x128/apps/pub.gpgfrontend.gpgfrontend.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c2807ed648e7321ae8cfa4edff7673bfd3f829ca0921ef8d301273ea7967b04a +size 3819 diff --git a/resource/lfs/hicolor/256x256/apps/pub.gpgfrontend.gpgfrontend.png b/resource/lfs/hicolor/256x256/apps/pub.gpgfrontend.gpgfrontend.png new file mode 100644 index 00000000..a669fc87 --- /dev/null +++ b/resource/lfs/hicolor/256x256/apps/pub.gpgfrontend.gpgfrontend.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:33a7dda6cb7d65c94a944a20d2133218e0c6371b3f879e031838179bdbda9afd +size 9155 diff --git a/resource/lfs/hicolor/32x32/apps/pub.gpgfrontend.gpgfrontend.png b/resource/lfs/hicolor/32x32/apps/pub.gpgfrontend.gpgfrontend.png new file mode 100644 index 00000000..ddae98d3 --- /dev/null +++ b/resource/lfs/hicolor/32x32/apps/pub.gpgfrontend.gpgfrontend.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0cfd63568e29d989b8558b8c5d8a8dfb2cf29413f72d358004beadd0ad8fedfa +size 3533 diff --git a/resource/lfs/icons/archive.png b/resource/lfs/icons/archive.png new file mode 100644 index 00000000..0ed42616 --- /dev/null +++ b/resource/lfs/icons/archive.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c4dbe252e5f1bdd4733935bc9ec9392339f81914ab33bd3a0d4653ba08a98372 +size 4613 diff --git a/resource/lfs/icons/button_cancel.png b/resource/lfs/icons/button_cancel.png new file mode 100644 index 00000000..1a772577 --- /dev/null +++ b/resource/lfs/icons/button_cancel.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:17e5c2c2d0a64b6a9adee858a05dfdb193107b26f20697c79dc9c3b8fcf9eefd +size 3242 diff --git a/resource/lfs/icons/button_copy.png b/resource/lfs/icons/button_copy.png new file mode 100644 index 00000000..21ca2aaa --- /dev/null +++ b/resource/lfs/icons/button_copy.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:94b469c9c553cd35a22952eafc3b8805f076eefde4db6d2a2234e9a0e77a7e78 +size 1475 diff --git a/resource/lfs/icons/button_cut.png b/resource/lfs/icons/button_cut.png new file mode 100644 index 00000000..7ff94c14 --- /dev/null +++ b/resource/lfs/icons/button_cut.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6932c1ce9d72f885a3eb19a88907e34181ab32bf9d7933d940dd4553b3371fc9 +size 2828 diff --git a/resource/lfs/icons/button_delete.png b/resource/lfs/icons/button_delete.png new file mode 100644 index 00000000..d27d3066 --- /dev/null +++ b/resource/lfs/icons/button_delete.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:45e7c41d6e29fa6b46d97422ca9c59427a66d852bc6f5c137b18ef1b1bff422e +size 2202 diff --git a/resource/lfs/icons/button_next.png b/resource/lfs/icons/button_next.png new file mode 100644 index 00000000..b887d44f --- /dev/null +++ b/resource/lfs/icons/button_next.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6809a8ff6a10541ba68539dd91ded3981f3165863e6d7cac5fcb6c17a8725102 +size 6380 diff --git a/resource/lfs/icons/button_ok.png b/resource/lfs/icons/button_ok.png new file mode 100644 index 00000000..2cd4d1f9 --- /dev/null +++ b/resource/lfs/icons/button_ok.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7441cd76fdf6dd815818b959f65a7587a1ab5b99bad434d034b5d3a5e257e535 +size 6709 diff --git a/resource/lfs/icons/button_paste.png b/resource/lfs/icons/button_paste.png new file mode 100644 index 00000000..7ac71c90 --- /dev/null +++ b/resource/lfs/icons/button_paste.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:01a37bfc3b3a5ea13dab06edcaf718c90789ae442b2caf8df7f5e3b02f5cde0c +size 2727 diff --git a/resource/lfs/icons/button_previous.png b/resource/lfs/icons/button_previous.png new file mode 100644 index 00000000..831c46bd --- /dev/null +++ b/resource/lfs/icons/button_previous.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1db665f0b4bfd4093591f49640b5a17aae0058592f76bed085d0ffa5300b00db +size 5914 diff --git a/resource/lfs/icons/check.png b/resource/lfs/icons/check.png new file mode 100644 index 00000000..31e3d202 --- /dev/null +++ b/resource/lfs/icons/check.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4dba7e8d5b0a5535c954ac93721549d2bbc946626af45e9736847622d99a3590 +size 4779 diff --git a/resource/lfs/icons/configure.png b/resource/lfs/icons/configure.png new file mode 100644 index 00000000..3223b893 --- /dev/null +++ b/resource/lfs/icons/configure.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f9c97fe51ba3f6a48e43ee15c27910c9ab9264d25870676eb97aa1906ac4a47b +size 4277 diff --git a/resource/lfs/icons/decrypted.png b/resource/lfs/icons/decrypted.png new file mode 100644 index 00000000..e36e3d45 --- /dev/null +++ b/resource/lfs/icons/decrypted.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3b222e7dac88c38035216200a2328774909d04b905ec0fb10581c60598debb6c +size 3620 diff --git a/resource/lfs/icons/decrypted_verified.png b/resource/lfs/icons/decrypted_verified.png new file mode 100644 index 00000000..5f670e5e --- /dev/null +++ b/resource/lfs/icons/decrypted_verified.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c555e916ef7d0e9d55490030b63447bfdceb079dedc1345b57a110f83875502a +size 3935 diff --git a/resource/lfs/icons/down.png b/resource/lfs/icons/down.png new file mode 100644 index 00000000..10a55dea --- /dev/null +++ b/resource/lfs/icons/down.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:002572c621871b254fd9bc10b157f87677ccf60fed7b699bdde66161a068b6f4 +size 4859 diff --git a/resource/lfs/icons/drafts.png b/resource/lfs/icons/drafts.png new file mode 100644 index 00000000..103f45a6 --- /dev/null +++ b/resource/lfs/icons/drafts.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:30cea7f8b78f7a223857d7de2a0342dcce1f05db126f1b74129ff5dd23eac2ab +size 6313 diff --git a/resource/lfs/icons/edit.png b/resource/lfs/icons/edit.png new file mode 100644 index 00000000..529172b5 --- /dev/null +++ b/resource/lfs/icons/edit.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aab742a47215e925826a913d6e5eb2b3d699a67f4a49e897517da1504cd12357 +size 1491 diff --git a/resource/lfs/icons/email.png b/resource/lfs/icons/email.png new file mode 100644 index 00000000..edb6e689 --- /dev/null +++ b/resource/lfs/icons/email.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:65d86915d90d8e6e504561665ebe7fb30667a6ad30fd358f4001591ed9f64d34 +size 4582 diff --git a/resource/lfs/icons/encrypted.png b/resource/lfs/icons/encrypted.png new file mode 100644 index 00000000..ada24e7d --- /dev/null +++ b/resource/lfs/icons/encrypted.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b4a83e2376cfbf8e5125cb7f51d485c02019a6bbb05f20459a5aeda6e308d635 +size 3288 diff --git a/resource/lfs/icons/encrypted_signed.png b/resource/lfs/icons/encrypted_signed.png new file mode 100644 index 00000000..f6d91e29 --- /dev/null +++ b/resource/lfs/icons/encrypted_signed.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e4bc0291611dd50d0f41ec9a884afe66250c7dd7c35f055a7780cde9b8a352b3 +size 2837 diff --git a/resource/lfs/icons/error.png b/resource/lfs/icons/error.png new file mode 100644 index 00000000..cbcadb02 --- /dev/null +++ b/resource/lfs/icons/error.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f17c7d8688e6ec9585412ffcd3adfa09c7f10fcf4cfd892c0b18ee6069739b63 +size 6721 diff --git a/resource/lfs/icons/exit.png b/resource/lfs/icons/exit.png new file mode 100644 index 00000000..eb95c97c --- /dev/null +++ b/resource/lfs/icons/exit.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9f12a278b83f813c9a6d6c624ebadf7cb98185ecb57b48fb17ccffae2aaab178 +size 4925 diff --git a/resource/lfs/icons/export_key_to_clipboard.png b/resource/lfs/icons/export_key_to_clipboard.png new file mode 100644 index 00000000..a417cedb --- /dev/null +++ b/resource/lfs/icons/export_key_to_clipboard.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:91a031340965a538f169d3997552d299fb3f543338f0de007f1ee6c41a911d68 +size 2659 diff --git a/resource/lfs/icons/export_key_to_file.png b/resource/lfs/icons/export_key_to_file.png new file mode 100644 index 00000000..867ab1fd --- /dev/null +++ b/resource/lfs/icons/export_key_to_file.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:801e0c114d0b7d1b700238b1d12ff98c88e5a4932251f7dcd7ac91c80f26deec +size 4577 diff --git a/resource/lfs/icons/file-browser.png b/resource/lfs/icons/file-browser.png new file mode 100644 index 00000000..cdfcc4af --- /dev/null +++ b/resource/lfs/icons/file-browser.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e97d955ffb482c4e17af98504b6d76b70b08d2e5f561eb8d80d806e8142d7ff4 +size 3652 diff --git a/resource/lfs/icons/file.png b/resource/lfs/icons/file.png new file mode 100644 index 00000000..5b621c98 --- /dev/null +++ b/resource/lfs/icons/file.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a94def8ea1a82dfee80f7b58452d9b19e5854e23a6590237af9b5af2c8f4e1b6 +size 4488 diff --git a/resource/lfs/icons/fileencrytion.png b/resource/lfs/icons/fileencrytion.png new file mode 100644 index 00000000..95498406 --- /dev/null +++ b/resource/lfs/icons/fileencrytion.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d1245de2fcefae258f5b006b2e219eba2b8cfd64079f7babb6b7303f9c082233 +size 2276 diff --git a/resource/lfs/icons/fileopen.png b/resource/lfs/icons/fileopen.png new file mode 100644 index 00000000..db4565e6 --- /dev/null +++ b/resource/lfs/icons/fileopen.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4d3e4c9fdacfbdfd86cb662182b8ae30a1329207a5faca0a710f1759355a6209 +size 3100 diff --git a/resource/lfs/icons/fileprint.png b/resource/lfs/icons/fileprint.png new file mode 100644 index 00000000..6a38fdb7 --- /dev/null +++ b/resource/lfs/icons/fileprint.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8d7996f0f0fa8b2202cedc83a8807d5cdd93e37260ca881dcf08f399f08724d5 +size 2915 diff --git a/resource/lfs/icons/filesave.png b/resource/lfs/icons/filesave.png new file mode 100644 index 00000000..48a8b528 --- /dev/null +++ b/resource/lfs/icons/filesave.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:860cc194f2e18205982500584561032c52762cd72f1f467253c83743bba25c30 +size 2348 diff --git a/resource/lfs/icons/filesaveas.png b/resource/lfs/icons/filesaveas.png new file mode 100644 index 00000000..6bb970dd --- /dev/null +++ b/resource/lfs/icons/filesaveas.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2c7b77a2065223d62e16a291912db7f4333dab306ad14734d1a6d746834db617 +size 4333 diff --git a/resource/lfs/icons/flag-fill.png b/resource/lfs/icons/flag-fill.png new file mode 100644 index 00000000..b10aedc8 --- /dev/null +++ b/resource/lfs/icons/flag-fill.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:349022c08e8937778926186507e4acab5244150bdd059a880f4802898db4b7a6 +size 2128 diff --git a/resource/lfs/icons/folder.png b/resource/lfs/icons/folder.png new file mode 100644 index 00000000..f6cf6811 --- /dev/null +++ b/resource/lfs/icons/folder.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:86e1f3419d987c7a4bf2c039f5e5b70ce61fc15d267c97570d29b2eaf8eb7fe3 +size 2944 diff --git a/resource/lfs/icons/format-line-spacing-double.png b/resource/lfs/icons/format-line-spacing-double.png new file mode 100644 index 00000000..bdc767c7 --- /dev/null +++ b/resource/lfs/icons/format-line-spacing-double.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:db40aa28df915f2e25304f02837931127fde103cec9f506fe1a79e1ad6688f76 +size 676 diff --git a/resource/lfs/icons/format-line-spacing-normal.png b/resource/lfs/icons/format-line-spacing-normal.png new file mode 100644 index 00000000..f7ac0605 --- /dev/null +++ b/resource/lfs/icons/format-line-spacing-normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a66d7d83b83ac2317e5d53c68cfe6e7ae0c1fc4db4623812ad66719787a019a6 +size 707 diff --git a/resource/lfs/icons/format-line-spacing-triple.png b/resource/lfs/icons/format-line-spacing-triple.png new file mode 100644 index 00000000..5de7739b --- /dev/null +++ b/resource/lfs/icons/format-line-spacing-triple.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:07fc9072bfc326914bf6efc525d8a5bab15a4848c9c1b6f9ffa07ecd2119f3cc +size 534 diff --git a/resource/lfs/icons/gnupg.png b/resource/lfs/icons/gnupg.png new file mode 100644 index 00000000..510261ab --- /dev/null +++ b/resource/lfs/icons/gnupg.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2028312f15a9a87f1d1a4e39d364244daedcb22dc105eb7273bcd7a3ad7d70de +size 7198 diff --git a/resource/lfs/icons/gpgfrontend-logo.png b/resource/lfs/icons/gpgfrontend-logo.png new file mode 100644 index 00000000..84ca1971 --- /dev/null +++ b/resource/lfs/icons/gpgfrontend-logo.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c00d0c08f4fce86d79294110a28c5a5985fca2078f08eb4fa349404751f85037 +size 17878 diff --git a/resource/lfs/icons/gpgfrontend-logo_small (copy).png b/resource/lfs/icons/gpgfrontend-logo_small (copy).png new file mode 100644 index 00000000..06dbb5b3 --- /dev/null +++ b/resource/lfs/icons/gpgfrontend-logo_small (copy).png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:af28a70c4c2d210baff0bcec2ca1d597361e79e71b36244c2a63b6062b8d64fc +size 12857 diff --git a/resource/lfs/icons/gpgfrontend-logo_small.png b/resource/lfs/icons/gpgfrontend-logo_small.png new file mode 100644 index 00000000..06dbb5b3 --- /dev/null +++ b/resource/lfs/icons/gpgfrontend-logo_small.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:af28a70c4c2d210baff0bcec2ca1d597361e79e71b36244c2a63b6062b8d64fc +size 12857 diff --git a/resource/lfs/icons/gpgfrontend.png b/resource/lfs/icons/gpgfrontend.png new file mode 100644 index 00000000..ddae98d3 --- /dev/null +++ b/resource/lfs/icons/gpgfrontend.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0cfd63568e29d989b8558b8c5d8a8dfb2cf29413f72d358004beadd0ad8fedfa +size 3533 diff --git a/resource/lfs/icons/help.png b/resource/lfs/icons/help.png new file mode 100644 index 00000000..551e5b3a --- /dev/null +++ b/resource/lfs/icons/help.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4d28523eb235987c7f16948fa6ec373b850e292c186243768331cabc1a2f52f7 +size 2723 diff --git a/resource/lfs/icons/import_key_from_clipboard.png b/resource/lfs/icons/import_key_from_clipboard.png new file mode 100644 index 00000000..4acbd759 --- /dev/null +++ b/resource/lfs/icons/import_key_from_clipboard.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0b6942d2d648b31980a4d7b999fb3f7062d3ac3c1dfd251fefeb5461324f9fe1 +size 1952 diff --git a/resource/lfs/icons/import_key_from_file.png b/resource/lfs/icons/import_key_from_file.png new file mode 100644 index 00000000..26341b10 --- /dev/null +++ b/resource/lfs/icons/import_key_from_file.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7498d6fe37850fc174c3a40d921613f2afc4074a1397bc50db75693c3d87907a +size 2404 diff --git a/resource/lfs/icons/import_key_from_server.png b/resource/lfs/icons/import_key_from_server.png new file mode 100644 index 00000000..4607ad63 --- /dev/null +++ b/resource/lfs/icons/import_key_from_server.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea79dcfb307eafc33bc1447add8e62e96032e33a38d411729e7b8346e93e88b1 +size 4802 diff --git a/resource/lfs/icons/importance.png b/resource/lfs/icons/importance.png new file mode 100644 index 00000000..5f239278 --- /dev/null +++ b/resource/lfs/icons/importance.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:27a33e86352e10cf109a3ef77b561f0ed7bd75255b5d70fb46cd600ade76c10e +size 6036 diff --git a/resource/lfs/icons/importkey_editor.png b/resource/lfs/icons/importkey_editor.png new file mode 100644 index 00000000..da2e8e53 --- /dev/null +++ b/resource/lfs/icons/importkey_editor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aee1c2355e8a6aa4c738a284bb7e9ba740c1d87c2618bc5c8b8a153c0abfd37e +size 4040 diff --git a/resource/lfs/icons/inbox.png b/resource/lfs/icons/inbox.png new file mode 100644 index 00000000..47337aa8 --- /dev/null +++ b/resource/lfs/icons/inbox.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4364bb3ff09678aa7ac28cdaa05746d1d566d0943c7934f15a189dfb3968be03 +size 5627 diff --git a/resource/lfs/icons/info.png b/resource/lfs/icons/info.png new file mode 100644 index 00000000..da9a46e3 --- /dev/null +++ b/resource/lfs/icons/info.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:382261e0bb03cf316aaef0e2859928a9093c26c78d86b7d681a999482d0072bd +size 7948 diff --git a/resource/lfs/icons/junk.png b/resource/lfs/icons/junk.png new file mode 100644 index 00000000..a3f362bf --- /dev/null +++ b/resource/lfs/icons/junk.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0281410d186d610c8ae5ccde6219ee3badbc9bcdbc5f76fdf76989eae5430a08 +size 7485 diff --git a/resource/lfs/icons/key_export.png b/resource/lfs/icons/key_export.png new file mode 100644 index 00000000..5bf16ce2 --- /dev/null +++ b/resource/lfs/icons/key_export.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5fb173f764f71b7d0cda088ea6119e3700e589b544a2caa39ad109a75f48b4ab +size 1449 diff --git a/resource/lfs/icons/key_generate.png b/resource/lfs/icons/key_generate.png new file mode 100644 index 00000000..df7fe13d --- /dev/null +++ b/resource/lfs/icons/key_generate.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1222fa9f83ae5f414bf199cfc7c2379479af1cd38ae5c5322b31854671d3bea8 +size 2708 diff --git a/resource/lfs/icons/key_import.png b/resource/lfs/icons/key_import.png new file mode 100644 index 00000000..27cc6c2a --- /dev/null +++ b/resource/lfs/icons/key_import.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:723b5c0ced22a7ad6fbddd86a460325f047f4d4fe95256de75607c764e82ed2d +size 4276 diff --git a/resource/lfs/icons/key_package.png b/resource/lfs/icons/key_package.png new file mode 100644 index 00000000..42e33e60 --- /dev/null +++ b/resource/lfs/icons/key_package.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:624d40db16f5e2cd542e1b17de7758623b43518da95d08d69c7811f64ee1b271 +size 8815 diff --git a/resource/lfs/icons/keymgmt.png b/resource/lfs/icons/keymgmt.png new file mode 100644 index 00000000..59488a68 --- /dev/null +++ b/resource/lfs/icons/keymgmt.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b42b4fc3825d262b46d120a10f9f97091814b61c9f9f062b0f7b4d25d483fdcb +size 4905 diff --git a/resource/lfs/icons/keys12.jpg b/resource/lfs/icons/keys12.jpg new file mode 100644 index 00000000..cc413d64 --- /dev/null +++ b/resource/lfs/icons/keys12.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bb6e11d2a189df92ffbb37d9033ab2d9e8ef841ba177287a563020a58bf7c86b +size 8130 diff --git a/resource/lfs/icons/keys13.jpg b/resource/lfs/icons/keys13.jpg new file mode 100644 index 00000000..4e2bbaaf --- /dev/null +++ b/resource/lfs/icons/keys13.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:adaa7646d26c7b3b04ec35f3ec42ba501296377b0d59c9bffe1cbdaebf49d9c2 +size 25883 diff --git a/resource/lfs/icons/kgpg_key2.png b/resource/lfs/icons/kgpg_key2.png new file mode 100644 index 00000000..220038ed --- /dev/null +++ b/resource/lfs/icons/kgpg_key2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b7d8a5dd2dfbb96852c6c6545152fd95c1e0a505b57400eb64fa65330af04fcf +size 3837 diff --git a/resource/lfs/icons/mimetypes/application-pdf.png b/resource/lfs/icons/mimetypes/application-pdf.png new file mode 100644 index 00000000..19427278 --- /dev/null +++ b/resource/lfs/icons/mimetypes/application-pdf.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:325a73c6ecf33c8349368b829c40514ad7f6cc1594e19a9abe083665924caa5f +size 1537 diff --git a/resource/lfs/icons/mimetypes/image-x-generic.png b/resource/lfs/icons/mimetypes/image-x-generic.png new file mode 100644 index 00000000..3293c323 --- /dev/null +++ b/resource/lfs/icons/mimetypes/image-x-generic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:04c1484b6bd4cac6112d451bd4fe186365686bf41eaedc1702b3922f419221ed +size 1562 diff --git a/resource/lfs/icons/mimetypes/text-plain.png b/resource/lfs/icons/mimetypes/text-plain.png new file mode 100644 index 00000000..09291143 --- /dev/null +++ b/resource/lfs/icons/mimetypes/text-plain.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ba5f411e30bb270cdea1a248b043721b5af1cb3a66da5fd9524a96ccabed13f1 +size 1138 diff --git a/resource/lfs/icons/mimetypes/unknown.png b/resource/lfs/icons/mimetypes/unknown.png new file mode 100644 index 00000000..412276f4 --- /dev/null +++ b/resource/lfs/icons/mimetypes/unknown.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:806f0f5e88cf35514674dff9d9305fcb919f7eb0fc465a6b5e9ca79f4142d9c0 +size 1091 diff --git a/resource/lfs/icons/misc_doc.png b/resource/lfs/icons/misc_doc.png new file mode 100644 index 00000000..012e609d --- /dev/null +++ b/resource/lfs/icons/misc_doc.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7678b8c6454a917befcab6864bc60e9fde3bae5790402e594b7574fcea06a1f7 +size 1482 diff --git a/resource/lfs/icons/quote.png b/resource/lfs/icons/quote.png new file mode 100644 index 00000000..e5dc26d1 --- /dev/null +++ b/resource/lfs/icons/quote.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0b970514c11890213b07f1a1930565a7072f91797182b62216fc290ad82e58f4 +size 1516 diff --git a/resource/lfs/icons/receive_email.png b/resource/lfs/icons/receive_email.png new file mode 100644 index 00000000..8e0a1c5a --- /dev/null +++ b/resource/lfs/icons/receive_email.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1eb030dc5edc7c4c5b806750dd420f461a5651d6a5286d3b4056f06d8615ecf8 +size 6404 diff --git a/resource/lfs/icons/refresh.png b/resource/lfs/icons/refresh.png new file mode 100644 index 00000000..33ee862c --- /dev/null +++ b/resource/lfs/icons/refresh.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aaf1bceeb3177301b6d6b27d2557dc18c42c6f15b47648c106c2b3a39b379f6b +size 6821 diff --git a/resource/lfs/icons/sent.png b/resource/lfs/icons/sent.png new file mode 100644 index 00000000..42a09ba6 --- /dev/null +++ b/resource/lfs/icons/sent.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0afe7bdff6082a39f5865640d5df36e52c56bc27d85c700cb977df83d8084802 +size 8314 diff --git a/resource/lfs/icons/server.png b/resource/lfs/icons/server.png new file mode 100644 index 00000000..357b2c47 --- /dev/null +++ b/resource/lfs/icons/server.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0ab93928a92a82dbcc570b40c3b39fc5c416f1e85a07ceb177cc051304784a0e +size 3663 diff --git a/resource/lfs/icons/signature.png b/resource/lfs/icons/signature.png new file mode 100644 index 00000000..bcab03d8 --- /dev/null +++ b/resource/lfs/icons/signature.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8ce421ffe434639cf8365bf2e266a2f658fb1c27ce03c6a25f885ba6c3d2b4e6 +size 3710 diff --git a/resource/lfs/icons/ssh-key.png b/resource/lfs/icons/ssh-key.png new file mode 100644 index 00000000..60a05a20 --- /dev/null +++ b/resource/lfs/icons/ssh-key.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:faf956400baa3a933a855f793f1a6c1feb3c17dd4dc9cf174c77d1061b578c5a +size 6510 diff --git a/resource/lfs/icons/statusbar_icon.png b/resource/lfs/icons/statusbar_icon.png new file mode 100644 index 00000000..31cad65e --- /dev/null +++ b/resource/lfs/icons/statusbar_icon.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:de3e5e276542bf4db1ec1c999237bd7c924ec482d17b291a06363df200670b72 +size 870 diff --git a/resource/lfs/icons/trash.png b/resource/lfs/icons/trash.png new file mode 100644 index 00000000..b6ffd2f1 --- /dev/null +++ b/resource/lfs/icons/trash.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0e62ec80d60518772619e0b3c3e00adb2269709c427a1edea6c51f4b31432d4d +size 3901 diff --git a/resource/lfs/icons/txt.png b/resource/lfs/icons/txt.png new file mode 100644 index 00000000..70bd0966 --- /dev/null +++ b/resource/lfs/icons/txt.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:07801839b7474ac61caede32fa3c1bef8c039f96ba95b0a7fdf9741156948a5a +size 2482 diff --git a/resource/lfs/icons/undo.png b/resource/lfs/icons/undo.png new file mode 100644 index 00000000..66fde659 --- /dev/null +++ b/resource/lfs/icons/undo.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5be1fc189b99e79e87571618aa2813bceab342414590ce169379b5455f43fa77 +size 4347 diff --git a/resource/lfs/icons/up-arrow.png b/resource/lfs/icons/up-arrow.png new file mode 100644 index 00000000..75887fa5 --- /dev/null +++ b/resource/lfs/icons/up-arrow.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9b02da624cd73f0dabdb341659c44748d5b5740212f813b50e1fe38531429c35 +size 4969 diff --git a/resource/lfs/icons/up.png b/resource/lfs/icons/up.png new file mode 100644 index 00000000..c69d30a4 --- /dev/null +++ b/resource/lfs/icons/up.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a42e92ff92beab851b379a28f77e438ba1389cb71d36f3e63419f55df849ec8 +size 4557 diff --git a/resource/lfs/icons/verify.png b/resource/lfs/icons/verify.png new file mode 100644 index 00000000..c83f821d --- /dev/null +++ b/resource/lfs/icons/verify.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e4230a0d94570b2dfaa15aa74b44b749fb2fe11a82c6d4cca2b59b56a43be71d +size 7005 diff --git a/resource/lfs/icons/warning.png b/resource/lfs/icons/warning.png new file mode 100644 index 00000000..2bf999b8 --- /dev/null +++ b/resource/lfs/icons/warning.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f3fa6a70b3142a14636c17067dcbb91402404a30e2608bd6abcc849567d6075 +size 7506 diff --git a/resource/lfs/icons/wizard_banner.png b/resource/lfs/icons/wizard_banner.png new file mode 100644 index 00000000..e8c50d35 --- /dev/null +++ b/resource/lfs/icons/wizard_banner.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0f232f4539d6b6ab34f0b212f4ff18d27d8defd37538dd2b98edbc06259f123f +size 16779 diff --git a/resource/lfs/locale/po/af_ZA.po b/resource/lfs/locale/po/af_ZA.po new file mode 100644 index 00000000..e1ea537d --- /dev/null +++ b/resource/lfs/locale/po/af_ZA.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:28f0d88dbda7e26863343bd7712734a851cda1704f8f2b1e25cdb8319d7cb5dd +size 178621 diff --git a/resource/lfs/locale/po/ar_IQ.po b/resource/lfs/locale/po/ar_IQ.po new file mode 100644 index 00000000..9c666723 --- /dev/null +++ b/resource/lfs/locale/po/ar_IQ.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e74990bbc6abe54992d726502c6d11f1f64fd4af0e571a7cb7712c975faabb52 +size 193799 diff --git a/resource/lfs/locale/po/ar_SA.po b/resource/lfs/locale/po/ar_SA.po new file mode 100644 index 00000000..936e422b --- /dev/null +++ b/resource/lfs/locale/po/ar_SA.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:975bd684d25977809b9b1655d78cb7523fb838fe581822e60c49ed0df83065ef +size 193786 diff --git a/resource/lfs/locale/po/be_BY.po b/resource/lfs/locale/po/be_BY.po new file mode 100644 index 00000000..523b939f --- /dev/null +++ b/resource/lfs/locale/po/be_BY.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3ff405dfada2e7dc4070c60da66ae631a02ca42aa5adda5eb5a7badab64b2318 +size 204590 diff --git a/resource/lfs/locale/po/bg_BG.po b/resource/lfs/locale/po/bg_BG.po new file mode 100644 index 00000000..09b51da2 --- /dev/null +++ b/resource/lfs/locale/po/bg_BG.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:869bab9f9a558338399126f5435d5472ddb8922b69b4a7c67edf411c98064776 +size 206711 diff --git a/resource/lfs/locale/po/ca_ES.po b/resource/lfs/locale/po/ca_ES.po new file mode 100644 index 00000000..f5a7dec7 --- /dev/null +++ b/resource/lfs/locale/po/ca_ES.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:67074700501db216092117d9a9ba12ce74f8a37f724f6ab99262fdd5a2e3946a +size 181764 diff --git a/resource/lfs/locale/po/cs_CZ.po b/resource/lfs/locale/po/cs_CZ.po new file mode 100644 index 00000000..5359703b --- /dev/null +++ b/resource/lfs/locale/po/cs_CZ.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ec01bc3b302dbc5fae7db37b20bac8266641c281b53f182662367bb467b34d34 +size 179793 diff --git a/resource/lfs/locale/po/da_DK.po b/resource/lfs/locale/po/da_DK.po new file mode 100644 index 00000000..6de8a22f --- /dev/null +++ b/resource/lfs/locale/po/da_DK.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a0b96267327fe7a85bda9978f07979bd40266c1ade45d27991d5ee81de46591e +size 177186 diff --git a/resource/lfs/locale/po/de_AT.po b/resource/lfs/locale/po/de_AT.po new file mode 100644 index 00000000..b6111e8a --- /dev/null +++ b/resource/lfs/locale/po/de_AT.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9da8047ce35402c04a816acc1e5ea3ac1d938018ef88f455857bfae8fa10dc76 +size 183833 diff --git a/resource/lfs/locale/po/de_CH.po b/resource/lfs/locale/po/de_CH.po new file mode 100644 index 00000000..8f16384c --- /dev/null +++ b/resource/lfs/locale/po/de_CH.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:beadf3b2774e19d8487fcca43951b424943cac8cc85749303d2409ea59420de0 +size 183821 diff --git a/resource/lfs/locale/po/de_DE.po b/resource/lfs/locale/po/de_DE.po new file mode 100644 index 00000000..7ca407f7 --- /dev/null +++ b/resource/lfs/locale/po/de_DE.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:81c1d84c7d431485823deddfc67f5bc1e7922d994db59f8107eb2d8d08c33495 +size 184285 diff --git a/resource/lfs/locale/po/el_GR.po b/resource/lfs/locale/po/el_GR.po new file mode 100644 index 00000000..91079378 --- /dev/null +++ b/resource/lfs/locale/po/el_GR.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5045b87ad0e4e2b7bc7172772a4cc0ec0c6b5257aad98d57f108b36eacb5c175 +size 214074 diff --git a/resource/lfs/locale/po/en_US.po b/resource/lfs/locale/po/en_US.po new file mode 100644 index 00000000..d2e1a2cd --- /dev/null +++ b/resource/lfs/locale/po/en_US.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f04dd1dc4b01e75fc6e01120d6ddcbd0934c1efc47528147bf78da0848f83ce6 +size 174736 diff --git a/resource/lfs/locale/po/es_ES.po b/resource/lfs/locale/po/es_ES.po new file mode 100644 index 00000000..9aced60f --- /dev/null +++ b/resource/lfs/locale/po/es_ES.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:86a1363b95f4def768ce3edbbcb6dc0a67d7fd0db1f6539b4d6b11428bc72cc3 +size 181915 diff --git a/resource/lfs/locale/po/es_MX.po b/resource/lfs/locale/po/es_MX.po new file mode 100644 index 00000000..9d26a6d6 --- /dev/null +++ b/resource/lfs/locale/po/es_MX.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:633227ddb99b0f7c449e73a85874cab6ec898dd85bed63356dd95975918953c0 +size 156250 diff --git a/resource/lfs/locale/po/et_EE.po b/resource/lfs/locale/po/et_EE.po new file mode 100644 index 00000000..4f9d40b1 --- /dev/null +++ b/resource/lfs/locale/po/et_EE.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fcc266aaa4edebed315146a97785949b159ca39e9325eb9678ed7c3a1b7d9e87 +size 176566 diff --git a/resource/lfs/locale/po/fa_IR.po b/resource/lfs/locale/po/fa_IR.po new file mode 100644 index 00000000..c8eba924 --- /dev/null +++ b/resource/lfs/locale/po/fa_IR.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2a12df4a347064e35d130320b9f33e329a2eaf5dd167ba701195b8f4ca88a88d +size 195536 diff --git a/resource/lfs/locale/po/fi_FI.po b/resource/lfs/locale/po/fi_FI.po new file mode 100644 index 00000000..12dc226d --- /dev/null +++ b/resource/lfs/locale/po/fi_FI.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:da7b046f4ae573cac1d5e6eae3ec8551b02f500245bce4b83d1d7c16015c38d1 +size 178462 diff --git a/resource/lfs/locale/po/fr_CA.po b/resource/lfs/locale/po/fr_CA.po new file mode 100644 index 00000000..ec5d9420 --- /dev/null +++ b/resource/lfs/locale/po/fr_CA.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:030c695997ca7b4fe25cb128f58255d6bebfd181346a5a38253e39b949b67bd8 +size 184247 diff --git a/resource/lfs/locale/po/fr_FR.po b/resource/lfs/locale/po/fr_FR.po new file mode 100644 index 00000000..72cd97e9 --- /dev/null +++ b/resource/lfs/locale/po/fr_FR.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6e42dac05e41b520715fb6172c9d13ecf53977e2d0ce91ee4d57391a25113932 +size 184226 diff --git a/resource/lfs/locale/po/he_IL.po b/resource/lfs/locale/po/he_IL.po new file mode 100644 index 00000000..671b3f8a --- /dev/null +++ b/resource/lfs/locale/po/he_IL.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ba6b60c5a4ef1d2c28c9ae594688a428b4627a75a4ebef9352398b925562fb20 +size 186987 diff --git a/resource/lfs/locale/po/hi_IN.po b/resource/lfs/locale/po/hi_IN.po new file mode 100644 index 00000000..ea740a8f --- /dev/null +++ b/resource/lfs/locale/po/hi_IN.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9cfdf09bcb42d93682ebb17e665bd24e6ec6dc3a740fdc575c0f55c791b5f086 +size 227532 diff --git a/resource/lfs/locale/po/hr_HR.po b/resource/lfs/locale/po/hr_HR.po new file mode 100644 index 00000000..e86bb75e --- /dev/null +++ b/resource/lfs/locale/po/hr_HR.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5ba7fcdcfa9084041a323216b42d369cfb6224b8629fa23c0f75646124a9bfeb +size 178992 diff --git a/resource/lfs/locale/po/id_ID.po b/resource/lfs/locale/po/id_ID.po new file mode 100644 index 00000000..8db68ef0 --- /dev/null +++ b/resource/lfs/locale/po/id_ID.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d4a35dbc50a129ef8da1f20f04c41362508673ef5d77815571246e0cea9ed51f +size 177523 diff --git a/resource/lfs/locale/po/it_IT.po b/resource/lfs/locale/po/it_IT.po new file mode 100644 index 00000000..64e8b7da --- /dev/null +++ b/resource/lfs/locale/po/it_IT.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0f6b9b7f01c64f16cd68b073299499021dea115718ed40157529c62cc9b10423 +size 181812 diff --git a/resource/lfs/locale/po/iw_IL.po b/resource/lfs/locale/po/iw_IL.po new file mode 100644 index 00000000..12f7d889 --- /dev/null +++ b/resource/lfs/locale/po/iw_IL.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e18c010c87e737b8956a9771a978e5f273602460c2db0fe3de1b26b742a55da1 +size 161317 diff --git a/resource/lfs/locale/po/ja_JP.po b/resource/lfs/locale/po/ja_JP.po new file mode 100644 index 00000000..77c93890 --- /dev/null +++ b/resource/lfs/locale/po/ja_JP.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b889d6b287a12d07fd18ddfa68e4d235c3d63d91572e190570e264a506909d49 +size 188487 diff --git a/resource/lfs/locale/po/ko_KR.po b/resource/lfs/locale/po/ko_KR.po new file mode 100644 index 00000000..76aaf8d9 --- /dev/null +++ b/resource/lfs/locale/po/ko_KR.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b51345220da4755f94d7aadb65673b71209ccf2f3fbac311fe28664aef3569d5 +size 180599 diff --git a/resource/lfs/locale/po/lt_LT.po b/resource/lfs/locale/po/lt_LT.po new file mode 100644 index 00000000..676f9b2f --- /dev/null +++ b/resource/lfs/locale/po/lt_LT.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1f77f8d5dd073e70e9cfdb2a3cf67f61fae6393a93a4b172fc68bb0ea9bbb568 +size 180308 diff --git a/resource/lfs/locale/po/nl_NL.po b/resource/lfs/locale/po/nl_NL.po new file mode 100644 index 00000000..4e425e99 --- /dev/null +++ b/resource/lfs/locale/po/nl_NL.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cc30142bee7663add4b207e43dde28411fed5f55b2e7fc9ca472edefd7cf2545 +size 180142 diff --git a/resource/lfs/locale/po/pl_PL.po b/resource/lfs/locale/po/pl_PL.po new file mode 100644 index 00000000..a0671299 --- /dev/null +++ b/resource/lfs/locale/po/pl_PL.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:40ee8a29b964383487ebc05b9056c8c38e515bc2b0d7dba171e81f26d94d900c +size 180377 diff --git a/resource/lfs/locale/po/pt_BR.po b/resource/lfs/locale/po/pt_BR.po new file mode 100644 index 00000000..104e9cda --- /dev/null +++ b/resource/lfs/locale/po/pt_BR.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3a1d2a79e2f66ff06f89d7a0bc145d682d7ba9255eb77002630191f4a08db0c0 +size 181155 diff --git a/resource/lfs/locale/po/ru_RU.po b/resource/lfs/locale/po/ru_RU.po new file mode 100644 index 00000000..5cb48216 --- /dev/null +++ b/resource/lfs/locale/po/ru_RU.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e2e4165fe52865a917a141571c14b84d8b8b65d669fed6eb848696f39299b0b3 +size 206538 diff --git a/resource/lfs/locale/po/sq_AL.po b/resource/lfs/locale/po/sq_AL.po new file mode 100644 index 00000000..86419d64 --- /dev/null +++ b/resource/lfs/locale/po/sq_AL.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ba12a6f3ae1a4c777d0247bb371d07b7a5e86b23199b0469d1fab058579c39c +size 183627 diff --git a/resource/lfs/locale/po/uk_UA.po b/resource/lfs/locale/po/uk_UA.po new file mode 100644 index 00000000..9254a4fe --- /dev/null +++ b/resource/lfs/locale/po/uk_UA.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8712926b45c68833c85cd736e797486129de3bf0dc8a572dee50c43be0356be1 +size 205262 diff --git a/resource/lfs/locale/po/zh_CN.po b/resource/lfs/locale/po/zh_CN.po new file mode 100644 index 00000000..bd969aaf --- /dev/null +++ b/resource/lfs/locale/po/zh_CN.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:66c78a261044ce74fc616af86983e912ef9147d4ed38547e1ec0c3711660b13f +size 171812 diff --git a/resource/lfs/locale/po/zh_HK.po b/resource/lfs/locale/po/zh_HK.po new file mode 100644 index 00000000..72c731d6 --- /dev/null +++ b/resource/lfs/locale/po/zh_HK.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bfd8d21ac746313d1ff0e923870e341e39c08da587466db212fde190456b2113 +size 171694 diff --git a/resource/lfs/locale/po/zh_TW.po b/resource/lfs/locale/po/zh_TW.po new file mode 100644 index 00000000..ea27de1c --- /dev/null +++ b/resource/lfs/locale/po/zh_TW.po @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7d346e095da2ca7a26b7df0c9dc0e0702c1e8f3cf9f56dca090fff50b1a243bd +size 171688 diff --git a/resource/lfs/locale/template/GpgFrontend.pot b/resource/lfs/locale/template/GpgFrontend.pot new file mode 100644 index 00000000..8bda2ffb --- /dev/null +++ b/resource/lfs/locale/template/GpgFrontend.pot @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:810f7df66638b9a07471ec42392fcf377e403f5a1e7a6b4a9ceef8aba5dd9133 +size 132195 diff --git a/resource/lfs/macOS/GnuPG/agent/gpg-agent b/resource/lfs/macOS/GnuPG/agent/gpg-agent deleted file mode 100755 index 190c40e2..00000000 --- a/resource/lfs/macOS/GnuPG/agent/gpg-agent +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:09ad99b28e3b2db960965f7debf20d5d64867cebc6852d52a853f827dad7c7b5 -size 436544 diff --git a/resource/lfs/macOS/GnuPG/bin/gpgconf b/resource/lfs/macOS/GnuPG/bin/gpgconf deleted file mode 100755 index f30709d1..00000000 --- a/resource/lfs/macOS/GnuPG/bin/gpgconf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1d433cb8cd39b2e727467452063047005205b4e742e24ffb2b8d2e2c3389c798 -size 88 diff --git a/resource/lfs/macOS/GnuPG/bin/gpgconf-original b/resource/lfs/macOS/GnuPG/bin/gpgconf-original deleted file mode 100755 index e305b949..00000000 --- a/resource/lfs/macOS/GnuPG/bin/gpgconf-original +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:453e1ff371d08aee36b84899582ba68bc275ba8883340ea183f0c82a51bf480c -size 201552 diff --git a/resource/lfs/macOS/GnuPG/dirmngr/dirmngr b/resource/lfs/macOS/GnuPG/dirmngr/dirmngr deleted file mode 100755 index 944a545a..00000000 --- a/resource/lfs/macOS/GnuPG/dirmngr/dirmngr +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:80903d1d7107d87f350790a01fb19a6206cc36d62d50d82865e1ef9c081d443b -size 581472 diff --git a/resource/lfs/macOS/GnuPG/g10/gpg b/resource/lfs/macOS/GnuPG/g10/gpg deleted file mode 100755 index 92f49d92..00000000 --- a/resource/lfs/macOS/GnuPG/g10/gpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d8973db4e183b7b26aed45fc663ff34e2d0ba52b0d3d08bc249294d89a955cf1 -size 1033696 diff --git a/resource/lfs/macOS/GnuPG/kbx/keyboxd b/resource/lfs/macOS/GnuPG/kbx/keyboxd deleted file mode 100755 index e3675190..00000000 --- a/resource/lfs/macOS/GnuPG/kbx/keyboxd +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c66166e8e8efef62e18c67cd2bac0db5d0ba50e6c0eb117fc07369f1bb55d207 -size 305488 diff --git a/resource/lfs/macOS/GnuPG/libs/libassuan.0.dylib b/resource/lfs/macOS/GnuPG/libs/libassuan.0.dylib deleted file mode 100644 index b1775f54..00000000 --- a/resource/lfs/macOS/GnuPG/libs/libassuan.0.dylib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:243914cefac155f1843f91331d2eb3326154ba5f68a1143b3882b8fc94f13bc4 -size 116640 diff --git a/resource/lfs/macOS/GnuPG/libs/libgcrypt.20.dylib b/resource/lfs/macOS/GnuPG/libs/libgcrypt.20.dylib deleted file mode 100644 index e1a31ac4..00000000 --- a/resource/lfs/macOS/GnuPG/libs/libgcrypt.20.dylib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cc444590a050499a5f516284b43cedeba243822729b3c593ac458ca5a509a710 -size 842032 diff --git a/resource/lfs/macOS/GnuPG/libs/libgmp.10.dylib b/resource/lfs/macOS/GnuPG/libs/libgmp.10.dylib deleted file mode 100644 index 829aea2b..00000000 --- a/resource/lfs/macOS/GnuPG/libs/libgmp.10.dylib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ed2249f92c4386a97513991642ee9eb6af041c646e3c9fdab2ac4c6f468fefec -size 486352 diff --git a/resource/lfs/macOS/GnuPG/libs/libgnutls.30.dylib b/resource/lfs/macOS/GnuPG/libs/libgnutls.30.dylib deleted file mode 100644 index 55330b13..00000000 --- a/resource/lfs/macOS/GnuPG/libs/libgnutls.30.dylib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ddc00b098c8a5c43fcba2524d9c9a0cb323fd1f77e6b64a809927ebcf14f542c -size 1948912 diff --git a/resource/lfs/macOS/GnuPG/libs/libgpg-error.0.dylib b/resource/lfs/macOS/GnuPG/libs/libgpg-error.0.dylib deleted file mode 100644 index 16479414..00000000 --- a/resource/lfs/macOS/GnuPG/libs/libgpg-error.0.dylib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ac9396f90299bd5952399c5428ed41b285e1b35d97ff90ee7917f17b314df746 -size 178496 diff --git a/resource/lfs/macOS/GnuPG/libs/libhogweed.6.6.dylib b/resource/lfs/macOS/GnuPG/libs/libhogweed.6.6.dylib deleted file mode 100644 index e76bc3ae..00000000 --- a/resource/lfs/macOS/GnuPG/libs/libhogweed.6.6.dylib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e6581f0ae342f40ac50f205bbfb3cb3b639eeebad4aa10f0892aab4e2c42f1db -size 300160 diff --git a/resource/lfs/macOS/GnuPG/libs/libidn2.0.dylib b/resource/lfs/macOS/GnuPG/libs/libidn2.0.dylib deleted file mode 100644 index 1e6338ba..00000000 --- a/resource/lfs/macOS/GnuPG/libs/libidn2.0.dylib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:308f59ceaa30199b39fdcb63080f86c0135beb744a0f73d89155bc94ed44ac1f -size 259536 diff --git a/resource/lfs/macOS/GnuPG/libs/libintl.8.dylib b/resource/lfs/macOS/GnuPG/libs/libintl.8.dylib deleted file mode 100644 index ed4dfc46..00000000 --- a/resource/lfs/macOS/GnuPG/libs/libintl.8.dylib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c55333e6fa8832b6f8a0276bfce9a50cecee95af2515e9d2fbde04074cfdbc5e -size 111216 diff --git a/resource/lfs/macOS/GnuPG/libs/libksba.8.dylib b/resource/lfs/macOS/GnuPG/libs/libksba.8.dylib deleted file mode 100644 index 20a0ceb5..00000000 --- a/resource/lfs/macOS/GnuPG/libs/libksba.8.dylib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e1604bb672c6a414b5c2dc2e3a5fc1a26554c74ec0790cf66c622d594466f04a -size 267344 diff --git a/resource/lfs/macOS/GnuPG/libs/libnettle.8.6.dylib b/resource/lfs/macOS/GnuPG/libs/libnettle.8.6.dylib deleted file mode 100644 index 5da22375..00000000 --- a/resource/lfs/macOS/GnuPG/libs/libnettle.8.6.dylib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:952c262111a35af64debcdcac6d38e9bf794b4602e6661625345b8f74813382d -size 315664 diff --git a/resource/lfs/macOS/GnuPG/libs/libnpth.0.dylib b/resource/lfs/macOS/GnuPG/libs/libnpth.0.dylib deleted file mode 100644 index 8b17220c..00000000 --- a/resource/lfs/macOS/GnuPG/libs/libnpth.0.dylib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e01272a5843b3abf78ecd0862a09d6648c7217c31fc1eccac23f380e4f84d1ee -size 56464 diff --git a/resource/lfs/macOS/GnuPG/libs/libp11-kit.0.dylib b/resource/lfs/macOS/GnuPG/libs/libp11-kit.0.dylib deleted file mode 100644 index 6a974b2f..00000000 --- a/resource/lfs/macOS/GnuPG/libs/libp11-kit.0.dylib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1df14b9fd115d317087f606a312f3095082e3286da21801f4f5ac41449f1babd -size 1022832 diff --git a/resource/lfs/macOS/GnuPG/libs/libreadline.8.2.dylib b/resource/lfs/macOS/GnuPG/libs/libreadline.8.2.dylib deleted file mode 100644 index 232ff1a9..00000000 --- a/resource/lfs/macOS/GnuPG/libs/libreadline.8.2.dylib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b1c19c68716d6098eff03f3d2bb62d312b9ebcca44c7b51ccc67d6cd3329b1ed -size 295968 diff --git a/resource/lfs/macOS/GnuPG/libs/libtasn1.6.dylib b/resource/lfs/macOS/GnuPG/libs/libtasn1.6.dylib deleted file mode 100644 index 22bc919e..00000000 --- a/resource/lfs/macOS/GnuPG/libs/libtasn1.6.dylib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:57c57b889d791ffca6f3c128dc6396de707086c11d1067a7c92b9e55cff49950 -size 125328 diff --git a/resource/lfs/macOS/GnuPG/libs/libunistring.5.dylib b/resource/lfs/macOS/GnuPG/libs/libunistring.5.dylib deleted file mode 100644 index 7fc15150..00000000 --- a/resource/lfs/macOS/GnuPG/libs/libunistring.5.dylib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c9f775e184335cc6bbb7e2b702f14054ac38672c4cd1648e12cedf4f2a4cd0e3 -size 1849472 diff --git a/resource/lfs/macOS/GnuPG/libs/libusb-1.0.0.dylib b/resource/lfs/macOS/GnuPG/libs/libusb-1.0.0.dylib deleted file mode 100644 index 569c5bdd..00000000 --- a/resource/lfs/macOS/GnuPG/libs/libusb-1.0.0.dylib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1e35b0eb52d44b464970aa671113f87089c4b540933437d2bf0dac8fcfc38fba -size 161040 diff --git a/resource/lfs/macOS/GnuPG/scd/scdaemon b/resource/lfs/macOS/GnuPG/scd/scdaemon deleted file mode 100755 index ba7d6de6..00000000 --- a/resource/lfs/macOS/GnuPG/scd/scdaemon +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1dd2a6bdf916e99dfbf6d662941661805de38f78bcf3522a9813fc430bede78e -size 555632 diff --git a/resource/lfs/macOS/GnuPG/sm/gpgsm b/resource/lfs/macOS/GnuPG/sm/gpgsm deleted file mode 100755 index 784b56ba..00000000 --- a/resource/lfs/macOS/GnuPG/sm/gpgsm +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9e660da5cdf99a0ff9be44326332a7d901b41a05136f279beb26dd81b4155555 -size 550544 diff --git a/resource/lfs/macOS/GnuPG/tools/gpg-connect-agent b/resource/lfs/macOS/GnuPG/tools/gpg-connect-agent deleted file mode 100755 index 882568b5..00000000 --- a/resource/lfs/macOS/GnuPG/tools/gpg-connect-agent +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b696f753532e0ff1c149c6e0e4b602982aa3715f31456d448b1ee3dfacbb06b -size 202832 diff --git a/resource/lfs/pixmaps/pub.gpgfrontend.gpgfrontend.png b/resource/lfs/pixmaps/pub.gpgfrontend.gpgfrontend.png new file mode 100644 index 00000000..a669fc87 --- /dev/null +++ b/resource/lfs/pixmaps/pub.gpgfrontend.gpgfrontend.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:33a7dda6cb7d65c94a944a20d2133218e0c6371b3f879e031838179bdbda9afd +size 9155 diff --git a/resource/pixmaps/pub.gpgfrontend.gpgfrontend.png b/resource/pixmaps/pub.gpgfrontend.gpgfrontend.png deleted file mode 100644 index b3268b01..00000000 Binary files a/resource/pixmaps/pub.gpgfrontend.gpgfrontend.png and /dev/null differ diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 4ec07d66..fb0aecc2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -102,7 +102,7 @@ if (APPLICATION_BUILD) if (APPLE) set(RESOURCE_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Resources) elseif (LINUX AND NOT LINUX_INSTALL_SOFTWARE) - file(COPY ${CMAKE_SOURCE_DIR}/resource/gpgfrontend DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ FOLLOW_SYMLINK_CHAIN) + file(COPY ${CMAKE_SOURCE_DIR}/resource/lfs/app-image/gpgfrontend DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ FOLLOW_SYMLINK_CHAIN) set(RESOURCE_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/gpgfrontend/usr/share) else () set(RESOURCE_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) @@ -127,16 +127,16 @@ if (MULTI_LANG_SUPPORT) if (NOT GETTEXT_MSGFMT_EXECUTABLE OR NOT GETTEXT_XGETTEXT_EXECUTABLE) message(ERROR "msgfmt or xgettext not found. Translations will *not* be installed") - else (NOT GETTEXT_MSGFMT_EXECUTABLE) + else() message(STATUS "Setting target translations") add_custom_target(translations) - set(OUTPUT_POT_PATH ${CMAKE_SOURCE_DIR}/resource/locale/template/${PROJECT_NAME}.pot) + set(OUTPUT_POT_PATH ${CMAKE_SOURCE_DIR}/resource/lfs/locale/template/${PROJECT_NAME}.pot) add_custom_command( TARGET translations COMMAND find ${CMAKE_SOURCE_DIR}/src -iname \"*.cpp\" | xargs xgettext --package-name=${PROJECT_NAME} --copyright-holder=Saturneric --package-version=${PROJECT_VERSION} --msgid-bugs-address=eric@bktus.com --add-comments="/*" --c++ -k_ -o ${OUTPUT_POT_PATH} ) - file(GLOB ALL_PO_FILES ${CMAKE_SOURCE_DIR}/resource/locale/po/*.po) + file(GLOB ALL_PO_FILES ${CMAKE_SOURCE_DIR}/resource/lfs/locale/po/*.po) SET(GMO_FILES) foreach (_poFile ${ALL_PO_FILES}) @@ -171,7 +171,7 @@ endif () if (APPLICATION_BUILD) # Copy Resource Files file(COPY ${CMAKE_SOURCE_DIR}/resource/css DESTINATION ${RESOURCE_OUTPUT_DIRECTORY}/ FOLLOW_SYMLINK_CHAIN) - file(COPY ${CMAKE_SOURCE_DIR}/resource/icons DESTINATION ${RESOURCE_OUTPUT_DIRECTORY}/ FOLLOW_SYMLINK_CHAIN) + file(COPY ${CMAKE_SOURCE_DIR}/resource/lfs/icons DESTINATION ${RESOURCE_OUTPUT_DIRECTORY}/ FOLLOW_SYMLINK_CHAIN) file(COPY ${CMAKE_SOURCE_DIR}/TRANSLATORS DESTINATION ${RESOURCE_OUTPUT_DIRECTORY} FOLLOW_SYMLINK_CHAIN) if (GPG_STANDALONE_MODE) file(COPY ${CMAKE_SOURCE_DIR}/resource/gpg1.4 DESTINATION ${RESOURCE_OUTPUT_DIRECTORY}/ FOLLOW_SYMLINK_CHAIN) @@ -419,12 +419,17 @@ if (APPLICATION_BUILD) # option for sandbox mode, still under test if(GPGFRONTEND_XOCDE_ENABLE_SANDBOX) + message(STATUS "Build Application With App Sandbox") set(CUSTOM_ATTRIBUTE_ENABLE_APP_SANDBOX "Yes") add_custom_command(TARGET ${AppName} POST_BUILD COMMAND /bin/cp -rf ${CMAKE_SOURCE_DIR}/resource/lfs/macOS/GnuPG ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${CMAKE_BUILD_TYPE}/${AppName}.app/Contents/ WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} COMMENT "Copying Buddled GnuPG into App Bundle Resource") + set_target_properties(${AppName} PROPERTIES + XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS "${CMAKE_SOURCE_DIR}/GpgFrontend.entitlements" + ) else() + message(STATUS "Build Application Without App Sandbox") set(CUSTOM_ATTRIBUTE_ENABLE_APP_SANDBOX "No") endif() @@ -434,7 +439,6 @@ if (APPLICATION_BUILD) XCODE_ATTRIBUTE_OTHER_CODE_SIGN_FLAGS "--deep --entitlements ${CMAKE_SOURCE_DIR}/resource/plist/entitlement.plist" XCODE_ATTRIBUTE_ENABLE_APP_SANDBOX "${CUSTOM_ATTRIBUTE_ENABLE_APP_SANDBOX}" XCODE_ATTRIBUTE_ENABLE_HARDENED_RUNTIME "Yes" - XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS "${CMAKE_SOURCE_DIR}/GpgFrontend.entitlements" XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "${GPGFRONTEND_XOCDE_CODE_SIGN_IDENTITY}" ) else () @@ -510,9 +514,9 @@ if (LINUX AND LINUX_INSTALL_SOFTWARE) DESTINATION /usr/share/metainfo/) install(DIRECTORY ${CMAKE_SOURCE_DIR}/resource/desktop/ DESTINATION /usr/share/applications/) - install(DIRECTORY ${CMAKE_SOURCE_DIR}/resource/pixmaps/ + install(DIRECTORY ${CMAKE_SOURCE_DIR}/resource/lfs/pixmaps/ DESTINATION /usr/share/pixmaps/) - install(DIRECTORY ${CMAKE_SOURCE_DIR}/resource/hicolor/ + install(DIRECTORY ${CMAKE_SOURCE_DIR}/resource/lfs/hicolor/ DESTINATION /usr/share/icons/hicolor/) endif () if (MULTI_LANG_SUPPORT) diff --git a/src/SECURITY.md b/src/SECURITY.md new file mode 100644 index 00000000..0d6b2add --- /dev/null +++ b/src/SECURITY.md @@ -0,0 +1,43 @@ +# Security Policy + +## Supported Versions + +The application white check mark is still in support, without it means there +version will no longer have a update including security fixture. That's beacuse +currently I have a job and a hard learning plain, which means I don't have too +much time to dealing with this project now, sincerely, I am sorry for that. +Maybe this situation will get better in the future. So it is recommand to use +the latest version. + +| Version | Supported | +| ------- | ------------------ | +| 1.x.x | :x: | +| 2.x.x | :x: | +| 2.1.x | :white_check_mark: | + +## Platform & Library Support + +According to security concern and my limiting time to contributing, GpgFrontend +will gradually drop the support of some old platforms. + +Starting from v1.0.0, x32 operating system is no longer support. Mainly because +I have limit time and the fact that x32 machime is getting less and less in the +pc market, so I plan to stop spending tons of time dealing with lots of complex +problem which might made me crazy. x64 is just enough, or you can use gpg4usb. + +Starting from v2.0.1, Ubuntu 16.04 is no longer support. Mainly because this +Ubuntu 16.04 LTS's life time had come into an end at during that time. Keep +using this version of Ubuntu is not safty anymore. + +Starting from v2.1.0, macOS 10.15 is no longer support. Mainly because this +system will no longer support by github action in the near future. Also, I think +this version is old enough to drop it out, and Apple might not longer to support +it soon. + +## Reporting a Vulnerability + +If you want to report a vulnerability, it's not good to raise an issue in +public. You should send an email to eric@bktus.com to contract me. In the email, +You can describe the vulnerability you have just discovered and request a +hot-fix. Or you can just provide a git patch to fix it and send it to me using +the email. This is a better way to solve the vulnerability as quick as possible. \ No newline at end of file diff --git a/src/core/GpgContext.cpp b/src/core/GpgContext.cpp index a5213134..f8dbebc6 100644 --- a/src/core/GpgContext.cpp +++ b/src/core/GpgContext.cpp @@ -40,8 +40,10 @@ #include "core/GpgModel.h" #include "core/common/CoreCommonUtil.h" #include "core/function/CoreSignalStation.h" +#include "core/function/GlobalSettingStation.h" #include "core/function/gpg/GpgCommandExecutor.h" #include "core/thread/TaskRunnerGetter.h" +#include "spdlog/spdlog.h" #include "thread/Task.h" #ifdef _WIN32 @@ -58,20 +60,12 @@ GpgContext::GpgContext(int channel) * Set up gpgme-context, set paths to app-run path */ GpgContext::GpgContext(const GpgContextInitArgs &args) : args_(args) { - static bool _first = true; - - if (_first) { - /* Initialize the locale environment. */ - SPDLOG_DEBUG("locale: {}", setlocale(LC_CTYPE, nullptr)); - info_.GpgMEVersion = gpgme_check_version(nullptr); - gpgme_set_locale(nullptr, LC_CTYPE, setlocale(LC_CTYPE, nullptr)); -#ifdef LC_MESSAGES - gpgme_set_locale(nullptr, LC_MESSAGES, setlocale(LC_MESSAGES, nullptr)); -#endif - _first = false; - } - gpgme_ctx_t _p_ctx; + + // get gpgme library version + info_.GpgMEVersion = gpgme_check_version(nullptr); + + // create a new context check_gpg_error(gpgme_new(&_p_ctx)); _ctx_ref = CtxRefHandler(_p_ctx); @@ -83,6 +77,17 @@ GpgContext::GpgContext(const GpgContextInitArgs &args) : args_(args) { assert(check_gpg_error_2_err_code(err) == GPG_ERR_NO_ERROR); } + // set context offline mode + SPDLOG_DEBUG("gpg context offline mode: {}", args_.offline_mode); + gpgme_set_offline(_ctx_ref.get(), args_.offline_mode ? 1 : 0); + + // set option auto import missing key + // invalid at offline mode + SPDLOG_DEBUG("gpg context auto import missing key: {}", args_.offline_mode); + if (!args.offline_mode && args.auto_import_missing_key) + check_gpg_error(gpgme_set_ctx_flag(_ctx_ref.get(), "auto-key-import", "1")); + + // get engine info auto engine_info = gpgme_ctx_get_engine_info(*this); // Check ENV before running bool check_passed = false, find_openpgp = false, find_gpgconf = false, @@ -219,8 +224,22 @@ void GpgContext::post_init_ctx() { // preload info auto &info = GetInfo(); - // listen passphrase input event - SetPassphraseCb(custom_passphrase_cb); + auto &settings = GlobalSettingStation::GetInstance().GetUISettings(); + + bool use_pinentry_as_password_input_dialog = false; + try { + use_pinentry_as_password_input_dialog = + settings.lookup("general.use_pinentry_as_password_input_dialog"); + } catch (...) { + SPDLOG_ERROR( + "setting operation error: use_pinentry_as_password_input_dialog"); + } + + // use custom qt dialog to replace pinentry + if (!use_pinentry_as_password_input_dialog) { + SetPassphraseCb(custom_passphrase_cb); + } + connect(this, &GpgContext::SignalNeedUserInputPassphrase, CoreSignalStation::GetInstance(), &CoreSignalStation::SignalNeedUserInputPassphrase); @@ -372,6 +391,16 @@ const GpgInfo &GpgContext::GetInfo(bool refresh) { auto component_name = info_split_list[0]; auto component_desc = info_split_list[1]; auto component_path = info_split_list[2]; + + boost::algorithm::trim(component_name); + boost::algorithm::trim(component_desc); + boost::algorithm::trim(component_path); + +#ifdef WINDOWS + // replace some special substrings on windows platform + boost::replace_all(component_path, "%3a", ":"); +#endif + auto binary_checksum = check_binary_chacksum(component_path); SPDLOG_DEBUG( @@ -386,13 +415,13 @@ const GpgInfo &GpgContext::GetInfo(bool refresh) { version = info_.GnupgVersion; } if (component_name == "gpg-agent") { - info_.GpgAgentPath = info_split_list[2]; + info_.GpgAgentPath = component_path; } if (component_name == "dirmngr") { - info_.DirmngrPath = info_split_list[2]; + info_.DirmngrPath = component_path; } if (component_name == "keyboxd") { - info_.KeyboxdPath = info_split_list[2]; + info_.KeyboxdPath = component_path; } { @@ -436,16 +465,25 @@ const GpgInfo &GpgContext::GetInfo(bool refresh) { if (info_split_list.size() != 2) continue; + auto configuration_name = info_split_list[0]; + auto configuration_value = info_split_list[1]; + boost::algorithm::trim(configuration_name); + boost::algorithm::trim(configuration_value); + +#ifdef WINDOWS + // replace some special substrings on windows platform + boost::replace_all(configuration_value, "%3a", ":"); +#endif + // record gnupg home path - if (info_split_list[0] == "homedir") { + if (configuration_name == "homedir") { info_.GnuPGHomePath = info_split_list[1]; } - auto configuration_name = info_split_list[0]; { // try lock std::unique_lock lock(info_.Lock); - configurations_info[configuration_name] = {info_split_list[1]}; + configurations_info[configuration_name] = {configuration_value}; } } }); @@ -489,12 +527,19 @@ const GpgInfo &GpgContext::GetInfo(bool refresh) { if (info_split_list.size() != 6) continue; auto configuration_name = info_split_list[0]; + boost::algorithm::trim(configuration_name); { // try lock std::unique_lock lock(info_.Lock); options_info[configuration_name] = { info_split_list[1], info_split_list[2], info_split_list[3], info_split_list[4], info_split_list[5]}; + + boost::algorithm::trim(options_info[configuration_name][0]); + boost::algorithm::trim(options_info[configuration_name][1]); + boost::algorithm::trim(options_info[configuration_name][2]); + boost::algorithm::trim(options_info[configuration_name][3]); + boost::algorithm::trim(options_info[configuration_name][4]); } } }); @@ -540,6 +585,7 @@ const GpgInfo &GpgContext::GetInfo(bool refresh) { if (info_split_list.size() != 10) continue; auto configuration_name = info_split_list[0]; + boost::algorithm::trim(configuration_name); { // try lock std::unique_lock lock(info_.Lock); @@ -547,6 +593,25 @@ const GpgInfo &GpgContext::GetInfo(bool refresh) { info_split_list[1], info_split_list[2], info_split_list[3], info_split_list[4], info_split_list[5], info_split_list[6], info_split_list[7], info_split_list[8], info_split_list[9]}; + + boost::algorithm::trim( + available_options_info[configuration_name][0]); + boost::algorithm::trim( + available_options_info[configuration_name][1]); + boost::algorithm::trim( + available_options_info[configuration_name][2]); + boost::algorithm::trim( + available_options_info[configuration_name][3]); + boost::algorithm::trim( + available_options_info[configuration_name][4]); + boost::algorithm::trim( + available_options_info[configuration_name][5]); + boost::algorithm::trim( + available_options_info[configuration_name][6]); + boost::algorithm::trim( + available_options_info[configuration_name][7]); + boost::algorithm::trim( + available_options_info[configuration_name][8]); } } }); @@ -561,20 +626,33 @@ const GpgInfo &GpgContext::GetInfo(bool refresh) { std::optional GpgContext::check_binary_chacksum( std::filesystem::path path) { - QFile f(QString::fromStdString(path.u8string())); - if (!f.open(QFile::ReadOnly)) return {}; + // check file info and access rights + QFileInfo info(QString::fromStdString(path.u8string())); + if (!info.exists() || !info.isFile() || !info.isReadable()) { + SPDLOG_ERROR("get info for file {} error, exists: {}", + info.filePath().toStdString(), info.exists()); + return {}; + } + + // open and read file + QFile f(info.filePath()); + if (!f.open(QIODevice::ReadOnly)) { + SPDLOG_ERROR("open {} to calculate check sum error: {}", path.u8string(), + f.errorString().toStdString()); + return {}; + } // read all data from file auto buffer = f.readAll(); f.close(); - auto hash_md5 = QCryptographicHash(QCryptographicHash::Md5); + auto hash_sha = QCryptographicHash(QCryptographicHash::Sha256); // md5 - hash_md5.addData(buffer); - auto md5 = hash_md5.result().toHex().toStdString(); - SPDLOG_DEBUG("md5 {}", md5); + hash_sha.addData(buffer); + auto sha = hash_sha.result().toHex().toStdString(); + SPDLOG_DEBUG("checksum for file {} is {}", path.u8string(), sha); - return md5.substr(0, 6); + return sha.substr(0, 6); } void GpgContext::_ctx_ref_deleter::operator()(gpgme_ctx_t _ctx) { diff --git a/src/core/GpgContext.h b/src/core/GpgContext.h index 384271a6..2ff87e6b 100644 --- a/src/core/GpgContext.h +++ b/src/core/GpgContext.h @@ -51,6 +51,8 @@ struct GpgContextInitArgs { std::string gpg_path = {}; bool test_mode = false; bool ascii = true; + bool offline_mode = false; + bool auto_import_missing_key = false; GpgContextInitArgs() = default; }; diff --git a/src/core/GpgCoreInit.cpp b/src/core/GpgCoreInit.cpp index 840b2b87..9395bac7 100644 --- a/src/core/GpgCoreInit.cpp +++ b/src/core/GpgCoreInit.cpp @@ -36,6 +36,10 @@ #include "core/GpgContext.h" #include "core/function/GlobalSettingStation.h" #include "function/gpg/GpgAdvancedOperator.h" +#include "spdlog/spdlog.h" +#include "thread/Task.h" +#include "thread/TaskRunner.h" +#include "thread/TaskRunnerGetter.h" namespace GpgFrontend { @@ -93,12 +97,38 @@ void ShutdownCoreLoggingSystem() { void ResetGpgFrontendCore() { reset_gpgfrontend_core(); } void init_gpgfrontend_core() { - // read from settings file + /* Initialize the locale environment. */ + SPDLOG_DEBUG("locale: {}", setlocale(LC_CTYPE, nullptr)); + // init gpgme subsystem + gpgme_check_version(nullptr); + gpgme_set_locale(nullptr, LC_CTYPE, setlocale(LC_CTYPE, nullptr)); +#ifdef LC_MESSAGES + gpgme_set_locale(nullptr, LC_MESSAGES, setlocale(LC_MESSAGES, nullptr)); +#endif + + // get settings + auto& settings = GlobalSettingStation::GetInstance().GetUISettings(); + + // read settings + bool forbid_all_gnupg_connection = false; + try { + forbid_all_gnupg_connection = + settings.lookup("network.forbid_all_gnupg_connection"); + } catch (...) { + SPDLOG_ERROR("setting operation error: forbid_all_gnupg_connection"); + } + + bool auto_import_missing_key = false; + try { + auto_import_missing_key = + settings.lookup("network.auto_import_missing_key"); + } catch (...) { + SPDLOG_ERROR("setting operation error: auto_import_missing_key"); + } + // read from settings file bool use_custom_key_database_path = false; try { - auto& settings = - GpgFrontend::GlobalSettingStation::GetInstance().GetUISettings(); use_custom_key_database_path = settings.lookup("general.use_custom_key_database_path"); } catch (...) { @@ -110,8 +140,6 @@ void init_gpgfrontend_core() { std::string custom_key_database_path; try { - auto& settings = - GpgFrontend::GlobalSettingStation::GetInstance().GetUISettings(); custom_key_database_path = static_cast( settings.lookup("general.custom_key_database_path")); @@ -123,7 +151,7 @@ void init_gpgfrontend_core() { custom_key_database_path); // init default channel - GpgFrontend::GpgContext::CreateInstance( + auto& default_ctx = GpgFrontend::GpgContext::CreateInstance( GPGFRONTEND_DEFAULT_CHANNEL, [=]() -> std::unique_ptr { GpgFrontend::GpgContextInitArgs args; @@ -132,23 +160,46 @@ void init_gpgfrontend_core() { args.db_path = custom_key_database_path; } - return std::unique_ptr(new GpgContext(args)); - }); - - // init non-ascii channel - GpgFrontend::GpgContext::CreateInstance( - GPGFRONTEND_NON_ASCII_CHANNEL, [=]() -> std::unique_ptr { - GpgFrontend::GpgContextInitArgs args; - args.ascii = false; - - // set key database path - if (use_custom_key_database_path && !custom_key_database_path.empty()) { - args.db_path = custom_key_database_path; - } + args.offline_mode = forbid_all_gnupg_connection; + args.auto_import_missing_key = auto_import_missing_key; return std::unique_ptr(new GpgContext(args)); }); + // exit if failed + if (!default_ctx.good()) { + SPDLOG_ERROR("default gpgme context init error, exit."); + QCoreApplication::exit(); + }; + + // async init no-ascii channel + Thread::TaskRunnerGetter::GetInstance() + .GetTaskRunner(Thread::TaskRunnerGetter::kTaskRunnerType_GPG) + ->PostTask( + new Thread::Task([=](Thread::Task::DataObjectPtr data_obj) -> int { + // init non-ascii channel + auto& ctx = GpgFrontend::GpgContext::CreateInstance( + GPGFRONTEND_NON_ASCII_CHANNEL, + [=]() -> std::unique_ptr { + GpgFrontend::GpgContextInitArgs args; + args.ascii = false; + + // set key database path + if (use_custom_key_database_path && + !custom_key_database_path.empty()) { + args.db_path = custom_key_database_path; + } + + args.offline_mode = forbid_all_gnupg_connection; + args.auto_import_missing_key = auto_import_missing_key; + + return std::unique_ptr(new GpgContext(args)); + }); + if (!ctx.good()) SPDLOG_ERROR("no-ascii channel init error"); + + return ctx.good() ? 0 : -1; + })); + // try to restart all components GpgFrontend::GpgAdvancedOperator::GetInstance().RestartGpgComponents(); } diff --git a/src/core/function/ArchiveFileOperator.cpp b/src/core/function/ArchiveFileOperator.cpp index 04c9326f..8aad0500 100644 --- a/src/core/function/ArchiveFileOperator.cpp +++ b/src/core/function/ArchiveFileOperator.cpp @@ -136,8 +136,6 @@ void GpgFrontend::ArchiveFileOperator::CreateArchive( } for (;;) { - bool needcr = false; - entry = archive_entry_new(); r = archive_read_next_header2(disk, entry); @@ -149,15 +147,6 @@ void GpgFrontend::ArchiveFileOperator::CreateArchive( } archive_read_disk_descend(disk); -#ifdef WINDOWS - auto entry_path = - QString::fromStdWString(std::wstring(archive_entry_pathname_w(entry))) - .toUtf8() - .toStdString(); -#else - auto entry_path = std::string(archive_entry_pathname_utf8(entry)); -#endif - SPDLOG_DEBUG("Adding: {} size: {} bytes: {} file type: {}", archive_entry_pathname_utf8(entry), archive_entry_size(entry), archive_entry_filetype(entry)); @@ -201,7 +190,6 @@ void GpgFrontend::ArchiveFileOperator::ExtractArchive( struct archive *a; struct archive *ext; struct archive_entry *entry; - int r; a = archive_read_new(); ext = archive_write_disk_new(); @@ -241,8 +229,9 @@ void GpgFrontend::ArchiveFileOperator::ExtractArchive( archive_error_string(a)); throw std::runtime_error("archive_read_open_filename() failed"); } + for (;;) { - r = archive_read_next_header(a, &entry); + int r = archive_read_next_header(a, &entry); if (r == ARCHIVE_EOF) break; if (r != ARCHIVE_OK) { SPDLOG_ERROR("archive_read_next_header() failed: {}", diff --git a/src/core/function/CharsetOperator.cpp b/src/core/function/CharsetOperator.cpp index 0e40e317..72c5e72b 100644 --- a/src/core/function/CharsetOperator.cpp +++ b/src/core/function/CharsetOperator.cpp @@ -117,12 +117,10 @@ bool GpgFrontend::CharsetOperator::Convert2Utf8(const std::string &buffer, if (status == U_BUFFER_OVERFLOW_ERROR) { status = U_ZERO_ERROR; - target_limit = target_capacity + 1; out_buffer.clear(); out_buffer.resize(target_capacity); - target_capacity = - ucnv_convert(from_encode.c_str(), to_encode.c_str(), out_buffer.data(), - out_buffer.size(), buffer.data(), buffer.size(), &status); + ucnv_convert(from_encode.c_str(), to_encode.c_str(), out_buffer.data(), + out_buffer.size(), buffer.data(), buffer.size(), &status); } if (U_FAILURE(status)) { diff --git a/src/core/function/aes/aes_ssl_cbc.cpp b/src/core/function/aes/aes_ssl_cbc.cpp index 88a54baa..3aa80ef5 100644 --- a/src/core/function/aes/aes_ssl_cbc.cpp +++ b/src/core/function/aes/aes_ssl_cbc.cpp @@ -59,7 +59,7 @@ uint8_t *aes_256_cbc_encrypt(EVP_CIPHER_CTX *e, uint8_t *plaintext, int *len) { /* max ciphertext len for a n bytes of plaintext is n + AES_BLOCK_SIZE -1 * bytes */ int c_len = *len + AES_BLOCK_SIZE, f_len = 0; - auto *ciphertext = (uint8_t *)malloc(c_len); + auto *ciphertext = static_cast(malloc(c_len)); /* allows reusing of 'e' for multiple encryption cycles */ EVP_EncryptInit_ex(e, nullptr, nullptr, nullptr, nullptr); @@ -86,7 +86,7 @@ uint8_t *aes_256_cbc_encrypt(EVP_CIPHER_CTX *e, uint8_t *plaintext, int *len) { uint8_t *aes_256_cbc_decrypt(EVP_CIPHER_CTX *e, uint8_t *ciphertext, int *len) { /* plaintext will always be equal to or lesser than length of ciphertext*/ int p_len = *len, f_len = 0; - auto *plaintext = (uint8_t *)malloc(p_len); + auto *plaintext = static_cast(malloc(p_len)); EVP_DecryptInit_ex(e, nullptr, nullptr, nullptr, nullptr); EVP_DecryptUpdate(e, plaintext, &p_len, ciphertext, *len); diff --git a/src/core/model/GpgData.cpp b/src/core/model/GpgData.cpp index 5aa95dc6..05f61a46 100644 --- a/src/core/model/GpgData.cpp +++ b/src/core/model/GpgData.cpp @@ -40,7 +40,8 @@ GpgFrontend::GpgData::GpgData() { GpgFrontend::GpgData::GpgData(void* buffer, size_t size, bool copy) { gpgme_data_t data; - auto err = gpgme_data_new_from_mem(&data, (const char*)buffer, size, copy); + auto err = gpgme_data_new_from_mem(&data, static_cast(buffer), + size, copy); assert(gpgme_err_code(err) == GPG_ERR_NO_ERROR); data_ref_ = std::unique_ptr(data); diff --git a/src/core/thread/Task.cpp b/src/core/thread/Task.cpp index f3c6ae86..7173b69e 100644 --- a/src/core/thread/Task.cpp +++ b/src/core/thread/Task.cpp @@ -218,7 +218,7 @@ void GpgFrontend::Thread::Task::DataObject::free_heap_ptr(Destructor *ptr) { if (ptr->destroy != nullptr) { ptr->destroy(ptr->p_obj); } - free((void *)ptr->p_obj); + free(const_cast(ptr->p_obj)); delete ptr; } diff --git a/src/main.cpp b/src/main.cpp index 98c02a0e..6b0eb727 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -126,6 +126,7 @@ int main(int argc, char* argv[]) { * with changed translation when settings change. */ int return_from_event_loop_code; + int restart_count = 0; do { do { @@ -154,16 +155,20 @@ int main(int argc, char* argv[]) { return_from_event_loop_code = CRASH_CODE; } - SPDLOG_DEBUG("restart loop refresh, event loop code: {}", - return_from_event_loop_code); - } while (return_from_event_loop_code == RESTART_CODE); + restart_count++; + + SPDLOG_DEBUG( + "restart loop refresh, event loop code: {}, restart count: {}", + return_from_event_loop_code, restart_count); + } while (return_from_event_loop_code == RESTART_CODE && restart_count < 2); if (return_from_event_loop_code == DEEP_RESTART_CODE || return_from_event_loop_code == CRASH_CODE) { // reset core GpgFrontend::ResetGpgFrontendCore(); // log for debug - SPDLOG_DEBUG("deep restart or cash loop refresh"); + SPDLOG_DEBUG("deep restart or cash loop refresh, restart count: {}", + restart_count); } else { // log for debug SPDLOG_DEBUG("need to close application, event loop code: {}", @@ -171,9 +176,9 @@ int main(int argc, char* argv[]) { } // deep restart mode - } while (return_from_event_loop_code == DEEP_RESTART_CODE || - return_from_event_loop_code == CRASH_CODE); - + } while ((return_from_event_loop_code == DEEP_RESTART_CODE || + return_from_event_loop_code == CRASH_CODE) && + restart_count < 3); // shutdown the logging system for ui GpgFrontend::UI::ShutdownUILoggingSystem(); @@ -181,8 +186,6 @@ int main(int argc, char* argv[]) { // shutdown the logging system for core GpgFrontend::ShutdownCoreLoggingSystem(); - - // log for debug SPDLOG_INFO("GpgFrontend about to exit."); diff --git a/src/ui/GpgFrontendApplication.cpp b/src/ui/GpgFrontendApplication.cpp index 1b2bb9ad..3697adde 100644 --- a/src/ui/GpgFrontendApplication.cpp +++ b/src/ui/GpgFrontendApplication.cpp @@ -59,9 +59,11 @@ GpgFrontendApplication *GpgFrontendApplication::GetInstance(int argc, if (new_instance || !instance) { if (instance != nullptr) { + SPDLOG_DEBUG("old application exists, quitting..."); instance->quit(); delete instance; } + SPDLOG_DEBUG("creating new application instance, argc: {}", argc); instance = new GpgFrontendApplication(static_argc, static_argv); } return instance; diff --git a/src/ui/GpgFrontendUIInit.cpp b/src/ui/GpgFrontendUIInit.cpp index 6e41f81f..b90493a5 100644 --- a/src/ui/GpgFrontendUIInit.cpp +++ b/src/ui/GpgFrontendUIInit.cpp @@ -71,6 +71,63 @@ void InitGpgFrontendUI(QApplication* app) { // init common utils CommonUtils::GetInstance(); + // application proxy configure + + auto& settings = GlobalSettingStation::GetInstance().GetUISettings(); + bool proxy_enable = false; + try { + proxy_enable = settings.lookup("proxy.enable"); + } catch (...) { + SPDLOG_ERROR("setting operation error: proxy_enable"); + } + SPDLOG_DEBUG("loading proxy configure, proxy_enable: {}", proxy_enable); + + // if enable proxy for application + if (proxy_enable) { + try { + std::string proxy_type = settings.lookup("proxy.proxy_type"); + std::string proxy_host = settings.lookup("proxy.proxy_host"); + int proxy_port = settings.lookup("proxy.port"); + std::string proxy_username = settings.lookup("proxy.username"); + std::string proxy_password = settings.lookup("proxy.password"); + + SPDLOG_DEBUG("proxy settings: type {}, host {}, port: {}", proxy_type, + proxy_host, proxy_port); + + QNetworkProxy::ProxyType proxy_type_qt = QNetworkProxy::NoProxy; + if (proxy_type == "HTTP") { + proxy_type_qt = QNetworkProxy::HttpProxy; + } else if (proxy_type == "Socks5") { + proxy_type_qt = QNetworkProxy::Socks5Proxy; + } else { + proxy_type_qt = QNetworkProxy::DefaultProxy; + } + + // create proxy object and apply settings + QNetworkProxy proxy; + if (proxy_type_qt != QNetworkProxy::DefaultProxy) { + proxy.setType(proxy_type_qt); + proxy.setHostName(QString::fromStdString(proxy_host)); + proxy.setPort(proxy_port); + if (!proxy_username.empty()) + proxy.setUser(QString::fromStdString(proxy_username)); + if (!proxy_password.empty()) + proxy.setPassword(QString::fromStdString(proxy_password)); + } else { + proxy.setType(proxy_type_qt); + } + QNetworkProxy::setApplicationProxy(proxy); + + } catch (...) { + SPDLOG_ERROR("setting operation error: proxy setings"); + // no proxy by default + QNetworkProxy::setApplicationProxy(QNetworkProxy::NoProxy); + } + } else { + // no proxy by default + QNetworkProxy::setApplicationProxy(QNetworkProxy::NoProxy); + } + // create the thread to load the gpg context auto* init_ctx_task = new Thread::CtxCheckTask(); @@ -213,7 +270,7 @@ void init_locale() { #ifndef WINDOWS if (!lang.empty()) { - std::string lc = lang.empty() ? "" : lang + ".UTF-8"; + std::string lc = lang + ".UTF-8"; // set LC_ALL auto* locale_name = setlocale(LC_ALL, lc.c_str()); @@ -229,7 +286,7 @@ void init_locale() { } #else if (!lang.empty()) { - std::string lc = lang.empty() ? "" : lang; + std::string lc = lang; // set LC_ALL auto* locale_name = setlocale(LC_ALL, lc.c_str()); diff --git a/src/ui/UserInterfaceUtils.cpp b/src/ui/UserInterfaceUtils.cpp index f944e037..5a11e119 100644 --- a/src/ui/UserInterfaceUtils.cpp +++ b/src/ui/UserInterfaceUtils.cpp @@ -299,38 +299,36 @@ void CommonUtils::SlotExecuteGpgCommand( void CommonUtils::SlotImportKeyFromKeyServer( const KeyIdArgsList &key_ids, const ImportCallbackFunctiopn &callback) { + // target key server that we need to import key from it std::string target_keyserver; - if (target_keyserver.empty()) { - try { - auto &settings = GlobalSettingStation::GetInstance().GetUISettings(); - SettingsObject key_server_json("key_server"); + try { + auto &settings = GlobalSettingStation::GetInstance().GetUISettings(); + SettingsObject key_server_json("key_server"); - // get key servers from settings - const auto key_server_list = - key_server_json.Check("server_list", nlohmann::json::array()); - if (key_server_list.empty()) { - throw std::runtime_error("No key server configured"); - } + // get key servers from settings + const auto key_server_list = + key_server_json.Check("server_list", nlohmann::json::array()); + if (key_server_list.empty()) { + throw std::runtime_error("No key server configured"); + } - const int target_key_server_index = - key_server_json.Check("default_server", 0); - if (target_key_server_index >= key_server_list.size()) { - throw std::runtime_error("default_server index out of range"); - } - target_keyserver = - key_server_list[target_key_server_index].get(); - - SPDLOG_DEBUG("set target key server to default Key Server: {}", - target_keyserver); - } catch (...) { - SPDLOG_ERROR(_("Cannot read default_keyserver From Settings")); - QMessageBox::critical( - nullptr, _("Default Keyserver Not Found"), - _("Cannot read default keyserver from your settings, " - "please set a default keyserver first")); - return; + const int target_key_server_index = + key_server_json.Check("default_server", 0); + if (target_key_server_index >= key_server_list.size()) { + throw std::runtime_error("default_server index out of range"); } + target_keyserver = + key_server_list[target_key_server_index].get(); + + SPDLOG_DEBUG("set target key server to default Key Server: {}", + target_keyserver); + } catch (...) { + SPDLOG_ERROR(_("Cannot read default_keyserver From Settings")); + QMessageBox::critical(nullptr, _("Default Keyserver Not Found"), + _("Cannot read default keyserver from your settings, " + "please set a default keyserver first")); + return; } auto thread = QThread::create([target_keyserver, key_ids, callback]() { diff --git a/src/ui/dialog/GeneralDialog.cpp b/src/ui/dialog/GeneralDialog.cpp index 9367aa44..90c56b8a 100644 --- a/src/ui/dialog/GeneralDialog.cpp +++ b/src/ui/dialog/GeneralDialog.cpp @@ -57,53 +57,17 @@ void GpgFrontend::UI::GeneralDialog::slot_restore_settings() noexcept { size_ = {width, height}; - if (this->parent() != nullptr) { - QPoint parent_pos = {0, 0}; - QSize parent_size = {0, 0}; - - auto *parent_widget = qobject_cast(this->parent()); - if (parent_widget != nullptr) { - parent_pos = parent_widget->pos(); - parent_size = parent_widget->size(); - } - - auto *parent_dialog = qobject_cast(this->parent()); - if (parent_dialog != nullptr) { - parent_pos = parent_dialog->pos(); - parent_size = parent_dialog->size(); - } - - auto *parent_window = qobject_cast(this->parent()); - if (parent_window != nullptr) { - parent_pos = parent_window->pos(); - parent_size = parent_window->size(); - } - - SPDLOG_DEBUG("parent pos x: {} y: {}", parent_pos.x(), parent_pos.y()); - - SPDLOG_DEBUG("parent size width: {} height: {}", parent_size.width(), - parent_size.height()); - - SPDLOG_DEBUG("this dialog size width: {} height: {}", size_.width(), - size_.height()); - - if (parent_pos != QPoint{0, 0}) { - QPoint parent_center{parent_pos.x() + parent_size.width() / 2, - parent_pos.y() + parent_size.height() / 2}; - - pos_ = {parent_center.x() - size_.width() / 2, - parent_center.y() - size_.height() / 2}; - - // record parent_pos_ - this->parent_pos_ = parent_pos; - this->parent_size_ = parent_size; - } + // check for valid + if (!pos_.isNull() && pos_.x() > 50 && pos_.y() > 50 && size_.isValid()) { + this->move(pos_); + this->resize(size_); + return; } - - this->move(pos_); - this->resize(size_); } + // default action + movePosition2CenterOfParent(); + } catch (...) { SPDLOG_ERROR(name_, "error"); } @@ -148,8 +112,56 @@ void GpgFrontend::UI::GeneralDialog::setPosCenterOfScreen() { * */ void GpgFrontend::UI::GeneralDialog::movePosition2CenterOfParent() { - SPDLOG_DEBUG("parent pos x: {} y: {}", parent_pos_.x(), parent_pos_.y()); + // read pos and size from parent + if (this->parent() != nullptr) { + QPoint parent_pos = {0, 0}; + QSize parent_size = {0, 0}; + + auto *parent_widget = qobject_cast(this->parent()); + if (parent_widget != nullptr) { + parent_pos = parent_widget->pos(); + parent_size = parent_widget->size(); + } + + auto *parent_dialog = qobject_cast(this->parent()); + if (parent_dialog != nullptr) { + parent_pos = parent_dialog->pos(); + parent_size = parent_dialog->size(); + } + + auto *parent_window = qobject_cast(this->parent()); + if (parent_window != nullptr) { + parent_pos = parent_window->pos(); + parent_size = parent_window->size(); + } + + SPDLOG_DEBUG("parent pos x: {} y: {}", parent_pos.x(), parent_pos.y()); + SPDLOG_DEBUG("parent size width: {} height: {}", parent_size.width(), + parent_size.height()); + + SPDLOG_DEBUG("this dialog size width: {} height: {}", size_.width(), + size_.height()); + + if (parent_pos != QPoint{0, 0}) { + QPoint parent_center{parent_pos.x() + parent_size.width() / 2, + parent_pos.y() + parent_size.height() / 2}; + + pos_ = {parent_center.x() - size_.width() / 2, + parent_center.y() - size_.height() / 2}; + + // record parent_pos_ + this->parent_pos_ = parent_pos; + this->parent_size_ = parent_size; + } + } else { + // reset parent's pos and size + this->parent_pos_ = QPoint{0, 0}; + this->parent_size_ = QSize{0, 0}; + } + + // log for debug + SPDLOG_DEBUG("parent pos x: {} y: {}", parent_pos_.x(), parent_pos_.y()); SPDLOG_DEBUG("parent size width: {}", parent_size_.width(), "height:", parent_size_.height()); @@ -164,5 +176,7 @@ void GpgFrontend::UI::GeneralDialog::movePosition2CenterOfParent() { pos_ = {parent_center.x() - size_.width() / 2, parent_center.y() - size_.height() / 2}; this->move(pos_); + } else { + setPosCenterOfScreen(); } } \ No newline at end of file diff --git a/src/ui/dialog/details/VerifyDetailsDialog.h b/src/ui/dialog/details/VerifyDetailsDialog.h index 97e2cc2d..5bc09884 100644 --- a/src/ui/dialog/details/VerifyDetailsDialog.h +++ b/src/ui/dialog/details/VerifyDetailsDialog.h @@ -60,7 +60,6 @@ class VerifyDetailsDialog : public QDialog { void slot_refresh(); private: - KeyList* key_list_; ///< QHBoxLayout* main_layout_; ///< QWidget* m_vbox_{}; ///< QByteArray* input_data_{}; ///< diff --git a/src/ui/dialog/help/AboutDialog.cpp b/src/ui/dialog/help/AboutDialog.cpp index 3cf6c2a2..faf2b316 100644 --- a/src/ui/dialog/help/AboutDialog.cpp +++ b/src/ui/dialog/help/AboutDialog.cpp @@ -28,6 +28,8 @@ #include "AboutDialog.h" +#include + #include "GpgFrontendBuildInfo.h" #include "core/function/GlobalSettingStation.h" #include "core/thread/TaskRunnerGetter.h" @@ -83,9 +85,9 @@ InfoTab::InfoTab(QWidget* parent) : QWidget(parent) { "
" + qApp->applicationVersion() + "
" + "
" + GIT_VERSION + "
" + "
" + _("GpgFrontend is an easy-to-use, compact, cross-platform, " - "and installation-free gpg front-end tool." - "It visualizes most of the common operations of gpg commands." - "It's licensed under the GPL v3") + + "and installation-free GnuPG Frontend." + "It visualizes most of the common operations of GnuPG." + "GpgFrontend is licensed under the GPLv3") + "

" "" + _("Developer:") + "
" + "Saturneric" + "

" + @@ -94,7 +96,8 @@ InfoTab::InfoTab(QWidget* parent) : QWidget(parent) { " GitHub " + _("or send a mail to my mailing list at") + " eric@bktus.com." + "

" + - _("Built with Qt") + " " + qVersion() + " " + _("and GPGME") + " " + + _("Built with Qt") + " " + qVersion() + ", " + OPENSSL_VERSION_TEXT + + " " + _("and") + " " + "GPGME" + " " + GpgFrontend::GpgContext::GetInstance() .GetInfo(false) .GpgMEVersion.c_str() + diff --git a/src/ui/dialog/help/AboutDialog.h b/src/ui/dialog/help/AboutDialog.h index 09a63734..6d7ce265 100644 --- a/src/ui/dialog/help/AboutDialog.h +++ b/src/ui/dialog/help/AboutDialog.h @@ -80,7 +80,6 @@ class UpdateTab : public QWidget { QLabel* upgrade_label_; ///< QProgressBar* pb_; ///< QString current_version_; ///< - QPushButton* download_button_; ///< public: /** diff --git a/src/ui/dialog/help/GnupgTab.cpp b/src/ui/dialog/help/GnupgTab.cpp index 2758cbe1..996d4ad9 100644 --- a/src/ui/dialog/help/GnupgTab.cpp +++ b/src/ui/dialog/help/GnupgTab.cpp @@ -42,7 +42,10 @@ GpgFrontend::UI::GnupgTab::GnupgTab(QWidget* parent) QStringList components_column_titles; components_column_titles << _("Name") << _("Description") << _("Version") - << _("Checksum") << _("Path"); + << _("Checksum") << _("Binary Path"); + + ui_->tabWidget->setTabText(0, _("Components")); + ui_->tabWidget->setTabText(1, _("Configurations")); ui_->componentDetailsTable->setColumnCount(components_column_titles.length()); ui_->componentDetailsTable->setHorizontalHeaderLabels( @@ -52,7 +55,7 @@ GpgFrontend::UI::GnupgTab::GnupgTab(QWidget* parent) QAbstractItemView::SelectRows); QStringList configurations_column_titles; - configurations_column_titles << _("Name") << _("Path"); + configurations_column_titles << _("Key") << _("Value"); ui_->configurationDetailsTable->setColumnCount( configurations_column_titles.length()); diff --git a/src/ui/dialog/import_export/KeyImportDetailDialog.cpp b/src/ui/dialog/import_export/KeyImportDetailDialog.cpp index e9b1af93..32ae63fa 100644 --- a/src/ui/dialog/import_export/KeyImportDetailDialog.cpp +++ b/src/ui/dialog/import_export/KeyImportDetailDialog.cpp @@ -124,7 +124,6 @@ void KeyImportDetailDialog::create_general_info_box() { new QLabel(QString(_("Private Unchanged")) + ": "), row, 0); generalInfoBoxLayout->addWidget( new QLabel(QString::number(m_result_.secret_unchanged)), row, 1); - row++; } } @@ -162,36 +161,36 @@ void KeyImportDetailDialog::create_keys_table() { keys_table_->resizeColumnsToContents(); } -QString KeyImportDetailDialog::get_status_string(int keyStatus) { - QString statusString; +QString KeyImportDetailDialog::get_status_string(int key_status) { + QString status_string; // keystatus is greater than 15, if key is private - if (keyStatus > 15) { - statusString.append(_("Private")); - keyStatus = keyStatus - 16; + if (key_status > 15) { + status_string.append(_("Private")); + key_status = key_status - 16; } else { - statusString.append(_("Public")); + status_string.append(_("Public")); } - if (keyStatus == 0) { - statusString.append(", " + QString(_("Unchanged"))); + if (key_status == 0) { + status_string.append(", " + QString(_("Unchanged"))); } else { - if (keyStatus == 1) { - statusString.append(", " + QString(_("New Key"))); + if (key_status == 1) { + status_string.append(", " + QString(_("New Key"))); } else { - if (keyStatus > 7) { - statusString.append(", " + QString(_("New Subkey"))); - keyStatus = keyStatus - 8; + if (key_status > 7) { + status_string.append(", " + QString(_("New Subkey"))); + return status_string; } - if (keyStatus > 3) { - statusString.append(", " + QString(_("New Signature"))); - keyStatus = keyStatus - 4; + if (key_status > 3) { + status_string.append(", " + QString(_("New Signature"))); + return status_string; } - if (keyStatus > 1) { - statusString.append(", " + QString(_("New UID"))); - keyStatus = keyStatus - 2; + if (key_status > 1) { + status_string.append(", " + QString(_("New UID"))); + return status_string; } } } - return statusString; + return status_string; } void KeyImportDetailDialog::create_button_box() { diff --git a/src/ui/dialog/import_export/KeyServerImportDialog.cpp b/src/ui/dialog/import_export/KeyServerImportDialog.cpp index 713c5a58..5692f607 100644 --- a/src/ui/dialog/import_export/KeyServerImportDialog.cpp +++ b/src/ui/dialog/import_export/KeyServerImportDialog.cpp @@ -47,6 +47,23 @@ KeyServerImportDialog::KeyServerImportDialog(bool automatic, QWidget* parent) // Layout for messagebox auto* message_layout = new QHBoxLayout(); + // get settings + auto& settings = GlobalSettingStation::GetInstance().GetUISettings(); + // read settings + bool forbid_all_gnupg_connection = false; + try { + forbid_all_gnupg_connection = + settings.lookup("network.forbid_all_gnupg_connection"); + } catch (...) { + SPDLOG_ERROR("setting operation error: forbid_all_gnupg_connection"); + } + + if (forbid_all_gnupg_connection) { + QMessageBox::critical(this, "Forbidden", "GnuPG is in offline mode now."); + this->close(); + this->deleteLater(); + } + if (automatic) { setWindowFlags(Qt::Window | Qt::WindowTitleHint | Qt::CustomizeWindowHint); } else { @@ -249,6 +266,10 @@ void KeyServerImportDialog::slot_search() { Thread::TaskRunnerGetter::GetInstance() .GetTaskRunner(Thread::TaskRunnerGetter::kTaskRunnerType_Network) ->PostTask(task); + + QEventLoop loop; + connect(task, &Thread::Task::SignalTaskEnd, &loop, &QEventLoop::quit); + loop.exec(); } void KeyServerImportDialog::slot_search_finished( diff --git a/src/ui/dialog/key_generate/KeygenDialog.cpp b/src/ui/dialog/key_generate/KeygenDialog.cpp index d6f61215..ea874ed2 100644 --- a/src/ui/dialog/key_generate/KeygenDialog.cpp +++ b/src/ui/dialog/key_generate/KeygenDialog.cpp @@ -28,6 +28,8 @@ #include "KeygenDialog.h" +#include + #include "core/common/CoreCommonUtil.h" #include "core/function/GlobalSettingStation.h" #include "core/function/gpg/GpgKeyOpera.h" @@ -53,6 +55,16 @@ KeyGenDialog::KeyGenDialog(QWidget* parent) SPDLOG_ERROR("setting operation error: longer_expiration_date"); } + bool use_pinentry_as_password_input_dialog = false; + try { + use_pinentry_as_password_input_dialog = + settings.lookup("general.use_pinentry_as_password_input_dialog"); + } catch (...) { + SPDLOG_ERROR( + "setting operation error: use_pinentry_as_password_input_dialog"); + } + use_pinentry_ = use_pinentry_as_password_input_dialog; + max_date_time_ = longer_expiration_date ? QDateTime::currentDateTime().toLocalTime().addYears(30) : QDateTime::currentDateTime().toLocalTime().addYears(2); @@ -111,7 +123,8 @@ void KeyGenDialog::slot_key_gen_accept() { error_stream << " " << _("Expiration time too long.") << std::endl; } - if (passphrase_edit_->isEnabled() && passphrase_edit_->text().size() == 0) { + if (!use_pinentry_ && passphrase_edit_->isEnabled() && + passphrase_edit_->text().size() == 0) { error_stream << " " << _("Password is empty.") << std::endl; } @@ -139,7 +152,7 @@ void KeyGenDialog::slot_key_gen_accept() { #endif } - if (!gen_key_info_->IsNoPassPhrase()) { + if (!use_pinentry_ && !gen_key_info_->IsNoPassPhrase()) { CoreCommonUtil::GetInstance()->SetTempCacheValue( "__key_passphrase", this->passphrase_edit_->text().toStdString()); } @@ -160,14 +173,14 @@ void KeyGenDialog::slot_key_gen_accept() { dialog->close(); - if (!gen_key_info_->IsNoPassPhrase()) { + if (!use_pinentry_ && !gen_key_info_->IsNoPassPhrase()) { CoreCommonUtil::GetInstance()->ResetTempCacheValue("__key_passphrase"); } SPDLOG_DEBUG("generate done"); if (gpgme_err_code(error) == GPG_ERR_NO_ERROR) { - auto* msg_box = new QMessageBox((QWidget*)this->parent()); + auto* msg_box = new QMessageBox(qobject_cast(this->parent())); msg_box->setAttribute(Qt::WA_DeleteOnClose); msg_box->setStandardButtons(QMessageBox::Ok); msg_box->setWindowTitle(_("Success")); @@ -391,6 +404,7 @@ QGroupBox* KeyGenDialog::create_basic_info_group_box() { expire_check_box_->setCheckState(Qt::Unchecked); passphrase_edit_->setEchoMode(QLineEdit::Password); + passphrase_edit_->setHidden(use_pinentry_); no_pass_phrase_check_box_ = new QCheckBox(this); no_pass_phrase_check_box_->setCheckState(Qt::Unchecked); @@ -404,8 +418,9 @@ QGroupBox* KeyGenDialog::create_basic_info_group_box() { vbox1->addWidget(new QLabel(QString(_("Never Expire")) + ": "), 3, 3); vbox1->addWidget(new QLabel(QString(_("KeySize (in Bit)")) + ": "), 4, 0); vbox1->addWidget(new QLabel(QString(_("Key Type")) + ": "), 5, 0); - vbox1->addWidget(new QLabel(QString(_("Password")) + ": "), 6, 0); - vbox1->addWidget(new QLabel(QString(_("Non Pass Phrase")) + ": "), 6, 3); + if (!use_pinentry_) + vbox1->addWidget(new QLabel(QString(_("Password")) + ": "), 6, 0); + vbox1->addWidget(new QLabel(QString(_("Non Pass Phrase"))), 6, 3); vbox1->addWidget(name_edit_, 0, 1, 1, 3); vbox1->addWidget(email_edit_, 1, 1, 1, 3); @@ -414,7 +429,7 @@ QGroupBox* KeyGenDialog::create_basic_info_group_box() { vbox1->addWidget(expire_check_box_, 3, 2); vbox1->addWidget(key_size_spin_box_, 4, 1); vbox1->addWidget(key_type_combo_box_, 5, 1); - vbox1->addWidget(passphrase_edit_, 6, 1); + if (!use_pinentry_) vbox1->addWidget(passphrase_edit_, 6, 1); vbox1->addWidget(no_pass_phrase_check_box_, 6, 2); auto basicInfoGroupBox = new QGroupBox(); diff --git a/src/ui/dialog/key_generate/KeygenDialog.h b/src/ui/dialog/key_generate/KeygenDialog.h index a1d7f39a..31b5f9c7 100644 --- a/src/ui/dialog/key_generate/KeygenDialog.h +++ b/src/ui/dialog/key_generate/KeygenDialog.h @@ -103,6 +103,7 @@ class KeyGenDialog : public GeneralDialog { ///< of the Key QDateTime max_date_time_; ///< std::vector key_usage_check_boxes_; ///< ENCR, SIGN, CERT, AUTH + bool use_pinentry_ = false; /** * @brief diff --git a/src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp b/src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp index 50f38413..f4263962 100644 --- a/src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp +++ b/src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp @@ -52,6 +52,16 @@ SubkeyGenerateDialog::SubkeyGenerateDialog(const KeyId& key_id, QWidget* parent) SPDLOG_ERROR("setting operation error: longer_expiration_date"); } + bool use_pinentry_as_password_input_dialog = false; + try { + use_pinentry_as_password_input_dialog = + settings.lookup("general.use_pinentry_as_password_input_dialog"); + } catch (...) { + SPDLOG_ERROR( + "setting operation error: use_pinentry_as_password_input_dialog"); + } + use_pinentry_ = use_pinentry_as_password_input_dialog; + max_date_time_ = longer_expiration_date ? QDateTime::currentDateTime().toLocalTime().addYears(30) : QDateTime::currentDateTime().toLocalTime().addYears(2); @@ -148,20 +158,24 @@ QGroupBox* SubkeyGenerateDialog::create_basic_info_group_box() { expire_check_box_ = new QCheckBox(this); expire_check_box_->setCheckState(Qt::Unchecked); + passphrase_edit_->setEchoMode(QLineEdit::Password); + passphrase_edit_->setHidden(use_pinentry_); + auto* vbox1 = new QGridLayout; vbox1->addWidget(new QLabel(QString(_("Key Type")) + ": "), 0, 0); vbox1->addWidget(new QLabel(QString(_("KeySize (in Bit)")) + ": "), 1, 0); vbox1->addWidget(new QLabel(QString(_("Expiration Date")) + ": "), 2, 0); vbox1->addWidget(new QLabel(QString(_("Never Expire"))), 2, 3); - vbox1->addWidget(new QLabel(QString(_("Password")) + ": "), 3, 0); + if (!use_pinentry_) + vbox1->addWidget(new QLabel(QString(_("Password")) + ": "), 3, 0); vbox1->addWidget(new QLabel(QString(_("Non Pass Phrase"))), 3, 3); vbox1->addWidget(key_type_combo_box_, 0, 1); vbox1->addWidget(key_size_spin_box_, 1, 1); vbox1->addWidget(date_edit_, 2, 1); vbox1->addWidget(expire_check_box_, 2, 2); - vbox1->addWidget(passphrase_edit_, 3, 1); + if (!use_pinentry_) vbox1->addWidget(passphrase_edit_, 3, 1); vbox1->addWidget(no_pass_phrase_check_box_, 3, 2); auto basicInfoGroupBox = new QGroupBox(); @@ -265,7 +279,8 @@ void SubkeyGenerateDialog::slot_key_gen_accept() { err_stream << " " << _("Expiration time no more than 2 years.") << " "; } - if (passphrase_edit_->isEnabled() && passphrase_edit_->text().size() == 0) { + if (!use_pinentry_ && passphrase_edit_->isEnabled() && + passphrase_edit_->text().size() == 0) { err_stream << " " << _("Password is empty.") << std::endl; } @@ -286,7 +301,7 @@ void SubkeyGenerateDialog::slot_key_gen_accept() { #endif } - if (!gen_key_info_->IsNoPassPhrase()) { + if (!use_pinentry_ && !gen_key_info_->IsNoPassPhrase()) { CoreCommonUtil::GetInstance()->SetTempCacheValue( "__key_passphrase", this->passphrase_edit_->text().toStdString()); } @@ -307,12 +322,12 @@ void SubkeyGenerateDialog::slot_key_gen_accept() { } waiting_dialog->close(); - if (!gen_key_info_->IsNoPassPhrase()) { + if (!use_pinentry_ && !gen_key_info_->IsNoPassPhrase()) { CoreCommonUtil::GetInstance()->ResetTempCacheValue("__key_passphrase"); } if (check_gpg_error_2_err_code(error) == GPG_ERR_NO_ERROR) { - auto* msg_box = new QMessageBox((QWidget*)this->parent()); + auto* msg_box = new QMessageBox(qobject_cast(this->parent())); msg_box->setAttribute(Qt::WA_DeleteOnClose); msg_box->setStandardButtons(QMessageBox::Ok); msg_box->setWindowTitle(_("Success")); diff --git a/src/ui/dialog/key_generate/SubkeyGenerateDialog.h b/src/ui/dialog/key_generate/SubkeyGenerateDialog.h index 731bb951..2b88bd61 100644 --- a/src/ui/dialog/key_generate/SubkeyGenerateDialog.h +++ b/src/ui/dialog/key_generate/SubkeyGenerateDialog.h @@ -74,6 +74,7 @@ class SubkeyGenerateDialog : public GeneralDialog { std::vector key_usage_check_boxes_; ///< ENCR, SIGN, CERT, AUTH QDateTime max_date_time_; ///< + bool use_pinentry_ = false; /** * @brief Create a key usage group box object diff --git a/src/ui/dialog/keypair_details/KeyPairOperaTab.cpp b/src/ui/dialog/keypair_details/KeyPairOperaTab.cpp index a1452033..9be77923 100644 --- a/src/ui/dialog/keypair_details/KeyPairOperaTab.cpp +++ b/src/ui/dialog/keypair_details/KeyPairOperaTab.cpp @@ -27,6 +27,7 @@ #include "KeyPairOperaTab.h" #include "KeySetExpireDateDialog.h" +#include "core/function/GlobalSettingStation.h" #include "core/function/gpg/GpgKeyImportExporter.h" #include "core/function/gpg/GpgKeyOpera.h" #include "ui/SignalStation.h" @@ -73,10 +74,23 @@ KeyPairOperaTab::KeyPairOperaTab(const std::string& key_id, QWidget* parent) } auto advance_h_box_layout = new QHBoxLayout(); + + // get settings + auto& settings = GlobalSettingStation::GetInstance().GetUISettings(); + // read settings + bool forbid_all_gnupg_connection = false; + try { + forbid_all_gnupg_connection = + settings.lookup("network.forbid_all_gnupg_connection"); + } catch (...) { + SPDLOG_ERROR("setting operation error: forbid_all_gnupg_connection"); + } + auto* key_server_opera_button = new QPushButton(_("Key Server Operation (Pubkey)")); key_server_opera_button->setStyleSheet("text-align:center;"); key_server_opera_button->setMenu(key_server_opera_menu_); + key_server_opera_button->setDisabled(forbid_all_gnupg_connection); advance_h_box_layout->addWidget(key_server_opera_button); if (m_key_.IsPrivateKey() && m_key_.IsHasMasterKey()) { @@ -147,8 +161,13 @@ void KeyPairOperaTab::slot_export_public_key() { } // generate a file name +#ifndef WINDOWS auto file_string = m_key_.GetName() + "<" + m_key_.GetEmail() + ">(" + m_key_.GetId() + ")_pub.asc"; +#else + auto file_string = m_key_.GetName() + "[" + m_key_.GetEmail() + "](" + + m_key_.GetId() + ")_pub.asc"; +#endif std::replace(file_string.begin(), file_string.end(), ' ', '_'); auto file_name = @@ -193,8 +212,14 @@ void KeyPairOperaTab::slot_export_short_private_key() { return; } + // generate a file name +#ifndef WINDOWS auto file_string = m_key_.GetName() + "<" + m_key_.GetEmail() + ">(" + m_key_.GetId() + ")_short_secret.asc"; +#else + auto file_string = m_key_.GetName() + "[" + m_key_.GetEmail() + "](" + + m_key_.GetId() + ")_short_secret.asc"; +#endif std::replace(file_string.begin(), file_string.end(), ' ', '_'); auto file_name = @@ -235,8 +260,15 @@ void KeyPairOperaTab::slot_export_private_key() { _("An error occurred during the export operation.")); return; } + + // generate a file name +#ifndef WINDOWS auto file_string = m_key_.GetName() + "<" + m_key_.GetEmail() + ">(" + m_key_.GetId() + ")_full_secret.asc"; +#else + auto file_string = m_key_.GetName() + "[" + m_key_.GetEmail() + "](" + + m_key_.GetId() + ")_full_secret.asc"; +#endif std::replace(file_string.begin(), file_string.end(), ' ', '_'); auto file_name = diff --git a/src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp b/src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp index d1367541..9c243a39 100644 --- a/src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp +++ b/src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp @@ -312,7 +312,7 @@ void KeyPairSubkeyTab::slot_refresh_subkey_detail() { } fingerprint_var_label_->setText( - QString::fromStdString(subkey.GetFingerprint())); + QString::fromStdString(beautify_fingerprint(subkey.GetFingerprint()))); } void KeyPairSubkeyTab::create_subkey_opera_menu() { diff --git a/src/ui/dialog/keypair_details/KeySetExpireDateDialog.cpp b/src/ui/dialog/keypair_details/KeySetExpireDateDialog.cpp index d09662e1..89d2ce74 100644 --- a/src/ui/dialog/keypair_details/KeySetExpireDateDialog.cpp +++ b/src/ui/dialog/keypair_details/KeySetExpireDateDialog.cpp @@ -79,7 +79,7 @@ void KeySetExpireDateDialog::slot_confirm() { auto err = GpgKeyOpera::GetInstance().SetExpire(m_key_, m_subkey_, expires); if (check_gpg_error_2_err_code(err) == GPG_ERR_NO_ERROR) { - auto* msg_box = new QMessageBox((QWidget*)this->parent()); + auto* msg_box = new QMessageBox(qobject_cast(this->parent())); msg_box->setAttribute(Qt::WA_DeleteOnClose); msg_box->setStandardButtons(QMessageBox::Ok); msg_box->setWindowTitle(_("Success")); diff --git a/src/ui/dialog/settings/SettingsGeneral.cpp b/src/ui/dialog/settings/SettingsGeneral.cpp index 7e48b4e1..17d9251c 100644 --- a/src/ui/dialog/settings/SettingsGeneral.cpp +++ b/src/ui/dialog/settings/SettingsGeneral.cpp @@ -47,7 +47,7 @@ GeneralTab::GeneralTab(QWidget* parent) ui_->saveCheckedKeysCheckBox->setText( _("Save checked private keys on exit and restore them on next start.")); ui_->clearGpgPasswordCacheCheckBox->setText( - "Clear gpg password cache when closing GpgFrontend."); + _("Clear gpg password cache when closing GpgFrontend.")); ui_->importConfirmationBox->setTitle(_("Operation")); ui_->longerKeyExpirationDateCheckBox->setText( @@ -57,6 +57,8 @@ GeneralTab::GeneralTab(QWidget* parent) ui_->gnupgDatabaseBox->setTitle(_("GnuPG")); ui_->asciiModeCheckBox->setText(_("No ASCII Mode")); + ui_->usePinentryAsPasswordInputDialogCheckBox->setText( + _("Use Pinentry as Password Input Dialog")); ui_->useCustomGnuPGInstallPathCheckBox->setText(_("Use Custom GnuPG")); ui_->useCustomGnuPGInstallPathButton->setText(_("Select GnuPG Path")); ui_->keyDatabseUseCustomCheckBox->setText( @@ -167,6 +169,12 @@ GeneralTab::GeneralTab(QWidget* parent) } }); + connect(ui_->usePinentryAsPasswordInputDialogCheckBox, + &QCheckBox::stateChanged, this, [=](int state) { + // announce the restart + this->slot_gnupg_stettings_changed(); + }); + SetSettings(); } @@ -260,6 +268,16 @@ void GeneralTab::SetSettings() { SPDLOG_ERROR("setting operation error: use_custom_gnupg_install_path"); } + try { + bool use_pinentry_as_password_input_dialog = + settings.lookup("general.use_pinentry_as_password_input_dialog"); + if (use_pinentry_as_password_input_dialog) + ui_->usePinentryAsPasswordInputDialogCheckBox->setCheckState(Qt::Checked); + } catch (...) { + SPDLOG_ERROR( + "setting operation error: use_pinentry_as_password_input_dialog"); + } + this->slot_update_custom_gnupg_install_path_label( ui_->useCustomGnuPGInstallPathCheckBox->checkState()); } @@ -343,6 +361,15 @@ void GeneralTab::ApplySettings() { general["use_custom_gnupg_install_path"] = ui_->useCustomGnuPGInstallPathCheckBox->isChecked(); } + + if (!general.exists("use_pinentry_as_password_input_dialog")) + general.add("use_pinentry_as_password_input_dialog", + libconfig::Setting::TypeBoolean) = + ui_->usePinentryAsPasswordInputDialogCheckBox->isChecked(); + else { + general["use_pinentry_as_password_input_dialog"] = + ui_->usePinentryAsPasswordInputDialogCheckBox->isChecked(); + } } #ifdef MULTI_LANG_SUPPORT diff --git a/src/ui/dialog/settings/SettingsKeyServer.cpp b/src/ui/dialog/settings/SettingsKeyServer.cpp index 8719ab9a..83bd2c80 100644 --- a/src/ui/dialog/settings/SettingsKeyServer.cpp +++ b/src/ui/dialog/settings/SettingsKeyServer.cpp @@ -284,6 +284,11 @@ void KeyserverTab::slot_test_listed_key_server() { Thread::TaskRunnerGetter::GetInstance() .GetTaskRunner(Thread::TaskRunnerGetter::kTaskRunnerType_Network) ->PostTask(task); + + QEventLoop loop; + connect(task, &Thread::Task::SignalTaskEnd, &loop, &QEventLoop::quit); + connect(waiting_dialog, &QProgressDialog::canceled, &loop, &QEventLoop::quit); + loop.exec(); } void KeyserverTab::contextMenuEvent(QContextMenuEvent* event) { diff --git a/src/ui/dialog/settings/SettingsNetwork.cpp b/src/ui/dialog/settings/SettingsNetwork.cpp index fe3d450e..0713856d 100644 --- a/src/ui/dialog/settings/SettingsNetwork.cpp +++ b/src/ui/dialog/settings/SettingsNetwork.cpp @@ -29,7 +29,7 @@ #include "SettingsNetwork.h" #include "core/function/GlobalSettingStation.h" -#include "ui/thread/ProxyConnectionTestThread.h" +#include "ui/thread/ProxyConnectionTestTask.h" #include "ui_NetworkSettings.h" GpgFrontend::UI::NetworkTab::NetworkTab(QWidget *parent) @@ -37,7 +37,28 @@ GpgFrontend::UI::NetworkTab::NetworkTab(QWidget *parent) ui_->setupUi(this); connect(ui_->enableProxyCheckBox, &QCheckBox::stateChanged, this, - [=](int state) { switch_ui_enabled(state == Qt::Checked); }); + [=](int state) { + switch_ui_enabled(state == Qt::Checked); + // when selecting no proxy option, apply it immediately + if (state != Qt::Checked) apply_proxy_settings(); + }); + + connect( + ui_->autoImportMissingKeyCheckBox, &QCheckBox::stateChanged, this, + [=](int state) { + ui_->forbidALLGnuPGNetworkConnectionCheckBox->setCheckState( + state == Qt::Checked + ? Qt::Unchecked + : ui_->forbidALLGnuPGNetworkConnectionCheckBox->checkState()); + }); + + connect(ui_->forbidALLGnuPGNetworkConnectionCheckBox, + &QCheckBox::stateChanged, this, [=](int state) { + ui_->autoImportMissingKeyCheckBox->setCheckState( + state == Qt::Checked + ? Qt::Unchecked + : ui_->autoImportMissingKeyCheckBox->checkState()); + }); connect( ui_->proxyTypeComboBox, &QComboBox::currentTextChanged, this, @@ -47,7 +68,7 @@ GpgFrontend::UI::NetworkTab::NetworkTab(QWidget *parent) &NetworkTab::slot_test_proxy_connection_result); ui_->proxyGroupBox->setTitle(_("Proxy")); - ui_->capabilityGroupBox->setTitle(_("Network Capability")); + ui_->capabilityGroupBox->setTitle(_("Network Ability")); ui_->operationsGroupBox->setTitle(_("Operations")); ui_->enableProxyCheckBox->setText(_("Enable Proxy")); @@ -59,12 +80,18 @@ GpgFrontend::UI::NetworkTab::NetworkTab(QWidget *parent) ui_->usernameLabel->setText(_("Username")); ui_->passwordLabel->setText(_("Password")); - ui_->forbidALLCheckBox->setText(_("Forbid all network connection.")); - ui_->forbidALLCheckBox->setDisabled(true); + ui_->checkProxyConnectionButton->setText( + _("Apply Proxy Settings and Check Proxy Connection")); + ui_->forbidALLGnuPGNetworkConnectionCheckBox->setText( + _("Forbid all GnuPG network connection.")); ui_->prohibitUpdateCheck->setText( _("Prohibit checking for version updates when the program starts.")); - ui_->checkProxyConnectionButton->setText(_("Check Proxy Connection")); + ui_->autoImportMissingKeyCheckBox->setText( + _("Automatically import a missing key for signature verification.")); + ui_->networkAbilityTipsLabel->setText( + _("Tips: These Option Changes take effect only after the " + "application restart.")); SetSettings(); } @@ -120,21 +147,17 @@ void GpgFrontend::UI::NetworkTab::SetSettings() { SPDLOG_ERROR("setting operation error: proxy_enable"); } - { - auto state = ui_->enableProxyCheckBox->checkState(); - switch_ui_enabled(state == Qt::Checked); - } - - ui_->forbidALLCheckBox->setCheckState(Qt::Unchecked); + ui_->forbidALLGnuPGNetworkConnectionCheckBox->setCheckState(Qt::Unchecked); try { - bool forbid_all_connection = - settings.lookup("network.forbid_all_connection"); - if (forbid_all_connection) - ui_->forbidALLCheckBox->setCheckState(Qt::Checked); + bool forbid_all_gnupg_connection = + settings.lookup("network.forbid_all_gnupg_connection"); + if (forbid_all_gnupg_connection) + ui_->forbidALLGnuPGNetworkConnectionCheckBox->setCheckState(Qt::Checked); else - ui_->forbidALLCheckBox->setCheckState(Qt::Unchecked); + ui_->forbidALLGnuPGNetworkConnectionCheckBox->setCheckState( + Qt::Unchecked); } catch (...) { - SPDLOG_ERROR("setting operation error: forbid_all_connection"); + SPDLOG_ERROR("setting operation error: forbid_all_gnupg_connection"); } ui_->prohibitUpdateCheck->setCheckState(Qt::Unchecked); @@ -148,6 +171,21 @@ void GpgFrontend::UI::NetworkTab::SetSettings() { } catch (...) { SPDLOG_ERROR("setting operation error: prohibit_update_checking"); } + + ui_->autoImportMissingKeyCheckBox->setCheckState(Qt::Unchecked); + try { + bool auto_import_missing_key = + settings.lookup("network.auto_import_missing_key"); + if (auto_import_missing_key) + ui_->autoImportMissingKeyCheckBox->setCheckState(Qt::Checked); + else + ui_->autoImportMissingKeyCheckBox->setCheckState(Qt::Unchecked); + } catch (...) { + SPDLOG_ERROR("setting operation error: auto_import_missing_key"); + } + + switch_ui_enabled(ui_->enableProxyCheckBox->isChecked()); + switch_ui_proxy_type(ui_->proxyTypeComboBox->currentText()); } void GpgFrontend::UI::NetworkTab::ApplySettings() { @@ -207,11 +245,13 @@ void GpgFrontend::UI::NetworkTab::ApplySettings() { auto &network = settings["network"]; - if (!network.exists("forbid_all_connection")) - network.add("forbid_all_connection", libconfig::Setting::TypeBoolean) = - ui_->forbidALLCheckBox->isChecked(); + if (!network.exists("forbid_all_gnupg_connection")) + network.add("forbid_all_gnupg_connection", + libconfig::Setting::TypeBoolean) = + ui_->forbidALLGnuPGNetworkConnectionCheckBox->isChecked(); else { - network["forbid_all_connection"] = ui_->forbidALLCheckBox->isChecked(); + network["forbid_all_gnupg_connection"] = + ui_->forbidALLGnuPGNetworkConnectionCheckBox->isChecked(); } if (!network.exists("prohibit_update_checking")) @@ -221,6 +261,14 @@ void GpgFrontend::UI::NetworkTab::ApplySettings() { network["prohibit_update_checking"] = ui_->prohibitUpdateCheck->isChecked(); } + if (!network.exists("auto_import_missing_key")) + network.add("auto_import_missing_key", libconfig::Setting::TypeBoolean) = + ui_->autoImportMissingKeyCheckBox->isChecked(); + else { + network["auto_import_missing_key"] = + ui_->autoImportMissingKeyCheckBox->isChecked(); + } + apply_proxy_settings(); } @@ -232,9 +280,9 @@ void GpgFrontend::UI::NetworkTab::slot_test_proxy_connection_result() { tr("Server Url"), QLineEdit::Normal, "https://", &ok); if (ok && !url.isEmpty()) { - auto thread = new ProxyConnectionTestThread(url, 800, this); - connect(thread, - &GpgFrontend::UI::ProxyConnectionTestThread:: + auto task = new ProxyConnectionTestTask(url, 800); + connect(task, + &GpgFrontend::UI::ProxyConnectionTestTask:: SignalProxyConnectionTestResult, this, [=](const QString &result) { if (result == "Reachable") { @@ -248,7 +296,6 @@ void GpgFrontend::UI::NetworkTab::slot_test_proxy_connection_result() { "proxy server. Proxy settings may be invalid.")); } }); - connect(thread, &QThread::finished, thread, &QThread::deleteLater); // Waiting Dialog auto *waiting_dialog = new QProgressDialog(this); @@ -261,43 +308,43 @@ void GpgFrontend::UI::NetworkTab::slot_test_proxy_connection_result() { waiting_dialog_label->setWordWrap(true); waiting_dialog->setLabel(waiting_dialog_label); waiting_dialog->resize(420, 120); - connect(thread, &QThread::finished, [=]() { - waiting_dialog->finished(0); + connect(task, &Thread::Task::SignalTaskEnd, [=]() { + waiting_dialog->close(); waiting_dialog->deleteLater(); }); - connect(waiting_dialog, &QProgressDialog::canceled, [=]() { - SPDLOG_DEBUG("cancel clicked"); - if (thread->isRunning()) thread->terminate(); - }); // Show Waiting Dialog waiting_dialog->show(); waiting_dialog->setFocus(); - thread->start(); + Thread::TaskRunnerGetter::GetInstance() + .GetTaskRunner(Thread::TaskRunnerGetter::kTaskRunnerType_Network) + ->PostTask(task); + QEventLoop loop; - connect(thread, &QThread::finished, &loop, &QEventLoop::quit); + connect(task, &Thread::Task::SignalTaskEnd, &loop, &QEventLoop::quit); + connect(waiting_dialog, &QProgressDialog::canceled, &loop, + &QEventLoop::quit); loop.exec(); } } void GpgFrontend::UI::NetworkTab::apply_proxy_settings() { // apply settings - QNetworkProxy _proxy; + QNetworkProxy proxy; if (ui_->enableProxyCheckBox->isChecked() && proxy_type_ != QNetworkProxy::DefaultProxy) { - _proxy.setType(proxy_type_); - _proxy.setHostName(ui_->proxyServerAddressEdit->text()); - _proxy.setPort(ui_->portSpin->value()); + proxy.setType(proxy_type_); + proxy.setHostName(ui_->proxyServerAddressEdit->text()); + proxy.setPort(ui_->portSpin->value()); if (!ui_->usernameEdit->text().isEmpty()) { - _proxy.setUser(ui_->usernameEdit->text()); - _proxy.setPassword(ui_->passwordEdit->text()); + proxy.setUser(ui_->usernameEdit->text()); + proxy.setPassword(ui_->passwordEdit->text()); } } else { - _proxy.setType(proxy_type_); + proxy.setType(proxy_type_); } - - QNetworkProxy::setApplicationProxy(_proxy); + QNetworkProxy::setApplicationProxy(proxy); } void GpgFrontend::UI::NetworkTab::switch_ui_enabled(bool enabled) { diff --git a/src/ui/main_window/KeyMgmt.cpp b/src/ui/main_window/KeyMgmt.cpp index 9183d9d7..949ef071 100644 --- a/src/ui/main_window/KeyMgmt.cpp +++ b/src/ui/main_window/KeyMgmt.cpp @@ -91,7 +91,7 @@ KeyMgmt::KeyMgmt(QWidget* parent) setCentralWidget(key_list_); key_list_->SetDoubleClickedAction([this](const GpgKey& key, QWidget* parent) { - new KeyDetailsDialog(key, parent); + new KeyDetailsDialog(key, this); }); key_list_->SlotRefresh(); @@ -109,8 +109,10 @@ KeyMgmt::KeyMgmt(QWidget* parent) this->statusBar()->show(); setWindowTitle(_("KeyPair Management")); + key_list_->AddMenuAction(generate_subkey_act_); key_list_->AddMenuAction(delete_selected_keys_act_); + key_list_->AddSeparator(); key_list_->AddMenuAction(show_key_details_act_); connect(this, &KeyMgmt::SignalKeyStatusUpdated, SignalStation::GetInstance(), @@ -163,11 +165,23 @@ void KeyMgmt::create_actions() { CommonUtils::GetInstance()->SlotImportKeyFromClipboard(this); }); + // get settings + auto& settings = GlobalSettingStation::GetInstance().GetUISettings(); + // read settings + bool forbid_all_gnupg_connection = false; + try { + forbid_all_gnupg_connection = + settings.lookup("network.forbid_all_gnupg_connection"); + } catch (...) { + SPDLOG_ERROR("setting operation error: forbid_all_gnupg_connection"); + } + import_key_from_key_server_act_ = new QAction(_("Keyserver"), this); import_key_from_key_server_act_->setIcon( QIcon(":import_key_from_server.png")); import_key_from_key_server_act_->setToolTip( _("Import New Key From Keyserver")); + import_key_from_key_server_act_->setDisabled(forbid_all_gnupg_connection); connect(import_key_from_key_server_act_, &QAction::triggered, this, [&]() { CommonUtils::GetInstance()->SlotImportKeyFromKeyServer(this); }); @@ -241,35 +255,28 @@ void KeyMgmt::create_menus() { } void KeyMgmt::create_tool_bars() { - QToolBar* keyToolBar = addToolBar(_("Key")); - keyToolBar->setObjectName("keytoolbar"); + QToolBar* key_tool_bar = addToolBar(_("Key")); + key_tool_bar->setObjectName("keytoolbar"); - // add button with popup menu for import - auto* generateToolButton = new QToolButton(this); - generateToolButton->setMenu(generate_key_menu_); - generateToolButton->setPopupMode(QToolButton::InstantPopup); - generateToolButton->setIcon(QIcon(":key_generate.png")); - generateToolButton->setText(_("Generate")); - generateToolButton->setToolTip(_("Generate A New Keypair or Subkey")); - generateToolButton->setToolButtonStyle(icon_style_); - keyToolBar->addWidget(generateToolButton); + // genrate key pair + key_tool_bar->addAction(generate_key_pair_act_); // add button with popup menu for import - auto* toolButton = new QToolButton(this); - toolButton->setMenu(import_key_menu_); - toolButton->setPopupMode(QToolButton::InstantPopup); - toolButton->setIcon(QIcon(":key_import.png")); - toolButton->setToolTip(_("Import key")); - toolButton->setText(_("Import Key")); - toolButton->setToolButtonStyle(icon_style_); - keyToolBar->addWidget(toolButton); - - keyToolBar->addSeparator(); - keyToolBar->addAction(delete_checked_keys_act_); - keyToolBar->addSeparator(); - keyToolBar->addAction(export_key_to_file_act_); - keyToolBar->addAction(export_key_to_clipboard_act_); - keyToolBar->addAction(export_key_as_open_ssh_format_); + auto* tool_button = new QToolButton(this); + tool_button->setMenu(import_key_menu_); + tool_button->setPopupMode(QToolButton::InstantPopup); + tool_button->setIcon(QIcon(":key_import.png")); + tool_button->setToolTip(_("Import key")); + tool_button->setText(_("Import Key")); + tool_button->setToolButtonStyle(icon_style_); + key_tool_bar->addWidget(tool_button); + + key_tool_bar->addSeparator(); + key_tool_bar->addAction(delete_checked_keys_act_); + key_tool_bar->addSeparator(); + key_tool_bar->addAction(export_key_to_file_act_); + key_tool_bar->addAction(export_key_to_clipboard_act_); + key_tool_bar->addAction(export_key_as_open_ssh_format_); } void KeyMgmt::SlotDeleteSelectedKeys() { @@ -323,7 +330,7 @@ void KeyMgmt::SlotShowKeyDetails() { return; } - new KeyDetailsDialog(key); + new KeyDetailsDialog(key, this); } void KeyMgmt::SlotExportKeyToKeyPackage() { diff --git a/src/ui/main_window/MainWindow.cpp b/src/ui/main_window/MainWindow.cpp index fff3ab63..b38646cf 100644 --- a/src/ui/main_window/MainWindow.cpp +++ b/src/ui/main_window/MainWindow.cpp @@ -84,7 +84,13 @@ void MainWindow::Init() noexcept { }); m_key_list_->AddMenuAction(append_selected_keys_act_); + m_key_list_->AddMenuAction(append_key_create_date_to_editor_act_); + m_key_list_->AddMenuAction(append_key_expire_date_to_editor_act_); + m_key_list_->AddMenuAction(append_key_fingerprint_to_editor_act_); + m_key_list_->AddSeparator(); m_key_list_->AddMenuAction(copy_mail_address_to_clipboard_act_); + m_key_list_->AddMenuAction(copy_key_default_uid_to_clipboard_act_); + m_key_list_->AddMenuAction(copy_key_id_to_clipboard_act_); m_key_list_->AddSeparator(); m_key_list_->AddMenuAction(show_key_details_act_); diff --git a/src/ui/main_window/MainWindow.h b/src/ui/main_window/MainWindow.h index e32a02ff..04a82759 100644 --- a/src/ui/main_window/MainWindow.h +++ b/src/ui/main_window/MainWindow.h @@ -224,12 +224,42 @@ class MainWindow : public GeneralMainWindow { */ void slot_append_selected_keys(); + /** + * @brief + * + */ + void slot_append_keys_create_datetime(); + + /** + * @brief + * + */ + void slot_append_keys_expire_datetime(); + + /** + * @brief + * + */ + void slot_append_keys_fingerprint(); + /** * @details Copy the mailaddress of selected key to clipboard. * Method for keylists contextmenu. */ void slot_copy_mail_address_to_clipboard(); + /** + * @details Copy the mailaddress of selected key to clipboard. + * Method for keylists contextmenu. + */ + void slot_copy_default_uid_to_clipboard(); + + /** + * @details Copy the mailaddress of selected key to clipboard. + * Method for keylists contextmenu. + */ + void slot_copy_key_id_to_clipboard(); + /** * @details Open key management dialog. */ @@ -376,8 +406,15 @@ class MainWindow : public GeneralMainWindow { QAction* append_selected_keys_act_{}; ///< Action to append selected keys to edit + QAction* append_key_fingerprint_to_editor_act_{}; ///< + QAction* append_key_create_date_to_editor_act_{}; ///< + QAction* append_key_expire_date_to_editor_act_{}; ///< + QAction* copy_mail_address_to_clipboard_act_{}; ///< Action to copy mail to ///< clipboard + QAction* copy_key_id_to_clipboard_act_{}; ///< + QAction* copy_key_default_uid_to_clipboard_act_{}; ///< + QAction* open_key_management_act_{}; ///< Action to open key management QAction* copy_act_{}; ///< Action to copy text QAction* quote_act_{}; ///< Action to quote text diff --git a/src/ui/main_window/MainWindowSlotFunction.cpp b/src/ui/main_window/MainWindowSlotFunction.cpp index 6f702e34..841c8680 100644 --- a/src/ui/main_window/MainWindowSlotFunction.cpp +++ b/src/ui/main_window/MainWindowSlotFunction.cpp @@ -26,12 +26,15 @@ * */ +#include +#include #include #include #include #include "MainWindow.h" #include "core/GpgConstants.h" +#include "core/GpgContext.h" #include "core/GpgModel.h" #include "core/function/gpg/GpgBasicOperator.h" #include "core/function/gpg/GpgKeyGetter.h" @@ -611,11 +614,88 @@ void MainWindow::slot_append_selected_keys() { auto exported = std::make_unique(); auto key_ids = m_key_list_->GetSelected(); - GpgKeyImportExporter::GetInstance().ExportKeys(key_ids, exported); + if (key_ids->empty()) { + SPDLOG_ERROR("no key is selected"); + return; + } + + if (!GpgKeyImportExporter::GetInstance().ExportKeys(key_ids, exported)) { + QMessageBox::critical(this, _("Error"), _("Key Export Operation Failed.")); + return; + } edit_->CurTextPage()->GetTextPage()->appendPlainText( QString::fromStdString(*exported)); } +void MainWindow::slot_append_keys_create_datetime() { + if (edit_->TabCount() == 0 || edit_->SlotCurPageTextEdit() == nullptr) { + return; + } + + auto key_ids = m_key_list_->GetSelected(); + + if (key_ids->empty()) { + SPDLOG_ERROR("no key is selected"); + return; + } + + auto key = GpgKeyGetter::GetInstance().GetKey(key_ids->front()); + if (!key.IsGood()) { + QMessageBox::critical(this, _("Error"), _("Key Not Found.")); + return; + } + + auto create_datetime_format_str = + boost::posix_time::to_iso_extended_string(key.GetCreateTime()) + + " (UTC) " + "\n"; + + edit_->CurTextPage()->GetTextPage()->appendPlainText( + QString::fromStdString(create_datetime_format_str)); +} + +void MainWindow::slot_append_keys_expire_datetime() { + if (edit_->TabCount() == 0 || edit_->SlotCurPageTextEdit() == nullptr) { + return; + } + + auto key_ids = m_key_list_->GetSelected(); + + if (key_ids->empty()) { + SPDLOG_ERROR("no key is selected"); + return; + } + + auto key = GpgKeyGetter::GetInstance().GetKey(key_ids->front()); + if (!key.IsGood()) { + QMessageBox::critical(this, _("Error"), _("Key Not Found.")); + return; + } + + auto create_datetime_format_str = + boost::posix_time::to_iso_extended_string(key.GetCreateTime()) + + " (UTC) " + "\n"; + + edit_->CurTextPage()->GetTextPage()->appendPlainText( + QString::fromStdString(create_datetime_format_str)); +} + +void MainWindow::slot_append_keys_fingerprint() { + auto key_ids = m_key_list_->GetSelected(); + if (key_ids->empty()) return; + + auto key = GpgKeyGetter::GetInstance().GetKey(key_ids->front()); + if (!key.IsGood()) { + QMessageBox::critical(this, _("Error"), _("Key Not Found.")); + return; + } + + auto fingerprint_format_str = + beautify_fingerprint(key.GetFingerprint()) + "\n"; + + edit_->CurTextPage()->GetTextPage()->appendPlainText( + QString::fromStdString(fingerprint_format_str)); +} + void MainWindow::slot_copy_mail_address_to_clipboard() { auto key_ids = m_key_list_->GetSelected(); if (key_ids->empty()) return; @@ -629,6 +709,32 @@ void MainWindow::slot_copy_mail_address_to_clipboard() { cb->setText(QString::fromStdString(key.GetEmail())); } +void MainWindow::slot_copy_default_uid_to_clipboard() { + auto key_ids = m_key_list_->GetSelected(); + if (key_ids->empty()) return; + + auto key = GpgKeyGetter::GetInstance().GetKey(key_ids->front()); + if (!key.IsGood()) { + QMessageBox::critical(this, _("Error"), _("Key Not Found.")); + return; + } + QClipboard* cb = QApplication::clipboard(); + cb->setText(QString::fromStdString(key.GetUIDs()->front().GetUID())); +} + +void MainWindow::slot_copy_key_id_to_clipboard() { + auto key_ids = m_key_list_->GetSelected(); + if (key_ids->empty()) return; + + auto key = GpgKeyGetter::GetInstance().GetKey(key_ids->front()); + if (!key.IsGood()) { + QMessageBox::critical(this, _("Error"), _("Key Not Found.")); + return; + } + QClipboard* cb = QApplication::clipboard(); + cb->setText(QString::fromStdString(key.GetId())); +} + void MainWindow::slot_show_key_details() { auto key_ids = m_key_list_->GetSelected(); if (key_ids->empty()) return; diff --git a/src/ui/main_window/MainWindowUI.cpp b/src/ui/main_window/MainWindowUI.cpp index b9a01c15..1034df52 100644 --- a/src/ui/main_window/MainWindowUI.cpp +++ b/src/ui/main_window/MainWindowUI.cpp @@ -27,6 +27,7 @@ */ #include "MainWindow.h" +#include "core/function/GlobalSettingStation.h" #include "core/function/gpg/GpgAdvancedOperator.h" #include "ui/UserInterfaceUtils.h" @@ -251,11 +252,23 @@ void MainWindow::create_actions() { CommonUtils::GetInstance()->SlotImportKeyFromClipboard(this); }); + // get settings + auto& settings = GlobalSettingStation::GetInstance().GetUISettings(); + // read settings + bool forbid_all_gnupg_connection = false; + try { + forbid_all_gnupg_connection = + settings.lookup("network.forbid_all_gnupg_connection"); + } catch (...) { + SPDLOG_ERROR("setting operation error: forbid_all_gnupg_connection"); + } + import_key_from_key_server_act_ = new QAction(_("Keyserver"), this); import_key_from_key_server_act_->setIcon( QIcon(":import_key_from_server.png")); import_key_from_key_server_act_->setToolTip( _("Import New Key From Keyserver")); + import_key_from_key_server_act_->setDisabled(forbid_all_gnupg_connection); connect(import_key_from_key_server_act_, &QAction::triggered, this, [&]() { CommonUtils::GetInstance()->SlotImportKeyFromKeyServer(this); }); @@ -353,22 +366,53 @@ void MainWindow::create_actions() { connect(start_wizard_act_, &QAction::triggered, this, &MainWindow::slot_start_wizard); - /* Popup-Menu-Action for KeyList - */ - append_selected_keys_act_ = new QAction(_("Append To Text Editor"), this); + append_selected_keys_act_ = + new QAction(_("Append Public Key to Editor"), this); append_selected_keys_act_->setToolTip( - _("Append The Selected Public Key To Text in Editor")); + _("Append selected Keypair's Public Key to Editor")); connect(append_selected_keys_act_, &QAction::triggered, this, &MainWindow::slot_append_selected_keys); + append_key_create_date_to_editor_act_ = + new QAction(_("Append Create DateTime to Editor"), this); + append_key_create_date_to_editor_act_->setToolTip( + _("Append selected Key's creation date and time to Editor")); + connect(append_key_create_date_to_editor_act_, &QAction::triggered, this, + &MainWindow::slot_append_keys_create_datetime); + + append_key_expire_date_to_editor_act_ = + new QAction(_("Append Expire DateTime to Editor"), this); + append_key_expire_date_to_editor_act_->setToolTip( + _("Append selected Key's expiration date and time to Editor")); + connect(append_key_expire_date_to_editor_act_, &QAction::triggered, this, + &MainWindow::slot_append_keys_expire_datetime); + + append_key_fingerprint_to_editor_act_ = + new QAction(_("Append Fingerprint to Editor"), this); + append_key_expire_date_to_editor_act_->setToolTip( + _("Append selected Key's Fingerprint to Editor")); + connect(append_key_fingerprint_to_editor_act_, &QAction::triggered, this, + &MainWindow::slot_append_keys_fingerprint); + copy_mail_address_to_clipboard_act_ = new QAction(_("Copy Email"), this); copy_mail_address_to_clipboard_act_->setToolTip( - _("Copy selected Email to clipboard")); + _("Copy selected Keypair's to clipboard")); connect(copy_mail_address_to_clipboard_act_, &QAction::triggered, this, &MainWindow::slot_copy_mail_address_to_clipboard); - // TODO: find central place for shared actions, to avoid code-duplication with - // keymgmt.cpp + copy_key_default_uid_to_clipboard_act_ = + new QAction(_("Copy Default UID"), this); + copy_key_default_uid_to_clipboard_act_->setToolTip( + _("Copy selected Keypair's default UID to clipboard")); + connect(copy_key_default_uid_to_clipboard_act_, &QAction::triggered, this, + &MainWindow::slot_copy_default_uid_to_clipboard); + + copy_key_id_to_clipboard_act_ = new QAction(_("Copy Key ID"), this); + copy_key_id_to_clipboard_act_->setToolTip( + _("Copy selected Keypair's ID to clipboard")); + connect(copy_key_id_to_clipboard_act_, &QAction::triggered, this, + &MainWindow::slot_copy_key_id_to_clipboard); + show_key_details_act_ = new QAction(_("Show Key Details"), this); show_key_details_act_->setToolTip(_("Show Details for this Key")); connect(show_key_details_act_, &QAction::triggered, this, @@ -464,8 +508,8 @@ void MainWindow::create_menus() { help_menu_->addAction(start_wizard_act_); help_menu_->addSeparator(); help_menu_->addAction(check_update_act_); - help_menu_->addAction(translate_act_); help_menu_->addAction(gnupg_act_); + help_menu_->addAction(translate_act_); help_menu_->addAction(about_act_); } diff --git a/src/ui/thread/ProxyConnectionTestTask.cpp b/src/ui/thread/ProxyConnectionTestTask.cpp new file mode 100644 index 00000000..c7d623d7 --- /dev/null +++ b/src/ui/thread/ProxyConnectionTestTask.cpp @@ -0,0 +1,74 @@ +/** + * Copyright (C) 2021 Saturneric + * + * This file is part of GpgFrontend. + * + * GpgFrontend is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GpgFrontend is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GpgFrontend. If not, see . + * + * The initial version of the source code is inherited from + * the gpg4usb project, which is under GPL-3.0-or-later. + * + * The source code version of this software was modified and released + * by Saturneric starting on May 12, 2021. + * + */ + +#include "ProxyConnectionTestTask.h" + +GpgFrontend::UI::ProxyConnectionTestTask::ProxyConnectionTestTask(QString url, + int timeout) + : Task("proxy_connection_test_task"), + url_(std::move(url)), + timeout_(timeout), + network_manager_(new QNetworkAccessManager(this)) {} + +void GpgFrontend::UI::ProxyConnectionTestTask::run() { + SetFinishAfterRun(false); + + auto* network_reply = network_manager_->get(QNetworkRequest{url_}); + auto* timer = new QTimer(this); + + connect(network_reply, &QNetworkReply::finished, this, + [this, network_reply]() { + SPDLOG_DEBUG("key server domain reply: {} received", + url_.toStdString()); + this->slot_process_network_reply(network_reply); + }); + + connect(timer, &QTimer::timeout, this, [this, network_reply]() { + SPDLOG_DEBUG("timeout for key server: {}", url_.toStdString()); + if (network_reply->isRunning()) { + network_reply->abort(); + this->slot_process_network_reply(network_reply); + } + }); + + timer->start(timeout_); +} + +void GpgFrontend::UI::ProxyConnectionTestTask::slot_process_network_reply( + QNetworkReply* reply) { + auto buffer = reply->readAll(); + SPDLOG_DEBUG("key server domain reply: {}, buffer size: {}", + url_.toStdString(), buffer.size()); + + if (reply->error() == QNetworkReply::NoError && !buffer.isEmpty()) { + result_ = "Reachable"; + } else { + result_ = "Not Reachable"; + } + + emit SignalProxyConnectionTestResult(result_); + emit SignalTaskRunnableEnd(0); +} diff --git a/src/ui/thread/ProxyConnectionTestThread.h b/src/ui/thread/ProxyConnectionTestTask.h similarity index 81% rename from src/ui/thread/ProxyConnectionTestThread.h rename to src/ui/thread/ProxyConnectionTestTask.h index 70757e03..38e78ae4 100644 --- a/src/ui/thread/ProxyConnectionTestThread.h +++ b/src/ui/thread/ProxyConnectionTestTask.h @@ -39,7 +39,7 @@ namespace GpgFrontend::UI { * @brief * */ -class ProxyConnectionTestThread : public QThread { +class ProxyConnectionTestTask : public Thread::Task { Q_OBJECT public: /** @@ -49,9 +49,7 @@ class ProxyConnectionTestThread : public QThread { * @param timeout * @param parent */ - explicit ProxyConnectionTestThread(QString url, int timeout, - QWidget* parent = nullptr) - : QThread(parent), url_(std::move(url)), timeout_(timeout) {} + explicit ProxyConnectionTestTask(QString url, int timeout); signals: /** @@ -68,10 +66,14 @@ class ProxyConnectionTestThread : public QThread { */ void run() override; + private slots: + void slot_process_network_reply(QNetworkReply* reply); + private: - QString url_; ///< - QString result_; ///< - int timeout_ = 500; ///< + QString url_; ///< + QString result_; ///< + int timeout_ = 500; ///< + QNetworkAccessManager* network_manager_; ///< }; } // namespace GpgFrontend::UI diff --git a/src/ui/thread/ProxyConnectionTestThread.cpp b/src/ui/thread/ProxyConnectionTestThread.cpp deleted file mode 100644 index 8b113453..00000000 --- a/src/ui/thread/ProxyConnectionTestThread.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Copyright (C) 2021 Saturneric - * - * This file is part of GpgFrontend. - * - * GpgFrontend is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * GpgFrontend is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GpgFrontend. If not, see . - * - * The initial version of the source code is inherited from - * the gpg4usb project, which is under GPL-3.0-or-later. - * - * The source code version of this software was modified and released - * by Saturneric starting on May 12, 2021. - * - */ - -#include "ProxyConnectionTestThread.h" - -void GpgFrontend::UI::ProxyConnectionTestThread::run() { - QNetworkProxyQuery npq({QUrl(url_)}); - auto proxies_list = QNetworkProxyFactory::systemProxyForQuery(npq); - - if (proxies_list.isEmpty()) { - SPDLOG_DEBUG("no proxy applied"); - } else { - SPDLOG_DEBUG("proxies list hostname: {}", - proxies_list.front().hostName().toStdString()); - } - - SPDLOG_DEBUG("proxies list size: {}", proxies_list.size()); - - auto manager = std::make_unique(nullptr); - QNetworkRequest url_request; - url_request.setUrl(QUrl(url_)); - auto _reply = manager->get(url_request); - - while (_reply->isRunning()) QApplication::processEvents(); - auto _buffer = _reply->readAll(); - if (_reply->error() == QNetworkReply::NoError && !_buffer.isEmpty()) { - result_ = "Reachable"; - } else { - result_ = "Not Reachable"; - } - - _reply->deleteLater(); - - emit SignalProxyConnectionTestResult(result_); -} diff --git a/src/ui/widgets/TextEdit.cpp b/src/ui/widgets/TextEdit.cpp index 4947e179..d22c091a 100644 --- a/src/ui/widgets/TextEdit.cpp +++ b/src/ui/widgets/TextEdit.cpp @@ -603,6 +603,7 @@ void TextEdit::slot_save_status_to_cache_for_revovery() { text_page_data_modified_count_); if (this->text_page_data_modified_count_++ % 3 != 0) return; +#ifdef DEBUG int tab_count = tab_widget_->count(); SPDLOG_DEBUG("current tabs count {}", tab_count); @@ -635,6 +636,7 @@ void TextEdit::slot_save_status_to_cache_for_revovery() { tab_title, raw_text.size()); unsaved_pages.push_back({i, tab_title, raw_text}); } +#endif } } // namespace GpgFrontend::UI diff --git a/src/ui/widgets/VerifyKeyDetailBox.cpp b/src/ui/widgets/VerifyKeyDetailBox.cpp index c6c4982c..555414b4 100644 --- a/src/ui/widgets/VerifyKeyDetailBox.cpp +++ b/src/ui/widgets/VerifyKeyDetailBox.cpp @@ -28,6 +28,7 @@ #include "ui/widgets/VerifyKeyDetailBox.h" +#include "core/function/GlobalSettingStation.h" #include "core/function/gpg/GpgKeyGetter.h" namespace GpgFrontend::UI { @@ -40,8 +41,21 @@ VerifyKeyDetailBox::VerifyKeyDetailBox(const GpgSignature& signature, switch (gpg_err_code(signature.GetStatus())) { case GPG_ERR_NO_PUBKEY: { this->setTitle("A Error Signature"); - auto* importButton = new QPushButton(_("Import from keyserver")); - connect(importButton, &QPushButton::clicked, this, + + // get settings + auto& settings = GlobalSettingStation::GetInstance().GetUISettings(); + // read settings + bool forbid_all_gnupg_connection = false; + try { + forbid_all_gnupg_connection = + settings.lookup("network.forbid_all_gnupg_connection"); + } catch (...) { + SPDLOG_ERROR("setting operation error: forbid_all_gnupg_connection"); + } + + auto* import_button = new QPushButton(_("Import from keyserver")); + import_button->setDisabled(forbid_all_gnupg_connection); + connect(import_button, &QPushButton::clicked, this, &VerifyKeyDetailBox::slot_import_form_key_server); this->setTitle(QString(_("Key not present with id 0x")) + fpr_.c_str()); @@ -52,7 +66,7 @@ VerifyKeyDetailBox::VerifyKeyDetailBox(const GpgSignature& signature, // grid->addWidget(new QLabel(_("Fingerprint:")), 1, 0); grid->addWidget(new QLabel(_("Key not present in key list")), 0, 1); // grid->addWidget(new QLabel(signature->fpr), 1, 1); - grid->addWidget(importButton, 2, 0, 2, 1); + grid->addWidget(import_button, 2, 0, 2, 1); vbox->addLayout(grid); break; diff --git a/ui/GeneralSettings.ui b/ui/GeneralSettings.ui index 75aef6b2..668d3396 100644 --- a/ui/GeneralSettings.ui +++ b/ui/GeneralSettings.ui @@ -85,6 +85,13 @@ + + + + Use Pinentry as Password Input Dialog + + + diff --git a/ui/NetworkSettings.ui b/ui/NetworkSettings.ui index 9e27d11b..8d7c7d48 100644 --- a/ui/NetworkSettings.ui +++ b/ui/NetworkSettings.ui @@ -6,7 +6,7 @@ 0 0 - 549 + 554 727 @@ -251,23 +251,57 @@ + + + + Qt::Horizontal + + + + + + + Operations + + + + + + + + Check Proxy Connection + + + + + + + + - Network Capability + Network Ability + + + + Tips: These Option Changes take effect only after the application restart. + + + - + - Forbid all network connection. + Forbid all GnuPG network connection. @@ -278,8 +312,22 @@ + + + + Automatically import a missing key for signature verification. + + + + + + + Qt::Horizontal + + + @@ -296,26 +344,6 @@ - - - - Operations - - - - - - - - Check Proxy Connection - - - - - - - -