You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kftpgrabber/kftpgrabber/src/widgets/bookmarks/editor.cpp

493 lines
17 KiB

/*
* This file is part of the KFTPGrabber project
*
* Copyright (C) 2003-2004 by the KFTPGrabber developers
* Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
* Copyright (C) 2004 Markus Brueffer <markus@brueffer.de>
*
* 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
* is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
* NON-INFRINGEMENT. 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 Steet, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* 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) with this exception, 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. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
#include <ntqlayout.h>
#include <ntqpushbutton.h>
#include <ntqcheckbox.h>
#include <ntqgroupbox.h>
#include <ntqspinbox.h>
#include <ntqsplitter.h>
#include <ntqtextedit.h>
#include <ntqtabwidget.h>
#include <tdeglobal.h>
#include <kcharsets.h>
#include <tdelocale.h>
#include <kiconloader.h>
#include <klineedit.h>
#include <kpassdlg.h>
#include <tdemessagebox.h>
#include <tdepopupmenu.h>
#include <kcombobox.h>
#include <kurlrequester.h>
#include <kguiitem.h>
#include <tdefiledialog.h>
#include <tdeio/job.h>
#include "kftpapi.h"
#include "kftpbookmarks.h"
#include "misc/kftpconfig.h"
#include "misc.h"
#include "editor.h"
#include "listview.h"
#include "importwizard.h"
#include "editortls.h"
using namespace KFTPGrabberBase;
namespace KFTPWidgets {
namespace Bookmarks {
TDEActionCollection *BookmarkEditor::actionCollection()
{
return KFTPAPI::getInstance()->mainWindow()->actionCollection();
}
BookmarkEditor::BookmarkEditor(TQWidget *parent, const char *name)
: KDialogBase(parent, name, true, "FTP Bookmark Editor", User2|User1|Ok|Apply|Cancel, Ok, true, KGuiItem(i18n("Import...")), KGuiItem(i18n("Export..."))),
m_activeSite(0),
m_activeItem(0L),
m_portChanged(false)
{
// We operate on a copy of the bookmarks
m_bookmarks = new KFTPBookmarks::Manager(*KFTPBookmarks::Manager::self());
TQHBoxLayout *winLayout = new TQHBoxLayout(this, 0, KDialog::spacingHint());
TQSplitter *splitter = new TQSplitter(this);
setMainWidget(splitter);
winLayout->addWidget(splitter);
// Create the list view for editing bookmarks
m_tree = new ListView(m_bookmarks, splitter);
m_properties = new BookmarkProperties(splitter);
initDialog();
connect(this, SIGNAL(user1Clicked()), this, SLOT(slotImportWizard()));
connect(this, SIGNAL(user2Clicked()), this, SLOT(slotExportWizard()));
connect(m_tree, SIGNAL(bookmarkClicked(TQListViewItem*)), this, SLOT(slotTreeClicked(TQListViewItem*)));
connect(m_tree, SIGNAL(bookmarkNew(ListViewItem*, KFTPBookmarks::Site*)), this, SLOT(slotNewAction(ListViewItem*, KFTPBookmarks::Site*)));
connect(m_tree, SIGNAL(bookmarkDuplicated(ListViewItem*, KFTPBookmarks::Site*)), this, SLOT(slotDuplicateAction(ListViewItem*, KFTPBookmarks::Site*)));
connect(m_tree, SIGNAL(bookmarkDeleted()), this, SLOT(slotDeleteAction()));
connect(m_tree, SIGNAL(bookmarkMoved()), this, SLOT(refresh()));
connect(m_tree, SIGNAL(categoryRenamed()), this, SLOT(refresh()));
// Get the new bookmark data
m_tree->fillBookmarkData();
}
BookmarkEditor::BookmarkEditor(ListViewItem *item, TQWidget *parent, const char *name)
: KDialogBase(parent, name, true, i18n("FTP Bookmark Editor"), Ok|Apply|Cancel, Ok, true),
m_activeSite(0),
m_activeItem(item),
m_tree(0L),
m_portChanged(false)
{
setCaption(m_activeItem->text(0));
// We operate on a copy of the bookmarks
m_bookmarks = new KFTPBookmarks::Manager(*KFTPBookmarks::Manager::self());
TQHBoxLayout *winLayout = new TQHBoxLayout(this, 0, KDialog::spacingHint());
m_properties = new BookmarkProperties(this);
setMainWidget(m_properties);
winLayout->addWidget(m_properties);
initDialog();
m_activeSite = m_activeItem->m_site;
showActiveNode();
}
BookmarkEditor::~BookmarkEditor()
{
delete m_bookmarks;
}
void BookmarkEditor::initDialog()
{
m_properties->tabList->setTabIconSet(m_properties->general, loadSmallIcon("kfm"));
m_properties->tabList->setTabIconSet(m_properties->advanced, loadSmallIcon("contents"));
m_properties->tabList->setTabIconSet(m_properties->keepalive, loadSmallIcon("clock"));
m_properties->protoAdvanced->setIconSet(loadSmallIcon("configure"));
m_properties->retryGroup->setEnabled(false);
m_properties->defLocalDir->setMode(KFile::Directory | KFile::ExistingOnly | KFile::LocalOnly );
connect(m_properties->anonLogin, SIGNAL(clicked()), this, SLOT(slotChangeAnonLogin()));
connect(m_properties->doRetry, SIGNAL(clicked()), this, SLOT(slotChangeActiveRetryGroup()));
connect(m_properties->doKeepalive, SIGNAL(clicked()), this, SLOT(slotChangeActiveKeepaliveGroup()));
connect(m_properties->protoAdvanced, SIGNAL(clicked()), this, SLOT(slotProtoAdvancedClicked()));
connect(m_properties->serverProtocol, SIGNAL(activated(int)), this, SLOT(slotChangeServerProtocol(int)));
connect(m_properties->serverPort, SIGNAL(valueChanged(int)), this, SLOT(slotPortChanged()));
connect(this, SIGNAL(applyClicked()), this, SLOT(slotSaveActiveNode()));
connect(this, SIGNAL(okClicked()), this, SLOT(slotSaveActiveNode()));
// Populate charsets
TQStringList charsets = TDEGlobal::charsets()->descriptiveEncodingNames();
m_properties->serverEncoding->insertStringList(charsets);
// Deactivate everything until an item gets selected
m_properties->setEnabled(false);
}
void BookmarkEditor::refresh()
{
m_tree->clear();
m_tree->fillBookmarkData();
}
void BookmarkEditor::slotImportWizard()
{
ImportWizard *wizard = new ImportWizard(this);
if (wizard->exec() == TQDialog::Accepted) {
// Refresh bookmarks
m_bookmarks->setBookmarks(KFTPBookmarks::Manager::self());
m_tree->clear();
m_tree->fillBookmarkData();
}
delete wizard;
}
void BookmarkEditor::slotExportWizard()
{
if (KMessageBox::questionYesNo(0, i18n("<qt>You are about to export your KFTPGrabber bookmarks. They may contain passwords or sensitive X509 certificates; exporting your bookmarks may compromise their safety.<br><br>Are you sure?</qt>"), i18n("Export Bookmarks")) == KMessageBox::No) {
return;
}
TQString savePath = KFileDialog::getSaveFileName(TQString::null, "*.xml|KFTPGrabber Bookmarks", 0, i18n("Export Bookmarks"));
if (!savePath.isEmpty()) {
// Save and copy the bookmarks
KFTPBookmarks::Manager::self()->save();
TDEIO::copy(KURL(getStoreDir("bookmarks.xml")), KURL(savePath), false);
}
}
void BookmarkEditor::slotNewAction(ListViewItem *item, KFTPBookmarks::Site *site)
{
// Display the new server's properties
m_activeItem = item;
m_activeSite = site;
showActiveNode();
// Set Focus to servername
m_properties->serverName->selectAll();
m_properties->serverName->setFocus();
}
void BookmarkEditor::slotDuplicateAction(ListViewItem *item, KFTPBookmarks::Site *site)
{
m_activeItem = item;
// Display its properties
m_activeSite = site;
showActiveNode();
}
void BookmarkEditor::slotDeleteAction()
{
m_activeItem = 0L;
m_properties->setEnabled(false);
}
void BookmarkEditor::slotSaveActiveNode()
{
if (!m_activeItem) {
KFTPBookmarks::Manager::self()->setBookmarks(m_bookmarks);
return;
}
m_activeSite->setAttribute("name", m_properties->serverName->text());
m_activeSite->setProperty("host", m_properties->serverAddress->text());
m_activeSite->setProperty("port", m_properties->serverPort->value());
m_activeSite->setProperty("protocol", m_properties->serverProtocol->currentItem() == SP_SFTP ? "sftp" : "ftp");
m_activeSite->setProperty("use_tls", m_properties->serverProtocol->currentItem() == SP_SSL_EXPLICIT);
m_activeSite->setProperty("use_implicit", m_properties->serverProtocol->currentItem() == SP_SSL_IMPLICIT);
m_activeSite->setProperty("anonlogin", m_properties->anonLogin->isChecked());
m_activeSite->setProperty("username", m_properties->downUser->text());
m_activeSite->setProperty("password", encodePassword(m_properties->downPass->password()));
m_activeSite->setProperty("encoding", TDEGlobal::charsets()->encodingForName(m_properties->serverEncoding->currentText()));
// Only save the local dir if it differs from the default one
if (m_properties->defLocalDir->url() != KFTPCore::Config::defLocalDir())
m_activeSite->setProperty("deflocalpath", m_properties->defLocalDir->url());
m_activeSite->setProperty("defremotepath", m_properties->defRemoteDir->text());
m_activeSite->setProperty("description", m_properties->description->text());
m_activeSite->setProperty("doRetry", m_properties->doRetry->isChecked());
m_activeSite->setProperty("retrytime", m_properties->retryDelay->value());
m_activeSite->setProperty("retrycount", m_properties->retryCount->value());
m_activeSite->setProperty("doKeepalive", m_properties->doKeepalive->isChecked());
m_activeSite->setProperty("keepaliveTimeout", m_properties->keepaliveTimeout->value());
m_activeSite->setProperty("disablePASV", m_properties->disablePASV->isChecked());
m_activeSite->setProperty("disableEPSV", m_properties->disableEPSV->isChecked());
m_activeSite->setProperty("pasvSiteIp", m_properties->pasvSiteIp->isChecked());
m_activeSite->setProperty("disableForceIp", m_properties->disableForceIp->isChecked());
m_activeSite->setProperty("disableThreads", m_properties->threadsDisable->isChecked());
m_activeSite->setProperty("statListings", m_properties->statListings->isChecked());
// Update the ListView node
m_activeItem->setText(0, m_properties->serverName->text());
if (m_tree)
KFTPBookmarks::Manager::self()->setBookmarks(m_bookmarks);
showActiveNode();
// Save the bookmarks
KFTPBookmarks::Manager::self()->save();
}
void BookmarkEditor::showActiveNode()
{
if (m_activeItem->m_type == BT_CATEGORY || !m_activeSite) {
m_properties->setEnabled(false);
return;
}
m_properties->setEnabled(true);
// Show all the data for the active node
m_properties->serverName->setText(m_activeSite->getAttribute("name"));
m_properties->serverAddress->setText(m_activeSite->getProperty("host"));
if (m_activeSite->getProperty("protocol") == "sftp") m_properties->serverProtocol->setCurrentItem(SP_SFTP);
else if (m_activeSite->getIntProperty("use_tls")) m_properties->serverProtocol->setCurrentItem(SP_SSL_EXPLICIT);
else if (m_activeSite->getIntProperty("use_implicit")) m_properties->serverProtocol->setCurrentItem(SP_SSL_IMPLICIT);
else m_properties->serverProtocol->setCurrentItem(SP_FTP);
slotChangeServerProtocol(m_properties->serverProtocol->currentItem());
m_properties->serverPort->setValue(m_activeSite->getIntProperty("port"));
m_portChanged = false;
m_properties->downUser->erase();
m_properties->downPass->erase();
m_properties->anonLogin->setChecked(m_activeSite->getIntProperty("anonlogin"));
slotChangeAnonLogin();
m_properties->downUser->setText(m_activeSite->getProperty("username"));
m_properties->downPass->insert(m_activeSite->getProperty("password"));
TQString defLocalPath = m_activeSite->getProperty("deflocalpath");
if (defLocalPath.isEmpty())
defLocalPath = KFTPCore::Config::defLocalDir();
m_properties->defLocalDir->setURL(defLocalPath);
m_properties->defRemoteDir->setText(m_activeSite->getProperty("defremotepath"));
m_properties->description->setText(m_activeSite->getProperty("description"));
int retryTime = m_activeSite->getIntProperty("retrytime");
int retryCount = m_activeSite->getIntProperty("retrycount");
m_properties->doRetry->setChecked(m_activeSite->getIntProperty("doRetry"));
if (m_properties->doRetry->isChecked()) {
m_properties->retryGroup->setEnabled(true);
m_properties->retryDelay->setValue(retryTime);
m_properties->retryCount->setValue(retryCount);
} else {
m_properties->retryGroup->setEnabled(false);
m_properties->retryDelay->setValue(KFTPCore::Config::retryTime());
m_properties->retryCount->setValue(KFTPCore::Config::retryCount());
}
m_properties->doKeepalive->setChecked(m_activeSite->getIntProperty("doKeepalive"));
if (m_properties->doKeepalive->isChecked()) {
m_properties->keepaliveGroup->setEnabled(true);
m_properties->keepaliveTimeout->setValue(m_activeSite->getIntProperty("keepaliveTimeout"));
} else {
m_properties->keepaliveGroup->setEnabled(false);
m_properties->keepaliveTimeout->setValue(60);
}
TQString serverEncoding = m_activeSite->getProperty("encoding");
if (serverEncoding.isEmpty())
serverEncoding = KFTPCore::Config::defEncoding();
serverEncoding = TQString("%1 ( %2 )").arg(TDEGlobal::charsets()->languageForEncoding(serverEncoding)).arg(serverEncoding);
m_properties->serverEncoding->setCurrentText(serverEncoding);
m_properties->disablePASV->setChecked(m_activeSite->getIntProperty("disablePASV"));
m_properties->disableEPSV->setChecked(m_activeSite->getIntProperty("disableEPSV"));
m_properties->pasvSiteIp->setChecked(m_activeSite->getIntProperty("pasvSiteIp"));
m_properties->disableForceIp->setChecked(m_activeSite->getIntProperty("disableForceIp"));
m_properties->threadsDisable->setChecked(m_activeSite->getIntProperty("disableThreads"));
m_properties->statListings->setChecked(m_activeSite->getIntProperty("statListings"));
}
void BookmarkEditor::slotTreeClicked(TQListViewItem *item)
{
m_activeItem = static_cast<ListViewItem*>(item);
if ( !m_activeItem || m_activeItem->m_type == BT_CATEGORY ) {
// Deactivate all controls
m_properties->setEnabled(false);
return;
}
// Find the node and set it active
if (m_activeItem->m_type == BT_CATEGORY) {
// Category
m_activeSite = 0L;
} else {
// Server
m_activeSite = m_activeItem->m_site;
}
// Show the active node (if any)
showActiveNode();
}
void BookmarkEditor::slotChangeActiveRetryGroup()
{
m_properties->retryGroup->setEnabled(m_properties->doRetry->isChecked());
}
void BookmarkEditor::slotChangeActiveKeepaliveGroup()
{
m_properties->keepaliveGroup->setEnabled(m_properties->doKeepalive->isChecked());
}
void BookmarkEditor::slotChangeAnonLogin()
{
static TQString tmpUser, tmpPass;
if (m_properties->anonLogin->isChecked()) {
m_properties->downUser->setEnabled(false);
m_properties->downPass->setEnabled(false);
tmpUser = m_properties->downUser->text();
tmpPass = m_properties->downPass->text();
m_properties->downUser->setText("anonymous");
// Use the appropriate e-mail address for anonymous accounts
if (!KFTPCore::Config::anonMail().isEmpty())
m_properties->downPass->setText(KFTPCore::Config::anonMail());
else
m_properties->downPass->setText("userlogin@anonymo.us");
} else {
m_properties->downUser->setEnabled(true);
m_properties->downPass->setEnabled(true);
m_properties->downUser->setText(tmpUser);
m_properties->downPass->setText(tmpPass);
}
}
void BookmarkEditor::slotProtoAdvancedClicked()
{
BookmarkEditorTLS *tlsDialog = new BookmarkEditorTLS(this);
// Initialize dialog
int mode = m_activeSite->getIntProperty("tls_data_mode");
bool useCert = m_activeSite->getIntProperty("use_cert");
TQString certPath = m_activeSite->getProperty("tls_cert_path");
tlsDialog->setTLSMode(mode);
tlsDialog->setCertChecked(useCert);
if (useCert)
tlsDialog->setCertPath(certPath);
tlsDialog->slotChangeActiveX509Group();
if (tlsDialog->exec()) {
// Save the modifications
m_activeSite->setProperty("tls_data_mode", tlsDialog->getTLSMode());
m_activeSite->setProperty("use_cert", tlsDialog->isCertChecked());
if (tlsDialog->isCertChecked())
m_activeSite->setProperty("tls_cert_path", tlsDialog->getCertPath());
}
delete tlsDialog;
}
void BookmarkEditor::slotPortChanged()
{
m_portChanged = true;
}
void BookmarkEditor::slotChangeServerProtocol(int item)
{
// Enable/Disable the SSL/TLS settings if needed
m_properties->protoAdvanced->setEnabled( item == 1 || item == 2 );
// Set the default port
if (!m_portChanged) {
switch (item) {
case SP_SSL_IMPLICIT:
if (m_properties->serverPort->value() == 21 || m_properties->serverPort->value() == 22)
m_properties->serverPort->setValue(993);
break;
case SP_SFTP:
if (m_properties->serverPort->value() == 21 || m_properties->serverPort->value() == 993)
m_properties->serverPort->setValue(22);
break;
default:
if (m_properties->serverPort->value() == 22 || m_properties->serverPort->value() == 993)
m_properties->serverPort->setValue(21);
break;
}
m_portChanged = false;
}
}
}
}
#include "editor.moc"