#include "vpncontrol.h"
#include "stdio.h"
+#include <QSettings>
+
VPNControl::VPNControl(QObject *parent) :
QObject(parent),
vpnProcess(NULL),
- vpnStatus(VPNSTATUS_INVALID)
+ vpnStatus(VPNSTATUS_INVALID),
+ server(""),
+ port(1194),
+ compressed(true),
+ useTLS(true),
+ tlsDirection(1)
{
+ // Read in the settings
+ QSettings settings;
+ settings.setValue("showAll", false);
+
+ // Read configuration settings
+ server = settings.value("server", "127.0.0.1").toString();
+ port = settings.value("port", 1194).toInt();
+ compressed = settings.value("compressed", true).toBool();
+ useTLS = settings.value("useTLS", true).toBool();
+ tlsDirection = settings.value("tlsDirection", 1).toInt();
+ caCertFile = settings.value("caCertFile", "").toString();
+ clientCertFile = settings.value("clientCertFile", "").toString();
+ clientKeyFile = settings.value("clientKeyFile", "").toString();
+ tlsKeyFile = settings.value("tlsKeyFile", "").toString();
+ configFile = settings.value("configFile", "").toString();
}
void VPNControl::initialise()
if (vpnStatus != newStatus) {
vpnStatus = newStatus;
emit statusChanged(newStatus);
- printf ("Emitting status %d\n", newStatus);
+ }
+}
+int VPNControl::getTlsDirection() const
+{
+ return tlsDirection;
+}
+
+void VPNControl::setTlsDirection(int value)
+{
+ if (value != tlsDirection) {
+ tlsDirection = value;
+ settingsSetValue("tlsDirection", value);
+ emit tlsDirectionChanged (value);
+ }
+}
+
+bool VPNControl::getUseTLS() const
+{
+ return useTLS;
+}
+
+void VPNControl::setUseTLS(bool value)
+{
+ if (value != useTLS) {
+ useTLS = value;
+ settingsSetValue("useTLS", value);
+ emit useTLSChanged(useTLS);
+ }
+}
+
+bool VPNControl::getCompressed() const
+{
+ return compressed;
+}
+
+void VPNControl::setCompressed(bool value)
+{
+ if (value != compressed) {
+ compressed = value;
+ settingsSetValue("compressed", value);
+ emit compressedChanged(compressed);
+ }
+}
+
+unsigned int VPNControl::getPort() const
+{
+ return port;
+}
+
+void VPNControl::setPort(unsigned int value)
+{
+ if (value != port) {
+ port = value;
+ settingsSetValue("port", value);
+ emit portChanged(port);
+ }
+}
+
+QString VPNControl::getServer() const
+{
+ return server;
+}
+
+void VPNControl::setServer(const QString &value)
+{
+ if (value != server) {
+ server = value;
+ settingsSetValue("server", value);
+ emit serverChanged(server);
+ }
+}
+
+QString VPNControl::getCaCertFile () const
+{
+ return caCertFile;
+}
+
+void VPNControl::setCaCertFile(const QString &value)
+{
+ if (value != caCertFile) {
+ caCertFile = value;
+ settingsSetValue("caCertFile", value);
+ emit caCertFileChanged(caCertFile);
+ }
+}
+
+void VPNControl::setClientCertFile(const QString &value)
+{
+ if (value != clientCertFile) {
+ clientCertFile = value;
+ settingsSetValue("clientCertFile", value);
+ emit clientCertFileChanged(clientCertFile);
+ }
+}
+
+void VPNControl::setClientKeyFile(const QString &value)
+{
+ if (value != clientKeyFile) {
+ clientKeyFile = value;
+ settingsSetValue("clientKeyFile", value);
+ emit clientKeyFileChanged(clientKeyFile);
+ }
+}
+
+void VPNControl::setTlsKeyFile(const QString &value)
+{
+ if (value != tlsKeyFile) {
+ tlsKeyFile = value;
+ settingsSetValue("tlsKeyFile", value);
+ emit tlsKeyFileChanged(tlsKeyFile);
+ }
+}
+
+void VPNControl::setConfigFile(const QString &value)
+{
+ if (value != configFile) {
+ configFile = value;
+ settingsSetValue("configFile", value);
+ emit tlsKeyFileChanged(configFile);
}
}
+QString VPNControl::getClientCertFile () const
+{
+ return clientCertFile;
+}
+
+QString VPNControl::getClientKeyFile () const
+{
+ return clientKeyFile;
+}
+
+QString VPNControl::getTlsKeyFile () const
+{
+ return tlsKeyFile;
+}
+
+QString VPNControl::getConfigFile () const
+{
+ return configFile;
+}
+
+QString VPNControl::getLogText() const
+{
+ return logText;
+}
+
+void VPNControl::setLogText(const QString &value)
+{
+ logText = value;
+ emit logTextChanged(logText);
+}
+
+void VPNControl::settingsSetValue (QString key, QString value) {
+ QSettings settings;
+
+ settings.setValue(key, value);
+}
+
+void VPNControl::settingsSetValue (QString key, int value) {
+ QSettings settings;
+
+ settings.setValue(key, value);
+}
+
void VPNControl::vpnConnect() {
if (vpnProcess != NULL) {
printf ("Process already running.\n");
}
else {
- printf ("Connect\n");
-
vpnProcess = new QProcess();
- //QString program = "/home/nemo/Documents/Development/Projects/Stooge/stooge";
QString program = "openvpn";
- QStringList arguments;
- arguments << "/home/nemo/Documents/Configure/OpenVPN/client.ovpn";
-
+ collectArguments ();
vpnProcess->setReadChannel(QProcess::StandardOutput);
connect(vpnProcess, SIGNAL(error(QProcess::ProcessError)), this, SLOT(readError(QProcess::ProcessError)));
connect(vpnProcess, SIGNAL(readyRead()), this, SLOT(readData()));
vpnProcess->start(program, arguments);
vpnProcess->closeWriteChannel();
setStatus(VPNSTATUS_INITIALISING);
+ arguments.clear();
+ }
+}
+
+void VPNControl::collectArguments () {
+ arguments.clear();
+
+ addArgumentNonempty("config", configFile);
+ addArgumentNonempty("remote", server);
+ addArgumentNonempty("port", QString::number(port));
+ addOption("comp-lzo", compressed);
+ if ((useTLS) && (!tlsKeyFile.isEmpty())) {
+ addArgument("tls-auth", tlsKeyFile);
+ addValue(QString::number(tlsDirection));
+ }
+ addArgumentNonempty("ca", caCertFile);
+ addArgumentNonempty("cert", clientCertFile);
+ addArgumentNonempty("key", clientKeyFile);
+}
+
+void VPNControl::addArgument (QString key, QString value) {
+ QString argument;
+
+ argument = "--" + key;
+ arguments.append(argument);
+ if (!value.isEmpty()) {
+ arguments.append(value);
+ }
+}
+
+void VPNControl::addArgumentNonempty (QString key, QString value) {
+ QString argument;
+
+ if (!value.isEmpty()) {
+ argument = "--" + key;
+ arguments.append(argument);
+ arguments.append(value);
+ }
+}
+
+void VPNControl::addArgument (QString key) {
+ QString argument;
+
+ argument = "--" + key;
+ arguments.append(argument);
+}
+
+void VPNControl::addOption (QString key, bool add) {
+ if (add) {
+ addArgument (key);
}
}
+void VPNControl::addValue (QString key) {
+ arguments.append(key);
+}
+
void VPNControl::vpnDisconnect() {
if (vpnProcess != NULL) {
- printf ("Disconnect\n");
vpnProcess->terminate();
setStatus(VPNSTATUS_DISCONNECTING);
void VPNControl::readData() {
while (vpnProcess->canReadLine()) {
QByteArray read = vpnProcess->readLine();
- printf ("Output: %s", read.data());
+ //printf ("Output: %s", read.data());
+
+ logAppend(read);
+
if (read.endsWith("Initialization Sequence Completed\n")) {
- printf ("We're connected!\n");
setStatus(VPNSTATUS_CONNECTED);
}
}
}
void VPNControl::started() {
- printf ("Started\n");
setStatus(VPNSTATUS_CONNECTING);
}
void VPNControl::finished(int code) {
- printf ("Finished with code %d\n", code);
if (vpnProcess != NULL) {
//delete vpnProcess;
vpnProcess = NULL;
// Disconnect
vpnDisconnect();
}
+
+void VPNControl::updateConfiguration()
+{
+ printf ("Update configuration\n");
+}
+
+void VPNControl::logAppend(const QString &text)
+{
+ if (!text.isEmpty()) {
+ // How many lines to add
+ int newLines = text.count('\n');
+ int currentLines = logText.count('\n');
+ int removeLines = currentLines + newLines - 18;
+
+ // Remove excess lines
+// while (removeLines > 0) {
+// int nextLine = logText.indexOf('\n');
+// if (nextLine > 0) {
+// logText = logText.right(nextLine);
+// }
+// removeLines--;
+// }
+
+ // Add new lines
+ logText.append(text);
+ emit logTextChanged(logText);
+ }
+}
+