32 quint64 now = QDateTime::currentMSecsSinceEpoch();
45 if(reply->error() != QNetworkReply::NoError)
49 QByteArray data = reply->readAll();
51 QByteArray hash = QCryptographicHash::hash(data, QCryptographicHash::Sha256);
58 gpg.start(
"gpg", QStringList(
"--version"));
59 gpg.waitForFinished();
60 if(gpg.error() == QProcess::FailedToStart)
64 QString output = QString::fromUtf8(gpg.readAll());
66 if(output.contains(
"RSA", Qt::CaseInsensitive) && output.contains(
"SHA256", Qt::CaseInsensitive))
72 qDebug() <<
"No GPG detected, signature verification disabled";
76 QDir tmp = QDir::temp();
78 qint64 pid = QCoreApplication::applicationPid();
79 QString fwPath = tmp.absoluteFilePath(QString(
"ckb-%1-firmware").arg(pid));
80 QFile firmware(fwPath);
81 if(!firmware.open(QIODevice::WriteOnly)
82 || firmware.write(data) != data.length()){
83 qDebug() <<
"Failed to write firmware file to temporary location, aborting firmware check";
88 QString keyPath = tmp.absoluteFilePath(QString(
"ckb-%1-key.gpg").arg(pid));
89 if(!QFile::copy(
":/bin/ckb-next-key.gpg", keyPath)){
91 qDebug() <<
"Failed to write GPG key to temporary location, aborting firmware check";
96 gpg.start(
"gpg", QStringList(
"--no-default-keyring") <<
"--keyring" << keyPath <<
"--verify" << fwPath);
97 gpg.waitForFinished();
101 if(gpg.error() != QProcess::UnknownError || gpg.exitCode() != 0){
102 qDebug() <<
"GPG couldn't verify firmware signature:";
103 qDebug() << gpg.readAllStandardOutput();
104 qDebug() << gpg.readAllStandardError();
110 QStringList lines = QString::fromUtf8(data).split(
"\n");
112 foreach(QString line, lines){
114 line.replace(QRegExp(
"\\s+"),
" ").remove(QRegExp(
"^\\s")).remove(QRegExp(
"\\s$"));
116 if(line.length() == 0 || line.at(0) ==
'#')
120 if(line ==
"!BEGIN FW ENTRIES")
125 if(line ==
"!END FW ENTRIES")
127 QStringList components = line.split(
" ");
128 if(components.length() != 7)
131 QString device = components[0].toUpper() +
"-" + components[1].toUpper();
134 fw.
url = QUrl::fromPercentEncoding(components[3].toLatin1());
136 fw.
fileName = QUrl::fromPercentEncoding(components[5].toLatin1());
137 fw.
hash = QByteArray::fromHex(components[6].toLatin1());
141 qDebug() <<
"Downloaded new firmware list." <<
fwTable.count() <<
"entries found.";
154 QStringList components = features.split(
" ");
155 if(components.length() < 2)
158 QString vendorModel = components[0].toUpper() +
"-" + components[1].toUpper();
160 if(features.contains(
"rgb") && !features.contains(
"monochrome"))
161 vendorModel +=
"RGB";
168 QEventLoop loop(
this);
175 if(info.
hash.isEmpty())
186 if(info.
hash.isEmpty())
190 QEventLoop loop(
this);
191 connect(reply, SIGNAL(finished()), &loop, SLOT(
quit()));
194 if(reply->error() != QNetworkReply::NoError)
196 QByteArray zipData = reply->readAll();
197 QBuffer buffer(&zipData);
206 if(!binFile.
open(QIODevice::ReadOnly))
208 QByteArray binary = binFile.readAll();
210 if(QCryptographicHash::hash(binary, QCryptographicHash::Sha256) != info.
hash)
static KbFirmware instance
QNetworkAccessManager * networkManager
void processDownload(QNetworkReply *reply)
static void quit()
quit Stop working the daemon. function is called if the daemon received a sigterm In this case...
static float parseVersionString(QString version)
static float ckbDaemonVersionF()
static const quint64 AUTO_CHECK_TIME
float _latestForBoard(const QString &features, bool waitForComplete)
static float ckbGuiVersionF()
enum KbFirmware::@1 hasGPG
bool setCurrentFile(const QString &fileName, CaseSensitivity cs=csDefault)
Sets current file by its name.
ZIP file is open for reading files inside it.
QMap< QString, FW > fwTable
static bool checkUpdates()
static QString tableName(const QString &features)
A file inside ZIP archive.
virtual bool open(OpenMode mode)
Opens a file for reading.
QNetworkReply * tableDownload
bool open(Mode mode, zlib_filefunc_def *ioApi=NULL)
Opens ZIP file.
QByteArray _fileForBoard(const QString &features)