This commit is contained in:
asivery
2025-10-08 18:47:53 +02:00
parent b8f0b6dd6b
commit d5696ed758
14 changed files with 152 additions and 377 deletions

45
src/commons.cpp Normal file
View File

@@ -0,0 +1,45 @@
#pragma once
#include <QSettings>
#include <QFile>
#include <QVariant>
#include <iostream>
#define NAME "rmfakecloud"
static QString newRMFCHostName = NULL;
static int newRMFCPort;
extern "C" void _xovi_construct() {
char *configRoot = Environment->getExtensionDirectory(NAME);
// Load the config file and read the host.
QString configFile(configRoot);
configFile += "config.conf";
QSettings extensionConfig(configFile, QSettings::IniFormat);
QString newRMFCHostNameQStr = extensionConfig.value("host").toString();
if (newRMFCHostNameQStr == "") {
std::cerr << "[" << NAME << "] No host defined in the config file!";
abort();
}
std::cerr << "[" << NAME << "] New host set to: " << newRMFCHostNameQStr.toStdString();
newRMFCHostName = newRMFCHostNameQStr;
bool ok;
newRMFCPort = extensionConfig.value("port").toInt(&ok);
if(!ok) newRMFCPort = -1; // Default.
// Load our CA to the global cert store.
QString caCertFileName(configRoot);
caCertFileName += "ca.pem";
QFile caFile(caCertFileName);
if (caFile.open(QIODevice::ReadOnly)) {
const QByteArray caBytes = caFile.readAll();
const QSslCertificate certificate(caBytes);
QSslConfiguration config = QSslConfiguration::defaultConfiguration();
auto globalCerts = config.caCertificates();
globalCerts.append(certificate);
config.setCaCertificates(globalCerts);
QSslConfiguration::setDefaultConfiguration(config);
} else {
std::cerr << "[" << NAME << "] Failed to open CA file!";
}
free(configRoot);
}

View File

@@ -0,0 +1,35 @@
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QDebug>
#include <QIODevice>
#include "../xovi-networkaccess.h"
#include "commons.cpp"
extern "C" QNetworkReply* override$_ZN21QNetworkAccessManager13createRequestENS_9OperationERK15QNetworkRequestP9QIODevice(
QNetworkAccessManager* self,
QNetworkAccessManager::Operation op,
const QNetworkRequest& req,
QIODevice* outgoingData
) {
// set new url
QUrl newUrl = req.url();
newUrl.setHost(newRMFCHostName);
newUrl.setPort(newRMFCPort);
// create a new request, so we don't have to modify the original request
QNetworkRequest newReq(req);
newReq.setUrl(newUrl);
// get original function signature
using CreateFn = QNetworkReply*(*)(QNetworkAccessManager*,
QNetworkAccessManager::Operation,
const QNetworkRequest&,
QIODevice*);
CreateFn orig = reinterpret_cast<CreateFn>(
$_ZN21QNetworkAccessManager13createRequestENS_9OperationERK15QNetworkRequestP9QIODevice
);
// call original function, and return the result
return orig(self, op, newReq, outgoingData);
}

46
src/tokenstore-part.cpp Normal file
View File

@@ -0,0 +1,46 @@
#define NAME "rmfakecloud"
#include <QSettings>
#include <QFile>
#include <QVariant>
#include <iostream>
#include "../xovi-tokenstore.h"
extern "C" {
static QSettings *tokenStorage;
void _xovi_construct() {
char *configRoot = Environment->getExtensionDirectory(NAME);
// Prepare the token storage (leak object)
QString tokenFile(configRoot);
tokenFile += "tokens.conf";
tokenStorage = new QSettings(tokenFile, QSettings::IniFormat);
free(configRoot);
}
static inline bool checkKey(void **that, QAnyStringView &key) {
if(key == "devicetoken" || key == "UserToken") {
*that = tokenStorage;
return true;
}
return false;
}
QVariant override$_ZNK9QSettings5valueE14QAnyStringView(void *that, QAnyStringView key) {
checkKey(&that, key);
return $_ZNK9QSettings5valueE14QAnyStringView(that, key);
}
QVariant override$_ZNK9QSettings5valueE14QAnyStringViewRK8QVariant(void *that, QAnyStringView key, const QVariant &defaultValue) {
checkKey(&that, key);
return $_ZNK9QSettings5valueE14QAnyStringViewRK8QVariant(that, key, defaultValue);
}
void override$_ZN9QSettings8setValueE14QAnyStringViewRK8QVariant(void *that, QAnyStringView key, const QVariant &value) {
bool sync = checkKey(&that, key);
$_ZN9QSettings8setValueE14QAnyStringViewRK8QVariant(that, key, value);
if(sync) {
tokenStorage->sync();
}
}
}

32
src/websocket-part.cpp Normal file
View File

@@ -0,0 +1,32 @@
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QDebug>
#include <QIODevice>
#include <QWebSocket>
#include "../xovi-websocket.h"
#include "commons.cpp"
extern "C" void override$_ZN10QWebSocket4openERK15QNetworkRequest(
QWebSocket* self,
const QNetworkRequest& req
) {
// set new url
QUrl newUrl = req.url();
newUrl.setHost(newRMFCHostName);
newUrl.setPort(newRMFCPort);
// create a new request, so we don't have to modify the original request
QNetworkRequest newReq(req);
newReq.setUrl(newUrl);
// get original function signature
using CreateFn = void*(*)(QWebSocket*,
const QNetworkRequest&);
CreateFn orig = reinterpret_cast<CreateFn>(
$_ZN10QWebSocket4openERK15QNetworkRequest
);
// call original function, and return the result
orig(self, newReq);
}