/*************************************************************************** * * knetworkmanager-vpnc.cpp - A NetworkManager frontend for KDE * * Copyright (C) 2006 Novell, Inc. * * Author: Helmut Schaa , * Author: Timothy Pearson * * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * **************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "knetworkmanager-vpnc.h" using namespace std; typedef KGenericFactory VPNCPluginFactory; K_EXPORT_COMPONENT_FACTORY( knetworkmanager_vpnc, VPNCPluginFactory("knetworkmanager_vpnc")); #define NAT_MODE_CISCO 0 #define NAT_MODE_NATT 1 #define NAT_MODE_DISABLED 2 char linedata [2048]; VPNCPlugin::VPNCPlugin(TQObject* parent, const char* name, const TQStringList& args) : VPNPlugin(parent, name, args) { TDELocale* loc = TDEGlobal::locale(); loc->insertCatalogue("NetworkManager-vpnc"); } VPNCPlugin::~VPNCPlugin() { } VPNConfigWidget* VPNCPlugin::CreateConfigWidget(TQWidget* parent) { return new VPNCConfig(parent); } VPNAuthenticationWidget* VPNCPlugin::CreateAuthenticationWidget(TQWidget* parent) { return new VPNCAuthentication(parent); } VPNCConfig::VPNCConfig(TQWidget* parent) : VPNConfigWidget(parent) { TQVBoxLayout* layout = new TQVBoxLayout(this, 1, 1); _vpncWidget = new VPNCConfigWidget(this); layout->addWidget(_vpncWidget); connect(_vpncWidget->pcfImport, TQT_SIGNAL(clicked()), this, TQT_SLOT( pcfImport()) ); //connect(_vpncWidget->chkOverrideUsername, TQT_SIGNAL(toggled(bool)), _vpncWidget->Xauth_username, TQT_SLOT(setEnabled(bool))); //connect(_vpncWidget->chkOverrideUsername, TQT_SIGNAL(toggled(bool)), _vpncWidget->lblUsername, TQT_SLOT(setEnabled(bool))); connect(_vpncWidget->chkUseDomain, TQT_SIGNAL(toggled(bool)), _vpncWidget->Domain, TQT_SLOT(setEnabled(bool))); connect(_vpncWidget->chkUseDomain, TQT_SIGNAL(toggled(bool)), _vpncWidget->lblDomain, TQT_SLOT(setEnabled(bool))); connect(_vpncWidget->chkIPAdresses, TQT_SIGNAL(toggled(bool)), _vpncWidget->routes, TQT_SLOT(setEnabled(bool))); connect(_vpncWidget->chkUseKeepAlive, TQT_SIGNAL(toggled(bool)), _vpncWidget->nat_keep_alive_interval, TQT_SLOT(setEnabled(bool))); connect(_vpncWidget->chkUseKeepAlive, TQT_SIGNAL(toggled(bool)), _vpncWidget->lblKeepAliveInterval, TQT_SLOT(setEnabled(bool))); _vpncWidget->cboNAT->insertItem(i18n("Cisco UDP (default)"), NAT_MODE_CISCO); _vpncWidget->cboNAT->insertItem(i18n("NAT-T"), NAT_MODE_NATT); _vpncWidget->cboNAT->insertItem(i18n("Disabled"), NAT_MODE_DISABLED); this->languageChange(); } VPNCConfig::~VPNCConfig() { } void VPNCConfig::languageChange() { } int VPNCConfig::getFileConfig(char *parameter, char *line) { int i; if (strstr(line, parameter) != NULL) { if ((strstr(line, parameter) - line) == 0) { for (i=0; i<(strlen(line)-strlen(parameter));i++) { linedata[i] = line[i+strlen(parameter)]; if ((linedata[i] == 10) || (linedata[i] == 13)) { linedata[i] = 0; } } linedata[i-1]=0; return 0; } else { return 1; } } else { return 1; } } void VPNCConfig::pcfImport() { const TQString& pcf_file = TQString(_vpncWidget->editPCF->url()); printf("Asked for PCF import from file %s\n", pcf_file.ascii()); int i; FILE *file = fopen ( pcf_file.ascii(), "r" ); if ( file != NULL ) { char line [2048]; // or other suitable maximum line size // read a line while ( fgets ( line, sizeof line, file ) != NULL ) { // Parse the line and update global variables (current line in variable "line") if (getFileConfig("Host=", line) == 0) { //strdup(linedata) printf("Got configuration parameter Host with data %s\n", linedata); _vpncWidget->IPSec_gateway->setText(linedata); } if (getFileConfig("GroupName=", line) == 0) { printf("Got configuration parameter GroupName with data %s\n", linedata); _vpncWidget->IPSec_ID->setText(linedata); } // if (getFileConfig("TcpTunnelingPort=", line) == 0) { // printf("Got configuration parameter TcpTunnelingPort with data %s\n", linedata); // _vpncWidget->IPSec_ID->setText(linedata); // } if (getFileConfig("NTDomain=", line) == 0) { if (strlen(linedata) > 0) { printf("Got configuration parameter NTDomain with data %s\n", linedata); _vpncWidget->Domain->setText(linedata); _vpncWidget->chkUseDomain->setChecked(true); } } if (getFileConfig("GroupPwd=", line) == 0) { if (strlen(linedata) > 0) { printf("Got configuration parameter GroupPwd with data %s\n", linedata); KMessageBox::information(this, TQString("Your group password is: %1\n\r\n\rYou will need this information when you log on").arg(linedata)); } } if (getFileConfig("enc_GroupPwd=", line) == 0) { if (strlen(linedata) > 0) { printf("Got configuration parameter enc_GroupPwd with data %s\n", linedata); // Decrypt the obfusticated password with /usr/lib/vpnc/cisco-decrypt string decryptcommand="/usr/lib/vpnc/cisco-decrypt "; FILE *pipe_decrypt; char decrypted_result[2048]; int i; decryptcommand.append(linedata); printf("Group password decrypt command: %s\n", decryptcommand.c_str()); if ((pipe_decrypt = popen(decryptcommand.c_str(), "r")) == NULL) { printf("Group password decrypt error\n"); } else { fgets(decrypted_result, 2048, pipe_decrypt); pclose(pipe_decrypt); for (i=0;i<2048;i++) { if (decrypted_result[i] == 0) { decrypted_result[i-1]=0; i=2048; } } printf("Group password decrypt result: '%s'\n", decrypted_result); } KMessageBox::information(this, TQString("Your group password is: %1\n\r\n\rYou will need this information when you log on").arg(decrypted_result)); } } } fclose ( file ); } else { //printf("[WARN] Unable to open configuration file %s\n", pcf_file.ascii()); KMessageBox::error(this, i18n("That configuration file does not exist!")); } } void VPNCConfig::setVPNData(const TQStringList& routes, const TQMap& properties) { // fill up our inputfields (only textfields atm) for(TQMap::ConstIterator it = properties.begin(); it != properties.end(); ++it) { TQString entry = it.key(); TQString value = it.data(); if (entry == "IPSec gateway") { _vpncWidget->IPSec_gateway->setText(value); } else if (entry == "IPSec ID") { _vpncWidget->IPSec_ID->setText(value); } else if (entry == "Xauth username") { _vpncWidget->Xauth_username->setText(value); //_vpncWidget->chkOverrideUsername->setChecked(true); } else if (entry == "Domain") { _vpncWidget->Domain->setText(value); _vpncWidget->chkUseDomain->setChecked(true); } else if (entry == "NAT-Keepalive packet interval") { _vpncWidget->nat_keep_alive_interval->setText(value); _vpncWidget->chkUseKeepAlive->setChecked(true); } // backwards compatibility else if (entry == "Disable NAT Traversal") { _vpncWidget->cboNAT->setCurrentItem(NAT_MODE_DISABLED); } else if (entry == "NAT Traversal Mode") { if (value == "natt") _vpncWidget->cboNAT->setCurrentItem(NAT_MODE_NATT); else if (value == "cisco-udp") _vpncWidget->cboNAT->setCurrentItem(NAT_MODE_CISCO); else if (value == "none") _vpncWidget->cboNAT->setCurrentItem(NAT_MODE_DISABLED); else { // FIXME: unknown NAT mode } } else if (entry == "Enable Single DES") { _vpncWidget->chkSingleDES->setChecked(value == "yes" || value == "true"); } } // set routes if (!routes.empty()) { _vpncWidget->chkIPAdresses->setChecked(true); _vpncWidget->routes->setText(routes.join(" ")); } } TQMap VPNCConfig::getVPNProperties() { // build a StingList of properties TQMap strlist; strlist.insert("IPSec gateway", TQString(_vpncWidget->IPSec_gateway->text())); strlist.insert("IPSec ID", TQString(_vpncWidget->IPSec_ID->text())); //if (_vpncWidget->chkOverrideUsername->isChecked()) strlist.insert("Xauth username", TQString(_vpncWidget->Xauth_username->text())); if (_vpncWidget->chkUseDomain->isChecked()) strlist.insert("Domain", TQString(_vpncWidget->Domain->text())); if (_vpncWidget->chkUseKeepAlive->isChecked()) strlist.insert("NAT-Keepalive packet interval", TQString(_vpncWidget->nat_keep_alive_interval->text())); switch (_vpncWidget->cboNAT->currentItem()) { case NAT_MODE_CISCO: strlist.insert("NAT Traversal Mode", "cisco-udp"); break; case NAT_MODE_NATT: strlist.insert("NAT Traversal Mode", "natt"); break; case NAT_MODE_DISABLED: default: strlist.insert("NAT Traversal Mode", "none"); break; } if (_vpncWidget->chkSingleDES->isChecked()) strlist.insert("Enable Single DES", "yes"); else strlist.insert("Enable Single DES", "no"); return strlist; } TQStringList VPNCConfig::getVPNRoutes() { TQStringList strlist; if(_vpncWidget->chkIPAdresses->isChecked()) { strlist = TQStringList::split(" ", _vpncWidget->routes->text()); } return strlist; } bool VPNCConfig::hasChanged() { return true; } bool VPNCConfig::isValid(TQStringList& err_msg) { bool retval = true; if(_vpncWidget->IPSec_gateway->text() == "" || _vpncWidget->IPSec_ID->text() == "") { err_msg.append(i18n("At least the gateway and group has to be supplied.")); retval = false; } return retval; } VPNCAuthentication::VPNCAuthentication(TQWidget* parent, char* name) : VPNAuthenticationWidget(parent, name) { TQVBoxLayout* layout = new TQVBoxLayout(this, 1, 1); _vpncAuth = new VPNCAuthenticationWidget(this); layout->addWidget(_vpncAuth); } VPNCAuthentication::~VPNCAuthentication() { } TQMap VPNCAuthentication::getPasswords() { TQMap pwds; pwds.insert("Xauth password", TQString(_vpncAuth->editUserPassword->password())); if (_vpncAuth->chkObfusticated->isChecked()) { // Decrypt the obfusticated password with /usr/lib/vpnc/cisco-decrypt string decryptcommand="/usr/lib/vpnc/cisco-decrypt "; FILE *pipe_decrypt; char decrypted_result[2048]; int i; decryptcommand.append(_vpncAuth->editGroupPassword->password()); printf("Group password decrypt command: %s\n", decryptcommand.c_str()); if ((pipe_decrypt = popen(decryptcommand.c_str(), "r")) == NULL) { printf("Group password decrypt error\n"); } else { fgets(decrypted_result, 2048, pipe_decrypt); pclose(pipe_decrypt); for (i=0;i<2048;i++) { if (decrypted_result[i] == 0) { decrypted_result[i-1]=0; i=2048; } } printf("Group password decrypt result: '%s'\n", decrypted_result); pwds.insert("IPSec secret", TQString(decrypted_result)); } } else { pwds.insert("IPSec secret", TQString(_vpncAuth->editGroupPassword->password())); } return pwds; } void VPNCAuthentication::setPasswords(TQString name, TQString value) { if (name == TQString("Xauth password")) { _vpncAuth->editUserPassword->erase(); _vpncAuth->editUserPassword->insert(value); } else if (name == TQString("IPSec secret")) { _vpncAuth->editGroupPassword->erase(); _vpncAuth->editGroupPassword->insert(value); } }