diff options
author | saturneric <[email protected]> | 2024-07-24 14:02:49 +0000 |
---|---|---|
committer | saturneric <[email protected]> | 2024-07-24 14:02:49 +0000 |
commit | 46b7ecec8f5787d3a4b14a2fd2ec4f324a041345 (patch) | |
tree | 0704d13add7c2b1957b832f42a817df827a39b9a /src/m_gpg_info/GnupgTab.cpp | |
parent | fix: metadata is not translated (diff) | |
download | Modules-46b7ecec8f5787d3a4b14a2fd2ec4f324a041345.tar.gz Modules-46b7ecec8f5787d3a4b14a2fd2ec4f324a041345.zip |
feat: move in GnuPGTab
Diffstat (limited to 'src/m_gpg_info/GnupgTab.cpp')
-rw-r--r-- | src/m_gpg_info/GnupgTab.cpp | 330 |
1 files changed, 330 insertions, 0 deletions
diff --git a/src/m_gpg_info/GnupgTab.cpp b/src/m_gpg_info/GnupgTab.cpp new file mode 100644 index 0000000..1317139 --- /dev/null +++ b/src/m_gpg_info/GnupgTab.cpp @@ -0,0 +1,330 @@ +/** + * Copyright (C) 2021 Saturneric <[email protected]> + * + * 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. + * + * All the source code of GpgFrontend was modified and released by + * Saturneric <[email protected]> starting on May 12, 2021. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + */ + +// +// Created by eric on 2022/7/23. +// + +#include "GnupgTab.h" + +#include "GFModuleCommonUtils.hpp" +#include "GFSDKModule.h" +#include "GnuPGInfoGatheringModule.h" +#include "ui_GnuPGInfo.h" + +extern auto StartGatheringGnuPGInfo() -> int; + +GnupgTab::GnupgTab(QWidget* parent) + : QWidget(parent), ui_(SecureCreateSharedObject<Ui_GnuPGInfo>()) { + ui_->setupUi(this); + + QStringList components_column_titles; + components_column_titles << tr("Name") << tr("Description") << tr("Version") + << tr("Checksum") << tr("Binary Path"); + + ui_->tabWidget->setTabText(0, tr("Components")); + ui_->tabWidget->setTabText(1, tr("Directories")); + ui_->tabWidget->setTabText(2, tr("Options")); + + ui_->componentDetailsTable->setColumnCount(components_column_titles.length()); + ui_->componentDetailsTable->setHorizontalHeaderLabels( + components_column_titles); + ui_->componentDetailsTable->horizontalHeader()->setStretchLastSection(false); + ui_->componentDetailsTable->setSelectionBehavior( + QAbstractItemView::SelectRows); + + // table items not editable + ui_->componentDetailsTable->setEditTriggers( + QAbstractItemView::NoEditTriggers); + + // no focus (rectangle around table items) + // may be it should focus on whole row + ui_->componentDetailsTable->setFocusPolicy(Qt::NoFocus); + ui_->componentDetailsTable->setAlternatingRowColors(true); + + QStringList directories_column_titles; + directories_column_titles << tr("Directory Type") << tr("Path"); + + ui_->directoriesDetailsTable->setColumnCount( + static_cast<int>(directories_column_titles.length())); + ui_->directoriesDetailsTable->setHorizontalHeaderLabels( + directories_column_titles); + ui_->directoriesDetailsTable->horizontalHeader()->setStretchLastSection( + false); + ui_->directoriesDetailsTable->setSelectionBehavior( + QAbstractItemView::SelectRows); + + // table items not editable + ui_->directoriesDetailsTable->setEditTriggers( + QAbstractItemView::NoEditTriggers); + + // no focus (rectangle around table items) + // may be it should focus on whole row + ui_->directoriesDetailsTable->setFocusPolicy(Qt::NoFocus); + ui_->directoriesDetailsTable->setAlternatingRowColors(true); + + QStringList options_column_titles; + options_column_titles << tr("Component") << tr("Group") << tr("Key") + << tr("Description") << tr("Default Value") + << tr("Value"); + + ui_->optionDetailsTable->setColumnCount(options_column_titles.length()); + ui_->optionDetailsTable->setHorizontalHeaderLabels(options_column_titles); + ui_->optionDetailsTable->horizontalHeader()->setStretchLastSection(false); + ui_->optionDetailsTable->setSelectionBehavior(QAbstractItemView::SelectRows); + + // table items not editable + ui_->optionDetailsTable->setEditTriggers(QAbstractItemView::NoEditTriggers); + + // no focus (rectangle around table items) + // may be it should focus on whole row + ui_->optionDetailsTable->setFocusPolicy(Qt::NoFocus); + ui_->optionDetailsTable->setAlternatingRowColors(true); + + if (GFModuleRetrieveRTValueOrDefaultBool( + DUP("ui"), DUP("env.state.gnupg_info_gathering"), 0) == 1) { + process_software_info(); + } else { + gather_gnupg_info(); + } +} + +void GnupgTab::process_software_info() { + const auto gnupg_version = UDUP(GFModuleRetrieveRTValueOrDefault( + DUP("core"), DUP("gpgme.ctx.gnupg_version"), DUP("2.0.0"))); + + ui_->gnupgVersionLabel->setText(QString("Version: %1").arg(gnupg_version)); + + char** pl_components; + auto pl_components_size = GFModuleListRTChildKeys( + GFGetModuleID(), DUP("gnupg.components"), &pl_components); + + auto components = CharArrayToQStringList(pl_components, pl_components_size); + MLogDebug( + QString("got gnupg components from rt, size: %1").arg(components.size())); + + ui_->componentDetailsTable->setRowCount(components.size()); + + int row = 0; + for (auto& component : components) { + auto component_info_json_bytes = UDUP(GFModuleRetrieveRTValueOrDefault( + GFGetModuleID(), QDUP(QString("gnupg.components.%1").arg(component)), + DUP(""))); + MLogDebug(QString("got gnupg component %1 info from rt").arg(component)); + + auto component_info_json = + QJsonDocument::fromJson(component_info_json_bytes.toUtf8()); + if (!component_info_json.isObject()) { + MLogWarn(QString("illegal gnupg component info, json: %1") + .arg(component_info_json_bytes)); + continue; + } + + auto component_info = component_info_json.object(); + if (!component_info.contains("name")) { + MLogWarn(QString("illegal gnupg component info. it doesn't have a " + "name, json: %1") + .arg(component_info_json_bytes)); + continue; + } + + auto* tmp0 = new QTableWidgetItem(component_info["name"].toString()); + tmp0->setTextAlignment(Qt::AlignCenter); + ui_->componentDetailsTable->setItem(row, 0, tmp0); + + auto* tmp1 = new QTableWidgetItem(component_info["desc"].toString()); + tmp1->setTextAlignment(Qt::AlignCenter); + ui_->componentDetailsTable->setItem(row, 1, tmp1); + + auto* tmp2 = new QTableWidgetItem(component_info["version"].toString()); + tmp2->setTextAlignment(Qt::AlignCenter); + ui_->componentDetailsTable->setItem(row, 2, tmp2); + + auto* tmp3 = + new QTableWidgetItem(component_info["binary_checksum"].toString()); + tmp3->setTextAlignment(Qt::AlignCenter); + ui_->componentDetailsTable->setItem(row, 3, tmp3); + + auto* tmp4 = new QTableWidgetItem(component_info["path"].toString()); + tmp4->setTextAlignment(Qt::AlignLeft); + ui_->componentDetailsTable->setItem(row, 4, tmp4); + + row++; + } + + ui_->componentDetailsTable->resizeColumnsToContents(); + + char** p_dirs; + auto p_dirs_size = + GFModuleListRTChildKeys(GFGetModuleID(), DUP("gnupg.dirs"), &p_dirs); + auto dirs = CharArrayToQStringList(p_dirs, p_dirs_size); + + ui_->directoriesDetailsTable->setRowCount(static_cast<int>(p_dirs_size)); + + row = 0; + for (auto& dir : dirs) { + const auto dir_path = UDUP(GFModuleRetrieveRTValueOrDefault( + GFGetModuleID(), QDUP(QString("gnupg.dirs.%1").arg(dir)), DUP(""))); + + if (dir_path.isEmpty()) continue; + + auto* tmp0 = new QTableWidgetItem(dir); + tmp0->setTextAlignment(Qt::AlignCenter); + ui_->directoriesDetailsTable->setItem(row, 0, tmp0); + + auto* tmp1 = new QTableWidgetItem(dir_path); + tmp1->setTextAlignment(Qt::AlignCenter); + ui_->directoriesDetailsTable->setItem(row, 1, tmp1); + + row++; + } + + ui_->directoriesDetailsTable->resizeColumnsToContents(); + + // calculate the total row number of configuration table + row = 0; + for (auto& component : components) { + char** p_options; + auto p_options_size = GFModuleListRTChildKeys( + GFGetModuleID(), + QDUP(QString("gnupg.components.%1.options").arg(component)), + &p_options); + auto options = CharArrayToQStringList(p_options, p_options_size); + + for (auto& option : options) { + const auto option_info_json = QJsonDocument::fromJson( + UDUP(GFModuleRetrieveRTValueOrDefault( + GFGetModuleID(), + QDUP(QString("gnupg.components.%1.options.%2") + .arg(component) + .arg(option)), + DUP(""))) + .toUtf8()); + + if (!option_info_json.isObject()) continue; + + auto option_info = option_info_json.object(); + if (!option_info.contains("name") || option_info["flags"] == "1") { + continue; + } + row++; + } + } + + ui_->optionDetailsTable->setRowCount(row); + + row = 0; + QString configuration_group; + for (auto& component : components) { + char** pc_options; + auto pc_options_size = GFModuleListRTChildKeys( + GFGetModuleID(), + QDUP(QString("gnupg.components.%1.options").arg(component)), + &pc_options); + auto c_options = CharArrayToQStringList(pc_options, pc_options_size); + + for (auto& option : c_options) { + auto option_info_json_bytes = UDUP(GFModuleRetrieveRTValueOrDefault( + GFGetModuleID(), + QDUP(QString("gnupg.components.%1.options.%2") + .arg(component) + .arg(option)), + DUP(""))); + MLogDebug( + QString("got gnupg component's option %1 info from rt, info: %2") + .arg(component) + .arg(option_info_json_bytes)); + + auto option_info_json = + QJsonDocument::fromJson(option_info_json_bytes.toUtf8()); + + if (!option_info_json.isObject()) { + MLogWarn(QString("illegal gnupg option info, json: %1") + .arg(option_info_json_bytes)); + continue; + } + + auto option_info = option_info_json.object(); + if (!option_info.contains("name")) { + MLogWarn(QString("illegal gnupg configuation info. it doesn't have a " + "name, json: %1") + .arg(option_info_json_bytes)); + continue; + } + + if (option_info["flags"] == "1") { + configuration_group = option_info["name"].toString(); + continue; + } + + auto* tmp0 = new QTableWidgetItem(component); + tmp0->setTextAlignment(Qt::AlignCenter); + ui_->optionDetailsTable->setItem(row, 0, tmp0); + + auto* tmp1 = new QTableWidgetItem(configuration_group); + tmp1->setTextAlignment(Qt::AlignCenter); + ui_->optionDetailsTable->setItem(row, 1, tmp1); + + auto* tmp2 = new QTableWidgetItem(option_info["name"].toString()); + tmp2->setTextAlignment(Qt::AlignCenter); + ui_->optionDetailsTable->setItem(row, 2, tmp2); + + auto* tmp3 = new QTableWidgetItem(option_info["description"].toString()); + + tmp3->setTextAlignment(Qt::AlignLeft); + ui_->optionDetailsTable->setItem(row, 3, tmp3); + + auto* tmp4 = + new QTableWidgetItem(option_info["default_value"].toString()); + tmp4->setTextAlignment(Qt::AlignLeft); + ui_->optionDetailsTable->setItem(row, 4, tmp4); + + auto* tmp5 = new QTableWidgetItem(option_info["value"].toString()); + tmp5->setTextAlignment(Qt::AlignLeft); + ui_->optionDetailsTable->setItem(row, 5, tmp5); + + row++; + } + } + + ui_->loadProgressBar->hide(); + ui_->tabWidget->setDisabled(false); +} + +void GnupgTab::gather_gnupg_info() { + ui_->loadProgressBar->show(); + ui_->tabWidget->setDisabled(true); + + if (StartGatheringGnuPGInfo() >= 0) { + GFModuleUpsertRTValueBool(DUP("ui"), DUP("env.state.gnupg_info_gathering"), + 1); + process_software_info(); + } +} + +auto GnupgTabFactory(const char* id) -> void* { return new GnupgTab(); }
\ No newline at end of file |