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.
493 lines
17 KiB
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"
|