summaryrefslogtreecommitdiff
path: root/examples/triage/fileinfo.cpp
diff options
context:
space:
mode:
authorrose <47357290+rompse@users.noreply.github.com>2021-10-05 17:20:51 -0400
committerrose <47357290+rompse@users.noreply.github.com>2021-10-06 15:55:01 -0400
commita396e114c14c5c1cf9fa12688fdbdafe2f07b61b (patch)
tree16c00c4b78413e0aea992de48601f2a7a5aec191 /examples/triage/fileinfo.cpp
parentc4f4bf5be39c224b619a5928d380d91122ecf1d8 (diff)
TriageView: path, size, md5, sha1, sha256
Diffstat (limited to 'examples/triage/fileinfo.cpp')
-rw-r--r--examples/triage/fileinfo.cpp99
1 files changed, 99 insertions, 0 deletions
diff --git a/examples/triage/fileinfo.cpp b/examples/triage/fileinfo.cpp
new file mode 100644
index 00000000..00b75ca2
--- /dev/null
+++ b/examples/triage/fileinfo.cpp
@@ -0,0 +1,99 @@
+#include "fileinfo.h"
+#include "fontsettings.h"
+#include "theme.h"
+#include <QClipboard>
+#include <QApplication>
+#include <QToolTip>
+#include <QPainter>
+
+class CopyableLabel: public QLabel
+{
+ QColor m_desiredColor{};
+
+public:
+ CopyableLabel(const QString& text, const QColor& color)
+ : QLabel(text), m_desiredColor(color)
+ {
+ this->setMouseTracking(true);
+ auto style = QPalette(palette());
+ style.setColor(QPalette::WindowText, m_desiredColor);
+ setPalette(style);
+ this->setToolTip("Copy");
+ }
+
+ void enterEvent(QEnterEvent* event) override
+ {
+ auto font = this->font();
+ font.setBold(true);
+ this->setFont(font);
+ QToolTip::showText(event->globalPosition().toPoint(), this->toolTip());
+ }
+
+ void leaveEvent(QEvent* event) override
+ {
+ auto font = this->font();
+ font.setBold(false);
+ this->setFont(font);
+ QToolTip::hideText();
+ }
+
+ void mousePressEvent(QMouseEvent* event) override
+ {
+ if (event->button() == Qt::LeftButton)
+ QApplication::clipboard()->setText(this->text());
+ }
+};
+
+void FileInfoWidget::addField(const QString& name, const QVariant& value)
+{
+ auto& [row, column] = this->m_fieldPosition;
+
+ const auto valueLabel = new QLabel(value.toString());
+ valueLabel->setFont(getMonospaceFont(this));
+
+ this->m_layout->addWidget(new QLabel(name), row, column);
+ this->m_layout->addWidget(valueLabel, row++, column + 1);
+}
+
+void FileInfoWidget::addHashField(const QString& hashName,
+ const QCryptographicHash::Algorithm& algorithm,
+ const QByteArray& data)
+{
+ auto& [row, column] = this->m_fieldPosition;
+
+ const auto hashFieldColor = getThemeColor(AlphanumericHighlightColor);
+ const auto crypto = QCryptographicHash::hash(data, algorithm);
+ const auto hashLabel = new CopyableLabel(crypto.toHex(), hashFieldColor);
+ hashLabel->setFont(getMonospaceFont(this));
+
+ this->m_layout->addWidget(new QLabel(hashName), row, column);
+ this->m_layout->addWidget(hashLabel, row++, column + 1);
+}
+
+FileInfoWidget::FileInfoWidget(QWidget* parent, BinaryViewRef bv)
+{
+ this->m_layout = new QGridLayout();
+ this->m_layout->setContentsMargins(0, 0, 0, 0);
+ this->m_layout->setVerticalSpacing(1);
+
+ const auto filePath = bv->GetFile()->GetOriginalFilename();
+ this->addField("Path: ", filePath.c_str());
+
+ const auto fileSize = QString::number(bv->GetParentView()->GetLength(), 16).prepend("0x");
+ this->addField("Size: ", fileSize);
+
+ const auto bufferSize = fileSize.toUInt(nullptr, 16);
+ const auto fileBuffer = std::make_unique<char[]>(bufferSize);
+ bv->GetParentView()->Read(fileBuffer.get(), 0, bufferSize);
+
+ const auto fileBytes = QByteArray(fileBuffer.get(), bufferSize);
+ this->addHashField("MD5: ", QCryptographicHash::Md5, fileBytes);
+ this->addHashField("SHA-1: ", QCryptographicHash::Sha1, fileBytes);
+ this->addHashField("SHA-256: ", QCryptographicHash::Sha256, fileBytes);
+
+ const auto scaledWidth = UIContext::getScaledWindowSize(20, 20).width();
+ this->m_layout->setColumnMinimumWidth(FileInfoWidget::m_maxColumns * 3 - 1, scaledWidth);
+ this->m_layout->setColumnStretch(FileInfoWidget::m_maxColumns * 3 - 1, 1);
+ setLayout(this->m_layout);
+}
+