1
0
mirror of https://github.com/qTox/qTox.git synced 2024-03-22 14:00:36 +08:00

Merge pull request #387 from dubslow/proxy

Proxy support (clean PR this time)
This commit is contained in:
Tux3 / Mlkj / !Lev.uXFMLA 2014-10-06 20:28:10 +02:00
commit 07a06f2fdc
11 changed files with 202 additions and 18 deletions

View File

@ -121,6 +121,9 @@ void Core::start()
{ {
// IPv6 needed for LAN discovery, but can crash some weird routers. On by default, can be disabled in options. // IPv6 needed for LAN discovery, but can crash some weird routers. On by default, can be disabled in options.
bool enableIPv6 = Settings::getInstance().getEnableIPv6(); bool enableIPv6 = Settings::getInstance().getEnableIPv6();
bool forceTCP = Settings::getInstance().getForceTCP();
QString proxyAddr = Settings::getInstance().getProxyAddr();
int proxyPort = Settings::getInstance().getProxyPort();
if (enableIPv6) if (enableIPv6)
qDebug() << "Core starting with IPv6 enabled"; qDebug() << "Core starting with IPv6 enabled";
else else
@ -128,10 +131,28 @@ void Core::start()
Tox_Options toxOptions; Tox_Options toxOptions;
toxOptions.ipv6enabled = enableIPv6; toxOptions.ipv6enabled = enableIPv6;
toxOptions.udp_disabled = 0; toxOptions.udp_disabled = forceTCP;
toxOptions.proxy_enabled = false; if (proxyAddr.length() > 255)
toxOptions.proxy_address[0] = 0; {
toxOptions.proxy_port = 0; qWarning() << "Core: proxy address" << proxyAddr << "is too long";
toxOptions.proxy_enabled = false;
toxOptions.proxy_address[0] = 0;
toxOptions.proxy_port = 0;
}
else if (proxyAddr != "" && proxyPort > 0)
{
qDebug() << "Core: using proxy" << proxyAddr << ":" << proxyPort;
toxOptions.proxy_enabled = true;
uint16_t sz = CString::fromString(proxyAddr, (unsigned char*)toxOptions.proxy_address);
toxOptions.proxy_address[sz] = 0;
toxOptions.proxy_port = proxyPort;
}
else
{
toxOptions.proxy_enabled = false;
toxOptions.proxy_address[0] = 0;
toxOptions.proxy_port = 0;
}
tox = tox_new(&toxOptions); tox = tox_new(&toxOptions);
if (tox == nullptr) if (tox == nullptr)
@ -142,13 +163,29 @@ void Core::start()
tox = tox_new(&toxOptions); tox = tox_new(&toxOptions);
if (tox == nullptr) if (tox == nullptr)
{ {
qCritical() << "Tox core failed to start"; if (toxOptions.proxy_enabled)
emit failedToStart(); {
//QMessageBox::critical(Widget::getInstance(), tr("Proxy failure", "popup title"),
//tr("toxcore failed to start with your proxy settings. qTox cannot run; please modify your "
//"settings and restart.", "popup text"));
qCritical() << "Core: bad proxy! no toxcore!";
emit badProxy();
}
else
{
qCritical() << "Tox core failed to start";
emit failedToStart();
}
return; return;
} }
else else
qWarning() << "Core failed to start with IPv6, falling back to IPv4. LAN discovery may not work properly."; qWarning() << "Core failed to start with IPv6, falling back to IPv4. LAN discovery may not work properly.";
} }
else if (toxOptions.proxy_enabled)
{
emit badProxy();
return;
}
else else
{ {
qCritical() << "Tox core failed to start"; qCritical() << "Tox core failed to start";
@ -919,8 +956,6 @@ void Core::setAvatar(uint8_t format, const QByteArray& data)
qWarning() << "Core: Failed to set self avatar"; qWarning() << "Core: Failed to set self avatar";
return; return;
} }
else
qDebug() << "Core: Set avatar, format:"<<format<<", size:"<<data.size();
QPixmap pic; QPixmap pic;
pic.loadFromData(data); pic.loadFromData(data);
@ -1053,6 +1088,8 @@ bool Core::loadConfiguration()
void Core::saveConfiguration() void Core::saveConfiguration()
{ {
Settings::getInstance().save();
if (!tox) if (!tox)
{ {
qWarning() << "Core::saveConfiguration: Tox not started, aborting!"; qWarning() << "Core::saveConfiguration: Tox not started, aborting!";
@ -1085,8 +1122,6 @@ void Core::saveConfiguration()
configurationFile.commit(); configurationFile.commit();
delete[] data; delete[] data;
} }
Settings::getInstance().save();
} }
void Core::loadFriends() void Core::loadFriends()

1
core.h
View File

@ -138,6 +138,7 @@ signals:
void failedToSetTyping(bool typing); void failedToSetTyping(bool typing);
void failedToStart(); void failedToStart();
void badProxy();
void fileSendStarted(ToxFile file); void fileSendStarted(ToxFile file);
void fileReceiveRequested(ToxFile file); void fileReceiveRequested(ToxFile file);

View File

@ -34,13 +34,12 @@ public:
uint16_t size(); uint16_t size();
static QString toString(const uint8_t* cMessage, const uint16_t cMessageSize); static QString toString(const uint8_t* cMessage, const uint16_t cMessageSize);
static uint16_t fromString(const QString& message, uint8_t* cMessage);
private: private:
const static int MAX_SIZE_OF_UTF8_ENCODED_CHARACTER = 4; const static int MAX_SIZE_OF_UTF8_ENCODED_CHARACTER = 4;
uint8_t* cString; uint8_t* cString;
uint16_t cStringSize; uint16_t cStringSize;
static uint16_t fromString(const QString& message, uint8_t* cMessage);
}; };
#endif // CSTRING_H #endif // CSTRING_H

View File

@ -140,6 +140,9 @@ void Settings::load()
s.beginGroup("Privacy"); s.beginGroup("Privacy");
typingNotification = s.value("typingNotification", false).toBool(); typingNotification = s.value("typingNotification", false).toBool();
forceTCP = s.value("forceTCP", false).toBool();
proxyAddr = s.value("proxyAddr", "").toString();
proxyPort = s.value("proxyPort", 0).toInt();
s.endGroup(); s.endGroup();
// try to set a smiley pack if none is selected // try to set a smiley pack if none is selected
@ -239,6 +242,9 @@ void Settings::save(QString path)
s.beginGroup("Privacy"); s.beginGroup("Privacy");
s.setValue("typingNotification", typingNotification); s.setValue("typingNotification", typingNotification);
s.setValue("forceTCP", forceTCP);
s.setValue("proxyAddr", proxyAddr);
s.setValue("proxyPort", proxyPort);
s.endGroup(); s.endGroup();
} }
@ -351,6 +357,36 @@ void Settings::setUseTranslations(bool newValue)
useTranslations = newValue; useTranslations = newValue;
} }
bool Settings::getForceTCP() const
{
return forceTCP;
}
void Settings::setForceTCP(bool newValue)
{
forceTCP = newValue;
}
QString Settings::getProxyAddr() const
{
return proxyAddr;
}
void Settings::setProxyAddr(const QString& newValue)
{
proxyAddr = newValue;
}
int Settings::getProxyPort() const
{
return proxyPort;
}
void Settings::setProxyPort(int newValue)
{
proxyPort = newValue;
}
bool Settings::getEnableLogging() const bool Settings::getEnableLogging() const
{ {
return enableLogging; return enableLogging;

View File

@ -52,6 +52,15 @@ public:
bool getUseTranslations() const; bool getUseTranslations() const;
void setUseTranslations(bool newValue); void setUseTranslations(bool newValue);
bool getForceTCP() const;
void setForceTCP(bool newValue);
QString getProxyAddr() const;
void setProxyAddr(const QString& newValue);
int getProxyPort() const;
void setProxyPort(int newValue);
bool getEnableLogging() const; bool getEnableLogging() const;
void setEnableLogging(bool newValue); void setEnableLogging(bool newValue);
@ -153,6 +162,10 @@ private:
bool enableIPv6; bool enableIPv6;
bool useTranslations; bool useTranslations;
static bool makeToxPortable; static bool makeToxPortable;
bool forceTCP;
QString proxyAddr;
int proxyPort;
bool enableLogging; bool enableLogging;
bool encryptLogs; bool encryptLogs;

View File

@ -20,6 +20,7 @@
#include "widget/widget.h" #include "widget/widget.h"
#include "misc/settings.h" #include "misc/settings.h"
#include "misc/smileypack.h" #include "misc/smileypack.h"
#include <QMessageBox>
GeneralForm::GeneralForm() : GeneralForm::GeneralForm() :
GenericForm(tr("General Settings"), QPixmap(":/img/settings/general.png")) GenericForm(tr("General Settings"), QPixmap(":/img/settings/general.png"))
@ -37,10 +38,20 @@ GeneralForm::GeneralForm() :
} }
bodyUI->smileyPackBrowser->setCurrentIndex(bodyUI->smileyPackBrowser->findData(Settings::getInstance().getSmileyPack())); bodyUI->smileyPackBrowser->setCurrentIndex(bodyUI->smileyPackBrowser->findData(Settings::getInstance().getSmileyPack()));
connect(bodyUI->cbEnableIPv6, SIGNAL(stateChanged(int)), this, SLOT(onEnableIPv6Updated())); bodyUI->cbUDPDisabled->setChecked(Settings::getInstance().getForceTCP());
connect(bodyUI->cbUseTranslations, SIGNAL(stateChanged(int)), this, SLOT(onUseTranslationUpdated())); bodyUI->proxyAddr->setText(Settings::getInstance().getProxyAddr());
connect(bodyUI->cbMakeToxPortable, SIGNAL(stateChanged(int)), this, SLOT(onMakeToxPortableUpdated())); int port = Settings::getInstance().getProxyPort();
if (port != -1)
bodyUI->proxyPort->setText(QString::number(port));
connect(bodyUI->cbEnableIPv6, &QCheckBox::stateChanged, this, &GeneralForm::onEnableIPv6Updated);
connect(bodyUI->cbUseTranslations, &QCheckBox::stateChanged, this, &GeneralForm::onUseTranslationUpdated);
connect(bodyUI->cbMakeToxPortable, &QCheckBox::stateChanged, this, &GeneralForm::onMakeToxPortableUpdated);
connect(bodyUI->smileyPackBrowser, SIGNAL(currentIndexChanged(int)), this, SLOT(onSmileyBrowserIndexChanged(int))); connect(bodyUI->smileyPackBrowser, SIGNAL(currentIndexChanged(int)), this, SLOT(onSmileyBrowserIndexChanged(int)));
// new syntax can't handle overloaded signals... (at least not in a pretty way)
connect(bodyUI->cbUDPDisabled, &QCheckBox::stateChanged, this, &GeneralForm::onUDPUpdated);
connect(bodyUI->proxyAddr, &QLineEdit::editingFinished, this, &GeneralForm::onProxyAddrEdited);
connect(bodyUI->proxyPort, &QLineEdit::editingFinished, this, &GeneralForm::onProxyPortEdited);
} }
GeneralForm::~GeneralForm() GeneralForm::~GeneralForm()
@ -68,3 +79,28 @@ void GeneralForm::onSmileyBrowserIndexChanged(int index)
QString filename = bodyUI->smileyPackBrowser->itemData(index).toString(); QString filename = bodyUI->smileyPackBrowser->itemData(index).toString();
Settings::getInstance().setSmileyPack(filename); Settings::getInstance().setSmileyPack(filename);
} }
void GeneralForm::onUDPUpdated()
{
Settings::getInstance().setForceTCP(bodyUI->cbUDPDisabled->isChecked());
}
void GeneralForm::onProxyAddrEdited()
{
Settings::getInstance().setProxyAddr(bodyUI->proxyAddr->text());
}
void GeneralForm::onProxyPortEdited()
{
QString text = bodyUI->proxyPort->text();
if (text != "")
{
int port = text.toInt();
if (port < 1)
QMessageBox::warning(bodyUI->proxyPort, tr("Bad port", "title of bad port popup"), tr("The port you entered is invalid; please enter another.", "text of bad port popup"));
else
Settings::getInstance().setProxyPort(port);
}
else
Settings::getInstance().setProxyPort(-1);
}

View File

@ -37,6 +37,9 @@ private slots:
void onUseTranslationUpdated(); void onUseTranslationUpdated();
void onMakeToxPortableUpdated(); void onMakeToxPortableUpdated();
void onSmileyBrowserIndexChanged(int index); void onSmileyBrowserIndexChanged(int index);
void onUDPUpdated();
void onProxyAddrEdited();
void onProxyPortEdited();
private: private:
Ui::GeneralSettings *bodyUI; Ui::GeneralSettings *bodyUI;

View File

@ -75,6 +75,55 @@
</layout> </layout>
</widget> </widget>
</item> </item>
<item>
<widget class="QGroupBox" name="proxyGroup">
<property name="title">
<string>Proxy settings</string>
</property>
<layout class="QVBoxLayout" name="verticalLayoutProxy">
<item>
<widget class="QCheckBox" name="cbUDPDisabled">
<property name="text">
<string extracomment="Text on checkbox to disable UDP">Disable UDP (not recommended)</string>
</property>
<property name="toolTip">
<string extracomment="force tcp checkbox tooltip">This allows, e.g., toxing over Tor. It adds load to the Tox network however, so use only when necessary.</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayoutProxyLabel">
<item>
<widget class="QLabel" name="proxyAddrLabel">
<property name="text">
<string extracomment="Text on proxy addr label">Proxy address</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="proxyPortLabel">
<property name="text">
<string extracomment="Text on proxy port label">Proxy port</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayoutProxyBoxes">
<item>
<widget class="QLineEdit" name="proxyAddr">
</widget>
</item>
<item>
<widget class="QLineEdit" name="proxyPort">
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item> <item>
<spacer name="verticalSpacer"> <spacer name="verticalSpacer">
<property name="orientation"> <property name="orientation">

View File

@ -66,7 +66,7 @@ SettingsWidget::SettingsWidget(Camera* cam, QWidget* parent)
tabBar->setIconSize(QSize(20, 20)); tabBar->setIconSize(QSize(20, 20));
tabBar->setShape(QTabBar::RoundedSouth); tabBar->setShape(QTabBar::RoundedSouth);
connect(tabBar, SIGNAL(currentChanged(int)), this, SLOT(onTabChanged(int))); connect(tabBar, &QTabBar::currentChanged, this, &SettingsWidget::onTabChanged);
} }
SettingsWidget::~SettingsWidget() SettingsWidget::~SettingsWidget()

View File

@ -124,6 +124,7 @@ Widget::Widget(QWidget *parent)
connect(core, &Core::connected, this, &Widget::onConnected); connect(core, &Core::connected, this, &Widget::onConnected);
connect(core, &Core::disconnected, this, &Widget::onDisconnected); connect(core, &Core::disconnected, this, &Widget::onDisconnected);
connect(core, &Core::failedToStart, this, &Widget::onFailedToStartCore); connect(core, &Core::failedToStart, this, &Widget::onFailedToStartCore);
connect(core, &Core::badProxy, this, &Widget::onBadProxyCore);
connect(core, &Core::statusSet, this, &Widget::onStatusSet); connect(core, &Core::statusSet, this, &Widget::onStatusSet);
connect(core, &Core::usernameSet, this, &Widget::setUsername); connect(core, &Core::usernameSet, this, &Widget::setUsername);
connect(core, &Core::statusMessageSet, this, &Widget::setStatusMessage); connect(core, &Core::statusMessageSet, this, &Widget::setStatusMessage);
@ -283,12 +284,22 @@ void Widget::onDisconnected()
void Widget::onFailedToStartCore() void Widget::onFailedToStartCore()
{ {
QMessageBox critical(this); QMessageBox critical(this);
critical.setText("Toxcore failed to start, the application will terminate after you close this message."); critical.setText(tr("Toxcore failed to start, the application will terminate after you close this message."));
critical.setIcon(QMessageBox::Critical); critical.setIcon(QMessageBox::Critical);
critical.exec(); critical.exec();
qApp->quit(); qApp->quit();
} }
void Widget::onBadProxyCore()
{
QMessageBox critical(this);
critical.setText(tr("toxcore failed to start with your proxy settings. qTox cannot run; please modify your "
"settings and restart.", "popup text"));
critical.setIcon(QMessageBox::Critical);
critical.exec();
onSettingsClicked();
}
void Widget::onStatusSet(Status status) void Widget::onStatusSet(Status status)
{ {
//We have to use stylesheets here, there's no way to //We have to use stylesheets here, there's no way to

View File

@ -77,6 +77,7 @@ private slots:
void onTransferClicked(); void onTransferClicked();
void onSettingsClicked(); void onSettingsClicked();
void onFailedToStartCore(); void onFailedToStartCore();
void onBadProxyCore();
void onAvatarClicked(); void onAvatarClicked();
void onSelfAvatarLoaded(const QPixmap &pic); void onSelfAvatarLoaded(const QPixmap &pic);
void onUsernameChanged(const QString& newUsername, const QString& oldUsername); void onUsernameChanged(const QString& newUsername, const QString& oldUsername);