7#include <QtCore/QCryptographicHash>
8#include <QtCore/QSettings>
27 return _mavlinkSigningKeysInstance();
30MAVLinkSigningKeys::MAVLinkSigningKeys(QObject* parent)
36 auto* mvm = MultiVehicleManager::instance();
41 for (
int i = 0; i < mvm->vehicles()->count(); ++i) {
42 _connectVehicle(mvm->vehicles()->value<
Vehicle*>(i));
46MAVLinkSigningKeys::~MAVLinkSigningKeys()
50bool MAVLinkSigningKeys::isKeyInUse(
const QString& name)
const
52 auto* mvm = MultiVehicleManager::instance();
53 for (
int i = 0; i < mvm->vehicles()->count(); ++i) {
54 const auto* vehicle = mvm->vehicles()->value<
Vehicle*>(i);
55 if (vehicle && vehicle->mavlinkSigningKeyName() == name) {
62void MAVLinkSigningKeys::_connectVehicle(
Vehicle* vehicle)
68void MAVLinkSigningKeys::_disconnectVehicle(
Vehicle* vehicle)
74QByteArray MAVLinkSigningKeys::keyBytesAt(
int index)
const
76 if (index >= 0 && index < _keys->count()) {
82QString MAVLinkSigningKeys::keyNameAt(
int index)
const
84 if (index >= 0 && index < _keys->count()) {
90QByteArray MAVLinkSigningKeys::keyBytesByName(
const QString& name)
const
92 for (
int i = 0; i < _keys->
count(); ++i) {
94 if (key->name() == name) {
95 return key->keyBytes();
101bool MAVLinkSigningKeys::_keyExists(
const QString& name)
const
103 for (
int i = 0; i < _keys->
count(); ++i) {
111void MAVLinkSigningKeys::addKey(
const QString& name,
const QString& passphrase)
113 if (name.isEmpty() || passphrase.isEmpty()) {
114 qCWarning(MAVLinkSigningKeysLog) <<
"Name and passphrase must not be empty";
119 for (
int i = 0; i < _keys->
count(); ++i) {
121 qCWarning(MAVLinkSigningKeysLog) <<
"Key with name already exists:" << name;
126 const QByteArray hash = QCryptographicHash::hash(passphrase.toUtf8(), QCryptographicHash::Sha256);
135void MAVLinkSigningKeys::removeKey(
int index)
137 if (index < 0 || index >= _keys->
count()) {
141 _keys->
removeAt(index)->deleteLater();
146void MAVLinkSigningKeys::_save()
149 settings.beginGroup(kSettingsGroup);
151 settings.beginWriteArray(kKeysArrayKey);
152 for (
int i = 0; i < _keys->
count(); ++i) {
153 settings.setArrayIndex(i);
155 settings.setValue(kNameKey, key->name());
156 settings.setValue(kKeyBytesKey, key->keyBytes().toHex());
163void MAVLinkSigningKeys::_load()
167 bool migrated =
false;
171 settings.beginGroup(kSettingsGroup);
173 const int count = settings.beginReadArray(kKeysArrayKey);
174 for (
int i = 0; i < count; ++i) {
175 settings.setArrayIndex(i);
176 const QString name = settings.value(kNameKey).toString();
177 const QByteArray keyBytes = QByteArray::fromHex(settings.value(kKeyBytesKey).toByteArray());
178 if (!name.isEmpty() && keyBytes.size() == 32) {
188 if (settings.contains(kOldSigningKeySettingsKey)) {
189 const QString oldPassphrase = settings.value(kOldSigningKeySettingsKey).toString();
190 settings.remove(kOldSigningKeySettingsKey);
191 if (!oldPassphrase.isEmpty()) {
192 QString migratedName = QStringLiteral(
"Migrated Key");
194 while (_keyExists(migratedName)) {
195 migratedName = QStringLiteral(
"Migrated Key %1").arg(suffix++);
197 const QByteArray keyBytes = QCryptographicHash::hash(oldPassphrase.toUtf8(), QCryptographicHash::Sha256);
200 qCDebug(MAVLinkSigningKeysLog) <<
"Migrated legacy signing key to named key system";
Q_APPLICATION_STATIC(MAVLinkSigningKeys, _mavlinkSigningKeysInstance)
#define QGC_LOGGING_CATEGORY(name, categoryStr)
A single named signing key entry.
void vehicleAdded(Vehicle *vehicle)
void vehicleRemoved(Vehicle *vehicle)
void append(QObject *object)
Caller maintains responsibility for object ownership and deletion.
QObject * removeAt(int index)
int count() const override final
void clearAndDeleteContents() override final
Clears the list and calls deleteLater on each entry.
void mavlinkSigningChanged()