diff --git a/src/widgets/checksumswidget.ui b/src/widgets/checksumswidget.ui index 6f3d1799a..d74d3f569 100644 --- a/src/widgets/checksumswidget.ui +++ b/src/widgets/checksumswidget.ui @@ -22,11 +22,11 @@ - + - Expected checksum (MD5, SHA1 or SHA256)... + Expected checksum (MD5, SHA1, SHA256 or SHA512)... @@ -58,30 +58,37 @@ - + - + MD5: - + SHA1: - + SHA256: + + + + SHA512: + + + - + @@ -90,7 +97,7 @@ - + Qt::Horizontal @@ -194,6 +201,44 @@ + + + + + + Calculate + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Click to copy the checksum to the clipboard. + + + Copy + + + + .. + + + + + diff --git a/src/widgets/kpropertiesdialog.cpp b/src/widgets/kpropertiesdialog.cpp index 8cc65e975..3e2223434 100644 --- a/src/widgets/kpropertiesdialog.cpp +++ b/src/widgets/kpropertiesdialog.cpp @@ -2767,6 +2767,7 @@ class KChecksumsPlugin::KChecksumsPluginPrivate QString m_md5; QString m_sha1; QString m_sha256; + QString m_sha512; }; KChecksumsPlugin::KChecksumsPlugin(KPropertiesDialog *dialog) @@ -2778,6 +2779,7 @@ KChecksumsPlugin::KChecksumsPlugin(KPropertiesDialog *dialog) d->m_ui.md5CopyButton->hide(); d->m_ui.sha1CopyButton->hide(); d->m_ui.sha256CopyButton->hide(); + d->m_ui.sha512CopyButton->hide(); connect(d->m_ui.lineEdit, &QLineEdit::textChanged, this, [=](const QString &text) { slotVerifyChecksum(text.toLower()); @@ -2786,6 +2788,7 @@ KChecksumsPlugin::KChecksumsPlugin(KPropertiesDialog *dialog) connect(d->m_ui.md5Button, &QPushButton::clicked, this, &KChecksumsPlugin::slotShowMd5); connect(d->m_ui.sha1Button, &QPushButton::clicked, this, &KChecksumsPlugin::slotShowSha1); connect(d->m_ui.sha256Button, &QPushButton::clicked, this, &KChecksumsPlugin::slotShowSha256); + connect(d->m_ui.sha512Button, &QPushButton::clicked, this, &KChecksumsPlugin::slotShowSha512); d->fileWatcher.addPath(properties->item().localPath()); connect(&d->fileWatcher, &QFileSystemWatcher::fileChanged, this, &KChecksumsPlugin::slotInvalidateCache); @@ -2803,6 +2806,10 @@ KChecksumsPlugin::KChecksumsPlugin(KPropertiesDialog *dialog) clipboard->setText(d->m_sha256); }); + connect(d->m_ui.sha512CopyButton, &QPushButton::clicked, this, [=]() { + clipboard->setText(d->m_sha512); + }); + connect(d->m_ui.pasteButton, &QPushButton::clicked, this, [=]() { d->m_ui.lineEdit->setText(clipboard->text()); }); @@ -2830,6 +2837,7 @@ void KChecksumsPlugin::slotInvalidateCache() d->m_md5 = QString(); d->m_sha1 = QString(); d->m_sha256 = QString(); + d->m_sha512 = QString(); } void KChecksumsPlugin::slotShowMd5() @@ -2865,6 +2873,17 @@ void KChecksumsPlugin::slotShowSha256() showChecksum(QCryptographicHash::Sha256, label, d->m_ui.sha256CopyButton); } +void KChecksumsPlugin::slotShowSha512() +{ + auto label = new QLabel(i18nc("@action:button", "Calculating..."), &d->m_widget); + label->setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::TextSelectableByKeyboard); + + d->m_ui.calculateWidget->layout()->replaceWidget(d->m_ui.sha512Button, label); + d->m_ui.sha512Button->hide(); + + showChecksum(QCryptographicHash::Sha512, label, d->m_ui.sha512CopyButton); +} + void KChecksumsPlugin::slotVerifyChecksum(const QString &input) { auto algorithm = detectAlgorithm(input); @@ -2912,6 +2931,9 @@ void KChecksumsPlugin::slotVerifyChecksum(const QString &input) case QCryptographicHash::Sha256: slotShowSha256(); break; + case QCryptographicHash::Sha512: + slotShowSha512(); + break; default: break; } @@ -2949,6 +2971,12 @@ bool KChecksumsPlugin::isSha256(const QString &input) return regex.match(input).hasMatch(); } +bool KChecksumsPlugin::isSha512(const QString &input) +{ + QRegularExpression regex(QStringLiteral("^[a-f0-9]{128}$")); + return regex.match(input).hasMatch(); +} + QString KChecksumsPlugin::computeChecksum(QCryptographicHash::Algorithm algorithm, const QString &path) { QFile file(path); @@ -2976,6 +3004,10 @@ QCryptographicHash::Algorithm KChecksumsPlugin::detectAlgorithm(const QString &i return QCryptographicHash::Sha256; } + if (isSha512(input)) { + return QCryptographicHash::Sha512; + } + // Md4 used as negative error code. return QCryptographicHash::Md4; } @@ -3080,6 +3112,8 @@ QString KChecksumsPlugin::cachedChecksum(QCryptographicHash::Algorithm algorithm return d->m_sha1; case QCryptographicHash::Sha256: return d->m_sha256; + case QCryptographicHash::Sha512: + return d->m_sha512; default: break; } @@ -3099,6 +3133,9 @@ void KChecksumsPlugin::cacheChecksum(const QString &checksum, QCryptographicHash case QCryptographicHash::Sha256: d->m_sha256 = checksum; break; + case QCryptographicHash::Sha512: + d->m_sha512 = checksum; + break; default: return; } diff --git a/src/widgets/kpropertiesdialog_p.h b/src/widgets/kpropertiesdialog_p.h index 65125ed99..bdf30ee54 100644 --- a/src/widgets/kpropertiesdialog_p.h +++ b/src/widgets/kpropertiesdialog_p.h @@ -177,6 +177,7 @@ private Q_SLOTS: void slotShowMd5(); void slotShowSha1(); void slotShowSha256(); + void slotShowSha512(); /** * Compare @p input (required to be lowercase) with the checksum in cache. */ @@ -186,6 +187,7 @@ private Q_SLOTS: static bool isMd5(const QString &input); static bool isSha1(const QString &input); static bool isSha256(const QString &input); + static bool isSha512(const QString &input); static QString computeChecksum(QCryptographicHash::Algorithm algorithm, const QString &path); static QCryptographicHash::Algorithm detectAlgorithm(const QString &input);