Page MenuHome GnuPG

No OneTemporary

diff --git a/src/conf/generalconfigurationpage.cpp b/src/conf/generalconfigurationpage.cpp
index 9bbd357..1602141 100644
--- a/src/conf/generalconfigurationpage.cpp
+++ b/src/conf/generalconfigurationpage.cpp
@@ -1,97 +1,93 @@
// SPDX-FileCopyrightText: 2024 g10 Code GmbH
// SPDX-FileContributor: Carl Schwan <carl@carlschwan.eu>
// SPDX-License-Identifier: GPL-2.0-or-later
#include "generalconfigurationpage.h"
#include "config.h"
#include "ui_generalconfigurationpage.h"
using namespace GpgPass::Config;
GeneralConfigurationPage::GeneralConfigurationPage(QWidget *parent)
: GpgPassConfigModule(parent)
, ui(new Ui::GeneralConfigurationPage)
{
ui->setupUi(this);
ui->mainLayout->insertStretch(0);
ui->mainLayout->insertStretch(2);
connect(ui->checkBoxAutoclearPanel, &QAbstractButton::toggled, this, &GeneralConfigurationPage::setAutoClearPanelSubentries);
connect(ui->checkBoxAutoclear, &QAbstractButton::toggled, this, &GeneralConfigurationPage::setAutoClearSubentries);
// Changed
connect(ui->checkBoxAutoclear, &QAbstractButton::toggled, this, &GeneralConfigurationPage::changed);
connect(ui->checkBoxAutoclearPanel, &QAbstractButton::toggled, this, &GeneralConfigurationPage::changed);
- connect(ui->checkBoxDisplayAsIs, &QAbstractButton::toggled, this, &GeneralConfigurationPage::changed);
connect(ui->checkBoxNoLineWrapping, &QAbstractButton::toggled, this, &GeneralConfigurationPage::changed);
#if QT_VERSION > QT_VERSION_CHECK(6, 0, 0)
connect(ui->spinBoxAutoclearPanelSeconds, &QSpinBox::valueChanged, this, &GeneralConfigurationPage::changed);
connect(ui->spinBoxAutoclearPanelSeconds, &QSpinBox::valueChanged, this, &GeneralConfigurationPage::changed);
#else
connect(ui->spinBoxAutoclearPanelSeconds, QOverload<int>::of(&QSpinBox::valueChanged), this, &GeneralConfigurationPage::changed);
connect(ui->spinBoxAutoclearPanelSeconds, QOverload<int>::of(&QSpinBox::valueChanged), this, &GeneralConfigurationPage::changed);
#endif
}
void GeneralConfigurationPage::save()
{
auto config = ::Config::self();
config->setClipboardAutoClearEnabled(ui->checkBoxAutoclear->isChecked());
config->setClipboardAutoClearTime(ui->spinBoxAutoclearSeconds->value());
config->setViewerAutoClearEnabled(ui->checkBoxAutoclearPanel->isChecked());
config->setViewerAutoClearTime(ui->spinBoxAutoclearPanelSeconds->value());
- config->setDisplayAsIs(ui->checkBoxDisplayAsIs->isChecked());
config->setNoLineWrapping(ui->checkBoxNoLineWrapping->isChecked());
config->save();
}
void GeneralConfigurationPage::load()
{
const auto config = ::Config::self();
ui->spinBoxAutoclearSeconds->setValue(config->clipboardAutoClearTime());
setAutoclear(config->clipboardAutoClearEnabled());
ui->spinBoxAutoclearPanelSeconds->setValue(config->viewerAutoClearTime());
setAutoclearPanel(config->viewerAutoClearEnabled());
- ui->checkBoxDisplayAsIs->setChecked(config->displayAsIs());
ui->checkBoxNoLineWrapping->setChecked(config->noLineWrapping());
}
void GeneralConfigurationPage::defaults()
{
auto config = ::Config::self();
ui->spinBoxAutoclearSeconds->setValue(config->defaultClipboardAutoClearTimeValue());
setAutoclear(config->defaultClipboardAutoClearEnabledValue());
ui->spinBoxAutoclearPanelSeconds->setValue(config->defaultViewerAutoClearTimeValue());
setAutoclearPanel(config->defaultViewerAutoClearEnabledValue());
- ui->checkBoxDisplayAsIs->setChecked(config->defaultDisplayAsIsValue());
ui->checkBoxNoLineWrapping->setChecked(config->defaultNoLineWrappingValue());
Q_EMIT changed();
}
void GeneralConfigurationPage::setAutoClearSubentries(bool autoclear)
{
ui->spinBoxAutoclearSeconds->setEnabled(autoclear);
}
void GeneralConfigurationPage::setAutoclear(bool autoclear)
{
ui->checkBoxAutoclear->setChecked(autoclear);
setAutoClearSubentries(autoclear);
}
void GeneralConfigurationPage::setAutoclearPanel(bool autoclear)
{
ui->checkBoxAutoclearPanel->setChecked(autoclear);
setAutoClearPanelSubentries(autoclear);
}
void GeneralConfigurationPage::setAutoClearPanelSubentries(bool autoclear)
{
ui->spinBoxAutoclearPanelSeconds->setEnabled(autoclear);
ui->labelPanelSeconds->setEnabled(autoclear);
}
diff --git a/src/conf/generalconfigurationpage.ui b/src/conf/generalconfigurationpage.ui
index 667bc71..d750810 100644
--- a/src/conf/generalconfigurationpage.ui
+++ b/src/conf/generalconfigurationpage.ui
@@ -1,148 +1,141 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<!--
SPDX-FileCopyrightText: 2024 g10 Code GmbH
SPDX-Contributor: Carl Schwan <carl.schwan@gnupg.com>
SPDX-License-Identifier: GPL-2.0-or-later
-->
<class>GeneralConfigurationPage</class>
<widget class="QWidget" name="GeneralConfigurationPage">
<attribute name="title">
<string>General</string>
</attribute>
<layout class="QHBoxLayout" name="mainLayout">
<property name="leftMargin">
<number>6</number>
</property>
<property name="topMargin">
<number>6</number>
</property>
<property name="rightMargin">
<number>6</number>
</property>
<property name="bottomMargin">
<number>6</number>
</property>
<item>
<layout class="QFormLayout">
<item row="0" column="0">
<widget class="QLabel">
<property name="text">
<string>Clipboard:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QCheckBox" name="checkBoxAutoclear">
<property name="text">
<string>Automatically clear after:</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="spinBoxAutoclearSeconds">
<property name="minimum">
<number>5</number>
</property>
<property name="value">
<number>10</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="labelSeconds">
<property name="text">
<string>Seconds</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Content panel:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_7">
<item>
<widget class="QCheckBox" name="checkBoxAutoclearPanel">
<property name="text">
<string>Automatically close after:</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="spinBoxAutoclearPanelSeconds">
<property name="minimum">
<number>5</number>
</property>
<property name="value">
<number>10</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="labelPanelSeconds">
<property name="minimumSize">
<size>
<width>55</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>Seconds</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_5">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="2" column="1">
- <widget class="QCheckBox" name="checkBoxDisplayAsIs">
- <property name="text">
- <string>Display the file content as-is</string>
- </property>
- </widget>
- </item>
- <item row="3" column="1">
<widget class="QCheckBox" name="checkBoxNoLineWrapping">
<property name="text">
<string>Ignore line wrapping</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</ui>
diff --git a/src/config.kcfg b/src/config.kcfg
index a9ac1e4..96d384c 100644
--- a/src/config.kcfg
+++ b/src/config.kcfg
@@ -1,156 +1,152 @@
<?xml version="1.0" encoding="UTF-8"?>
<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
<!--
SPDX-FileCopyrightText: 2024 g10 Code GmbH
SPDX-FileContributor: Carl Schwan <carl@carlschwan.eu>
SPDX-License-Identifier: GPL-2.0-or-later
-->
<kcfgfile name="gpgpassrc" />
<group name="Clipboard">
<entry name="ClipboardAutoClearEnabled" type="bool">
<label>Autoclear clipboard</label>
<default>false</default>
</entry>
<entry name="ClipboardAutoClearTime" type="int">
<label>Autoclear delay in seconds for the clipboard</label>
<default>10</default>
<min>5</min>
</entry>
</group>
<group name="Template">
<entry name="TemplateEnabled" type="bool">
<label>Template feature is enabled</label>
<default>true</default>
</entry>
<entry name="PassTemplate" type="StringList">
<label>Templates</label>
<default>login,URL</default>
</entry>
<entry name="TemplateAllFields" type="bool">
<label>Template all fields</label>
<default>false</default>
</entry>
</group>
<group name="PasswordViewer">
<entry name="ViewerAutoClearEnabled" type="bool">
<label>Autoclear the password viewer</label>
<default>false</default>
</entry>
<entry name="ViewerAutoClearTime" type="int">
<label>Autoclear delay in seconds for the password viewer</label>
<default>10</default>
<min>5</min>
</entry>
- <entry name="DisplayAsIs" type="bool">
- <label>Display the content as is</label>
- <default>false</default>
- </entry>
<entry name="NoLineWrapping" type="bool">
<label>No line wrapping</label>
<default>false</default>
</entry>
</group>
<group name="PasswordGenerator">
<entry name="PasswordLength" type="int">
<label>Password length</label>
<default>20</default>
<min>5</min>
</entry>
<entry name="LowerCase" type="bool">
<label>Lower case</label>
<default>true</default>
</entry>
<entry name="UpperCase" type="bool">
<label>Upper case</label>
<default>true</default>
</entry>
<entry name="Numbers" type="bool">
<label>Number</label>
<default>true</default>
</entry>
<entry name="AdditionalChars" type="String">
<label>Additional Characters</label>
<default></default>
</entry>
<entry name="ExcludedChars" type="String">
<label>Excluded Characters</label>
<default></default>
</entry>
<entry name="Logograms" type="bool">
<label>Logograms</label>
<default>true</default>
</entry>
<entry name="SpecialCharacters" type="bool">
<label>Special Characters</label>
<default>true</default>
</entry>
<entry name="GeneratorAdvanced" type="bool">
<label>Advanced password generator options</label>
<default>false</default>
</entry>
<entry name="Eascii" type="bool">
<label>EASCII</label>
<default>false</default>
</entry>
<entry name="Braces" type="bool">
<label>Braces</label>
<default>false</default>
</entry>
<entry name="Quotes" type="bool">
<label>Quotes</label>
<default>false</default>
</entry>
<entry name="Punctuation" type="bool">
<label>Punctuation</label>
<default>false</default>
</entry>
<entry name="Dashes" type="bool">
<label>Dashes</label>
<default>false</default>
</entry>
<entry name="Math" type="bool">
<label>Math</label>
<default>false</default>
</entry>
<entry name="ExcludeAlike" type="bool">
<label>Exclude look alike characters</label>
<default>true</default>
</entry>
<entry name="EnsureEvery" type="bool">
<label>Pick characters from every group</label>
<default>true</default>
</entry>
<entry name="WordCount" type="int">
<label>Passphrase word's count</label>
<default>7</default>
</entry>
<entry name="WordSeparator" type="string">
<label>Passphrase word separator</label>
<default>QStringLiteral("-")</default>
</entry>
<entry name="WordList" type="string">
<label>Passphrase word list</label>
<default></default>
</entry>
<entry name="WordCase" type="int">
<label>Passphrase word case</label>
<default>0</default>
</entry>
<entry name="GeneratorType" type="Enum">
<label>Passphrase word case</label>
<choices>
<choice name="Password">
<label>Password</label>
</choice>
<choice name="Passphrase">
<label>Passphrase</label>
</choice>
</choices>
<default>EnumGeneratorType::Password</default>
</entry>
</group>
</kcfg>
diff --git a/src/widgets/passwordviewerwidget.cpp b/src/widgets/passwordviewerwidget.cpp
index e2c4496..fa0be5b 100644
--- a/src/widgets/passwordviewerwidget.cpp
+++ b/src/widgets/passwordviewerwidget.cpp
@@ -1,296 +1,294 @@
// SPDX-FileCopyrightText: 2014-2023 Anne Jan Brouwer <brouwer@annejan.com>
// SPDX-FileCopyrightText: 2016-2017 tezeb <tezeb+github@outoftheblue.pl>
// SPDX-FileCopyrightText: 2018 Lukas Vogel <lukedirtwalker@gmail.com>
// SPDX-FileCopyrightText: 2018 Claudio Maradonna <penguyman@stronzi.org>
// SPDX-FileCopyrightText: 2019 Maciej S. Szmigiero <mail@maciej.szmigiero.name>
// SPDX-FileCopyrightText: 2023 g10 Code GmbH
// SPDX-FileContributor: Sune Stolborg Vuorela <sune@vuorela.dk>
// SPDX-License-Identifier: GPL-3.0-or-later
#include "passwordviewerwidget.h"
#include "clipboardhelper.h"
#include "config.h"
#include "job/filedecryptjob.h"
#include "passentry.h"
#include "qpushbuttonfactory.h"
#include "qrcodepopup.h"
#include "util.h"
#include <QAction>
#include <QApplication>
#include <QDialog>
#include <QFormLayout>
#include <QLabel>
#include <QMainWindow>
#include <QPushButton>
#include <QStatusBar>
#include <QStyle>
#include <QTextBrowser>
#include <QVBoxLayout>
#include <KLocalizedString>
#include <KMessageWidget>
#include <KPasswordLineEdit>
#include <KTitleWidget>
namespace
{
std::unique_ptr<QLabel> createTextBrowserForNotes()
{
auto textBrowser = std::make_unique<QLabel>();
textBrowser->setWordWrap(!Config::self()->noLineWrapping());
textBrowser->setOpenExternalLinks(true);
textBrowser->setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::LinksAccessibleByMouse);
textBrowser->setContextMenuPolicy(Qt::DefaultContextMenu);
textBrowser->setContentsMargins(0, 8, 0, 0);
return textBrowser;
}
}
PasswordViewerWidget::PasswordViewerWidget(ClipboardHelper *clipboardHelper, QWidget *parent)
: QWidget(parent)
, m_errorMessage(new KMessageWidget(this))
, m_titleWidget(new KTitleWidget(this))
, m_clipboardHelper(clipboardHelper)
, m_contentLayout(new QFormLayout)
, m_copyPasswordNameButton(new QPushButton(QIcon::fromTheme(QStringLiteral("edit-copy-symbolic")), {}, this))
{
auto layout = new QVBoxLayout(this);
layout->setContentsMargins({});
layout->setSpacing(0);
m_errorMessage->setMessageType(KMessageWidget::Error);
m_errorMessage->hide();
#if QT_VERSION > QT_VERSION_CHECK(6, 0, 0)
m_errorMessage->setPosition(KMessageWidget::Position::Header);
#endif
layout->addWidget(m_errorMessage);
auto scrollArea = new Kleo::AdjustingScrollArea(this);
layout->addWidget(scrollArea);
auto widget = new QWidget;
scrollArea->setWidget(widget);
auto hbox = new QVBoxLayout(widget);
auto mainLayout = new QVBoxLayout;
hbox->addLayout(mainLayout);
mainLayout->setContentsMargins(style()->pixelMetric(QStyle::PM_LayoutLeftMargin),
style()->pixelMetric(QStyle::PM_LayoutTopMargin),
style()->pixelMetric(QStyle::PM_LayoutRightMargin),
style()->pixelMetric(QStyle::PM_LayoutBottomMargin));
// Setup ui
m_copyPasswordNameButton->setAccessibleName(i18nc("@action:button", "Copy to clipboard"));
m_copyPasswordNameButton->setToolTip(i18nc("@info:tooltip", "Copy title to clipboard"));
auto titleLayout = new QHBoxLayout;
titleLayout->addWidget(m_titleWidget);
titleLayout->insertStretch(1);
titleLayout->addWidget(m_copyPasswordNameButton);
connect(m_copyPasswordNameButton, &QPushButton::clicked, this, [this]() {
m_clipboardHelper->copyTextToClipboard(m_titleWidget->text().trimmed());
});
mainLayout->addLayout(titleLayout);
mainLayout->addLayout(m_contentLayout);
setPanelTimer();
clearPanelTimer.setSingleShot(true);
connect(&clearPanelTimer, &QTimer::timeout, this, &PasswordViewerWidget::clear);
hbox->addStretch();
auto statusBar = new QStatusBar;
statusBar->setProperty("_breeze_statusbar_separator", true);
statusBar->setVisible(false);
layout->addWidget(statusBar);
connect(m_clipboardHelper, &ClipboardHelper::showMessage, statusBar, &QStatusBar::showMessage);
connect(statusBar, &QStatusBar::messageChanged, this, [statusBar](const QString &message) {
statusBar->setVisible(!message.isEmpty());
});
}
QString PasswordViewerWidget::filePath() const
{
return m_filePath;
}
QString PasswordViewerWidget::rawContent() const
{
return m_rawContent;
}
void PasswordViewerWidget::setFilePath(const QString &entryName, const QString &filePath)
{
m_entryName = entryName;
m_filePath = filePath;
auto decryptJob = new FileDecryptJob(filePath);
connect(decryptJob, &FileDecryptJob::result, this, &PasswordViewerWidget::fileDecryptedSlot);
decryptJob->start();
}
void PasswordViewerWidget::fileDecryptedSlot(KJob *job)
{
auto decryptJob = qobject_cast<FileDecryptJob *>(job);
Q_ASSERT(decryptJob);
if (decryptJob->error() != KJob::NoError) {
m_errorMessage->setText(decryptJob->errorText());
m_errorMessage->animatedShow();
} else {
m_errorMessage->animatedHide();
}
setRawContent(decryptJob->content());
}
void PasswordViewerWidget::setRawContent(const QString &rawContent)
{
m_rawContent = rawContent;
const PassEntry entry(m_entryName, m_rawContent);
setPassEntry(entry, m_rawContent);
Q_EMIT loaded();
}
void PasswordViewerWidget::setPassEntry(const PassEntry &entry, const QString &content)
{
QString password = entry.password();
QString output = content;
m_clipboardHelper->setClippedText(password);
// first clear the current view:
clear();
m_titleWidget->setText(entry.name());
m_titleWidget->show();
m_copyPasswordNameButton->show();
// show what is needed:
- if (!Config::self()->displayAsIs()) {
- if (!password.isEmpty()) {
- // set the password, it is hidden if needed in addToGridLayout
- addToGridLayout(i18n("Password:"), password);
- }
-
- const auto namedValues = entry.namedValues();
- for (const auto &nv : namedValues) {
- addToGridLayout(i18nc("Field label", "%1:", nv.name), nv.value);
- }
-
- output = entry.remainingDataForDisplay();
+ if (!password.isEmpty()) {
+ // set the password, it is hidden if needed in addToGridLayout
+ addToGridLayout(i18n("Password:"), password);
}
+ const auto namedValues = entry.namedValues();
+ for (const auto &nv : namedValues) {
+ addToGridLayout(i18nc("Field label", "%1:", nv.name), nv.value);
+ }
+
+ output = entry.remainingDataForDisplay();
+
if (Config::self()->viewerAutoClearEnabled()) {
clearPanelTimer.start();
}
if (!output.isEmpty()) {
output = output.toHtmlEscaped();
output.replace(Util::protocolRegex(), QStringLiteral(R"(<a href="\1">\1</a>)"));
output.replace(QLatin1Char('\n'), QStringLiteral("<br />"));
auto textBrowser = createTextBrowserForNotes();
textBrowser->setText(output);
m_contentLayout->addRow(new QLabel(i18nc("@label", "Notes:")), textBrowser.release());
}
}
void PasswordViewerWidget::clearTemplateWidgets()
{
while (m_contentLayout->count() > 0) {
m_contentLayout->removeRow(m_contentLayout->rowCount() - 1);
}
}
void PasswordViewerWidget::addToGridLayout(const QString &field, const QString &value)
{
QString trimmedField = field.trimmed();
QString trimmedValue = value.trimmed();
// Combine the Copy button and the line edit in one widget
auto rowLayout = new QHBoxLayout();
if (trimmedField == i18n("Password:")) {
#if QT_VERSION > QT_VERSION_CHECK(6, 0, 0)
auto *line = new KPasswordLineEdit();
line->setRevealPasswordMode(KPassword::RevealMode::Always);
line->setReadOnly(true);
line->setPassword(trimmedValue);
#else
auto *line = new QLineEdit();
line->setText(trimmedValue);
auto iconOn = QIcon::fromTheme(QStringLiteral("password-show-on"));
auto iconOff = QIcon::fromTheme(QStringLiteral("password-show-off"));
auto action = line->addAction(iconOn, QLineEdit::TrailingPosition);
action->setCheckable(true);
action->setText(i18n("Toggle password visibility"));
connect(action, &QAction::triggered, this, [line, action, iconOn, iconOff]() {
if (line->echoMode() == QLineEdit::Password) {
line->setEchoMode(QLineEdit::Normal);
action->setIcon(iconOff);
} else {
line->setEchoMode(QLineEdit::Password);
action->setIcon(iconOn);
}
});
#endif
line->setObjectName(trimmedField);
line->setContentsMargins(0, 0, 0, 0);
line->setEchoMode(QLineEdit::Password);
rowLayout->addWidget(line);
} else {
auto *line = new QLabel();
line->setOpenExternalLinks(true);
line->setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::LinksAccessibleByMouse | Qt::LinksAccessibleByKeyboard);
line->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum));
line->setObjectName(trimmedField);
trimmedValue.replace(Util::protocolRegex(), QStringLiteral(R"(<a href="\1">\1</a>)"));
line->setText(trimmedValue);
line->setContentsMargins(0, 0, 0, 0);
rowLayout->addWidget(line);
}
auto fieldName = trimmedField;
#if QT_VERSION > QT_VERSION_CHECK(6, 0, 0)
fieldName.removeLast(); // remove ':' from the end of the label
#else
fieldName.remove(fieldName.count() - 1, 1); // remove ':' from the end of the label
#endif
auto qrButton =
createPushButton(QIcon::fromTheme(QStringLiteral("view-barcode-qr")), i18n("View '%1' QR Code", fieldName), m_clipboardHelper, [trimmedValue]() {
const auto topLevelWidgets = QApplication::topLevelWidgets();
for (const auto widget : topLevelWidgets) {
if (qobject_cast<QMainWindow *>(widget)) {
auto popup = new QrCodePopup(trimmedValue, widget);
popup->show();
break;
}
}
});
rowLayout->addWidget(qrButton.release());
auto fieldLabel =
createPushButton(QIcon::fromTheme(QStringLiteral("edit-copy")), i18n("Copy '%1' to clipboard", fieldName), m_clipboardHelper, [this, trimmedValue] {
m_clipboardHelper->copyTextToClipboard(trimmedValue);
});
rowLayout->addWidget(fieldLabel.release());
// set into the layout
m_contentLayout->addRow(trimmedField, rowLayout);
}
void PasswordViewerWidget::clear()
{
clearTemplateWidgets();
m_filePath.clear();
m_titleWidget->setText(QString{});
m_copyPasswordNameButton->hide();
}
void PasswordViewerWidget::setPanelTimer()
{
clearPanelTimer.setInterval(1000 * Config::self()->viewerAutoClearTime());
}

File Metadata

Mime Type
text/x-diff
Expires
Thu, Feb 26, 6:27 PM (8 h, 15 m)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
f6/30/162b2a0ae2c27450b41b1272acfa

Event Timeline