aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/codeql-analysis.yml38
-rw-r--r--.github/workflows/debug.yml15
-rw-r--r--.github/workflows/release-deb-package.yml8
-rw-r--r--.github/workflows/release.yml25
-rw-r--r--README.md6
-rw-r--r--gpgfrontend.qrc148
-rw-r--r--resource/gpgfrontend/usr/share/applications/gpgfrontend.desktop7
-rw-r--r--resource/gpgfrontend/usr/share/icons/hicolor/128x128/apps/GpgFrontend.pngbin3819 -> 0 bytes
-rw-r--r--resource/gpgfrontend/usr/share/icons/hicolor/256x256/apps/GpgFrontend.pngbin9155 -> 0 bytes
-rw-r--r--resource/gpgfrontend/usr/share/icons/hicolor/32x32/apps/GpgFrontend.pngbin3533 -> 0 bytes
-rw-r--r--resource/gpgfrontend/usr/share/metainfo/pub.gpgfrontend.gpgfrontend.metainfo.xml35
-rw-r--r--resource/hicolor/128x128/apps/pub.gpgfrontend.gpgfrontend.pngbin3819 -> 0 bytes
-rw-r--r--resource/hicolor/256x256/apps/pub.gpgfrontend.gpgfrontend.pngbin9155 -> 0 bytes
-rw-r--r--resource/hicolor/32x32/apps/pub.gpgfrontend.gpgfrontend.pngbin3533 -> 0 bytes
-rw-r--r--resource/icons/archive.pngbin4613 -> 0 bytes
-rw-r--r--resource/icons/button_cancel.pngbin3242 -> 0 bytes
-rw-r--r--resource/icons/button_copy.pngbin1475 -> 0 bytes
-rw-r--r--resource/icons/button_cut.pngbin2828 -> 0 bytes
-rw-r--r--resource/icons/button_delete.pngbin2202 -> 0 bytes
-rw-r--r--resource/icons/button_next.pngbin6380 -> 0 bytes
-rw-r--r--resource/icons/button_ok.pngbin6709 -> 0 bytes
-rw-r--r--resource/icons/button_paste.pngbin2727 -> 0 bytes
-rw-r--r--resource/icons/button_previous.pngbin5914 -> 0 bytes
-rw-r--r--resource/icons/check.pngbin4779 -> 0 bytes
-rw-r--r--resource/icons/configure.pngbin4277 -> 0 bytes
-rw-r--r--resource/icons/decrypted.pngbin3620 -> 0 bytes
-rw-r--r--resource/icons/decrypted_verified.pngbin3935 -> 0 bytes
-rw-r--r--resource/icons/down.pngbin4859 -> 0 bytes
-rw-r--r--resource/icons/drafts.pngbin6313 -> 0 bytes
-rw-r--r--resource/icons/edit.pngbin1491 -> 0 bytes
-rw-r--r--resource/icons/email.pngbin4582 -> 0 bytes
-rw-r--r--resource/icons/encrypted.pngbin3288 -> 0 bytes
-rw-r--r--resource/icons/encrypted_signed.pngbin2837 -> 0 bytes
-rw-r--r--resource/icons/error.pngbin6721 -> 0 bytes
-rw-r--r--resource/icons/exit.pngbin4925 -> 0 bytes
-rw-r--r--resource/icons/export_key_to_clipboard.pngbin2659 -> 0 bytes
-rw-r--r--resource/icons/export_key_to_file.pngbin4577 -> 0 bytes
-rw-r--r--resource/icons/file-browser.pngbin3652 -> 0 bytes
-rw-r--r--resource/icons/file.pngbin4488 -> 0 bytes
-rw-r--r--resource/icons/fileencrytion.pngbin2276 -> 0 bytes
-rw-r--r--resource/icons/fileopen.pngbin3100 -> 0 bytes
-rw-r--r--resource/icons/fileprint.pngbin2915 -> 0 bytes
-rw-r--r--resource/icons/filesave.pngbin2348 -> 0 bytes
-rw-r--r--resource/icons/filesaveas.pngbin4333 -> 0 bytes
-rw-r--r--resource/icons/flag-fill.pngbin2128 -> 0 bytes
-rw-r--r--resource/icons/folder.pngbin2944 -> 0 bytes
-rw-r--r--resource/icons/format-line-spacing-double.pngbin676 -> 0 bytes
-rw-r--r--resource/icons/format-line-spacing-normal.pngbin707 -> 0 bytes
-rw-r--r--resource/icons/format-line-spacing-triple.pngbin534 -> 0 bytes
-rw-r--r--resource/icons/gnupg.pngbin7198 -> 0 bytes
-rw-r--r--resource/icons/gpgfrontend-logo.pngbin17878 -> 0 bytes
-rw-r--r--resource/icons/gpgfrontend-logo_small (copy).pngbin12857 -> 0 bytes
-rw-r--r--resource/icons/gpgfrontend-logo_small.pngbin12857 -> 0 bytes
-rw-r--r--resource/icons/gpgfrontend.pngbin3533 -> 0 bytes
-rw-r--r--resource/icons/help.pngbin2723 -> 0 bytes
-rw-r--r--resource/icons/import_key_from_clipboard.pngbin1952 -> 0 bytes
-rw-r--r--resource/icons/import_key_from_file.pngbin2404 -> 0 bytes
-rw-r--r--resource/icons/import_key_from_server.pngbin4802 -> 0 bytes
-rw-r--r--resource/icons/importance.pngbin6036 -> 0 bytes
-rw-r--r--resource/icons/importkey_editor.pngbin4040 -> 0 bytes
-rw-r--r--resource/icons/inbox.pngbin5627 -> 0 bytes
-rw-r--r--resource/icons/info.pngbin7948 -> 0 bytes
-rw-r--r--resource/icons/junk.pngbin7485 -> 0 bytes
-rw-r--r--resource/icons/key_export.pngbin1449 -> 0 bytes
-rw-r--r--resource/icons/key_generate.pngbin2708 -> 0 bytes
-rw-r--r--resource/icons/key_import.pngbin4276 -> 0 bytes
-rw-r--r--resource/icons/key_package.pngbin8815 -> 0 bytes
-rw-r--r--resource/icons/keymgmt.pngbin4905 -> 0 bytes
-rw-r--r--resource/icons/keys12.jpgbin8130 -> 0 bytes
-rw-r--r--resource/icons/keys13.jpgbin25883 -> 0 bytes
-rw-r--r--resource/icons/kgpg_key2.pngbin3837 -> 0 bytes
-rw-r--r--resource/icons/mimetypes/application-pdf.pngbin1537 -> 0 bytes
-rw-r--r--resource/icons/mimetypes/image-x-generic.pngbin1562 -> 0 bytes
-rw-r--r--resource/icons/mimetypes/text-plain.pngbin1138 -> 0 bytes
-rw-r--r--resource/icons/mimetypes/unknown.pngbin1091 -> 0 bytes
-rw-r--r--resource/icons/misc_doc.pngbin1482 -> 0 bytes
-rw-r--r--resource/icons/quote.pngbin1516 -> 0 bytes
-rw-r--r--resource/icons/receive_email.pngbin6404 -> 0 bytes
-rw-r--r--resource/icons/refresh.pngbin6821 -> 0 bytes
-rw-r--r--resource/icons/sent.pngbin8314 -> 0 bytes
-rw-r--r--resource/icons/server.pngbin3663 -> 0 bytes
-rw-r--r--resource/icons/signature.pngbin3710 -> 0 bytes
-rw-r--r--resource/icons/ssh-key.pngbin6510 -> 0 bytes
-rw-r--r--resource/icons/statusbar_icon.pngbin870 -> 0 bytes
-rw-r--r--resource/icons/trash.pngbin3901 -> 0 bytes
-rw-r--r--resource/icons/txt.pngbin2482 -> 0 bytes
-rw-r--r--resource/icons/undo.pngbin4347 -> 0 bytes
-rw-r--r--resource/icons/up-arrow.pngbin4969 -> 0 bytes
-rw-r--r--resource/icons/up.pngbin4557 -> 0 bytes
-rw-r--r--resource/icons/verify.pngbin7005 -> 0 bytes
-rw-r--r--resource/icons/warning.pngbin7506 -> 0 bytes
-rw-r--r--resource/icons/wizard_banner.pngbin16779 -> 0 bytes
-rw-r--r--resource/lfs/app-image/gpgfrontend/usr/share/applications/gpgfrontend.desktop3
-rw-r--r--resource/lfs/app-image/gpgfrontend/usr/share/icons/hicolor/128x128/apps/GpgFrontend.png3
-rw-r--r--resource/lfs/app-image/gpgfrontend/usr/share/icons/hicolor/256x256/apps/GpgFrontend.png3
-rw-r--r--resource/lfs/app-image/gpgfrontend/usr/share/icons/hicolor/32x32/apps/GpgFrontend.png3
-rw-r--r--resource/lfs/app-image/gpgfrontend/usr/share/metainfo/pub.gpgfrontend.gpgfrontend.metainfo.xml3
-rw-r--r--resource/lfs/hicolor/128x128/apps/pub.gpgfrontend.gpgfrontend.png3
-rw-r--r--resource/lfs/hicolor/256x256/apps/pub.gpgfrontend.gpgfrontend.png3
-rw-r--r--resource/lfs/hicolor/32x32/apps/pub.gpgfrontend.gpgfrontend.png3
-rw-r--r--resource/lfs/icons/archive.png3
-rw-r--r--resource/lfs/icons/button_cancel.png3
-rw-r--r--resource/lfs/icons/button_copy.png3
-rw-r--r--resource/lfs/icons/button_cut.png3
-rw-r--r--resource/lfs/icons/button_delete.png3
-rw-r--r--resource/lfs/icons/button_next.png3
-rw-r--r--resource/lfs/icons/button_ok.png3
-rw-r--r--resource/lfs/icons/button_paste.png3
-rw-r--r--resource/lfs/icons/button_previous.png3
-rw-r--r--resource/lfs/icons/check.png3
-rw-r--r--resource/lfs/icons/configure.png3
-rw-r--r--resource/lfs/icons/decrypted.png3
-rw-r--r--resource/lfs/icons/decrypted_verified.png3
-rw-r--r--resource/lfs/icons/down.png3
-rw-r--r--resource/lfs/icons/drafts.png3
-rw-r--r--resource/lfs/icons/edit.png3
-rw-r--r--resource/lfs/icons/email.png3
-rw-r--r--resource/lfs/icons/encrypted.png3
-rw-r--r--resource/lfs/icons/encrypted_signed.png3
-rw-r--r--resource/lfs/icons/error.png3
-rw-r--r--resource/lfs/icons/exit.png3
-rw-r--r--resource/lfs/icons/export_key_to_clipboard.png3
-rw-r--r--resource/lfs/icons/export_key_to_file.png3
-rw-r--r--resource/lfs/icons/file-browser.png3
-rw-r--r--resource/lfs/icons/file.png3
-rw-r--r--resource/lfs/icons/fileencrytion.png3
-rw-r--r--resource/lfs/icons/fileopen.png3
-rw-r--r--resource/lfs/icons/fileprint.png3
-rw-r--r--resource/lfs/icons/filesave.png3
-rw-r--r--resource/lfs/icons/filesaveas.png3
-rw-r--r--resource/lfs/icons/flag-fill.png3
-rw-r--r--resource/lfs/icons/folder.png3
-rw-r--r--resource/lfs/icons/format-line-spacing-double.png3
-rw-r--r--resource/lfs/icons/format-line-spacing-normal.png3
-rw-r--r--resource/lfs/icons/format-line-spacing-triple.png3
-rw-r--r--resource/lfs/icons/gnupg.png3
-rw-r--r--resource/lfs/icons/gpgfrontend-logo.png3
-rw-r--r--resource/lfs/icons/gpgfrontend-logo_small (copy).png3
-rw-r--r--resource/lfs/icons/gpgfrontend-logo_small.png3
-rw-r--r--resource/lfs/icons/gpgfrontend.png3
-rw-r--r--resource/lfs/icons/help.png3
-rw-r--r--resource/lfs/icons/import_key_from_clipboard.png3
-rw-r--r--resource/lfs/icons/import_key_from_file.png3
-rw-r--r--resource/lfs/icons/import_key_from_server.png3
-rw-r--r--resource/lfs/icons/importance.png3
-rw-r--r--resource/lfs/icons/importkey_editor.png3
-rw-r--r--resource/lfs/icons/inbox.png3
-rw-r--r--resource/lfs/icons/info.png3
-rw-r--r--resource/lfs/icons/junk.png3
-rw-r--r--resource/lfs/icons/key_export.png3
-rw-r--r--resource/lfs/icons/key_generate.png3
-rw-r--r--resource/lfs/icons/key_import.png3
-rw-r--r--resource/lfs/icons/key_package.png3
-rw-r--r--resource/lfs/icons/keymgmt.png3
-rw-r--r--resource/lfs/icons/keys12.jpg3
-rw-r--r--resource/lfs/icons/keys13.jpg3
-rw-r--r--resource/lfs/icons/kgpg_key2.png3
-rw-r--r--resource/lfs/icons/mimetypes/application-pdf.png3
-rw-r--r--resource/lfs/icons/mimetypes/image-x-generic.png3
-rw-r--r--resource/lfs/icons/mimetypes/text-plain.png3
-rw-r--r--resource/lfs/icons/mimetypes/unknown.png3
-rw-r--r--resource/lfs/icons/misc_doc.png3
-rw-r--r--resource/lfs/icons/quote.png3
-rw-r--r--resource/lfs/icons/receive_email.png3
-rw-r--r--resource/lfs/icons/refresh.png3
-rw-r--r--resource/lfs/icons/sent.png3
-rw-r--r--resource/lfs/icons/server.png3
-rw-r--r--resource/lfs/icons/signature.png3
-rw-r--r--resource/lfs/icons/ssh-key.png3
-rw-r--r--resource/lfs/icons/statusbar_icon.png3
-rw-r--r--resource/lfs/icons/trash.png3
-rw-r--r--resource/lfs/icons/txt.png3
-rw-r--r--resource/lfs/icons/undo.png3
-rw-r--r--resource/lfs/icons/up-arrow.png3
-rw-r--r--resource/lfs/icons/up.png3
-rw-r--r--resource/lfs/icons/verify.png3
-rw-r--r--resource/lfs/icons/warning.png3
-rw-r--r--resource/lfs/icons/wizard_banner.png3
-rw-r--r--resource/lfs/locale/po/af_ZA.po3
-rw-r--r--resource/lfs/locale/po/ar_IQ.po3
-rw-r--r--resource/lfs/locale/po/ar_SA.po3
-rw-r--r--resource/lfs/locale/po/be_BY.po3
-rw-r--r--resource/lfs/locale/po/bg_BG.po3
-rw-r--r--resource/lfs/locale/po/ca_ES.po3
-rw-r--r--resource/lfs/locale/po/cs_CZ.po3
-rw-r--r--resource/lfs/locale/po/da_DK.po3
-rw-r--r--resource/lfs/locale/po/de_AT.po3
-rw-r--r--resource/lfs/locale/po/de_CH.po3
-rw-r--r--resource/lfs/locale/po/de_DE.po3
-rw-r--r--resource/lfs/locale/po/el_GR.po3
-rw-r--r--resource/lfs/locale/po/en_US.po3
-rw-r--r--resource/lfs/locale/po/es_ES.po3
-rw-r--r--resource/lfs/locale/po/es_MX.po3
-rw-r--r--resource/lfs/locale/po/et_EE.po3
-rw-r--r--resource/lfs/locale/po/fa_IR.po3
-rw-r--r--resource/lfs/locale/po/fi_FI.po3
-rw-r--r--resource/lfs/locale/po/fr_CA.po3
-rw-r--r--resource/lfs/locale/po/fr_FR.po3
-rw-r--r--resource/lfs/locale/po/he_IL.po3
-rw-r--r--resource/lfs/locale/po/hi_IN.po3
-rw-r--r--resource/lfs/locale/po/hr_HR.po3
-rw-r--r--resource/lfs/locale/po/id_ID.po3
-rw-r--r--resource/lfs/locale/po/it_IT.po3
-rw-r--r--resource/lfs/locale/po/iw_IL.po3
-rw-r--r--resource/lfs/locale/po/ja_JP.po3
-rw-r--r--resource/lfs/locale/po/ko_KR.po3
-rw-r--r--resource/lfs/locale/po/lt_LT.po3
-rw-r--r--resource/lfs/locale/po/nl_NL.po3
-rw-r--r--resource/lfs/locale/po/pl_PL.po3
-rw-r--r--resource/lfs/locale/po/pt_BR.po3
-rw-r--r--resource/lfs/locale/po/ru_RU.po3
-rw-r--r--resource/lfs/locale/po/sq_AL.po3
-rw-r--r--resource/lfs/locale/po/uk_UA.po3
-rw-r--r--resource/lfs/locale/po/zh_CN.po3
-rw-r--r--resource/lfs/locale/po/zh_HK.po3
-rw-r--r--resource/lfs/locale/po/zh_TW.po3
-rw-r--r--resource/lfs/locale/template/GpgFrontend.pot3
-rwxr-xr-xresource/lfs/macOS/GnuPG/agent/gpg-agent3
-rwxr-xr-xresource/lfs/macOS/GnuPG/bin/gpgconf3
-rwxr-xr-xresource/lfs/macOS/GnuPG/bin/gpgconf-original3
-rwxr-xr-xresource/lfs/macOS/GnuPG/dirmngr/dirmngr3
-rwxr-xr-xresource/lfs/macOS/GnuPG/g10/gpg3
-rwxr-xr-xresource/lfs/macOS/GnuPG/kbx/keyboxd3
-rw-r--r--resource/lfs/macOS/GnuPG/libs/libassuan.0.dylib3
-rw-r--r--resource/lfs/macOS/GnuPG/libs/libgcrypt.20.dylib3
-rw-r--r--resource/lfs/macOS/GnuPG/libs/libgmp.10.dylib3
-rw-r--r--resource/lfs/macOS/GnuPG/libs/libgnutls.30.dylib3
-rw-r--r--resource/lfs/macOS/GnuPG/libs/libgpg-error.0.dylib3
-rw-r--r--resource/lfs/macOS/GnuPG/libs/libhogweed.6.6.dylib3
-rw-r--r--resource/lfs/macOS/GnuPG/libs/libidn2.0.dylib3
-rw-r--r--resource/lfs/macOS/GnuPG/libs/libintl.8.dylib3
-rw-r--r--resource/lfs/macOS/GnuPG/libs/libksba.8.dylib3
-rw-r--r--resource/lfs/macOS/GnuPG/libs/libnettle.8.6.dylib3
-rw-r--r--resource/lfs/macOS/GnuPG/libs/libnpth.0.dylib3
-rw-r--r--resource/lfs/macOS/GnuPG/libs/libp11-kit.0.dylib3
-rw-r--r--resource/lfs/macOS/GnuPG/libs/libreadline.8.2.dylib3
-rw-r--r--resource/lfs/macOS/GnuPG/libs/libtasn1.6.dylib3
-rw-r--r--resource/lfs/macOS/GnuPG/libs/libunistring.5.dylib3
-rw-r--r--resource/lfs/macOS/GnuPG/libs/libusb-1.0.0.dylib3
-rwxr-xr-xresource/lfs/macOS/GnuPG/scd/scdaemon3
-rwxr-xr-xresource/lfs/macOS/GnuPG/sm/gpgsm3
-rwxr-xr-xresource/lfs/macOS/GnuPG/tools/gpg-connect-agent3
-rw-r--r--resource/lfs/pixmaps/pub.gpgfrontend.gpgfrontend.png3
-rw-r--r--resource/pixmaps/pub.gpgfrontend.gpgfrontend.pngbin9155 -> 0 bytes
-rw-r--r--src/CMakeLists.txt20
-rw-r--r--src/SECURITY.md43
-rw-r--r--src/core/GpgContext.cpp134
-rw-r--r--src/core/GpgContext.h2
-rw-r--r--src/core/GpgCoreInit.cpp89
-rw-r--r--src/core/function/ArchiveFileOperator.cpp15
-rw-r--r--src/core/function/CharsetOperator.cpp6
-rw-r--r--src/core/function/aes/aes_ssl_cbc.cpp4
-rw-r--r--src/core/model/GpgData.cpp3
-rw-r--r--src/core/thread/Task.cpp2
-rw-r--r--src/main.cpp21
-rw-r--r--src/ui/GpgFrontendApplication.cpp2
-rw-r--r--src/ui/GpgFrontendUIInit.cpp61
-rw-r--r--src/ui/UserInterfaceUtils.cpp52
-rw-r--r--src/ui/dialog/GeneralDialog.cpp104
-rw-r--r--src/ui/dialog/details/VerifyDetailsDialog.h1
-rw-r--r--src/ui/dialog/help/AboutDialog.cpp11
-rw-r--r--src/ui/dialog/help/AboutDialog.h1
-rw-r--r--src/ui/dialog/help/GnupgTab.cpp7
-rw-r--r--src/ui/dialog/import_export/KeyImportDetailDialog.cpp41
-rw-r--r--src/ui/dialog/import_export/KeyServerImportDialog.cpp21
-rw-r--r--src/ui/dialog/key_generate/KeygenDialog.cpp29
-rw-r--r--src/ui/dialog/key_generate/KeygenDialog.h1
-rw-r--r--src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp27
-rw-r--r--src/ui/dialog/key_generate/SubkeyGenerateDialog.h1
-rw-r--r--src/ui/dialog/keypair_details/KeyPairOperaTab.cpp32
-rw-r--r--src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp2
-rw-r--r--src/ui/dialog/keypair_details/KeySetExpireDateDialog.cpp2
-rw-r--r--src/ui/dialog/settings/SettingsGeneral.cpp29
-rw-r--r--src/ui/dialog/settings/SettingsKeyServer.cpp5
-rw-r--r--src/ui/dialog/settings/SettingsNetwork.cpp133
-rw-r--r--src/ui/main_window/KeyMgmt.cpp63
-rw-r--r--src/ui/main_window/MainWindow.cpp6
-rw-r--r--src/ui/main_window/MainWindow.h37
-rw-r--r--src/ui/main_window/MainWindowSlotFunction.cpp108
-rw-r--r--src/ui/main_window/MainWindowUI.cpp60
-rw-r--r--src/ui/thread/ProxyConnectionTestTask.cpp74
-rw-r--r--src/ui/thread/ProxyConnectionTestTask.h (renamed from src/ui/thread/ProxyConnectionTestThread.h)16
-rw-r--r--src/ui/thread/ProxyConnectionTestThread.cpp58
-rw-r--r--src/ui/widgets/TextEdit.cpp2
-rw-r--r--src/ui/widgets/VerifyKeyDetailBox.cpp20
-rw-r--r--ui/GeneralSettings.ui7
-rw-r--r--ui/NetworkSettings.ui76
287 files changed, 1543 insertions, 620 deletions
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 @@
<!DOCTYPE RCC>
<RCC>
<qresource prefix="/">
- <file alias="keymgmt.png">resource/icons/keymgmt.png</file>
- <file alias="help.png">resource/icons/help.png</file>
- <file alias="button_copy.png">resource/icons/button_copy.png</file>
- <file alias="gpgfrontend-logo.png">resource/icons/gpgfrontend-logo.png</file>
- <file alias="banner.png">resource/icons/wizard_banner.png</file>
- <file alias="logo_small.png">resource/icons/gpgfrontend-logo_small.png</file>
- <file alias="keys2.jpg">resource/icons/keys12.jpg</file>
- <file alias="keys3.jpg">resource/icons/keys13.jpg</file>
- <file alias="error.png">resource/icons/error.png</file>
- <file alias="info.png">resource/icons/info.png</file>
- <file alias="inbox.png">resource/icons/inbox.png</file>
- <file alias="warning.png">resource/icons/warning.png</file>
- <file alias="archive.png">resource/icons/archive.png</file>
- <file alias="button_cancel.png">resource/icons/button_cancel.png</file>
- <file alias="button_cut.png">resource/icons/button_cut.png</file>
- <file alias="button_ok.png">resource/icons/button_ok.png</file>
- <file alias="button_paste.png">resource/icons/button_paste.png</file>
- <file alias="button_delete.png">resource/icons/button_delete.png</file>
- <file alias="configure.png">resource/icons/configure.png</file>
- <file alias="decrypted.png">resource/icons/decrypted.png</file>
- <file alias="drafts.png">resource/icons/drafts.png</file>
- <file alias="edit.png">resource/icons/edit.png</file>
- <file alias="email.png">resource/icons/email.png</file>
- <file alias="encrypted.png">resource/icons/encrypted.png</file>
- <file alias="encrypted_signed.png">resource/icons/encrypted_signed.png</file>
- <file alias="decrypted_verified.png">resource/icons/decrypted_verified.png</file>
- <file alias="exit.png">resource/icons/exit.png</file>
- <file alias="export_key_to_file.png">resource/icons/export_key_to_file.png</file>
- <file alias="file.png">resource/icons/file.png</file>
- <file alias="fileencryption.png">resource/icons/fileencrytion.png</file>
- <file alias="file-browser.png">resource/icons/file-browser.png</file>
- <file alias="fileopen.png">resource/icons/fileopen.png</file>
- <file alias="fileprint.png">resource/icons/fileprint.png</file>
- <file alias="filesave.png">resource/icons/filesave.png</file>
- <file alias="filesaveas.png">resource/icons/filesaveas.png</file>
- <file alias="flag.png">resource/icons/flag-fill.png</file>
- <file alias="folder.png">resource/icons/folder.png</file>
- <file alias="format-line-spacing-double.png">resource/icons/format-line-spacing-double.png</file>
- <file alias="format-line-spacing-normal.png">resource/icons/format-line-spacing-normal.png</file>
- <file alias="format-line-spacing-triple.png">resource/icons/format-line-spacing-triple.png</file>
- <file alias="gnupg.png">resource/icons/gnupg.png</file>
- <file alias="gpgfrontend.png">resource/icons/gpgfrontend.png</file>
- <file alias="importance.png">resource/icons/importance.png</file>
- <file alias="importkey_editor.png">resource/icons/importkey_editor.png</file>
- <file alias="import_key_from_clipboard.png">resource/icons/import_key_from_clipboard.png</file>
- <file alias="import_key_from_file.png">resource/icons/import_key_from_file.png</file>
- <file alias="import_key_from_server.png">resource/icons/import_key_from_server.png</file>
- <file alias="junk.png">resource/icons/junk.png</file>
- <file alias="key_export.png">resource/icons/key_export.png</file>
- <file alias="key_generate.png">resource/icons/key_generate.png</file>
- <file alias="key_import.png">resource/icons/key_import.png</file>
- <file alias="kgpg_key2.png">resource/icons/kgpg_key2.png</file>
- <file alias="key_package.png">resource/icons/key_package.png</file>
- <file alias="misc_doc.png">resource/icons/misc_doc.png</file>
- <file alias="quote.png">resource/icons/quote.png</file>
- <file alias="receive_email.png">resource/icons/receive_email.png</file>
- <file alias="sent.png">resource/icons/sent.png</file>
- <file alias="server.png">resource/icons/server.png</file>
- <file alias="signature.png">resource/icons/signature.png</file>
- <file alias="ssh-key.png">resource/icons/ssh-key.png</file>
- <file alias="statusbar_icon.png">resource/icons/statusbar_icon.png</file>
- <file alias="trash.png">resource/icons/trash.png</file>
- <file alias="txt.png">resource/icons/txt.png</file>
- <file alias="undo.png">resource/icons/undo.png</file>
- <file alias="verify.png">resource/icons/verify.png</file>
- <file alias="export_key_to_clipboard.png">resource/icons/export_key_to_clipboard.png</file>
- <file alias="mimetypes/application-pdf.png">resource/icons/mimetypes/application-pdf.png</file>
- <file alias="mimetypes/image-x-generic.png">resource/icons/mimetypes/image-x-generic.png</file>
- <file alias="mimetypes/text-plain.png">resource/icons/mimetypes/text-plain.png</file>
- <file alias="mimetypes/unknown.png">resource/icons/mimetypes/unknown.png</file>
- <file alias="button_previous.png">resource/icons/button_previous.png</file>
- <file alias="button_next.png">resource/icons/button_next.png</file>
- <file alias="refresh.png">resource/icons/refresh.png</file>
- <file alias="up.png">resource/icons/up.png</file>
+ <file alias="keymgmt.png">resource/lfs/icons/keymgmt.png</file>
+ <file alias="help.png">resource/lfs/icons/help.png</file>
+ <file alias="button_copy.png">resource/lfs/icons/button_copy.png</file>
+ <file alias="gpgfrontend-logo.png">resource/lfs/icons/gpgfrontend-logo.png</file>
+ <file alias="banner.png">resource/lfs/icons/wizard_banner.png</file>
+ <file alias="logo_small.png">resource/lfs/icons/gpgfrontend-logo_small.png</file>
+ <file alias="keys2.jpg">resource/lfs/icons/keys12.jpg</file>
+ <file alias="keys3.jpg">resource/lfs/icons/keys13.jpg</file>
+ <file alias="error.png">resource/lfs/icons/error.png</file>
+ <file alias="info.png">resource/lfs/icons/info.png</file>
+ <file alias="inbox.png">resource/lfs/icons/inbox.png</file>
+ <file alias="warning.png">resource/lfs/icons/warning.png</file>
+ <file alias="archive.png">resource/lfs/icons/archive.png</file>
+ <file alias="button_cancel.png">resource/lfs/icons/button_cancel.png</file>
+ <file alias="button_cut.png">resource/lfs/icons/button_cut.png</file>
+ <file alias="button_ok.png">resource/lfs/icons/button_ok.png</file>
+ <file alias="button_paste.png">resource/lfs/icons/button_paste.png</file>
+ <file alias="button_delete.png">resource/lfs/icons/button_delete.png</file>
+ <file alias="configure.png">resource/lfs/icons/configure.png</file>
+ <file alias="decrypted.png">resource/lfs/icons/decrypted.png</file>
+ <file alias="drafts.png">resource/lfs/icons/drafts.png</file>
+ <file alias="edit.png">resource/lfs/icons/edit.png</file>
+ <file alias="email.png">resource/lfs/icons/email.png</file>
+ <file alias="encrypted.png">resource/lfs/icons/encrypted.png</file>
+ <file alias="encrypted_signed.png">resource/lfs/icons/encrypted_signed.png</file>
+ <file alias="decrypted_verified.png">resource/lfs/icons/decrypted_verified.png</file>
+ <file alias="exit.png">resource/lfs/icons/exit.png</file>
+ <file alias="export_key_to_file.png">resource/lfs/icons/export_key_to_file.png</file>
+ <file alias="file.png">resource/lfs/icons/file.png</file>
+ <file alias="fileencryption.png">resource/lfs/icons/fileencrytion.png</file>
+ <file alias="file-browser.png">resource/lfs/icons/file-browser.png</file>
+ <file alias="fileopen.png">resource/lfs/icons/fileopen.png</file>
+ <file alias="fileprint.png">resource/lfs/icons/fileprint.png</file>
+ <file alias="filesave.png">resource/lfs/icons/filesave.png</file>
+ <file alias="filesaveas.png">resource/lfs/icons/filesaveas.png</file>
+ <file alias="flag.png">resource/lfs/icons/flag-fill.png</file>
+ <file alias="folder.png">resource/lfs/icons/folder.png</file>
+ <file alias="format-line-spacing-double.png">resource/lfs/icons/format-line-spacing-double.png</file>
+ <file alias="format-line-spacing-normal.png">resource/lfs/icons/format-line-spacing-normal.png</file>
+ <file alias="format-line-spacing-triple.png">resource/lfs/icons/format-line-spacing-triple.png</file>
+ <file alias="gnupg.png">resource/lfs/icons/gnupg.png</file>
+ <file alias="gpgfrontend.png">resource/lfs/icons/gpgfrontend.png</file>
+ <file alias="importance.png">resource/lfs/icons/importance.png</file>
+ <file alias="importkey_editor.png">resource/lfs/icons/importkey_editor.png</file>
+ <file alias="import_key_from_clipboard.png">resource/lfs/icons/import_key_from_clipboard.png</file>
+ <file alias="import_key_from_file.png">resource/lfs/icons/import_key_from_file.png</file>
+ <file alias="import_key_from_server.png">resource/lfs/icons/import_key_from_server.png</file>
+ <file alias="junk.png">resource/lfs/icons/junk.png</file>
+ <file alias="key_export.png">resource/lfs/icons/key_export.png</file>
+ <file alias="key_generate.png">resource/lfs/icons/key_generate.png</file>
+ <file alias="key_import.png">resource/lfs/icons/key_import.png</file>
+ <file alias="kgpg_key2.png">resource/lfs/icons/kgpg_key2.png</file>
+ <file alias="key_package.png">resource/lfs/icons/key_package.png</file>
+ <file alias="misc_doc.png">resource/lfs/icons/misc_doc.png</file>
+ <file alias="quote.png">resource/lfs/icons/quote.png</file>
+ <file alias="receive_email.png">resource/lfs/icons/receive_email.png</file>
+ <file alias="sent.png">resource/lfs/icons/sent.png</file>
+ <file alias="server.png">resource/lfs/icons/server.png</file>
+ <file alias="signature.png">resource/lfs/icons/signature.png</file>
+ <file alias="ssh-key.png">resource/lfs/icons/ssh-key.png</file>
+ <file alias="statusbar_icon.png">resource/lfs/icons/statusbar_icon.png</file>
+ <file alias="trash.png">resource/lfs/icons/trash.png</file>
+ <file alias="txt.png">resource/lfs/icons/txt.png</file>
+ <file alias="undo.png">resource/lfs/icons/undo.png</file>
+ <file alias="verify.png">resource/lfs/icons/verify.png</file>
+ <file alias="export_key_to_clipboard.png">resource/lfs/icons/export_key_to_clipboard.png</file>
+ <file alias="mimetypes/application-pdf.png">resource/lfs/icons/mimetypes/application-pdf.png</file>
+ <file alias="mimetypes/image-x-generic.png">resource/lfs/icons/mimetypes/image-x-generic.png</file>
+ <file alias="mimetypes/text-plain.png">resource/lfs/icons/mimetypes/text-plain.png</file>
+ <file alias="mimetypes/unknown.png">resource/lfs/icons/mimetypes/unknown.png</file>
+ <file alias="button_previous.png">resource/lfs/icons/button_previous.png</file>
+ <file alias="button_next.png">resource/lfs/icons/button_next.png</file>
+ <file alias="refresh.png">resource/lfs/icons/refresh.png</file>
+ <file alias="up.png">resource/lfs/icons/up.png</file>
</qresource>
</RCC>
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
--- a/resource/gpgfrontend/usr/share/icons/hicolor/128x128/apps/GpgFrontend.png
+++ /dev/null
Binary files 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
--- a/resource/gpgfrontend/usr/share/icons/hicolor/256x256/apps/GpgFrontend.png
+++ /dev/null
Binary files 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
--- a/resource/gpgfrontend/usr/share/icons/hicolor/32x32/apps/GpgFrontend.png
+++ /dev/null
Binary files 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 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2013 First Lastname <[email protected]> -->
-<component type="desktop-application">
- <id>pub.gpgfrontend.gpgfrontend</id>
- <metadata_license>FSFAP</metadata_license>
- <project_license>GPL-3.0+</project_license>
- <name>GpgFrontend</name>
- <summary>Take the initiative to protect privacy in your own hands</summary>
-
- <description>
- <p>
- GpgFrontend is a Powerful, Easy-to-Use, Compact, Cross-Platform, and Installation-Free OpenPGP Crypto Tool.
- </p>
- <p>
- 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.
- </p>
- <p>For moew information visit https://gpgfrontend.pub/</p>
-
- </description>
-
- <launchable type="desktop-id">gpgfrontend.desktop</launchable>
-
- <screenshots>
- <screenshot type="default">
- <caption>Main Window</caption>
- <image>https://raw.githubusercontent.com/saturneric/Blob/master/screenshots/keygen_ubuntu.png</image>
- </screenshot>
- </screenshots>
-
- <url type="homepage">https://gpgfrontend.pub/</url>
- <project_group>GNOME</project_group>
- <developer_name>Saturneric</developer_name>
-</component> \ 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
--- a/resource/hicolor/128x128/apps/pub.gpgfrontend.gpgfrontend.png
+++ /dev/null
Binary files 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
--- a/resource/hicolor/256x256/apps/pub.gpgfrontend.gpgfrontend.png
+++ /dev/null
Binary files 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
--- a/resource/hicolor/32x32/apps/pub.gpgfrontend.gpgfrontend.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/archive.png b/resource/icons/archive.png
deleted file mode 100644
index 37a87950..00000000
--- a/resource/icons/archive.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/button_cancel.png b/resource/icons/button_cancel.png
deleted file mode 100644
index 57e2c6cf..00000000
--- a/resource/icons/button_cancel.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/button_copy.png b/resource/icons/button_copy.png
deleted file mode 100644
index 03bcd93b..00000000
--- a/resource/icons/button_copy.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/button_cut.png b/resource/icons/button_cut.png
deleted file mode 100644
index a5e0c2d8..00000000
--- a/resource/icons/button_cut.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/button_delete.png b/resource/icons/button_delete.png
deleted file mode 100644
index 50e7098d..00000000
--- a/resource/icons/button_delete.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/button_next.png b/resource/icons/button_next.png
deleted file mode 100644
index b642910e..00000000
--- a/resource/icons/button_next.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/button_ok.png b/resource/icons/button_ok.png
deleted file mode 100644
index 50310aed..00000000
--- a/resource/icons/button_ok.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/button_paste.png b/resource/icons/button_paste.png
deleted file mode 100644
index 260fa568..00000000
--- a/resource/icons/button_paste.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/button_previous.png b/resource/icons/button_previous.png
deleted file mode 100644
index 67980245..00000000
--- a/resource/icons/button_previous.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/check.png b/resource/icons/check.png
deleted file mode 100644
index e793ced2..00000000
--- a/resource/icons/check.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/configure.png b/resource/icons/configure.png
deleted file mode 100644
index b2c3c62f..00000000
--- a/resource/icons/configure.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/decrypted.png b/resource/icons/decrypted.png
deleted file mode 100644
index 9fe6970a..00000000
--- a/resource/icons/decrypted.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/decrypted_verified.png b/resource/icons/decrypted_verified.png
deleted file mode 100644
index 5e45f625..00000000
--- a/resource/icons/decrypted_verified.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/down.png b/resource/icons/down.png
deleted file mode 100644
index e3531e0f..00000000
--- a/resource/icons/down.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/drafts.png b/resource/icons/drafts.png
deleted file mode 100644
index bc44f88a..00000000
--- a/resource/icons/drafts.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/edit.png b/resource/icons/edit.png
deleted file mode 100644
index 01a6662b..00000000
--- a/resource/icons/edit.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/email.png b/resource/icons/email.png
deleted file mode 100644
index f0517848..00000000
--- a/resource/icons/email.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/encrypted.png b/resource/icons/encrypted.png
deleted file mode 100644
index 45bbf696..00000000
--- a/resource/icons/encrypted.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/encrypted_signed.png b/resource/icons/encrypted_signed.png
deleted file mode 100644
index ffb57196..00000000
--- a/resource/icons/encrypted_signed.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/error.png b/resource/icons/error.png
deleted file mode 100644
index 3137becb..00000000
--- a/resource/icons/error.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/exit.png b/resource/icons/exit.png
deleted file mode 100644
index 8ed3161d..00000000
--- a/resource/icons/exit.png
+++ /dev/null
Binary files 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
--- a/resource/icons/export_key_to_clipboard.png
+++ /dev/null
Binary files 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
--- a/resource/icons/export_key_to_file.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/file-browser.png b/resource/icons/file-browser.png
deleted file mode 100644
index 29dba7e1..00000000
--- a/resource/icons/file-browser.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/file.png b/resource/icons/file.png
deleted file mode 100644
index d8562029..00000000
--- a/resource/icons/file.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/fileencrytion.png b/resource/icons/fileencrytion.png
deleted file mode 100644
index b4546e2a..00000000
--- a/resource/icons/fileencrytion.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/fileopen.png b/resource/icons/fileopen.png
deleted file mode 100644
index 461abcdc..00000000
--- a/resource/icons/fileopen.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/fileprint.png b/resource/icons/fileprint.png
deleted file mode 100644
index 1b780552..00000000
--- a/resource/icons/fileprint.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/filesave.png b/resource/icons/filesave.png
deleted file mode 100644
index ce80e05f..00000000
--- a/resource/icons/filesave.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/filesaveas.png b/resource/icons/filesaveas.png
deleted file mode 100644
index 14ce8aee..00000000
--- a/resource/icons/filesaveas.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/flag-fill.png b/resource/icons/flag-fill.png
deleted file mode 100644
index b8723616..00000000
--- a/resource/icons/flag-fill.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/folder.png b/resource/icons/folder.png
deleted file mode 100644
index b0e7989c..00000000
--- a/resource/icons/folder.png
+++ /dev/null
Binary files 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
--- a/resource/icons/format-line-spacing-double.png
+++ /dev/null
Binary files 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
--- a/resource/icons/format-line-spacing-normal.png
+++ /dev/null
Binary files 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
--- a/resource/icons/format-line-spacing-triple.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/gnupg.png b/resource/icons/gnupg.png
deleted file mode 100644
index 2a209e21..00000000
--- a/resource/icons/gnupg.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/gpgfrontend-logo.png b/resource/icons/gpgfrontend-logo.png
deleted file mode 100644
index 7e9841be..00000000
--- a/resource/icons/gpgfrontend-logo.png
+++ /dev/null
Binary files 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
--- a/resource/icons/gpgfrontend-logo_small (copy).png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/gpgfrontend-logo_small.png b/resource/icons/gpgfrontend-logo_small.png
deleted file mode 100644
index d34c6c31..00000000
--- a/resource/icons/gpgfrontend-logo_small.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/gpgfrontend.png b/resource/icons/gpgfrontend.png
deleted file mode 100644
index c90e1d1d..00000000
--- a/resource/icons/gpgfrontend.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/help.png b/resource/icons/help.png
deleted file mode 100644
index 54821e49..00000000
--- a/resource/icons/help.png
+++ /dev/null
Binary files 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
--- a/resource/icons/import_key_from_clipboard.png
+++ /dev/null
Binary files 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
--- a/resource/icons/import_key_from_file.png
+++ /dev/null
Binary files 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
--- a/resource/icons/import_key_from_server.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/importance.png b/resource/icons/importance.png
deleted file mode 100644
index e59ff133..00000000
--- a/resource/icons/importance.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/importkey_editor.png b/resource/icons/importkey_editor.png
deleted file mode 100644
index 406b29c4..00000000
--- a/resource/icons/importkey_editor.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/inbox.png b/resource/icons/inbox.png
deleted file mode 100644
index 5d0fbf2f..00000000
--- a/resource/icons/inbox.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/info.png b/resource/icons/info.png
deleted file mode 100644
index 82bfa824..00000000
--- a/resource/icons/info.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/junk.png b/resource/icons/junk.png
deleted file mode 100644
index 3fa05c63..00000000
--- a/resource/icons/junk.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/key_export.png b/resource/icons/key_export.png
deleted file mode 100644
index 6703498e..00000000
--- a/resource/icons/key_export.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/key_generate.png b/resource/icons/key_generate.png
deleted file mode 100644
index c67edd21..00000000
--- a/resource/icons/key_generate.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/key_import.png b/resource/icons/key_import.png
deleted file mode 100644
index 98384fba..00000000
--- a/resource/icons/key_import.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/key_package.png b/resource/icons/key_package.png
deleted file mode 100644
index 6464cb9d..00000000
--- a/resource/icons/key_package.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/keymgmt.png b/resource/icons/keymgmt.png
deleted file mode 100644
index ae44ad9c..00000000
--- a/resource/icons/keymgmt.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/keys12.jpg b/resource/icons/keys12.jpg
deleted file mode 100644
index acf8f8d0..00000000
--- a/resource/icons/keys12.jpg
+++ /dev/null
Binary files differ
diff --git a/resource/icons/keys13.jpg b/resource/icons/keys13.jpg
deleted file mode 100644
index 0b76c5c6..00000000
--- a/resource/icons/keys13.jpg
+++ /dev/null
Binary files differ
diff --git a/resource/icons/kgpg_key2.png b/resource/icons/kgpg_key2.png
deleted file mode 100644
index 129c55d5..00000000
--- a/resource/icons/kgpg_key2.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/mimetypes/application-pdf.png b/resource/icons/mimetypes/application-pdf.png
deleted file mode 100644
index c78b86c5..00000000
--- a/resource/icons/mimetypes/application-pdf.png
+++ /dev/null
Binary files 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
--- a/resource/icons/mimetypes/image-x-generic.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/mimetypes/text-plain.png b/resource/icons/mimetypes/text-plain.png
deleted file mode 100644
index adc28836..00000000
--- a/resource/icons/mimetypes/text-plain.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/mimetypes/unknown.png b/resource/icons/mimetypes/unknown.png
deleted file mode 100644
index 6a84b799..00000000
--- a/resource/icons/mimetypes/unknown.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/misc_doc.png b/resource/icons/misc_doc.png
deleted file mode 100644
index 57878ba3..00000000
--- a/resource/icons/misc_doc.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/quote.png b/resource/icons/quote.png
deleted file mode 100644
index 8d792b85..00000000
--- a/resource/icons/quote.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/receive_email.png b/resource/icons/receive_email.png
deleted file mode 100644
index eaa060fb..00000000
--- a/resource/icons/receive_email.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/refresh.png b/resource/icons/refresh.png
deleted file mode 100644
index 54745560..00000000
--- a/resource/icons/refresh.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/sent.png b/resource/icons/sent.png
deleted file mode 100644
index b11d0425..00000000
--- a/resource/icons/sent.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/server.png b/resource/icons/server.png
deleted file mode 100644
index 2efc30ef..00000000
--- a/resource/icons/server.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/signature.png b/resource/icons/signature.png
deleted file mode 100644
index 3aea526b..00000000
--- a/resource/icons/signature.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/ssh-key.png b/resource/icons/ssh-key.png
deleted file mode 100644
index c3563e43..00000000
--- a/resource/icons/ssh-key.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/statusbar_icon.png b/resource/icons/statusbar_icon.png
deleted file mode 100644
index 6bb93bb8..00000000
--- a/resource/icons/statusbar_icon.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/trash.png b/resource/icons/trash.png
deleted file mode 100644
index 9cf606b8..00000000
--- a/resource/icons/trash.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/txt.png b/resource/icons/txt.png
deleted file mode 100644
index 8db7ba45..00000000
--- a/resource/icons/txt.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/undo.png b/resource/icons/undo.png
deleted file mode 100644
index 19717cc8..00000000
--- a/resource/icons/undo.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/up-arrow.png b/resource/icons/up-arrow.png
deleted file mode 100644
index 12451e50..00000000
--- a/resource/icons/up-arrow.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/up.png b/resource/icons/up.png
deleted file mode 100644
index 46c47c70..00000000
--- a/resource/icons/up.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/verify.png b/resource/icons/verify.png
deleted file mode 100644
index e359b69f..00000000
--- a/resource/icons/verify.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/warning.png b/resource/icons/warning.png
deleted file mode 100644
index cc802e8d..00000000
--- a/resource/icons/warning.png
+++ /dev/null
Binary files differ
diff --git a/resource/icons/wizard_banner.png b/resource/icons/wizard_banner.png
deleted file mode 100644
index 7e19aeab..00000000
--- a/resource/icons/wizard_banner.png
+++ /dev/null
Binary files 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
--- a/resource/pixmaps/pub.gpgfrontend.gpgfrontend.png
+++ /dev/null
Binary files 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} [email protected] --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 [email protected] 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<std::string> 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<std::string>(
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<ChannelObject> {
GpgFrontend::GpgContextInitArgs args;
@@ -132,23 +160,46 @@ void init_gpgfrontend_core() {
args.db_path = custom_key_database_path;
}
- return std::unique_ptr<ChannelObject>(new GpgContext(args));
- });
-
- // init non-ascii channel
- GpgFrontend::GpgContext::CreateInstance(
- GPGFRONTEND_NON_ASCII_CHANNEL, [=]() -> std::unique_ptr<ChannelObject> {
- 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<ChannelObject>(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<ChannelObject> {
+ 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<ChannelObject>(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<uint8_t *>(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<uint8_t *>(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<const char*>(buffer),
+ size, copy);
assert(gpgme_err_code(err) == GPG_ERR_NO_ERROR);
data_ref_ = std::unique_ptr<struct gpgme_data, _data_ref_deleter>(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<void *>(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<std::string>();
-
- 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<std::string>();
+
+ 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<QWidget *>(this->parent());
- if (parent_widget != nullptr) {
- parent_pos = parent_widget->pos();
- parent_size = parent_widget->size();
- }
-
- auto *parent_dialog = qobject_cast<QDialog *>(this->parent());
- if (parent_dialog != nullptr) {
- parent_pos = parent_dialog->pos();
- parent_size = parent_dialog->size();
- }
-
- auto *parent_window = qobject_cast<QMainWindow *>(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<QWidget *>(this->parent());
+ if (parent_widget != nullptr) {
+ parent_pos = parent_widget->pos();
+ parent_size = parent_widget->size();
+ }
+
+ auto *parent_dialog = qobject_cast<QDialog *>(this->parent());
+ if (parent_dialog != nullptr) {
+ parent_pos = parent_dialog->pos();
+ parent_size = parent_dialog->size();
+ }
+
+ auto *parent_window = qobject_cast<QMainWindow *>(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 <openssl/opensslv.h>
+
#include "GpgFrontendBuildInfo.h"
#include "core/function/GlobalSettingStation.h"
#include "core/thread/TaskRunnerGetter.h"
@@ -83,9 +85,9 @@ InfoTab::InfoTab(QWidget* parent) : QWidget(parent) {
"<center><b>" + qApp->applicationVersion() + "</b></center>" +
"<center>" + GIT_VERSION + "</center>" + "<br><center>" +
_("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") +
"<br><br>"
"<b>" +
_("Developer:") + "</b><br>" + "Saturneric" + "<br><br>" +
@@ -94,7 +96,8 @@ InfoTab::InfoTab(QWidget* parent) : QWidget(parent) {
" <a href=\"https://github.com/saturneric/GpgFrontend\">GitHub</a> " +
_("or send a mail to my mailing list at") + " <a " +
"href=\"mailto:[email protected]\">[email protected]</a>." + "<br><br> " +
- _("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 <qobject.h>
+
#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<QWidget*>(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<QCheckBox*> 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<QWidget*>(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<QCheckBox*> 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<QWidget*>(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
@@ -225,12 +225,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.
*/
void slot_open_key_management();
@@ -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 <boost/date_time/posix_time/posix_time.hpp>
+#include <boost/date_time/posix_time/posix_time_io.hpp>
#include <memory>
#include <string>
#include <utility>
#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<ByteArray>();
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 <https://www.gnu.org/licenses/>.
+ *
+ * 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<[email protected]><[email protected]> 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
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 <https://www.gnu.org/licenses/>.
- *
- * 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<[email protected]><[email protected]> 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<QNetworkAccessManager>(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
@@ -86,6 +86,13 @@
</widget>
</item>
<item>
+ <widget class="QCheckBox" name="usePinentryAsPasswordInputDialogCheckBox">
+ <property name="text">
+ <string>Use Pinentry as Password Input Dialog</string>
+ </property>
+ </widget>
+ </item>
+ <item>
<widget class="Line" name="line_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
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 @@
<rect>
<x>0</x>
<y>0</y>
- <width>549</width>
+ <width>554</width>
<height>727</height>
</rect>
</property>
@@ -251,23 +251,57 @@
</layout>
</widget>
</item>
+ <item>
+ <widget class="Line" name="line_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
</layout>
</item>
+ <item row="1" column="0">
+ <widget class="QGroupBox" name="operationsGroupBox">
+ <property name="title">
+ <string>Operations</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_5">
+ <item row="0" column="0">
+ <layout class="QVBoxLayout" name="verticalLayout_5">
+ <item>
+ <widget class="QPushButton" name="checkProxyConnectionButton">
+ <property name="text">
+ <string>Check Proxy Connection</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="capabilityGroupBox">
<property name="title">
- <string>Network Capability</string>
+ <string>Network Ability</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
+ <item row="4" column="0">
+ <widget class="QLabel" name="networkAbilityTipsLabel">
+ <property name="text">
+ <string>Tips: These Option Changes take effect only after the application restart.</string>
+ </property>
+ </widget>
+ </item>
<item row="2" column="0">
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
- <widget class="QCheckBox" name="forbidALLCheckBox">
+ <widget class="QCheckBox" name="forbidALLGnuPGNetworkConnectionCheckBox">
<property name="text">
- <string>Forbid all network connection.</string>
+ <string>Forbid all GnuPG network connection.</string>
</property>
</widget>
</item>
@@ -278,8 +312,22 @@
</property>
</widget>
</item>
+ <item>
+ <widget class="QCheckBox" name="autoImportMissingKeyCheckBox">
+ <property name="text">
+ <string>Automatically import a missing key for signature verification.</string>
+ </property>
+ </widget>
+ </item>
</layout>
</item>
+ <item row="3" column="0">
+ <widget class="Line" name="line">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
</layout>
</widget>
</item>
@@ -296,26 +344,6 @@
</property>
</spacer>
</item>
- <item>
- <widget class="QGroupBox" name="operationsGroupBox">
- <property name="title">
- <string>Operations</string>
- </property>
- <layout class="QGridLayout" name="gridLayout_5">
- <item row="0" column="0">
- <layout class="QVBoxLayout" name="verticalLayout_5">
- <item>
- <widget class="QPushButton" name="checkProxyConnectionButton">
- <property name="text">
- <string>Check Proxy Connection</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- </layout>
- </widget>
- </item>
</layout>
</item>
</layout>