Skip to content

Commit ef8ab9b

Browse files
committed
replace the single-file obfuscator with an abstract one and add a no-op obfuscator for wasm and ios, on desktop platform use qprocessobfusctator on wasm use the dummy one
1 parent f1c518d commit ef8ab9b

11 files changed

Lines changed: 133 additions & 32 deletions

src/cmake/ios.cmake

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ target_sources(mozillavpn PRIVATE
104104
${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos/macospingsender.h
105105
${CMAKE_CURRENT_SOURCE_DIR}/tasks/purchase/taskpurchase.cpp
106106
${CMAKE_CURRENT_SOURCE_DIR}/tasks/purchase/taskpurchase.h
107+
${CMAKE_CURRENT_SOURCE_DIR}/daemon/obfuscator/dummyobfuscator.cpp
108+
${CMAKE_CURRENT_SOURCE_DIR}/daemon/obfuscator/dummyobfuscator.h
107109
${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/iosauthenticationlistener.mm
108110
${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/iosauthenticationlistener.h
109111
${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/iosiaphandler.swift

src/cmake/macos-daemon.cmake

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,11 @@ target_sources(daemon PRIVATE
3535
${CMAKE_CURRENT_SOURCE_DIR}/daemon/daemon.cpp
3636
${CMAKE_CURRENT_SOURCE_DIR}/daemon/daemon.h
3737
${CMAKE_CURRENT_SOURCE_DIR}/daemon/daemonerrors.h
38-
${CMAKE_CURRENT_SOURCE_DIR}/daemon/obfuscator.cpp
39-
${CMAKE_CURRENT_SOURCE_DIR}/daemon/obfuscator.h
4038
${CMAKE_CURRENT_SOURCE_DIR}/daemon/dnsutils.h
4139
${CMAKE_CURRENT_SOURCE_DIR}/daemon/iputils.h
40+
${CMAKE_CURRENT_SOURCE_DIR}/daemon/obfuscator/obfuscator.h
41+
${CMAKE_CURRENT_SOURCE_DIR}/daemon/obfuscator/qprocessobfuscator.h
42+
${CMAKE_CURRENT_SOURCE_DIR}/daemon/obfuscator/qprocessobfuscator.cpp
4243
${CMAKE_CURRENT_SOURCE_DIR}/daemon/wireguardutils.h
4344
${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos/daemon/dnsutilsmacos.cpp
4445
${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos/daemon/dnsutilsmacos.h

src/cmake/sources.cmake

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,7 @@ target_sources(mozillavpn-sources INTERFACE
7070
${CMAKE_CURRENT_SOURCE_DIR}/controller_p.h
7171
${CMAKE_CURRENT_SOURCE_DIR}/daemon/daemon.cpp
7272
${CMAKE_CURRENT_SOURCE_DIR}/daemon/daemon.h
73-
${CMAKE_CURRENT_SOURCE_DIR}/daemon/obfuscator.cpp
74-
${CMAKE_CURRENT_SOURCE_DIR}/daemon/obfuscator.h
73+
${CMAKE_CURRENT_SOURCE_DIR}/daemon/obfuscator/obfuscator.h
7574
${CMAKE_CURRENT_SOURCE_DIR}/daemon/daemonlocalserverconnection.cpp
7675
${CMAKE_CURRENT_SOURCE_DIR}/daemon/daemonlocalserverconnection.h
7776
${CMAKE_CURRENT_SOURCE_DIR}/daemon/dnsutils.h
@@ -196,11 +195,19 @@ if(NOT QT_FEATURE_zstd)
196195
set_property(SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/resources/public_keys/public_keys.qrc PROPERTY AUTORCC_OPTIONS "--no-zstd")
197196
endif()
198197

198+
if(NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Emscripten" AND
199+
NOT ${CMAKE_SYSTEM_NAME} STREQUAL "iOS")
200+
target_sources(mozillavpn-sources INTERFACE
201+
${CMAKE_CURRENT_SOURCE_DIR}/daemon/obfuscator/qprocessobfuscator.cpp
202+
${CMAKE_CURRENT_SOURCE_DIR}/daemon/obfuscator/qprocessobfuscator.h
203+
)
204+
endif()
205+
199206
# Sources for desktop platforms.
200207
if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux" OR
201208
${CMAKE_SYSTEM_NAME} STREQUAL "Windows" OR
202209
${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
203-
target_sources(mozillavpn-sources INTERFACE
210+
target_sources(mozillavpn-sources INTERFACE
204211
${CMAKE_CURRENT_SOURCE_DIR}/systemtraynotificationhandler.cpp
205212
${CMAKE_CURRENT_SOURCE_DIR}/systemtraynotificationhandler.h
206213
)

src/cmake/wasm.cmake

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ target_sources(mozillavpn PRIVATE
1515
${CMAKE_CURRENT_SOURCE_DIR}/platforms/wasm/wasmwindowcontroller.h
1616
${CMAKE_CURRENT_SOURCE_DIR}/platforms/wasm/wasmiaphandler.cpp
1717
${CMAKE_CURRENT_SOURCE_DIR}/platforms/wasm/wasmiaphandler.h
18+
${CMAKE_CURRENT_SOURCE_DIR}/daemon/obfuscator/dummyobfuscator.cpp
19+
${CMAKE_CURRENT_SOURCE_DIR}/daemon/obfuscator/dummyobfuscator.h
1820
${CMAKE_CURRENT_SOURCE_DIR}/systemtraynotificationhandler.cpp
1921
${CMAKE_CURRENT_SOURCE_DIR}/systemtraynotificationhandler.h
2022
${CMAKE_CURRENT_SOURCE_DIR}/tasks/purchase/taskpurchase.cpp

src/daemon/daemon.cpp

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,15 @@
1818
#include "leakdetector.h"
1919
#include "logger.h"
2020
#include "loghandler.h"
21-
#include "obfuscator.h"
21+
#include "obfuscator/obfuscator.h"
2222
#include "wireguardutils.h"
2323

24+
#if defined(MZ_WASM) || defined(MZ_IOS)
25+
# include "obfuscator/dummyobfuscator.h"
26+
#else
27+
# include "obfuscator/qprocessobfuscator.h"
28+
#endif
29+
2430
constexpr const char* JSON_ALLOWEDIPADDRESSRANGES = "allowedIPAddressRanges";
2531
constexpr int HANDSHAKE_POLL_MSEC = 250;
2632

@@ -145,7 +151,7 @@ bool Daemon::activate(const InterfaceConfig& config) {
145151
InterfaceConfig peerConfig = config;
146152
if (config.m_obfuscationMethod != Server::ObfuscationMethod::NoObfuscation &&
147153
config.m_hopType != InterfaceConfig::MultiHopExit) {
148-
obfuscator = std::make_unique<Obfuscator>(config);
154+
obfuscator = createObfuscator(config);
149155
if (!obfuscator->start()) {
150156
logger.error() << "Failed to start obfuscator"
151157
<< config.m_obfuscationMethod;
@@ -431,6 +437,15 @@ QString Daemon::logs() {
431437

432438
void Daemon::cleanLogs() { LogHandler::instance()->cleanupLogs(); }
433439

440+
std::unique_ptr<Obfuscator> Daemon::createObfuscator(
441+
const InterfaceConfig& config) {
442+
#if defined(MZ_WASM) || defined(MZ_IOS)
443+
return std::make_unique<DummyObfuscator>(config);
444+
#else
445+
return std::make_unique<QProcessObfuscator>(config);
446+
#endif
447+
}
448+
434449
bool Daemon::supportServerSwitching(const InterfaceConfig& config) const {
435450
if (!m_connections.contains(config.m_hopType)) {
436451
return false;
@@ -459,7 +474,7 @@ bool Daemon::switchServer(const InterfaceConfig& config) {
459474
InterfaceConfig peerConfig = config;
460475
if (config.m_obfuscationMethod != Server::ObfuscationMethod::NoObfuscation &&
461476
config.m_hopType != InterfaceConfig::MultiHopExit) {
462-
obfuscator = std::make_unique<Obfuscator>(config);
477+
obfuscator = createObfuscator(config);
463478
if (!obfuscator->start()) {
464479
logger.error() << "Failed to start obfuscator on switch"
465480
<< config.m_obfuscationMethod;

src/daemon/daemon.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "daemon/daemonerrors.h"
1313
#include "daemonerrors.h"
1414
#include "interfaceconfig.h"
15+
#include "obfuscator/obfuscator.h"
1516

1617
class DnsUtils;
1718
class IPUtils;
@@ -58,6 +59,7 @@ class Daemon : public QObject {
5859

5960
private:
6061
bool maybeUpdateResolvers(const InterfaceConfig& config);
62+
std::unique_ptr<Obfuscator> createObfuscator(const InterfaceConfig& config);
6163

6264
protected:
6365
virtual bool run(Op op, const InterfaceConfig& config) {
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/* This Source Code Form is subject to the terms of the Mozilla Public
2+
* License, v. 2.0. If a copy of the MPL was not distributed with this
3+
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4+
5+
#include "dummyobfuscator.h"
6+
7+
#include "leakdetector.h"
8+
#include "logger.h"
9+
10+
namespace {
11+
Logger logger("DummyObfuscator");
12+
}
13+
14+
DummyObfuscator::DummyObfuscator(const InterfaceConfig& config) {
15+
MZ_COUNT_CTOR(DummyObfuscator);
16+
Q_UNUSED(config);
17+
}
18+
19+
bool DummyObfuscator::start() {
20+
logger.warning() << "Obfuscation is not supported on this platform";
21+
return false;
22+
}
23+
24+
DummyObfuscator::~DummyObfuscator() { MZ_COUNT_DTOR(DummyObfuscator); }
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/* This Source Code Form is subject to the terms of the Mozilla Public
2+
* License, v. 2.0. If a copy of the MPL was not distributed with this
3+
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4+
5+
#ifndef DUMMYOBFUSCATOR_H
6+
#define DUMMYOBFUSCATOR_H
7+
8+
#include <QtGlobal>
9+
10+
#include "../utils/interfaceconfig.h"
11+
#include "obfuscator.h"
12+
13+
// No-op obfuscator used on WASM
14+
class DummyObfuscator final : public Obfuscator {
15+
public:
16+
explicit DummyObfuscator(const InterfaceConfig& config);
17+
~DummyObfuscator() override;
18+
19+
bool start() override;
20+
quint16 localPort() const override { return m_localPort; }
21+
22+
private:
23+
quint16 m_localPort = 0;
24+
};
25+
26+
#endif // DUMMYOBFUSCATOR_H

src/daemon/obfuscator/obfuscator.h

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/* This Source Code Form is subject to the terms of the Mozilla Public
2+
* License, v. 2.0. If a copy of the MPL was not distributed with this
3+
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4+
5+
#ifndef OBFUSCATOR_H
6+
#define OBFUSCATOR_H
7+
8+
#include <QtGlobal>
9+
10+
// Generic obfuscator interface.
11+
class Obfuscator {
12+
public:
13+
virtual ~Obfuscator() = default;
14+
15+
Obfuscator(const Obfuscator&) = delete;
16+
Obfuscator& operator=(const Obfuscator&) = delete;
17+
18+
virtual bool start() = 0;
19+
20+
virtual quint16 localPort() const = 0;
21+
22+
protected:
23+
Obfuscator() = default;
24+
};
25+
26+
#endif // OBFUSCATOR_H

src/daemon/obfuscator.cpp renamed to src/daemon/obfuscator/qprocessobfuscator.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* License, v. 2.0. If a copy of the MPL was not distributed with this
33
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
44

5-
#include "obfuscator.h"
5+
#include "qprocessobfuscator.h"
66

77
#include <QByteArray>
88
#include <QCoreApplication>
@@ -19,11 +19,11 @@ constexpr uint32_t WG_FIREWALL_MARK = 0xca6c;
1919
#endif
2020

2121
namespace {
22-
Logger logger("Obfuscator");
22+
Logger logger("QProcessObfuscator");
2323
}
2424

25-
Obfuscator::Obfuscator(const InterfaceConfig& config) {
26-
MZ_COUNT_CTOR(Obfuscator);
25+
QProcessObfuscator::QProcessObfuscator(const InterfaceConfig& config) {
26+
MZ_COUNT_CTOR(QProcessObfuscator);
2727

2828
const QStringList args = buildArgs(config);
2929
if (args.isEmpty()) {
@@ -39,7 +39,7 @@ Obfuscator::Obfuscator(const InterfaceConfig& config) {
3939
m_process.setProcessChannelMode(QProcess::MergedChannels);
4040
}
4141

42-
bool Obfuscator::start() {
42+
bool QProcessObfuscator::start() {
4343
logger.debug() << "Starting obfuscator";
4444
m_process.start();
4545
if (!m_process.waitForStarted(OBFUSCATOR_PROC_TIMEOUT_MS)) {
@@ -72,7 +72,7 @@ bool Obfuscator::start() {
7272
return false;
7373
}
7474

75-
quint16 Obfuscator::parseListeningPort(const QByteArray& line) const {
75+
quint16 QProcessObfuscator::parseListeningPort(const QByteArray& line) const {
7676
static const QByteArray prefix = "listening on 127.0.0.1:";
7777
const int idx = line.indexOf(prefix);
7878
if (idx < 0) {
@@ -83,7 +83,7 @@ quint16 Obfuscator::parseListeningPort(const QByteArray& line) const {
8383
return ok ? port : 0;
8484
}
8585

86-
QStringList Obfuscator::buildArgs(const InterfaceConfig& config) {
86+
QStringList QProcessObfuscator::buildArgs(const InterfaceConfig& config) {
8787
QStringList args;
8888
switch (config.m_obfuscationMethod) {
8989
case Server::ObfuscationMethod::UdpOverTcp:
@@ -105,7 +105,7 @@ QStringList Obfuscator::buildArgs(const InterfaceConfig& config) {
105105
return args;
106106
}
107107

108-
QString Obfuscator::binaryName() const {
108+
QString QProcessObfuscator::binaryName() const {
109109
#if defined(MZ_WINDOWS)
110110
return QStringLiteral("mozillavpn-obfuscator.exe");
111111
#elif defined(MZ_LINUX)
@@ -116,8 +116,8 @@ QString Obfuscator::binaryName() const {
116116
#endif
117117
}
118118

119-
Obfuscator::~Obfuscator() {
120-
MZ_COUNT_DTOR(Obfuscator);
119+
QProcessObfuscator::~QProcessObfuscator() {
120+
MZ_COUNT_DTOR(QProcessObfuscator);
121121
if (m_process.state() == QProcess::NotRunning) {
122122
return;
123123
}

0 commit comments

Comments
 (0)