Patch URLs conditionally

This commit is contained in:
asivery
2025-10-08 22:18:35 +02:00
parent d5696ed758
commit a091458f2f
3 changed files with 56 additions and 31 deletions

View File

@@ -16,10 +16,10 @@ extern "C" void _xovi_construct() {
QSettings extensionConfig(configFile, QSettings::IniFormat);
QString newRMFCHostNameQStr = extensionConfig.value("host").toString();
if (newRMFCHostNameQStr == "") {
std::cerr << "[" << NAME << "] No host defined in the config file!";
std::cerr << "[" << NAME << "] No host defined in the config file!" << std::endl;
abort();
}
std::cerr << "[" << NAME << "] New host set to: " << newRMFCHostNameQStr.toStdString();
std::cerr << "[" << NAME << "] New host set to: " << newRMFCHostNameQStr.toStdString() << std::endl;
newRMFCHostName = newRMFCHostNameQStr;
bool ok;
newRMFCPort = extensionConfig.value("port").toInt(&ok);
@@ -38,8 +38,26 @@ extern "C" void _xovi_construct() {
config.setCaCertificates(globalCerts);
QSslConfiguration::setDefaultConfiguration(config);
} else {
std::cerr << "[" << NAME << "] Failed to open CA file!";
std::cerr << "[" << NAME << "] Failed to open CA file!" << std::endl;
}
free(configRoot);
}
static inline bool shouldPatchURL(const QString &host) {
return QString(R""""(
hwr-production-dot-remarkable-production.appspot.com
service-manager-production-dot-remarkable-production.appspot.com
local.appspot.com
my.remarkable.com
ping.remarkable.com
internal.cloud.remarkable.com
eu.tectonic.remarkable.com
backtrace-proxy.cloud.remarkable.engineering
dev.ping.remarkable.com
dev.tectonic.remarkable.com
dev.internal.cloud.remarkable.com
eu.internal.tctn.cloud.remarkable.com
webapp-prod.cloud.remarkable.engineering
)"""").contains(host);
}

View File

@@ -12,24 +12,27 @@ extern "C" QNetworkReply* override$_ZN21QNetworkAccessManager13createRequestENS_
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*);
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);
if(shouldPatchURL(req.url().host())) {
// 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);
// call original function, and return the result
return orig(self, op, newReq, outgoingData);
} else {
return orig(self, op, req, outgoingData);
}
}

View File

@@ -11,22 +11,26 @@ 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&);
const QNetworkRequest&);
CreateFn orig = reinterpret_cast<CreateFn>(
$_ZN10QWebSocket4openERK15QNetworkRequest
);
// call original function, and return the result
orig(self, newReq);
if(shouldPatchURL(req.url().host())) {
// 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);
// call original function, and return the result
orig(self, newReq);
} else {
orig(self, req);
}
}