[Linux] Add Qr-Code to sync irk and enc key (#142)

This commit is contained in:
Tim Gromeyer
2025-06-05 09:03:29 +02:00
committed by GitHub
parent dcb25e2e52
commit 43d703423a
8 changed files with 1514 additions and 0 deletions

View File

@@ -0,0 +1,46 @@
#include <QQuickImageProvider>
#include <QPainter>
#include "thirdparty/QR-Code-generator/qrcodegen.hpp"
class QRCodeImageProvider : public QQuickImageProvider
{
public:
QRCodeImageProvider() : QQuickImageProvider(QQuickImageProvider::Image) {}
QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize) override
{
// Parse the keys from id (format: "encKey;irk")
QStringList keys = id.split(';');
if (keys.size() != 2)
return QImage();
// Create URL format: librepods://add-magic-keys?enc_key=...&irk=...
QString data = QString("librepods://add-magic-keys?enc_key=%1&irk=%2").arg(keys[0], keys[1]);
// Generate QR code using the existing qrcodegen library
qrcodegen::QrCode qr = qrcodegen::QrCode::encodeText(data.toUtf8().constData(), qrcodegen::QrCode::Ecc::MEDIUM);
int scale = 8;
QImage image(qr.getSize() * scale, qr.getSize() * scale, QImage::Format_RGB32);
image.fill(Qt::white);
QPainter painter(&image);
painter.setPen(Qt::NoPen);
painter.setBrush(Qt::black);
for (int y = 0; y < qr.getSize(); y++)
{
for (int x = 0; x < qr.getSize(); x++)
{
if (qr.getModule(x, y))
{
painter.drawRect(x * scale, y * scale, scale, scale);
}
}
}
if (size)
*size = image.size();
return image;
}
};