mirror of
https://github.com/NohamR/xovi-rmfakecloud.git
synced 2026-05-25 12:37:08 +00:00
Rewrite
This commit is contained in:
45
src/commons.cpp
Normal file
45
src/commons.cpp
Normal 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);
|
||||
}
|
||||
35
src/networkaccess-part.cpp
Normal file
35
src/networkaccess-part.cpp
Normal 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
46
src/tokenstore-part.cpp
Normal 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
32
src/websocket-part.cpp
Normal 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);
|
||||
}
|
||||
Reference in New Issue
Block a user