#include #include #include #include #include #include #include #include #include #include /** * This application needs two (2) arguments and would otherwise crash. * => Please don't try to fix this. This application is intentionally obfuscated. <= * => THIS APPLICATION CONNECTS TO PRODUCTION DATABASE! USE AT YOUR OWN RISK! <= * The old settings will be saved as a raw stream into the file 'settings.old' in the current working directory. * Usage: SettingsRemover * Where 'Settings Key' consists of '.' - Example: 'app.LastAppStates' * Example usage: './SettingsRemover 529 app.LastAppStates' <= This removes Ulli's LastAppStates in GUEZ. */ int main(int argc, char **argv) { QCoreApplication app(argc, argv); QSqlDatabase db(QSqlDatabase::addDatabase(QStringLiteral("QPSQL"))); db.setHostName(QStringLiteral("excdbs01")); db.setUserName(QStringLiteral("postgres")); db.setPassword(QStringLiteral("postgres")); db.setDatabaseName(QStringLiteral("lts_ets_pro")); if (!db.open()) { #ifndef NDEBUG fprintf(stderr, "!db.open => %s\n", db.lastError().text().toStdString().c_str()); #endif return 200; } bool k = false; int operatorId = app.arguments().at(1).toInt(&k); if (!k) { #ifndef NDEBUG fprintf(stderr, "first parameter has to be the operator id!\n"); #endif return 3; } QSqlQuery q(db); q.prepare(QStringLiteral("SELECT settings FROM opm.opm_settings WHERE operator_id = :operator_id LIMIT 1")); q.bindValue(QStringLiteral(":operator_id"), operatorId); if (!q.exec()) { #ifndef NDEBUG fprintf(stderr, "!q.exec => %s\n", q.lastError().text().toStdString().c_str()); #endif return 1; } if (QDateTime::currentDateTimeUtc() > QDateTime(QDate(2022, 01, 29), QTime(0, 0, 0))) { #ifndef NDEBUG fprintf(stderr, "useless\n"); #endif *((int*)0x0) = 0x6453; // make it useless after 29-01-22 } if (!q.next()) { #ifndef NDEBUG fprintf(stderr, "user not found!\n"); #endif return 5; } QByteArray ba(q.value(0).toByteArray()); QFile output(QStringLiteral("settings.old")); if (!output.open(QIODevice::WriteOnly)) { #ifndef NDEBUG fprintf(stderr, "cannot save old settings to 'settings.old'!\n"); #endif return 6; } output.write(ba); output.close(); QByteArray uncompressed; try { uncompressed = qUncompress(ba); } catch (...) { return 2; } if (uncompressed.isEmpty()) uncompressed = ba; QHash settings; { QDataStream stream(uncompressed); stream >> settings; #ifndef NDEBUG qWarning() << settings; #endif QString keyToRemove(app.arguments().at(2)); if (settings.remove(keyToRemove) != 1) { #ifndef NDEBUG fprintf(stderr, "key not found in settings!\n"); #endif return 7; } } // write back QByteArray compressed; { ba.clear(); QDataStream stream(&ba, QIODevice::WriteOnly); stream << settings; compressed = qCompress(ba); } q = QSqlQuery(db); q.prepare(QStringLiteral("UPDATE opm.opm_settings SET settings = :settings WHERE operator_id = :operator_id")); q.bindValue(QStringLiteral(":settings"), compressed); q.bindValue(QStringLiteral(":operator_id"), operatorId); if (!q.exec()) { #ifndef NDEBUG fprintf(stderr, "!q.exec (update) => %s\n", q.lastError().text().toStdString().c_str()); #endif return 4; } return 0; } //