Vladimir Golovnev (Glassez)
9 years ago
24 changed files with 2287 additions and 1972 deletions
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,160 @@
@@ -0,0 +1,160 @@
|
||||
/*
|
||||
* Bittorrent Client using Qt and libtorrent. |
||||
* Copyright (C) 2016 Vladimir Golovnev <glassez@yandex.ru> |
||||
* |
||||
* This program is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU General Public License |
||||
* as published by the Free Software Foundation; either version 2 |
||||
* of the License, or (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
||||
* |
||||
* In addition, as a special exception, the copyright holders give permission to |
||||
* link this program with the OpenSSL project's "OpenSSL" library (or with |
||||
* modified versions of it that use the same license as the "OpenSSL" library), |
||||
* and distribute the linked executables. You must obey the GNU General Public |
||||
* License in all respects for all of the code used other than "OpenSSL". If you |
||||
* modify file(s), you may extend this exception to your version of the file(s), |
||||
* but you are not obligated to do so. If you do not wish to do so, delete this |
||||
* exception statement from your version. |
||||
*/ |
||||
|
||||
#include "proxyconfigurationmanager.h" |
||||
#include "base/settingsstorage.h" |
||||
|
||||
#define SETTINGS_KEY(name) "Network/Proxy/" name |
||||
const QString KEY_DISABLED = SETTINGS_KEY("Disabled"); |
||||
const QString KEY_TYPE = SETTINGS_KEY("Type"); |
||||
const QString KEY_IP = SETTINGS_KEY("IP"); |
||||
const QString KEY_PORT = SETTINGS_KEY("Port"); |
||||
const QString KEY_AUTHENTICATION = SETTINGS_KEY("Authentication"); |
||||
const QString KEY_USERNAME = SETTINGS_KEY("Username"); |
||||
const QString KEY_PASSWORD = SETTINGS_KEY("Password"); |
||||
|
||||
namespace |
||||
{ |
||||
inline SettingsStorage *settings() { return SettingsStorage::instance(); } |
||||
|
||||
inline bool isSameConfig(const Net::ProxyConfiguration &conf1, const Net::ProxyConfiguration &conf2) |
||||
{ |
||||
return conf1.type == conf2.type |
||||
&& conf1.ip == conf2.ip |
||||
&& conf1.port == conf2.port |
||||
&& conf1.username == conf2.username |
||||
&& conf1.password == conf2.password; |
||||
} |
||||
} |
||||
|
||||
using namespace Net; |
||||
|
||||
ProxyConfigurationManager *ProxyConfigurationManager::m_instance = nullptr; |
||||
|
||||
ProxyConfigurationManager::ProxyConfigurationManager(QObject *parent) |
||||
: QObject(parent) |
||||
{ |
||||
m_proxyDisabled = settings()->loadValue(KEY_DISABLED, false).toBool(); |
||||
m_config.type = static_cast<ProxyType>( |
||||
settings()->loadValue(KEY_TYPE, static_cast<int>(ProxyType::None)).toInt()); |
||||
if ((m_config.type < ProxyType::None) || (m_config.type > ProxyType::SOCKS4)) |
||||
m_config.type = ProxyType::None; |
||||
m_config.ip = settings()->loadValue(KEY_IP, "0.0.0.0").toString(); |
||||
m_config.port = static_cast<ushort>(settings()->loadValue(KEY_PORT, 8080).toUInt()); |
||||
m_config.username = settings()->loadValue(KEY_USERNAME).toString(); |
||||
m_config.password = settings()->loadValue(KEY_PASSWORD).toString(); |
||||
} |
||||
|
||||
void ProxyConfigurationManager::initInstance() |
||||
{ |
||||
if (!m_instance) |
||||
m_instance = new ProxyConfigurationManager; |
||||
} |
||||
|
||||
void ProxyConfigurationManager::freeInstance() |
||||
{ |
||||
delete m_instance; |
||||
} |
||||
|
||||
ProxyConfigurationManager *ProxyConfigurationManager::instance() |
||||
{ |
||||
return m_instance; |
||||
} |
||||
|
||||
ProxyConfiguration ProxyConfigurationManager::proxyConfiguration() const |
||||
{ |
||||
return m_config; |
||||
} |
||||
|
||||
void ProxyConfigurationManager::setProxyConfiguration(const ProxyConfiguration &config) |
||||
{ |
||||
if (!isSameConfig(config, m_config)) { |
||||
m_config = config; |
||||
settings()->storeValue(KEY_TYPE, static_cast<int>(config.type)); |
||||
settings()->storeValue(KEY_IP, config.ip); |
||||
settings()->storeValue(KEY_PORT, config.port); |
||||
settings()->storeValue(KEY_USERNAME, config.username); |
||||
settings()->storeValue(KEY_PASSWORD, config.password); |
||||
configureProxy(); |
||||
|
||||
emit proxyConfigurationChanged(); |
||||
} |
||||
} |
||||
|
||||
bool ProxyConfigurationManager::isProxyDisabled() const |
||||
{ |
||||
return m_proxyDisabled; |
||||
} |
||||
|
||||
void ProxyConfigurationManager::setProxyDisabled(bool disabled) |
||||
{ |
||||
if (m_proxyDisabled != disabled) { |
||||
settings()->storeValue(KEY_DISABLED, disabled); |
||||
m_proxyDisabled = disabled; |
||||
} |
||||
} |
||||
|
||||
bool ProxyConfigurationManager::isAuthenticationRequired() const |
||||
{ |
||||
return m_config.type == ProxyType::SOCKS5_PW |
||||
|| m_config.type == ProxyType::HTTP_PW; |
||||
} |
||||
|
||||
void ProxyConfigurationManager::configureProxy() |
||||
{ |
||||
// Define environment variables for urllib in search engine plugins
|
||||
QString proxyStrHTTP, proxyStrSOCK; |
||||
if (!m_proxyDisabled) { |
||||
switch (m_config.type) { |
||||
case ProxyType::HTTP_PW: |
||||
proxyStrHTTP = QString("http://%1:%2@%3:%4").arg(m_config.username) |
||||
.arg(m_config.password).arg(m_config.ip).arg(m_config.port); |
||||
break; |
||||
case ProxyType::HTTP: |
||||
proxyStrHTTP = QString("http://%1:%2").arg(m_config.ip).arg(m_config.port); |
||||
break; |
||||
case ProxyType::SOCKS5: |
||||
proxyStrSOCK = QString("%1:%2").arg(m_config.ip).arg(m_config.port); |
||||
break; |
||||
case ProxyType::SOCKS5_PW: |
||||
proxyStrSOCK = QString("%1:%2@%3:%4").arg(m_config.username) |
||||
.arg(m_config.password).arg(m_config.ip).arg(m_config.port); |
||||
break; |
||||
default: |
||||
qDebug("Disabling HTTP communications proxy"); |
||||
} |
||||
|
||||
qDebug("HTTP communications proxy string: %s" |
||||
, qPrintable((m_config.type == ProxyType::SOCKS5) || (m_config.type == ProxyType::SOCKS5_PW) |
||||
? proxyStrSOCK : proxyStrHTTP)); |
||||
} |
||||
|
||||
qputenv("http_proxy", proxyStrHTTP.toLocal8Bit()); |
||||
qputenv("https_proxy", proxyStrHTTP.toLocal8Bit()); |
||||
qputenv("sock_proxy", proxyStrSOCK.toLocal8Bit()); |
||||
} |
@ -0,0 +1,87 @@
@@ -0,0 +1,87 @@
|
||||
/*
|
||||
* Bittorrent Client using Qt and libtorrent. |
||||
* Copyright (C) 2016 Vladimir Golovnev <glassez@yandex.ru> |
||||
* |
||||
* This program is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU General Public License |
||||
* as published by the Free Software Foundation; either version 2 |
||||
* of the License, or (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
||||
* |
||||
* In addition, as a special exception, the copyright holders give permission to |
||||
* link this program with the OpenSSL project's "OpenSSL" library (or with |
||||
* modified versions of it that use the same license as the "OpenSSL" library), |
||||
* and distribute the linked executables. You must obey the GNU General Public |
||||
* License in all respects for all of the code used other than "OpenSSL". If you |
||||
* modify file(s), you may extend this exception to your version of the file(s), |
||||
* but you are not obligated to do so. If you do not wish to do so, delete this |
||||
* exception statement from your version. |
||||
*/ |
||||
|
||||
#ifndef NET_PROXYCONFIGURATIONMANAGER_H |
||||
#define NET_PROXYCONFIGURATIONMANAGER_H |
||||
|
||||
#include <QObject> |
||||
|
||||
namespace Net |
||||
{ |
||||
enum class ProxyType |
||||
{ |
||||
None = 0, |
||||
HTTP = 1, |
||||
SOCKS5 = 2, |
||||
HTTP_PW = 3, |
||||
SOCKS5_PW = 4, |
||||
SOCKS4 = 5 |
||||
}; |
||||
|
||||
struct ProxyConfiguration |
||||
{ |
||||
ProxyType type = ProxyType::None; |
||||
QString ip = "0.0.0.0"; |
||||
ushort port = 8080; |
||||
QString username; |
||||
QString password; |
||||
}; |
||||
|
||||
class ProxyConfigurationManager: public QObject |
||||
{ |
||||
Q_OBJECT |
||||
Q_DISABLE_COPY(ProxyConfigurationManager) |
||||
|
||||
explicit ProxyConfigurationManager(QObject *parent = nullptr); |
||||
~ProxyConfigurationManager() = default; |
||||
|
||||
public: |
||||
static void initInstance(); |
||||
static void freeInstance(); |
||||
static ProxyConfigurationManager *instance(); |
||||
|
||||
ProxyConfiguration proxyConfiguration() const; |
||||
void setProxyConfiguration(const ProxyConfiguration &config); |
||||
bool isProxyDisabled() const; |
||||
void setProxyDisabled(bool disabled); |
||||
|
||||
bool isAuthenticationRequired() const; |
||||
|
||||
signals: |
||||
void proxyConfigurationChanged(); |
||||
|
||||
private: |
||||
void configureProxy(); |
||||
|
||||
static ProxyConfigurationManager *m_instance; |
||||
ProxyConfiguration m_config; |
||||
bool m_proxyDisabled; |
||||
}; |
||||
} |
||||
|
||||
#endif // NET_PROXYCONFIGURATIONMANAGER_H
|
@ -0,0 +1,73 @@
@@ -0,0 +1,73 @@
|
||||
/*
|
||||
* Bittorrent Client using Qt and libtorrent. |
||||
* Copyright (C) 2016 Vladimir Golovnev <glassez@yandex.ru> |
||||
* |
||||
* This program is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU General Public License |
||||
* as published by the Free Software Foundation; either version 2 |
||||
* of the License, or (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
||||
* |
||||
* In addition, as a special exception, the copyright holders give permission to |
||||
* link this program with the OpenSSL project's "OpenSSL" library (or with |
||||
* modified versions of it that use the same license as the "OpenSSL" library), |
||||
* and distribute the linked executables. You must obey the GNU General Public |
||||
* License in all respects for all of the code used other than "OpenSSL". If you |
||||
* modify file(s), you may extend this exception to your version of the file(s), |
||||
* but you are not obligated to do so. If you do not wish to do so, delete this |
||||
* exception statement from your version. |
||||
*/ |
||||
|
||||
#ifndef SETTINGVALUE_H |
||||
#define SETTINGVALUE_H |
||||
|
||||
#include <functional> |
||||
#include <QString> |
||||
|
||||
#include "settingsstorage.h" |
||||
|
||||
template <typename T> |
||||
class CachedSettingValue |
||||
{ |
||||
using ProxyFunc = std::function<T (const T&)>; |
||||
|
||||
public: |
||||
explicit CachedSettingValue(const char *keyName, const T &defaultValue = T() |
||||
, ProxyFunc proxyFunc = [](const T &value) { return value; }) |
||||
: m_keyName(QLatin1String(keyName)) |
||||
, m_value(proxyFunc(SettingsStorage::instance()->loadValue( |
||||
m_keyName, defaultValue).template value<T>())) |
||||
{ |
||||
} |
||||
|
||||
T value() const |
||||
{ |
||||
return m_value; |
||||
} |
||||
|
||||
CachedSettingValue<T> &operator=(const T &newValue) |
||||
{ |
||||
m_value = newValue; |
||||
SettingsStorage::instance()->storeValue(m_keyName, m_value); |
||||
return *this; |
||||
} |
||||
|
||||
operator T() const |
||||
{ |
||||
return value(); |
||||
} |
||||
|
||||
private: |
||||
const QString m_keyName; |
||||
T m_value; |
||||
}; |
||||
|
||||
#endif // SETTINGVALUE_H
|
Loading…
Reference in new issue