/* * This file is part of the KFTPGrabber project * * Copyright (C) 2003-2004 by the KFTPGrabber developers * Copyright (C) 2003-2004 Jernej Kos * Copyright (C) 2004 Markus Brueffer * * 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #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("You are about to export your KFTPGrabber bookmarks. They may contain passwords or sensitive X509 certificates; exporting your bookmarks may compromise their safety.

Are you sure?
"), 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(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"