From 7475ba4689fe84913d6feb6d8c6fb79b1d39c5f3 Mon Sep 17 00:00:00 2001 From: sudden6 Date: Wed, 23 Oct 2019 00:14:56 +0200 Subject: [PATCH] chore: remove dead updater code The server for this updater doesn't exist anymore and it wasn't used in years. --- updater/main.cpp | 103 ----------- updater/res.qrc | 5 - updater/res/qtox-256x256.png | Bin 5630 -> 0 bytes updater/serialize.cpp | 244 --------------------------- updater/serialize.h | 48 ------ updater/settings.cpp | 155 ----------------- updater/settings.h | 48 ------ updater/update.cpp | 134 --------------- updater/update.h | 60 ------- updater/updater.pro | 42 ----- updater/widget.cpp | 237 -------------------------- updater/widget.h | 63 ------- updater/widget.ui | 139 --------------- updater/windows/updater.exe.manifest | 12 -- updater/windows/updater.ico | Bin 16958 -> 0 bytes updater/windows/updater.rc | 2 - 16 files changed, 1292 deletions(-) delete mode 100644 updater/main.cpp delete mode 100644 updater/res.qrc delete mode 100644 updater/res/qtox-256x256.png delete mode 100644 updater/serialize.cpp delete mode 100644 updater/serialize.h delete mode 100644 updater/settings.cpp delete mode 100755 updater/settings.h delete mode 100644 updater/update.cpp delete mode 100644 updater/update.h delete mode 100644 updater/updater.pro delete mode 100644 updater/widget.cpp delete mode 100644 updater/widget.h delete mode 100644 updater/widget.ui delete mode 100644 updater/windows/updater.exe.manifest delete mode 100644 updater/windows/updater.ico delete mode 100644 updater/windows/updater.rc diff --git a/updater/main.cpp b/updater/main.cpp deleted file mode 100644 index 4edf91e18..000000000 --- a/updater/main.cpp +++ /dev/null @@ -1,103 +0,0 @@ -/* - Copyright © 2014-2019 by The qTox Project Contributors - - This file is part of qTox, a Qt-based graphical interface for Tox. - - qTox is libre software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - qTox is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with qTox. If not, see . -*/ - - -#include "settings.h" -#include "widget.h" -#include -#include -#include -#include -#include -#include -#include -#include - -static std::unique_ptr logFileStream{nullptr}; -static std::unique_ptr logFileFile{nullptr}; -static QMutex mutex; - -void logMessageHandler(QtMsgType type, const QMessageLogContext& ctxt, const QString& msg) -{ - // Silence qWarning spam due to bug in QTextBrowser (trying to open a file for base64 images) - if (ctxt.function == QString("virtual bool QFSFileEngine::open(QIODevice::OpenMode)") - && msg == QString("QFSFileEngine::open: No file name specified")) - return; - - QString LogMsg = QString("[%1] %2:%3 : ") - .arg(QTime::currentTime().toString("HH:mm:ss.zzz")) - .arg(ctxt.file) - .arg(ctxt.line); - switch (type) { - case QtDebugMsg: - LogMsg += "Debug"; - break; - case QtWarningMsg: - LogMsg += "Warning"; - break; - case QtCriticalMsg: - LogMsg += "Critical"; - break; - case QtFatalMsg: - LogMsg += "Fatal"; - break; - default: - break; - } - - LogMsg += ": " + msg + "\n"; - - QTextStream out(stderr, QIODevice::WriteOnly); - out << LogMsg; - - if (!logFileStream) - return; - - QMutexLocker locker(&mutex); - *logFileStream << LogMsg; - logFileStream->flush(); -} - -int main(int argc, char* argv[]) -{ - qInstallMessageHandler(logMessageHandler); - QApplication a(argc, argv); - Settings s; - - logFileStream.reset(new QTextStream); - logFileFile.reset(new QFile(s.getSettingsDirPath() + "qtox.log")); - if (logFileFile->open(QIODevice::Append)) { - logFileStream->setDevice(logFileFile.get()); - *logFileStream << QDateTime::currentDateTime().toString( - "\nyyyy-MM-dd HH:mm:ss' Updater file logger starting\n'"); - } else { - qWarning() << "Couldn't open log file!\n"; - logFileStream.release(); - } - - long unsigned int bufsize = 100; - char buf[100]; - GetUserNameA(buf, &bufsize); - qDebug() << "Updater running as user" << buf; - - Widget w(s); - w.show(); - - return a.exec(); -} diff --git a/updater/res.qrc b/updater/res.qrc deleted file mode 100644 index bdcb8e3d3..000000000 --- a/updater/res.qrc +++ /dev/null @@ -1,5 +0,0 @@ - - - res/qtox-256x256.png - - diff --git a/updater/res/qtox-256x256.png b/updater/res/qtox-256x256.png deleted file mode 100644 index ea5cefa744a4ecdcb06e8e7f362ffe753ff274af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5630 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 diff --git a/updater/serialize.cpp b/updater/serialize.cpp deleted file mode 100644 index 9c47982ca..000000000 --- a/updater/serialize.cpp +++ /dev/null @@ -1,244 +0,0 @@ -/* - Copyright © 2014-2019 by The qTox Project Contributors - - This file is part of qTox, a Qt-based graphical interface for Tox. - - qTox is libre software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - qTox is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with qTox. If not, see . -*/ - - -#include "serialize.h" - -QByteArray doubleToData(double num) -{ - union - { - char tab[8]; - double n; - } castUnion; - // char n[8]; - //*((double*) n) = num; - - castUnion.n = num; - return QByteArray(castUnion.tab, 8); -} - -QByteArray floatToData(float num) -{ - union - { - char tab[4]; - float n; - } castUnion; - - castUnion.n = num; - return QByteArray(castUnion.tab, 4); -} - -float dataToFloat(QByteArray data) -{ - union - { - char tab[4]; - float n; - } castUnion; - - castUnion.tab[0] = data.data()[0]; - castUnion.tab[1] = data.data()[1]; - castUnion.tab[2] = data.data()[2]; - castUnion.tab[3] = data.data()[3]; - return castUnion.n; -} - -// Converts a string into PNet string data -QByteArray stringToData(QString str) -{ - QByteArray data(4, 0); - // Write the size in a Uint of variable lenght (8-32 bits) - int i = 0; - uint num1 = (uint)str.toUtf8().size(); - while (num1 >= 0x80) { - data[i] = (unsigned char)(num1 | 0x80); - i++; - num1 = num1 >> 7; - } - data[i] = num1; - data.resize(i + 1); - data += str.toUtf8(); - return data; -} - -QString dataToString(QByteArray data) -{ - // Variable UInt32 - unsigned char num3; - int num = 0; - int num2 = 0; - int i = 0; - do { - num3 = data[i]; - i++; - num |= (num3 & 0x7f) << num2; - num2 += 7; - } while ((num3 & 0x80) != 0); - unsigned int strlen = (uint)num; - - if (!strlen) - return QString(); - - data = data.right(data.size() - i); // Remove the strlen - data.truncate(strlen); - return QString(data); -} - -float dataToRangedSingle(float min, float max, int numberOfBits, QByteArray data) -{ - uint endvalue = 0; - uint value = 0; - if (numberOfBits <= 8) { - endvalue = (uchar)data[0]; - goto done; - } - value = (uchar)data[0]; - numberOfBits -= 8; - if (numberOfBits <= 8) { - endvalue = (value | ((uint)((uchar)data[1]) << 8)); - goto done; - } - value |= (uint)(((uchar)data[1]) << 8); - numberOfBits -= 8; - if (numberOfBits <= 8) { - uint num2 = (uint)(((uchar)data[2]) << 0x10); - endvalue = (value | num2); - goto done; - } - value |= (uint)(((uchar)data[2]) << 0x10); - numberOfBits -= 8; - endvalue = (value | ((uint)(((uchar)data[3]) << 0x18))); - goto done; - -done: - - float num = max - min; - int num2 = (((int)1) << numberOfBits) - 1; - float num3 = endvalue; - float num4 = num3 / ((float)num2); - return (min + (num4 * num)); -} - -QByteArray rangedSingleToData(float value, float min, float max, int numberOfBits) -{ - QByteArray data; - float num = max - min; - float num2 = (value - min) / num; - int num3 = (((int)1) << numberOfBits) - 1; - uint source = num3 * num2; - - if (numberOfBits <= 8) { - data += (unsigned char)source; - return data; - } - data += (unsigned char)source; - numberOfBits -= 8; - if (numberOfBits <= 8) { - data += (unsigned char)(source >> 8); - return data; - } - data += (unsigned char)(source >> 8); - numberOfBits -= 8; - if (numberOfBits <= 8) { - data += (unsigned char)(source >> 16); - return data; - } - data += (unsigned char)(source >> 16); - data += (unsigned char)(source >> 24); - - return data; -} - -uint8_t dataToUint8(QByteArray data) -{ - return (uint8_t)data[0]; -} - -uint16_t dataToUint16(QByteArray data) -{ - return ((uint16_t)(uint8_t)data[0]) + (((uint16_t)(uint8_t)data[1]) << 8); -} - -uint32_t dataToUint32(QByteArray data) -{ - return ((uint32_t)(uint8_t)data[0]) + (((uint32_t)(uint8_t)data[1]) << 8) - + (((uint32_t)(uint8_t)data[2]) << 16) + (((uint32_t)(uint8_t)data[3]) << 24); -} - -uint64_t dataToUint64(QByteArray data) -{ - return ((uint64_t)(uint8_t)data[0]) + (((uint64_t)(uint8_t)data[1]) << 8) - + (((uint64_t)(uint8_t)data[2]) << 16) + (((uint64_t)(uint8_t)data[3]) << 24) - + (((uint64_t)(uint8_t)data[4]) << 32) + (((uint64_t)(uint8_t)data[5]) << 40) - + (((uint64_t)(uint8_t)data[6]) << 48) + (((uint64_t)(uint8_t)data[7]) << 56); -} - -unsigned getVUint32Size(QByteArray data) -{ - unsigned lensize = 0; - { - unsigned char num3; - do { - num3 = data[lensize]; - lensize++; - } while ((num3 & 0x80) != 0); - } - return lensize; -} - -QByteArray uint8ToData(uint8_t num) -{ - QByteArray data(1, 0); - data[0] = (uint8_t)num; - return data; -} - -QByteArray uint16ToData(uint16_t num) -{ - QByteArray data(2, 0); - data[0] = (uint8_t)(num & 0xFF); - data[1] = (uint8_t)((num >> 8) & 0xFF); - return data; -} - -QByteArray uint32ToData(uint32_t num) -{ - QByteArray data(4, 0); - data[0] = (uint8_t)(num & 0xFF); - data[1] = (uint8_t)((num >> 8) & 0xFF); - data[2] = (uint8_t)((num >> 16) & 0xFF); - data[3] = (uint8_t)((num >> 24) & 0xFF); - return data; -} - -QByteArray uint64ToData(uint64_t num) -{ - QByteArray data(8, 0); - data[0] = (uint8_t)(num & 0xFF); - data[1] = (uint8_t)((num >> 8) & 0xFF); - data[2] = (uint8_t)((num >> 16) & 0xFF); - data[3] = (uint8_t)((num >> 24) & 0xFF); - data[4] = (uint8_t)((num >> 32) & 0xFF); - data[5] = (uint8_t)((num >> 40) & 0xFF); - data[6] = (uint8_t)((num >> 48) & 0xFF); - data[7] = (uint8_t)((num >> 56) & 0xFF); - return data; -} diff --git a/updater/serialize.h b/updater/serialize.h deleted file mode 100644 index adb21e203..000000000 --- a/updater/serialize.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - Copyright © 2014-2019 by The qTox Project Contributors - - This file is part of qTox, a Qt-based graphical interface for Tox. - - qTox is libre software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - qTox is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with qTox. If not, see . -*/ - - -#ifndef SERIALIZE_H -#define SERIALIZE_H - -#include -#include -#include - -/// Most of those functions are unsafe unless otherwise specified -/// Do not use them on untrusted data (e.g. check a signature first) - -QByteArray doubleToData(double num); -QByteArray floatToData(float num); -float dataToFloat(QByteArray data); -QByteArray stringToData(QString str); -QString dataToString(QByteArray data); -float dataToRangedSingle(float min, float max, int numberOfBits, QByteArray data); -QByteArray rangedSingleToData(float value, float min, float max, int numberOfBits); -uint8_t dataToUint8(QByteArray data); -uint16_t dataToUint16(QByteArray data); -uint32_t dataToUint32(QByteArray data); -uint64_t dataToUint64(QByteArray data); -unsigned getVUint32Size(QByteArray data); -QByteArray uint8ToData(uint8_t num); -QByteArray uint16ToData(uint16_t num); -QByteArray uint32ToData(uint32_t num); -QByteArray uint64ToData(uint64_t num); - -#endif // SERIALIZE_H diff --git a/updater/settings.cpp b/updater/settings.cpp deleted file mode 100644 index b3a707e1f..000000000 --- a/updater/settings.cpp +++ /dev/null @@ -1,155 +0,0 @@ -/* - Copyright © 2019 by The qTox Project Contributors - - This file is part of qTox, a Qt-based graphical interface for Tox. - - qTox is libre software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - qTox is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with qTox. If not, see . -*/ - -#include "settings.h" -#include -#include -#include -#include -#include - -#ifdef Q_OS_WIN -#ifdef _WIN32_WINNT -#undef _WIN32_WINNT -#endif -#define _WIN32_WINNT 0x0600 // Vista for SHGetKnownFolderPath -#include -#include -#include -#include -#endif - -Settings::Settings() -{ - portable = false; - QFile portableSettings(SETTINGS_FILE); - if (portableSettings.exists()) { - QSettings ps(SETTINGS_FILE, QSettings::IniFormat); - ps.beginGroup("General"); - portable = ps.value("makeToxPortable", false).toBool(); - } - qDebug() << "Portable: " << portable; - -#ifdef Q_OS_WIN - // Get a primary unelevated token of the actual user - hPrimaryToken = nullptr; - HANDLE hShellProcess = nullptr, hShellProcessToken = nullptr; - const DWORD dwTokenRights = TOKEN_QUERY | TOKEN_IMPERSONATE | TOKEN_ASSIGN_PRIMARY - | TOKEN_DUPLICATE | TOKEN_ADJUST_DEFAULT | TOKEN_ADJUST_SESSIONID; - DWORD dwPID = 0; - HWND hwnd = nullptr; - DWORD dwLastErr = 0; - - // Enable SeIncreaseQuotaPrivilege - HANDLE hProcessToken = nullptr; - if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hProcessToken)) - goto unelevateFail; - TOKEN_PRIVILEGES tkp; - tkp.PrivilegeCount = 1; - LookupPrivilegeValueW(nullptr, SE_INCREASE_QUOTA_NAME, &tkp.Privileges[0].Luid); - tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; - AdjustTokenPrivileges(hProcessToken, FALSE, &tkp, 0, nullptr, nullptr); - dwLastErr = GetLastError(); - CloseHandle(hProcessToken); - if (ERROR_SUCCESS != dwLastErr) - goto unelevateFail; - - // Get a primary copy of the desktop shell's token, - // we're assuming the shell is running as the actual user - hwnd = GetShellWindow(); - if (!hwnd) - goto unelevateFail; - GetWindowThreadProcessId(hwnd, &dwPID); - if (!dwPID) - goto unelevateFail; - hShellProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, dwPID); - if (!hShellProcess) - goto unelevateFail; - if (!OpenProcessToken(hShellProcess, TOKEN_DUPLICATE, &hShellProcessToken)) - goto unelevateFail; - - // Duplicate the shell's process token to get a primary token. - // Based on experimentation, this is the minimal set of rights required for - // CreateProcessWithTokenW (contrary to current documentation). - if (!DuplicateTokenEx(hShellProcessToken, dwTokenRights, nullptr, SecurityImpersonation, - TokenPrimary, &hPrimaryToken)) - goto unelevateFail; - - qDebug() << "Unelevated primary access token acquired"; - goto unelevateCleanup; -unelevateFail: - qWarning() << "Unelevate failed, couldn't get access token"; -unelevateCleanup: - CloseHandle(hShellProcessToken); - CloseHandle(hShellProcess); -#endif -} - -Settings::~Settings() -{ -#ifdef Q_OS_WIN - CloseHandle(hPrimaryToken); -#endif -} - -QString Settings::getSettingsDirPath() const -{ - if (portable) - return QString(".") + QDir::separator(); - -// workaround for https://bugreports.qt-project.org/browse/QTBUG-38845 -#ifdef Q_OS_WIN - wchar_t* path; - bool isOld = false; // If true, we can't unelevate and just return the path for our current home - - auto shell32H = LoadLibrary(TEXT("shell32.dll")); - if (!(isOld = (shell32H == nullptr))) { - auto SHGetKnownFolderPathH = - (decltype(&SHGetKnownFolderPath))GetProcAddress(shell32H, "SHGetKnownFolderPath"); - if (!(isOld = (SHGetKnownFolderPathH == nullptr))) - SHGetKnownFolderPathH(FOLDERID_RoamingAppData, 0, hPrimaryToken, &path); - } - - if (isOld) { - return QDir::cleanPath(QStandardPaths::writableLocation(QStandardPaths::HomeLocation) - + QDir::separator() + "AppData" + QDir::separator() + "Roaming" - + QDir::separator() + "tox" + QDir::separator()); - } else { - QString pathStr = QString::fromStdWString(path); - pathStr.replace("\\", "/"); - return pathStr + "/tox"; - } -#elif defined(Q_OS_OSX) - return QDir::cleanPath(QStandardPaths::writableLocation(QStandardPaths::HomeLocation) - + QDir::separator() + "Library" + QDir::separator() - + "Application Support" + QDir::separator() + "Tox") - + QDir::separator(); -#else - return QDir::cleanPath(QStandardPaths::writableLocation(QStandardPaths::ConfigLocation) - + QDir::separator() + "tox") - + QDir::separator(); -#endif -} - -#ifdef Q_OS_WIN -HANDLE Settings::getPrimaryToken() const -{ - return hPrimaryToken; -} -#endif diff --git a/updater/settings.h b/updater/settings.h deleted file mode 100755 index 9454f2c6c..000000000 --- a/updater/settings.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - Copyright © 2019 by The qTox Project Contributors - - This file is part of qTox, a Qt-based graphical interface for Tox. - - qTox is libre software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - qTox is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with qTox. If not, see . -*/ - -#ifndef SETTINGS_H -#define SETTINGS_H - -#include - -#ifdef Q_OS_WIN -#include -#endif - -class Settings -{ -public: - Settings(); - ~Settings(); - - QString getSettingsDirPath() const; ///< The returned path ends with a directory separator -#ifdef Q_OS_WIN - HANDLE getPrimaryToken() const; ///< Used to impersonnate the unelevated user -#endif - -private: - bool portable; - static constexpr const char* SETTINGS_FILE = "qtox.ini"; -#ifdef Q_OS_WIN - HANDLE hPrimaryToken; -#endif -}; - -#endif // SETTINGS_H diff --git a/updater/update.cpp b/updater/update.cpp deleted file mode 100644 index 053eac7e8..000000000 --- a/updater/update.cpp +++ /dev/null @@ -1,134 +0,0 @@ -/* - Copyright © 2014-2019 by The qTox Project Contributors - - This file is part of qTox, a Qt-based graphical interface for Tox. - - qTox is libre software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - qTox is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with qTox. If not, see . -*/ - - -#include "update.h" -#include "serialize.h" -#include "widget.h" -#include -#include -#include -#include -#include - -unsigned char key[crypto_sign_PUBLICKEYBYTES] = {0x20, 0x89, 0x39, 0xaa, 0x9a, 0xe8, 0xb5, 0x21, - 0x0e, 0xac, 0x02, 0xa9, 0xc4, 0x92, 0xd9, 0xa2, - 0x17, 0x83, 0xbd, 0x78, 0x0a, 0xda, 0x33, 0xcd, - 0xa5, 0xc6, 0x44, 0xc7, 0xfc, 0xed, 0x00, 0x13}; - -QByteArray getLocalFlist() -{ - QByteArray flist; - - QFile flistFile("flist"); - if (!flistFile.open(QIODevice::ReadOnly)) { - qWarning() << "getLocalFlist: Can't open local flist"; - return flist; - } - - flist = flistFile.readAll(); - flistFile.close(); - - return flist; -} - -bool isUpToDate(UpdateFileMeta fileMeta) -{ - QString appDir = qApp->applicationDirPath(); - QFile file(appDir + QDir::separator() + fileMeta.installpath); - if (!file.open(QIODevice::ReadOnly)) - return false; - - // If the data we have is corrupted or old, mark it for update - QByteArray data = file.readAll(); - if (crypto_sign_verify_detached(fileMeta.sig, (unsigned char*)data.data(), data.size(), key) != 0) - return false; - - return true; -} - -QList genUpdateDiff(QList updateFlist, Widget* w) -{ - QList diff; - - float progressDiff = 45; - float progress = 5; - - for (UpdateFileMeta file : updateFlist) { - if (!isUpToDate(file)) - diff += file; - progress += progressDiff / updateFlist.size(); - w->setProgress(progress); - } - - return diff; -} - -QList parseFlist(QByteArray flistData) -{ - QList flist; - - if (flistData.isEmpty()) { - qWarning() << "AutoUpdater::parseflist: Empty data"; - return flist; - } - - // Check version - if (flistData[0] != '1') { - qWarning() << "AutoUpdater: parseflist: Bad version " << (uint8_t)flistData[0]; - return flist; - } - flistData = flistData.mid(1); - - // Check signature - if (flistData.size() < (int)(crypto_sign_BYTES)) { - qWarning() << "AutoUpdater::parseflist: Truncated data"; - return flist; - } else { - QByteArray msgData = flistData.mid(crypto_sign_BYTES); - unsigned char* msg = (unsigned char*)msgData.data(); - if (crypto_sign_verify_detached((unsigned char*)flistData.data(), msg, msgData.size(), key) - != 0) { - qCritical() << "AutoUpdater: parseflist: FORGED FLIST FILE"; - return flist; - } - flistData = flistData.mid(crypto_sign_BYTES); - } - - // Parse. We assume no errors handling needed since the signature is valid. - while (!flistData.isEmpty()) { - UpdateFileMeta newFile; - - memcpy(newFile.sig, flistData.data(), crypto_sign_BYTES); - flistData = flistData.mid(crypto_sign_BYTES); - - newFile.id = dataToString(flistData); - flistData = flistData.mid(newFile.id.size() + getVUint32Size(flistData)); - - newFile.installpath = dataToString(flistData); - flistData = flistData.mid(newFile.installpath.size() + getVUint32Size(flistData)); - - newFile.size = dataToUint64(flistData); - flistData = flistData.mid(8); - - flist += newFile; - } - - return flist; -} diff --git a/updater/update.h b/updater/update.h deleted file mode 100644 index a349abea2..000000000 --- a/updater/update.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - Copyright © 2014-2019 by The qTox Project Contributors - - This file is part of qTox, a Qt-based graphical interface for Tox. - - qTox is libre software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - qTox is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with qTox. If not, see . -*/ - - -#ifndef UPDATE_H -#define UPDATE_H - -#include -#include -#include - -class Widget; - -struct UpdateFileMeta -{ - unsigned char sig[crypto_sign_BYTES]; ///< Signature of the file (ed25519) - QString id; ///< Unique id of the file - QString installpath; ///< Local path including the file name. May be relative to qtox-updater or - /// absolute - uint64_t size; ///< Size in bytes of the file - - bool operator==(const UpdateFileMeta& other) - { - return (size == other.size && id == other.id && installpath == other.installpath - && memcmp(sig, other.sig, crypto_sign_BYTES) == 0); - } -}; - -struct UpdateFile -{ - UpdateFileMeta metadata; - QByteArray data; -}; - -/// Gets the local flist. Returns an empty array on error -QByteArray getLocalFlist(); -/// Parses and validates a flist file. Returns an empty list on error -QList parseFlist(QByteArray flistData); -/// Generates a list of files we need to update -QList genUpdateDiff(QList updateFlist, Widget* w); - -extern unsigned char key[crypto_sign_PUBLICKEYBYTES]; - -#endif // UPDATE_H diff --git a/updater/updater.pro b/updater/updater.pro deleted file mode 100644 index b6e8b99d7..000000000 --- a/updater/updater.pro +++ /dev/null @@ -1,42 +0,0 @@ -#------------------------------------------------- -# -# Project created by QtCreator 2014-11-09T21:09:08 -# -#------------------------------------------------- - -QT += core gui - -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets - -TARGET = qtox-updater -TEMPLATE = app - -CONFIG += c++11 - -QMAKE_CXXFLAGS += -fno-exceptions - -SOURCES += main.cpp\ - widget.cpp \ - update.cpp \ - serialize.cpp \ - settings.cpp - -HEADERS += widget.h \ - update.h \ - serialize.h \ - settings.h - -FORMS += widget.ui - -RESOURCES += \ - res.qrc - -INCLUDEPATH += libs/include - -RC_FILE = windows/updater.rc - -LIBS += -L$$PWD/libs/lib/ -lsodium - -win32 { - LIBS += -lshell32 -luuid -} diff --git a/updater/widget.cpp b/updater/widget.cpp deleted file mode 100644 index ec2211c0c..000000000 --- a/updater/widget.cpp +++ /dev/null @@ -1,237 +0,0 @@ -/* - Copyright © 2014-2019 by The qTox Project Contributors - - This file is part of qTox, a Qt-based graphical interface for Tox. - - qTox is libre software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - qTox is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with qTox. If not, see . -*/ - - -#include "widget.h" -#include "ui_widget.h" - -#include -#include -#include -#include -#include -#include -#include - -#include "update.h" - -#ifdef Q_OS_WIN -#ifdef _WIN32_WINNT -#undef _WIN32_WINNT -#endif -#define _WIN32_WINNT 0x0600 // Vista for SHGetKnownFolderPath -#include -#include -#include -#include - -const bool supported = true; -const QString QTOX_PATH = "qtox.exe"; -#else -const bool supported = false; -const QString QTOX_PATH; -#endif -const QString SETTINGS_FILE = "settings.ini"; - -Widget::Widget(const Settings& s) - : QWidget(nullptr) - , ui(new Ui::Widget) - , settings{s} -{ - ui->setupUi(this); - - // Updates only for supported platforms - if (!supported) - fatalError(tr("The qTox updater is not supported on this platform.")); - - QMetaObject::invokeMethod(this, "update", Qt::QueuedConnection); -} - -Widget::~Widget() -{ - delete ui; -} - -void Widget::setProgress(int value) -{ - ui->progress->setValue(value); - ui->progress->repaint(); - qApp->processEvents(); -} - -void Widget::fatalError(QString message) -{ - qCritical() << "Update aborted with error:" << message; - QMessageBox::critical(this, tr("Error"), message + '\n' + tr("qTox will restart now.")); - deleteUpdate(); - restoreBackups(); - startQToxAndExit(); -} - -void Widget::deleteUpdate() -{ - QDir updateDir(settings.getSettingsDirPath() + "/update/"); - updateDir.removeRecursively(); -} - -void Widget::startQToxAndExit() -{ -#ifdef Q_OS_WIN - // Try to restart qTox as the actual user with our unelevated token - STARTUPINFOW si; - PROCESS_INFORMATION pi; - SecureZeroMemory(&si, sizeof(si)); - SecureZeroMemory(&pi, sizeof(pi)); - si.cb = sizeof(si); - - bool unelevateOk = true; - - auto advapi32H = LoadLibrary(TEXT("advapi32.dll")); - if ((unelevateOk = (advapi32H != nullptr))) { - auto CreateProcessWithTokenWH = - (decltype(&CreateProcessWithTokenW))GetProcAddress(advapi32H, - "CreateProcessWithTokenW"); - if ((unelevateOk = (CreateProcessWithTokenWH != nullptr))) { - if (!CreateProcessWithTokenWH(settings.getPrimaryToken(), 0, - QTOX_PATH.toStdWString().c_str(), 0, 0, 0, - QApplication::applicationDirPath().toStdWString().c_str(), - &si, &pi)) - unelevateOk = false; - } - } - - CloseHandle(pi.hProcess); - CloseHandle(pi.hThread); - - if (!unelevateOk) { - qWarning() << "Failed to start unelevated qTox"; - QProcess::startDetached(QTOX_PATH); - } - -#else - QProcess::startDetached(QTOX_PATH); -#endif - exit(0); -} - -void Widget::deleteBackups() -{ - for (QString file : backups) - QFile(file + ".bak").remove(); -} - -void Widget::restoreBackups() -{ - for (QString file : backups) - QFile(file + ".bak").rename(file); -} - -void Widget::update() -{ - /// 1. Find and parse the update (0-5%) - // Check that the dir exists - QString updateDirStr = settings.getSettingsDirPath() + "/update/"; - QDir updateDir(updateDirStr); - if (!updateDir.exists()) - fatalError(tr("No update found.")); - - setProgress(2); - - // Check that we have a flist and that every file on the diff exists - QFile updateFlistFile(updateDirStr + "flist"); - if (!updateFlistFile.open(QIODevice::ReadOnly)) - fatalError(tr("The update is incomplete!")); - - QByteArray updateFlistData = updateFlistFile.readAll(); - updateFlistFile.close(); - - QList updateFlist = parseFlist(updateFlistData); - setProgress(5); - - /// 2. Generate a diff (5-50%) - QList diff = genUpdateDiff(updateFlist, this); - for (UpdateFileMeta fileMeta : diff) - if (!QFile::exists(updateDirStr + fileMeta.installpath)) - fatalError(tr("The update is incomplete.")); - - if (diff.size() == 0) - fatalError(tr("The update is empty!")); - setProgress(50); - qDebug() << "Diff generated," << diff.size() << "files to update"; - - /// 2. Check the update (50-75%) - float checkProgressStep = 25.0 / (float)diff.size(); - float checkProgress = 50; - for (UpdateFileMeta fileMeta : diff) { - UpdateFile file; - file.metadata = fileMeta; - - QFile fileFile(updateDirStr + fileMeta.installpath); - if (!fileFile.open(QIODevice::ReadOnly)) - fatalError(tr("Update files are unreadable.")); - - file.data = fileFile.readAll(); - fileFile.close(); - - if (file.data.size() != (int)fileMeta.size) - fatalError(tr("Update files are corrupted.")); - - if (crypto_sign_verify_detached(file.metadata.sig, (unsigned char*)file.data.data(), - file.data.size(), key) - != 0) - fatalError(tr("Update files are corrupted.")); - - checkProgress += checkProgressStep; - setProgress(checkProgress); - } - setProgress(75); - qDebug() << "Update files signature verified, installing"; - - /// 3. Install the update (75-95%) - float installProgressStep = 20.0 / (float)diff.size(); - float installProgress = 75; - for (UpdateFileMeta fileMeta : diff) { - // Backup old files - if (QFile(fileMeta.installpath).exists()) { - QFile(fileMeta.installpath + ".bak").remove(); - QFile(fileMeta.installpath).rename(fileMeta.installpath + ".bak"); - backups.append(fileMeta.installpath); - } - - // Install new ones - QDir().mkpath(QFileInfo(fileMeta.installpath).absolutePath()); - QFile fileFile(updateDirStr + fileMeta.installpath); - if (!fileFile.copy(fileMeta.installpath)) - fatalError(tr("Unable to copy the update's files from ") - + (updateDirStr + fileMeta.installpath) + " to " + fileMeta.installpath); - installProgress += installProgressStep; - setProgress(installProgress); - } - setProgress(95); - - /// 4. Delete the update and backups (95-100%) - deleteUpdate(); - setProgress(97); - deleteBackups(); - setProgress(100); - - /// 5. Start qTox and exit - qDebug() << "Update applied, restarting qTox!"; - startQToxAndExit(); -} diff --git a/updater/widget.h b/updater/widget.h deleted file mode 100644 index ec92c471a..000000000 --- a/updater/widget.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - Copyright © 2014-2019 by The qTox Project Contributors - - This file is part of qTox, a Qt-based graphical interface for Tox. - - qTox is libre software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - qTox is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with qTox. If not, see . -*/ - - -#ifndef WIDGET_H -#define WIDGET_H - -#include "settings.h" -#include - -#ifdef Q_OS_WIN -#include -#endif - -namespace Ui { -class Widget; -} - -class Widget : public QWidget -{ - Q_OBJECT - -public: - explicit Widget(const Settings& s); - ~Widget(); - - // Utilities - void deleteBackups(); - void restoreBackups(); - void setProgress(int value); - - // Noreturn - void fatalError(QString message); ///< Calls deleteUpdate and startQToxAndExit - void deleteUpdate(); - void startQToxAndExit(); - -public slots: - // Finds and applies the update - void update(); - -private: - Ui::Widget* ui; - QStringList backups; - const Settings& settings; -}; - -#endif // WIDGET_H diff --git a/updater/widget.ui b/updater/widget.ui deleted file mode 100644 index 62eb04de7..000000000 --- a/updater/widget.ui +++ /dev/null @@ -1,139 +0,0 @@ - - - Widget - - - - 0 - 0 - 401 - 224 - - - - qTox Updater - - - - :/res/qtox-256x256.png:/res/qtox-256x256.png - - - - - 0 - 13 - 191 - 191 - - - - - - - :/res/qtox-256x256.png - - - true - - - - - - 206 - 95 - 171 - 20 - - - - 0 - - - 0 - - - Qt::AlignCenter - - - false - - - - - - 205 - 115 - 171 - 20 - - - - Updating qTox ... - - - Qt::AlignCenter - - - - - - 201 - 170 - 181 - 20 - - - - <html><head/><body><p><a href="https://tox.chat"><span style=" text-decoration: underline; color:#0000ff;">https://tox.chat</span></a></p></body></html> - - - Qt::AlignCenter - - - true - - - - - - 200 - 183 - 181 - 20 - - - - <a href="https://github.com/qTox/qtox">https://github.com/qTox/qtox</a> - - - Qt::AlignCenter - - - - - - 195 - 32 - 191 - 31 - - - - - 14 - - - - qTox Update - - - Qt::AlignCenter - - - - - - - - - diff --git a/updater/windows/updater.exe.manifest b/updater/windows/updater.exe.manifest deleted file mode 100644 index a6e206c80..000000000 --- a/updater/windows/updater.exe.manifest +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/updater/windows/updater.ico b/updater/windows/updater.ico deleted file mode 100644 index b322a59aa40aff41d33f4f855cf3608c3d3702e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16958 zcmeI2Yiv|S6vuDz1BqYC7fcit6QwMDKl<xpeN%y`8(;-MDai z?#w-N=KRj=&fc9FNs7R~#fv5Uy-l**ElD>>l4OCPO0q+!ej=|~x6jIgybd`9`3)jZ zV)+iS^*|~hQzpoLGkkPICNr;AYy*gWwvim5-89JeA&*e$yb%WMN)Gnv z;Rkno7_lokNZ`!@*vrC@f29uotpfR7DM=~k7o;xuLXXU!H(&JJvrPwouL%ByX$wE= zeYba&EX&zOWY^AJ&&5W^{wg9C_~_Na?-0>vOLNOcBiz1ia*e*eA08ggpEG;TAEC-maW^+LH~KQ^xn7>X zyh9K>{RRm5{713V_!*f8yz`zb)cGm?xv_IE4GavF@{T>_%QD+CDv&*BN zxu&w+>2&6>@-Q|wmQ%8#WRE4va#d+3PzUAxuZ}-8CG}j_(XOY}IXKvHuqrt*`Mla* zU^(dg^jmI6`;K}wyHeiNw#hE=_nxxuq3EFU$Hm0`()WH}xx&iQC;Cs6&x@P)lfZGG z6#VPfu4`j4tLrzsu%RWK_^rv-uhoqH%4ycLF9qiyXz%~*%u6qRi{a;sG zw^_~Sue`Qy?WS-Ue)HR=E~rm4#?h!xJ^O#F!jNCj{%>-i_!Ht2z70@c-249$ zUWn;nAmYk+DC0QolhPi!iT&w1|Ka7Ifp{*P7?b;R9Cb(3-$xD~d4|@-*4M9pDSmGJ z4}$wNbpFSigDAxEk>Gf)nZI(fa{m2&c>2`o60Cm=3+nR&_%U?;i}>k<_ER7$AbTKZ zA!Cqh7$#Cj>we1f59ywsp4C_f8!_OMo*h1g9Do!R0J`$M(GKMcU){<)`cY`}WsxtOMK4BjfYT%TH&2T3cFmod?NyIODjV+=c{yaZ&MJ z_4x9XJ3BioL!E!gy-PmiVP)CS9;!wTCiVCy&QH8Zd$=q%p8AUNiq}GwKkt#eP98=r zo2JI5rcmXlJzOm|o_mK59jcn-{PnE(PM$nj!o#R#Gc+_*!19m!dcJQd^Q;g9^Q)%giI=^NiRsSn)M(Y;59T)Uu)TBP{>aH(!+ISs?~1E53rq3Ocmd zcif;5;`feN%2{#ZH_V^M-Z}QvczjxQbY95MTJReF2+g$w`*a9% z%^qtSKelggXP)~|=YhWSlM<7@VdWI{bSCg7bE))sM?7^J@yb}|ab+&c?ACf79vKzfzywbXb-fp3X;Z-j{0N9>268G$Dd(<5SE4Dq*)=R4NQH9b?^BPNRAdjZQW5c*uy zLiR#FfsA^EuHS^vcj$wVTLTrb?4X{mlVwkbvdg1wPLEDk>#Lsnnb6e6M@M+e&~~c# z(QZ5CzPg=cL!ab_`Xo(#l8zkl=&2XHWv`}tzM|OkYTveWt@xMlqOx17xs@{I=Ly70 z`AVf6I3(##${#B3LJ>OB<B-eGf5cd{eh k>DCt_M?4xNRFAAhlBO(?M&#+F5xI@DY diff --git a/updater/windows/updater.rc b/updater/windows/updater.rc deleted file mode 100644 index 80d03bd3a..000000000 --- a/updater/windows/updater.rc +++ /dev/null @@ -1,2 +0,0 @@ -ID_ICON ICON DISCARDABLE "updater.ico" -1 24 "updater.exe.manifest" \ No newline at end of file