* refactoring: improved the performance of secure_settings * bugfix: fixed textFields on PageSetupWizardCredentials * bugfix: fixed scrolling by keys on PageSettingsApiServerInfo * chore: hide site links for ios (#1374) * chore: fixed log output with split tunneling info * chore: hide "open logs folder" button for mobule platforms * chore: fixed again log output with split tunneling info * chore: bump version * Install apparmor (#1379) Install apparmor * chore: returned the backup page for androidTV * Enable PFS for Windows IKEv2 * refactoring: moved api info pages from ServerInfo * refactoring: moved gateway interaction functions to a separate class * bugfix: fixed storeEndpoint parsing * chore: returned links for mobile platforms * Update VPN protocol descriptions * Update VPN description texts * feature: added pages for subscription settings feature * feature: added page for export api native configs * feature: added error handling and minor ui fixes * refactor: update ios build configuration to use automatic code signing and prebuilt OpenVPNAdapter framework * feat: remove OpenVPNAdapter submodule * feat: remove ios openvpn script and associated cmake configuration * Update README.md * Update README_RU.md * Update README.md fix link * feature: added share vpn key to subscription settings page * bugfix: fixed possible crush on android * add timeouts in ipc client init * apply timeouts only for Windows * apply format to file * refactoring: simplified the validity check of the config before connection - improved project structure * bugfix: fixed visability of share drawer * feature: added 409 error handling from server response * chore: fixed android build * chore: fixed qr code display * Rewrite timeouts using waitForSource * feature: added error messages handler * feature: added issued configs info parsing * feature: added functionality to revoke api configs * chore: added links to instructions * chore: fixed qr code with vpnkey processing * chore: fixed native config post processing * chore: added link to android tv instruction * change node to IpcProcessTun2SocksReplica * chore: minor ui fixes * Update Windows OpenSSL (#1426) * Update Windows OpenSSL to 3.0.16 and add shared library for QSslSocket plugin * chore: update link to submodule 3rd-prebuild --------- Co-authored-by: vladimir.kuznetsov <nethiuswork@gmail.com> * chore: added 404 handling for revoke configs - added revoke before remove api server for premium v2 * chore: added log to see proxy decrypt errors * chore: minor ui fix * chore: bump version * bugfix: fixed mobile controllers initialization (#1436) * bugfix: fixed mobile controllers initialization * chore: bump version * Merge pull request #1440 from amnezia-vpn/feature/subscription-settings-page feature/subscription settings page --------- Co-authored-by: vladimir.kuznetsov <nethiuswork@gmail.com> Co-authored-by: pokamest <pokamest@gmail.com> Co-authored-by: Mykola Baibuz <mykola.baibuz@gmail.com> Co-authored-by: Yaroslav Yashin <yaroslav.yashin@gmail.com> Co-authored-by: KsZnak <ksu@amnezia.org> Co-authored-by: Cyril Anisimov <CyAn84@gmail.com>
177 lines
5.8 KiB
C++
177 lines
5.8 KiB
C++
#include "connectionController.h"
|
|
|
|
#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS)
|
|
#include <QGuiApplication>
|
|
#else
|
|
#include <QApplication>
|
|
#endif
|
|
|
|
#include "core/controllers/vpnConfigurationController.h"
|
|
#include "version.h"
|
|
|
|
ConnectionController::ConnectionController(const QSharedPointer<ServersModel> &serversModel,
|
|
const QSharedPointer<ContainersModel> &containersModel,
|
|
const QSharedPointer<ClientManagementModel> &clientManagementModel,
|
|
const QSharedPointer<VpnConnection> &vpnConnection, const std::shared_ptr<Settings> &settings,
|
|
QObject *parent)
|
|
: QObject(parent),
|
|
m_serversModel(serversModel),
|
|
m_containersModel(containersModel),
|
|
m_clientManagementModel(clientManagementModel),
|
|
m_vpnConnection(vpnConnection),
|
|
m_settings(settings)
|
|
{
|
|
connect(m_vpnConnection.get(), &VpnConnection::connectionStateChanged, this, &ConnectionController::onConnectionStateChanged);
|
|
connect(this, &ConnectionController::connectToVpn, m_vpnConnection.get(), &VpnConnection::connectToVpn, Qt::QueuedConnection);
|
|
connect(this, &ConnectionController::disconnectFromVpn, m_vpnConnection.get(), &VpnConnection::disconnectFromVpn, Qt::QueuedConnection);
|
|
|
|
connect(this, &ConnectionController::connectButtonClicked, this, &ConnectionController::toggleConnection, Qt::QueuedConnection);
|
|
|
|
m_state = Vpn::ConnectionState::Disconnected;
|
|
}
|
|
|
|
void ConnectionController::openConnection()
|
|
{
|
|
#if !defined(Q_OS_ANDROID) && !defined(Q_OS_IOS)
|
|
if (!Utils::processIsRunning(Utils::executable(SERVICE_NAME, false), true)) {
|
|
emit connectionErrorOccurred(ErrorCode::AmneziaServiceNotRunning);
|
|
return;
|
|
}
|
|
#endif
|
|
|
|
int serverIndex = m_serversModel->getDefaultServerIndex();
|
|
QJsonObject serverConfig = m_serversModel->getServerConfig(serverIndex);
|
|
|
|
DockerContainer container = qvariant_cast<DockerContainer>(m_serversModel->data(serverIndex, ServersModel::Roles::DefaultContainerRole));
|
|
|
|
if (!m_containersModel->isSupportedByCurrentPlatform(container)) {
|
|
emit connectionErrorOccurred(ErrorCode::NotSupportedOnThisPlatform);
|
|
return;
|
|
}
|
|
|
|
QSharedPointer<ServerController> serverController(new ServerController(m_settings));
|
|
VpnConfigurationsController vpnConfigurationController(m_settings, serverController);
|
|
|
|
QJsonObject containerConfig = m_containersModel->getContainerConfig(container);
|
|
ServerCredentials credentials = m_serversModel->getServerCredentials(serverIndex);
|
|
|
|
auto dns = m_serversModel->getDnsPair(serverIndex);
|
|
|
|
auto vpnConfiguration = vpnConfigurationController.createVpnConfiguration(dns, serverConfig, containerConfig, container);
|
|
emit connectToVpn(serverIndex, credentials, container, vpnConfiguration);
|
|
}
|
|
|
|
void ConnectionController::closeConnection()
|
|
{
|
|
emit disconnectFromVpn();
|
|
}
|
|
|
|
ErrorCode ConnectionController::getLastConnectionError()
|
|
{
|
|
return m_vpnConnection->lastError();
|
|
}
|
|
|
|
void ConnectionController::onConnectionStateChanged(Vpn::ConnectionState state)
|
|
{
|
|
m_state = state;
|
|
|
|
m_isConnected = false;
|
|
m_connectionStateText = tr("Connecting...");
|
|
switch (state) {
|
|
case Vpn::ConnectionState::Connected: {
|
|
m_isConnectionInProgress = false;
|
|
m_isConnected = true;
|
|
m_connectionStateText = tr("Connected");
|
|
break;
|
|
}
|
|
case Vpn::ConnectionState::Connecting: {
|
|
m_isConnectionInProgress = true;
|
|
break;
|
|
}
|
|
case Vpn::ConnectionState::Reconnecting: {
|
|
m_isConnectionInProgress = true;
|
|
m_connectionStateText = tr("Reconnecting...");
|
|
break;
|
|
}
|
|
case Vpn::ConnectionState::Disconnected: {
|
|
m_isConnectionInProgress = false;
|
|
m_connectionStateText = tr("Connect");
|
|
break;
|
|
}
|
|
case Vpn::ConnectionState::Disconnecting: {
|
|
m_isConnectionInProgress = true;
|
|
m_connectionStateText = tr("Disconnecting...");
|
|
break;
|
|
}
|
|
case Vpn::ConnectionState::Preparing: {
|
|
m_isConnectionInProgress = true;
|
|
m_connectionStateText = tr("Preparing...");
|
|
break;
|
|
}
|
|
case Vpn::ConnectionState::Error: {
|
|
m_isConnectionInProgress = false;
|
|
m_connectionStateText = tr("Connect");
|
|
emit connectionErrorOccurred(getLastConnectionError());
|
|
break;
|
|
}
|
|
case Vpn::ConnectionState::Unknown: {
|
|
m_isConnectionInProgress = false;
|
|
m_connectionStateText = tr("Connect");
|
|
emit connectionErrorOccurred(getLastConnectionError());
|
|
break;
|
|
}
|
|
}
|
|
emit connectionStateChanged();
|
|
}
|
|
|
|
void ConnectionController::onCurrentContainerUpdated()
|
|
{
|
|
if (m_isConnected || m_isConnectionInProgress) {
|
|
emit reconnectWithUpdatedContainer(tr("Settings updated successfully, reconnnection..."));
|
|
openConnection();
|
|
} else {
|
|
emit reconnectWithUpdatedContainer(tr("Settings updated successfully"));
|
|
}
|
|
}
|
|
|
|
void ConnectionController::onTranslationsUpdated()
|
|
{
|
|
// get translated text of current state
|
|
onConnectionStateChanged(getCurrentConnectionState());
|
|
}
|
|
|
|
Vpn::ConnectionState ConnectionController::getCurrentConnectionState()
|
|
{
|
|
return m_state;
|
|
}
|
|
|
|
QString ConnectionController::connectionStateText() const
|
|
{
|
|
return m_connectionStateText;
|
|
}
|
|
|
|
void ConnectionController::toggleConnection()
|
|
{
|
|
if (m_state == Vpn::ConnectionState::Preparing) {
|
|
emit preparingConfig();
|
|
return;
|
|
}
|
|
|
|
if (isConnectionInProgress()) {
|
|
closeConnection();
|
|
} else if (isConnected()) {
|
|
closeConnection();
|
|
} else {
|
|
emit prepareConfig();
|
|
}
|
|
}
|
|
|
|
bool ConnectionController::isConnectionInProgress() const
|
|
{
|
|
return m_isConnectionInProgress;
|
|
}
|
|
|
|
bool ConnectionController::isConnected() const
|
|
{
|
|
return m_isConnected;
|
|
}
|