Add Qt6 support (does not switch to Qt6) (#73)
Prepares us to move to qt6 when it is widely available for osx. * use Qt6 constant for DataLocation * append using QString.arg * remove unncessary includes * use setContentMargins over deprecated setMargin * Use Qt constant over dep. QString version * include missing QFile include * return an actual orientation instead of 0 * use OR to reflect that the keys are flags * write settings tags as QVariantList instead of vec * Only register tag streams if pre-Qt6 * fix double #if * no need to register TagVector -- not used anymore * update UGlobalHotkeys submod ule * add in missing headermain
parent
6726afe3d1
commit
9f1e863881
|
@ -4,6 +4,7 @@
|
||||||
#ifndef APPSETTINGS_H
|
#ifndef APPSETTINGS_H
|
||||||
#define APPSETTINGS_H
|
#define APPSETTINGS_H
|
||||||
|
|
||||||
|
#include <QSequentialIterable>
|
||||||
#include <QSettings>
|
#include <QSettings>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
|
|
||||||
|
@ -56,11 +57,28 @@ class AppSettings : public QObject {
|
||||||
QString operationName() { return settings.value(opNameSetting).toString(); }
|
QString operationName() { return settings.value(opNameSetting).toString(); }
|
||||||
|
|
||||||
void setLastUsedTags(std::vector<model::Tag> lastTags) {
|
void setLastUsedTags(std::vector<model::Tag> lastTags) {
|
||||||
settings.setValue(lastUsedTagsSetting, QVariant::fromValue(lastTags));
|
QVariantList writeTags;
|
||||||
|
|
||||||
|
for (auto tag : lastTags) {
|
||||||
|
writeTags << QVariant::fromValue(tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
settings.setValue(lastUsedTagsSetting, QVariant::fromValue(writeTags));
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<model::Tag> getLastUsedTags() {
|
std::vector<model::Tag> getLastUsedTags() {
|
||||||
|
std::vector<model::Tag> rtn;
|
||||||
|
|
||||||
auto val = settings.value(lastUsedTagsSetting);
|
auto val = settings.value(lastUsedTagsSetting);
|
||||||
return qvariant_cast<std::vector<model::Tag>>(val);
|
|
||||||
|
if (val.canConvert<QVariantList>()) {
|
||||||
|
QSequentialIterable iter = val.value<QSequentialIterable>();
|
||||||
|
for (const QVariant& item : iter) {
|
||||||
|
rtn.push_back(qvariant_cast<model::Tag>(item));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rtn;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
#endif // APPSETTINGS_H
|
#endif // APPSETTINGS_H
|
||||||
|
|
|
@ -15,7 +15,7 @@ ImageView::~ImageView() {
|
||||||
|
|
||||||
void ImageView::buildUi() {
|
void ImageView::buildUi() {
|
||||||
gridLayout = new QGridLayout(this);
|
gridLayout = new QGridLayout(this);
|
||||||
gridLayout->setMargin(0);
|
gridLayout->setContentsMargins(0, 0, 0, 0);
|
||||||
|
|
||||||
previewImage = new AspectRatioPixmapLabel(this);
|
previewImage = new AspectRatioPixmapLabel(this);
|
||||||
previewImage->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));
|
previewImage->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));
|
||||||
|
|
|
@ -19,7 +19,7 @@ CodeBlockView::~CodeBlockView() {
|
||||||
|
|
||||||
void CodeBlockView::buildUi() {
|
void CodeBlockView::buildUi() {
|
||||||
gridLayout = new QGridLayout(this);
|
gridLayout = new QGridLayout(this);
|
||||||
gridLayout->setMargin(0);
|
gridLayout->setContentsMargins(0, 0, 0, 0);
|
||||||
|
|
||||||
_languageLabel = new QLabel("Language", this);
|
_languageLabel = new QLabel("Language", this);
|
||||||
_sourceLabel = new QLabel("Source", this);
|
_sourceLabel = new QLabel("Source", this);
|
||||||
|
|
|
@ -13,7 +13,7 @@ ErrorView::~ErrorView() {
|
||||||
|
|
||||||
void ErrorView::buildUi() {
|
void ErrorView::buildUi() {
|
||||||
gridLayout = new QGridLayout(this);
|
gridLayout = new QGridLayout(this);
|
||||||
gridLayout->setMargin(0);
|
gridLayout->setContentsMargins(0, 0, 0, 0);
|
||||||
|
|
||||||
errorLabel = new QLabel(errorText, this);
|
errorLabel = new QLabel(errorText, this);
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#include "evidenceeditor.h"
|
#include "evidenceeditor.h"
|
||||||
|
|
||||||
|
#include <QFile>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "components/aspectratio_pixmap_label/imageview.h"
|
#include "components/aspectratio_pixmap_label/imageview.h"
|
||||||
|
@ -41,7 +42,7 @@ EvidenceEditor::~EvidenceEditor() {
|
||||||
|
|
||||||
void EvidenceEditor::buildUi() {
|
void EvidenceEditor::buildUi() {
|
||||||
gridLayout = new QGridLayout(this);
|
gridLayout = new QGridLayout(this);
|
||||||
gridLayout->setMargin(0);
|
gridLayout->setContentsMargins(0, 0, 0, 0);
|
||||||
|
|
||||||
splitter = new QSplitter(this);
|
splitter = new QSplitter(this);
|
||||||
splitter->setOrientation(Qt::Vertical);
|
splitter->setOrientation(Qt::Vertical);
|
||||||
|
@ -56,7 +57,7 @@ void EvidenceEditor::buildUi() {
|
||||||
descriptionArea->setLayout(descriptionAreaLayout);
|
descriptionArea->setLayout(descriptionAreaLayout);
|
||||||
descriptionAreaLayout->addWidget(_descriptionLabel);
|
descriptionAreaLayout->addWidget(_descriptionLabel);
|
||||||
descriptionAreaLayout->addWidget(descriptionTextBox);
|
descriptionAreaLayout->addWidget(descriptionTextBox);
|
||||||
descriptionAreaLayout->setMargin(0);
|
descriptionAreaLayout->setContentsMargins(0, 0, 0, 0);
|
||||||
|
|
||||||
// Layout
|
// Layout
|
||||||
/* 0
|
/* 0
|
||||||
|
|
|
@ -100,7 +100,7 @@ QLayoutItem *FlowLayout::takeAt(int index) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
Qt::Orientations FlowLayout::expandingDirections() const { return 0; }
|
Qt::Orientations FlowLayout::expandingDirections() const { return {}; }
|
||||||
|
|
||||||
bool FlowLayout::hasHeightForWidth() const { return true; }
|
bool FlowLayout::hasHeightForWidth() const { return true; }
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,7 @@ TagEditor::~TagEditor() {
|
||||||
|
|
||||||
void TagEditor::buildUi() {
|
void TagEditor::buildUi() {
|
||||||
gridLayout = new QGridLayout(this);
|
gridLayout = new QGridLayout(this);
|
||||||
gridLayout->setMargin(0);
|
gridLayout->setContentsMargins(0, 0, 0, 0);
|
||||||
|
|
||||||
couldNotCreateTagMsg = new QErrorMessage(this);
|
couldNotCreateTagMsg = new QErrorMessage(this);
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,7 @@ class TaggingLineEditEventFilter : public QObject {
|
||||||
if (event->type() == QEvent::KeyPress) {
|
if (event->type() == QEvent::KeyPress) {
|
||||||
QKeyEvent *ke = static_cast<QKeyEvent *>(event);
|
QKeyEvent *ke = static_cast<QKeyEvent *>(event);
|
||||||
|
|
||||||
if (matchesKey(ke, QKeySequence(Qt::CTRL + Qt::Key_Space))) {
|
if (matchesKey(ke, QKeySequence(Qt::CTRL | Qt::Key_Space))) {
|
||||||
emit completePressed();
|
emit completePressed();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@ TagView::~TagView() {
|
||||||
|
|
||||||
void TagView::buildUi() {
|
void TagView::buildUi() {
|
||||||
mainLayout = new QHBoxLayout(this);
|
mainLayout = new QHBoxLayout(this);
|
||||||
mainLayout->setMargin(0);
|
mainLayout->setContentsMargins(0, 0, 0, 0);
|
||||||
|
|
||||||
tagGroupBox = new QGroupBox("Tags", this);
|
tagGroupBox = new QGroupBox("Tags", this);
|
||||||
layout = new FlowLayout();
|
layout = new FlowLayout();
|
||||||
|
|
|
@ -133,14 +133,14 @@ Tri EvidenceFilters::parseTriFilterValue(const QString& text, bool strict) {
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::pair<QString, QString>> EvidenceFilters::tokenizeFilterText(const QString& text) {
|
std::vector<std::pair<QString, QString>> EvidenceFilters::tokenizeFilterText(const QString& text) {
|
||||||
QStringList list = text.split(":", QString::SplitBehavior::SkipEmptyParts);
|
QStringList list = text.split(":", Qt::SkipEmptyParts);
|
||||||
// now in: [Key][value key]...[value] format
|
// now in: [Key][value key]...[value] format
|
||||||
QStringList keys;
|
QStringList keys;
|
||||||
QStringList values;
|
QStringList values;
|
||||||
keys.append(list.first());
|
keys.append(list.first());
|
||||||
|
|
||||||
for (int i = 1; i < list.size() - 1; i++) {
|
for (int i = 1; i < list.size() - 1; i++) {
|
||||||
auto valueKeyPair = list.at(i).split(" ", QString::SplitBehavior::SkipEmptyParts);
|
auto valueKeyPair = list.at(i).split(" ", Qt::SkipEmptyParts);
|
||||||
keys.append(valueKeyPair.last());
|
keys.append(valueKeyPair.last());
|
||||||
valueKeyPair.removeLast();
|
valueKeyPair.removeLast();
|
||||||
values.append(valueKeyPair.join(" "));
|
values.append(valueKeyPair.join(" "));
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <QStringList>
|
||||||
|
|
||||||
enum Tri { Any, Yes, No };
|
enum Tri { Any, Yes, No };
|
||||||
|
|
||||||
|
|
|
@ -292,10 +292,8 @@ void Settings::onTestRequestComplete() {
|
||||||
connStatusLabel->setText("Could not connect: Not Found (check URL)");
|
connStatusLabel->setText("Could not connect: Not Found (check URL)");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
QString msg = "Could not connect: Unexpected Error (code: ";
|
QString msg = "Could not connect: Unexpected Error (code: %1)";
|
||||||
msg.append(statusCode);
|
connStatusLabel->setText(msg.arg(statusCode));
|
||||||
msg.append(")");
|
|
||||||
connStatusLabel->setText(msg);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
|
@ -18,18 +18,18 @@ class Constants {
|
||||||
|
|
||||||
static QString configLocation() {
|
static QString configLocation() {
|
||||||
#ifdef Q_OS_MACOS
|
#ifdef Q_OS_MACOS
|
||||||
return QStandardPaths::writableLocation(QStandardPaths::DataLocation) + "/config.json";
|
return QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + "/config.json";
|
||||||
#else
|
#else
|
||||||
return QStandardPaths::writableLocation(QStandardPaths::ConfigLocation) + "/ashirt/config.json";
|
return QStandardPaths::writableLocation(QStandardPaths::ConfigLocation) + "/ashirt/config.json";
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static QString dbLocation() {
|
static QString dbLocation() {
|
||||||
return QStandardPaths::writableLocation(QStandardPaths::DataLocation) + "/evidence.sqlite";
|
return QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + "/evidence.sqlite";
|
||||||
}
|
}
|
||||||
|
|
||||||
static QString defaultEvidenceRepo() {
|
static QString defaultEvidenceRepo() {
|
||||||
return QStandardPaths::writableLocation(QStandardPaths::DataLocation) + "/evidence";
|
return QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + "/evidence";
|
||||||
}
|
}
|
||||||
|
|
||||||
static QString releaseOwner() {
|
static QString releaseOwner() {
|
||||||
|
|
37
src/main.cpp
37
src/main.cpp
|
@ -11,6 +11,7 @@ void handleCLI(std::vector<std::string> args);
|
||||||
#ifndef QT_NO_SYSTEMTRAYICON
|
#ifndef QT_NO_SYSTEMTRAYICON
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
|
#include <QMetaType>
|
||||||
|
|
||||||
#include "appconfig.h"
|
#include "appconfig.h"
|
||||||
#include "appsettings.h"
|
#include "appsettings.h"
|
||||||
|
@ -19,38 +20,6 @@ void handleCLI(std::vector<std::string> args);
|
||||||
#include "exceptions/fileerror.h"
|
#include "exceptions/fileerror.h"
|
||||||
#include "traymanager.h"
|
#include "traymanager.h"
|
||||||
|
|
||||||
QDataStream& operator<<(QDataStream& out, const model::Tag& v) {
|
|
||||||
out << v.tagName << v.id << v.serverTagId;
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
QDataStream& operator>>(QDataStream& in, model::Tag& v) {
|
|
||||||
in >> v.tagName;
|
|
||||||
in >> v.id;
|
|
||||||
in >> v.serverTagId;
|
|
||||||
return in;
|
|
||||||
}
|
|
||||||
|
|
||||||
QDataStream& operator<<(QDataStream& out, const std::vector<model::Tag>& v) {
|
|
||||||
out << int(v.size());
|
|
||||||
for (const auto& tag : v) {
|
|
||||||
out << tag;
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
QDataStream& operator>>(QDataStream& in, std::vector<model::Tag>& v) {
|
|
||||||
int qty;
|
|
||||||
in >> qty;
|
|
||||||
v.reserve(qty);
|
|
||||||
for(int i = 0; i < qty; i++) {
|
|
||||||
model::Tag t;
|
|
||||||
in >> t;
|
|
||||||
v.push_back(t);
|
|
||||||
}
|
|
||||||
return in;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char* argv[]) {
|
int main(int argc, char* argv[]) {
|
||||||
Q_INIT_RESOURCE(res_icons);
|
Q_INIT_RESOURCE(res_icons);
|
||||||
Q_INIT_RESOURCE(res_migrations);
|
Q_INIT_RESOURCE(res_migrations);
|
||||||
|
@ -88,9 +57,11 @@ int main(int argc, char* argv[]) {
|
||||||
|
|
||||||
int rtn;
|
int rtn;
|
||||||
try {
|
try {
|
||||||
|
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
|
||||||
qRegisterMetaTypeStreamOperators<model::Tag>("Tag");
|
qRegisterMetaTypeStreamOperators<model::Tag>("Tag");
|
||||||
qRegisterMetaTypeStreamOperators<std::vector<model::Tag>>("TagVector");
|
#endif
|
||||||
QApplication app(argc, argv);
|
QApplication app(argc, argv);
|
||||||
|
qRegisterMetaType<model::Tag>();
|
||||||
|
|
||||||
if (!QSystemTrayIcon::isSystemTrayAvailable()) {
|
if (!QSystemTrayIcon::isSystemTrayAvailable()) {
|
||||||
handleCLI(std::vector<std::string>(argv, argv + argc));
|
handleCLI(std::vector<std::string>(argv, argv + argc));
|
||||||
|
|
|
@ -14,6 +14,7 @@ class Tag {
|
||||||
Tag() = default;
|
Tag() = default;
|
||||||
~Tag() = default;
|
~Tag() = default;
|
||||||
Tag(const Tag &) = default;
|
Tag(const Tag &) = default;
|
||||||
|
Tag& operator=(const Tag&) = default;
|
||||||
|
|
||||||
Tag(qint64 id, qint64 evidenceID, qint64 tagId, QString name) : Tag(id, tagId, name) { this->evidenceId = evidenceID; }
|
Tag(qint64 id, qint64 evidenceID, qint64 tagId, QString name) : Tag(id, tagId, name) { this->evidenceId = evidenceID; }
|
||||||
Tag(qint64 id, qint64 tagId, QString name) : Tag(tagId, name) { this->id = id; }
|
Tag(qint64 id, qint64 tagId, QString name) : Tag(tagId, name) { this->id = id; }
|
||||||
|
@ -22,6 +23,19 @@ class Tag {
|
||||||
this->tagName = name;
|
this->tagName = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
friend QDataStream& operator<<(QDataStream& out, const model::Tag& v) {
|
||||||
|
out << v.tagName << v.id << v.serverTagId;
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
friend QDataStream& operator>>(QDataStream& in, model::Tag& v) {
|
||||||
|
in >> v.tagName;
|
||||||
|
in >> v.id;
|
||||||
|
in >> v.serverTagId;
|
||||||
|
return in;
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
qint64 id;
|
qint64 id;
|
||||||
qint64 serverTagId;
|
qint64 serverTagId;
|
||||||
|
|
|
@ -7,23 +7,13 @@
|
||||||
|
|
||||||
#include <QAction>
|
#include <QAction>
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QCheckBox>
|
|
||||||
#include <QCloseEvent>
|
#include <QCloseEvent>
|
||||||
#include <QComboBox>
|
|
||||||
#include <QCoreApplication>
|
#include <QCoreApplication>
|
||||||
#include <QDesktopWidget>
|
|
||||||
#include <QGroupBox>
|
|
||||||
#include <QLabel>
|
|
||||||
#include <QLineEdit>
|
|
||||||
#include <QMenu>
|
#include <QMenu>
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
#include <QPushButton>
|
|
||||||
#include <QSpinBox>
|
|
||||||
#include <QTextEdit>
|
|
||||||
#include <QVBoxLayout>
|
|
||||||
#include <iostream>
|
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
#include <QDesktopServices>
|
#include <QDesktopServices>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
#include "appconfig.h"
|
#include "appconfig.h"
|
||||||
#include "appsettings.h"
|
#include "appsettings.h"
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit 4b1049f8e5248ac816b6b90dfa0e70c54b9b8306
|
Subproject commit 2f17fe1ec8dbbb00418d55343b9529dcfa93f264
|
Loading…
Reference in New Issue