2020-10-07 10:36:04 +00:00
|
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
2020-12-26 19:56:06 +00:00
|
|
|
// Copyright (c) 2020-2021, The Monero Project.
|
2020-10-07 10:36:04 +00:00
|
|
|
|
2021-03-30 09:52:29 +00:00
|
|
|
#ifndef WOWLET_TOR_H
|
|
|
|
#define WOWLET_TOR_H
|
2020-10-07 10:36:04 +00:00
|
|
|
|
|
|
|
#include <cstdio>
|
|
|
|
#include <cstdlib>
|
|
|
|
#include <iostream>
|
|
|
|
#include <QRegExp>
|
|
|
|
#include <QtNetwork>
|
|
|
|
#include "utils/childproc.h"
|
|
|
|
|
2021-02-05 10:53:18 +00:00
|
|
|
struct TorVersion
|
|
|
|
{
|
|
|
|
explicit TorVersion(int major=0, int minor=0, int patch=0, int release=0)
|
|
|
|
: patch(patch), release(release)
|
|
|
|
{
|
|
|
|
this->major = major;
|
|
|
|
this->minor = minor;
|
|
|
|
}
|
|
|
|
|
|
|
|
friend bool operator== (const TorVersion &v1, const TorVersion &v2) {
|
|
|
|
return (v1.major == v2.major &&
|
|
|
|
v1.minor == v2.minor &&
|
|
|
|
v1.patch == v2.patch &&
|
|
|
|
v1.release == v2.release);
|
|
|
|
}
|
|
|
|
|
|
|
|
friend bool operator!= (const TorVersion &v1, const TorVersion &v2) {
|
|
|
|
return !(v1 == v2);
|
|
|
|
}
|
|
|
|
|
|
|
|
friend bool operator> (const TorVersion &v1, const TorVersion &v2) {
|
|
|
|
if (v1.major != v2.major)
|
|
|
|
return v1.major > v2.major;
|
|
|
|
if (v1.minor != v2.minor)
|
|
|
|
return v1.minor > v2.minor;
|
|
|
|
if (v1.patch != v2.patch)
|
|
|
|
return v1.patch > v2.patch;
|
|
|
|
if (v1.release != v2.release)
|
|
|
|
return v1.release > v2.release;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
friend bool operator< (const TorVersion &v1, const TorVersion &v2) {
|
|
|
|
if (v1 == v2)
|
|
|
|
return false;
|
|
|
|
return !(v1 > v2);
|
|
|
|
}
|
|
|
|
|
|
|
|
QString toString() {
|
|
|
|
return QString("%1.%2.%3.%4").arg(QString::number(major), QString::number(minor),
|
|
|
|
QString::number(patch), QString::number(release));
|
|
|
|
}
|
|
|
|
|
2021-02-05 18:43:14 +00:00
|
|
|
static bool isValid(const TorVersion &v) {
|
|
|
|
return v != TorVersion();
|
|
|
|
}
|
|
|
|
|
2021-02-05 10:53:18 +00:00
|
|
|
int major;
|
|
|
|
int minor;
|
|
|
|
int patch;
|
|
|
|
int release;
|
|
|
|
};
|
|
|
|
|
2020-10-07 10:36:04 +00:00
|
|
|
class Tor : public QObject
|
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
public:
|
|
|
|
explicit Tor(AppContext *ctx, QObject *parent = nullptr);
|
|
|
|
|
|
|
|
void start();
|
|
|
|
void stop();
|
|
|
|
bool unpackBins();
|
2021-02-05 10:53:18 +00:00
|
|
|
TorVersion getVersion(const QString &fileName);
|
|
|
|
TorVersion stringToVersion(const QString &version);
|
2020-10-07 10:36:04 +00:00
|
|
|
|
|
|
|
bool torConnected = false;
|
|
|
|
bool localTor = false;
|
|
|
|
QString torDir;
|
|
|
|
QString torPath;
|
|
|
|
QString torDataPath;
|
|
|
|
|
|
|
|
static QString torHost;
|
|
|
|
static quint16 torPort;
|
|
|
|
|
|
|
|
QString torLogs;
|
|
|
|
QString errorMsg = "";
|
|
|
|
|
|
|
|
signals:
|
|
|
|
void connectionStateChanged(bool connected);
|
|
|
|
void startupFailure(QString reason);
|
|
|
|
void logsUpdated();
|
|
|
|
|
|
|
|
private slots:
|
|
|
|
void stateChanged(QProcess::ProcessState);
|
|
|
|
void handleProcessOutput();
|
|
|
|
void handleProcessError(QProcess::ProcessError error);
|
|
|
|
void checkConnection();
|
|
|
|
|
|
|
|
private:
|
|
|
|
void setConnectionState(bool connected);
|
|
|
|
|
|
|
|
ChildProcess m_process;
|
|
|
|
AppContext *m_ctx;
|
|
|
|
int m_restarts = 0;
|
|
|
|
bool m_stopRetries = false;
|
|
|
|
QTimer *m_checkConnectionTimer;
|
|
|
|
};
|
|
|
|
|
|
|
|
class AppContext; // forward declaration
|
|
|
|
|
2021-03-30 09:52:29 +00:00
|
|
|
#endif //WOWLET_TOR_H
|