summaryrefslogtreecommitdiffstats
path: root/tdeio/tdefile/tdefilesharedlg.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tdeio/tdefile/tdefilesharedlg.cpp')
-rw-r--r--tdeio/tdefile/tdefilesharedlg.cpp325
1 files changed, 325 insertions, 0 deletions
diff --git a/tdeio/tdefile/tdefilesharedlg.cpp b/tdeio/tdefile/tdefilesharedlg.cpp
new file mode 100644
index 000000000..8e6f9e650
--- /dev/null
+++ b/tdeio/tdefile/tdefilesharedlg.cpp
@@ -0,0 +1,325 @@
+/* This file is part of the KDE project
+ Copyright (c) 2001 David Faure <[email protected]>
+ Copyright (c) 2001 Laurent Montel <[email protected]>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License version 2 as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "tdefilesharedlg.h"
+#include <tqvbox.h>
+#include <tqlabel.h>
+#include <tqdir.h>
+#include <tqradiobutton.h>
+#include <tqbuttongroup.h>
+#include <tqlayout.h>
+#include <tqlineedit.h>
+#include <kprocess.h>
+#include <kprocio.h>
+#include <klocale.h>
+#include <kglobalsettings.h>
+#include <kstandarddirs.h>
+#include <kdebug.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <tdeio/tdefileshare.h>
+#include <kseparator.h>
+#include <tqpushbutton.h>
+#include <kapplication.h>
+#include <ksimpleconfig.h>
+#include <kmessagebox.h>
+
+class KFileSharePropsPlugin::Private
+{
+public:
+ TQVBox *m_vBox;
+ TDEProcess *m_configProc;
+ bool m_bAllShared;
+ bool m_bAllUnshared;
+ bool m_bAllReadOnly;
+};
+
+KFileSharePropsPlugin::KFileSharePropsPlugin( KPropertiesDialog *_props )
+ : KPropsDlgPlugin( _props )
+{
+ d = new Private;
+ d->m_vBox = _props->addVBoxPage( i18n("&Share") );
+ d->m_configProc = 0;
+ properties->setFileSharingPage(d->m_vBox);
+ m_widget = 0L;
+ init();
+}
+
+KFileSharePropsPlugin::~KFileSharePropsPlugin()
+{
+ if (d->m_configProc)
+ d->m_configProc->detach(); // Detach to prevent that we kill the process
+ delete d;
+}
+
+bool KFileSharePropsPlugin::supports( const KFileItemList& items )
+{
+ // Do not show dialog if in advanced mode,
+ // because the advanced dialog is shown already.
+ if (KFileShare::shareMode() == KFileShare::Advanced) {
+ kdDebug() << "KFileSharePropsPlugin::supports: false because sharemode is advanced" << endl;
+ return false;
+ }
+
+ KFileItemListIterator it( items );
+ for ( ; it.current(); ++it )
+ {
+ bool isLocal = ( *it )->isLocalFile();
+ // We only support local dirs
+ if ( !(*it)->isDir() || !isLocal )
+ return false;
+ // And sharing the trash doesn't make sense
+ if ( isLocal && (*it)->url().path( 1 ) == TDEGlobalSettings::trashPath() )
+ return false;
+ }
+ return true;
+}
+
+void KFileSharePropsPlugin::init()
+{
+ // We store the main widget, so that it's possible (later) to call init()
+ // more than once, to update the page if something changed (e.g. after
+ // the user has been authorized)
+ delete m_widget;
+ m_rbShare = 0L;
+ m_rbUnShare = 0L;
+ m_rbSharerw = 0L;
+ m_widget = new TQWidget( d->m_vBox );
+ TQVBoxLayout * vbox = new TQVBoxLayout( m_widget );
+ //TQHBoxLayout * hbox = new TQHBoxLayout( vbox );
+
+ switch ( KFileShare::authorization() ) {
+ case KFileShare::Authorized:
+ {
+ // Check if all selected dirs are in $HOME
+ TQString home = TQDir::homeDirPath();
+ if ( home[home.length()-1] != '/' )
+ home += '/';
+ bool ok = true;
+ KFileItemList items = properties->items();
+ // We have 3 possibilities: all shared, all unshared (ro,rw), or mixed.
+ d->m_bAllShared = true;
+ d->m_bAllUnshared = true;
+ d->m_bAllReadOnly = true;
+ KFileItemListIterator it( items );
+ for ( ; it.current() && ok; ++it ) {
+ TQString path = (*it)->url().path();
+ // 0 => not shared
+ // 1 => shared read only
+ // 3 => shared writeable
+ int dirStatus = KFileShare::isDirectoryShared( path );
+ if ( !path.startsWith( home ) )
+ ok = false;
+ if ( dirStatus == 1 ) {
+ d->m_bAllUnshared = false;
+ }
+ else if ( dirStatus == 3 ) {
+ d->m_bAllUnshared = false;
+ d->m_bAllReadOnly = false;
+ }
+ else {
+ d->m_bAllReadOnly = false;
+ }
+ }
+ if ( !ok )
+ {
+ vbox->addWidget( new TQLabel( i18n( "Only folders in your home folder can be shared."),
+ m_widget ), 0 );
+ }
+ else
+ {
+ // Everything ok, show the share/unshare GUI
+ vbox->setSpacing( KDialog::spacingHint() );
+ vbox->setMargin( KDialog::marginHint() );
+
+ TQButtonGroup *rbGroup = new TQButtonGroup( m_widget );
+ rbGroup->hide();
+ m_rbUnShare = new TQRadioButton( i18n("Not shared"), m_widget );
+ connect( m_rbUnShare, TQT_SIGNAL( toggled(bool) ), TQT_SIGNAL( changed() ) );
+ vbox->addWidget( m_rbUnShare, 0 );
+ rbGroup->insert( m_rbUnShare );
+
+ m_rbShare = new TQRadioButton( i18n("Shared - read only for others"), m_widget );
+ connect( m_rbShare, TQT_SIGNAL( toggled(bool) ), TQT_SIGNAL( changed() ) );
+ vbox->addWidget( m_rbShare, 0 );
+ rbGroup->insert( m_rbShare );
+
+ m_rbSharerw = new TQRadioButton( i18n("Shared - writeable for others"), m_widget );
+ connect( m_rbSharerw, TQT_SIGNAL( toggled(bool) ), TQT_SIGNAL( changed() ) );
+ vbox->addWidget( m_rbSharerw, 0 );
+ rbGroup->insert( m_rbSharerw );
+
+ //TQLabel *testlabel1 = new TQLabel(i18n("Enter Samba Share Name here"),m_widget);
+ //m_leSmbShareName = new TQLineEdit(m_widget);
+ //m_leSmbShareName->setMaxLength(12);
+
+ //hbox->addWidget( testlabel1, 0 );
+ //hbox->addWidget( m_leSmbShareName );
+ //vbox->addLayout( hbox );
+
+ // Activate depending on status
+ if ( d->m_bAllShared )
+ m_rbSharerw->setChecked(true);
+ if ( d->m_bAllUnshared )
+ m_rbUnShare->setChecked(true);
+ if ( d->m_bAllReadOnly )
+ m_rbShare->setChecked(true);
+
+ // Some help text
+ TQLabel *label = new TQLabel( i18n("Sharing this folder makes it available under Linux/UNIX (NFS) and Windows (Samba).") , m_widget );
+ label->setAlignment( TQt::AlignAuto | TQt::AlignVCenter | TQt::WordBreak );
+ vbox->addWidget( label, 0 );
+
+ KSeparator* sep=new KSeparator(m_widget);
+ vbox->addWidget( sep, 0 );
+ label = new TQLabel( i18n("You can also reconfigure file sharing authorization.") , m_widget );
+ label->setAlignment( TQt::AlignAuto | TQt::AlignVCenter | TQt::WordBreak );
+ vbox->addWidget( label, 0 );
+ m_pbConfig = new TQPushButton( i18n("Configure File Sharing..."), m_widget );
+ connect( m_pbConfig, TQT_SIGNAL( clicked() ), TQT_SLOT( slotConfigureFileSharing() ) );
+ vbox->addWidget( m_pbConfig, 0, Qt::AlignHCenter );
+
+ vbox->addStretch( 10 );
+
+ if( !KFileShare::sambaActive() && !KFileShare::nfsActive())
+ m_widget->setEnabled( false );
+ }
+ }
+ break;
+ case KFileShare::ErrorNotFound:
+ vbox->addWidget( new TQLabel( i18n("Error running 'filesharelist'. Check if installed and in $PATH or /usr/sbin."),
+ m_widget ), 0 );
+ break;
+ case KFileShare::UserNotAllowed:
+ {
+ vbox->setSpacing( 10 );
+ if (KFileShare::sharingEnabled()) {
+ vbox->addWidget( new TQLabel( i18n("You need to be authorized to share folders."),
+ m_widget ), 0 );
+ } else {
+ vbox->addWidget( new TQLabel( i18n("File sharing is disabled."),
+ m_widget ), 0 );
+ }
+ TQHBoxLayout* hBox = new TQHBoxLayout( (TQWidget *)0L );
+ vbox->addLayout( hBox, 0 );
+ m_pbConfig = new TQPushButton( i18n("Configure File Sharing..."), m_widget );
+ connect( m_pbConfig, TQT_SIGNAL( clicked() ), TQT_SLOT( slotConfigureFileSharing() ) );
+ hBox->addWidget( m_pbConfig, 0, Qt::AlignHCenter );
+ vbox->addStretch( 10 ); // align items on top
+ break;
+ }
+ case KFileShare::NotInitialized:
+ kdWarning() << "KFileShare Authorization still NotInitialized after calling authorization() - impossible" << endl;
+ break;
+ }
+ m_widget->show(); // In case the dialog was shown already.
+}
+
+void KFileSharePropsPlugin::slotConfigureFileSharing()
+{
+ if (d->m_configProc) return;
+
+ d->m_configProc = new TDEProcess(this);
+ (*d->m_configProc) << KStandardDirs::findExe("tdesu") << locate("exe", "tdecmshell") << "fileshare";
+ if (!d->m_configProc->start( TDEProcess::NotifyOnExit ))
+ {
+ delete d->m_configProc;
+ d->m_configProc = 0;
+ return;
+ }
+ connect(d->m_configProc, TQT_SIGNAL(processExited(TDEProcess *)),
+ this, TQT_SLOT(slotConfigureFileSharingDone()));
+ m_pbConfig->setEnabled(false);
+}
+
+void KFileSharePropsPlugin::slotConfigureFileSharingDone()
+{
+ delete d->m_configProc;
+ d->m_configProc = 0;
+ KFileShare::readConfig();
+ KFileShare::readShareList();
+ init();
+}
+
+void KFileSharePropsPlugin::applyChanges()
+{
+ kdDebug() << "KFileSharePropsPlugin::applyChanges" << endl;
+ if ( m_rbShare && m_rbUnShare && m_rbSharerw )
+ {
+ bool share = m_rbShare->isChecked();
+
+ if (share && d->m_bAllShared)
+ return; // Nothing to do
+ if (!share && d->m_bAllUnshared)
+ return; // Nothing to do
+
+ KFileItemList items = properties->items();
+ KFileItemListIterator it( items );
+ bool ok = true;
+ for ( ; it.current() && ok; ++it ) {
+ TQString path = (*it)->url().path();
+ ok = SuSEsetShared( path, share, m_rbSharerw->isChecked() );
+ if (!ok) {
+ if (share)
+ KMessageBox::detailedError(properties,
+ i18n("Sharing folder '%1' failed.").arg(path),
+ i18n("An error occurred while trying to share folder '%1'. "
+ "Make sure that the Perl script 'fileshareset' is set suid root.")
+ .arg(path));
+ else
+ KMessageBox::error(properties,
+ i18n("Unsharing folder '%1' failed.").arg(path),
+ i18n("An error occurred while trying to unshare folder '%1'. "
+ "Make sure that the Perl script 'fileshareset' is set suid root.")
+ .arg(path));
+
+ properties->abortApplying();
+ break;
+ }
+ }
+
+ // Get the change back into our cached info
+ KFileShare::readShareList();
+ }
+}
+
+bool KFileSharePropsPlugin::setShared( const TQString& path, bool shared )
+{
+ return SuSEsetShared( path, shared, true );
+}
+
+bool KFileSharePropsPlugin::SuSEsetShared( const TQString& path, bool shared, bool readonly )
+{
+ kdDebug() << "KFileSharePropsPlugin::setShared " << path << ","
+ << shared << readonly << endl;
+ return KFileShare::SuSEsetShared( path, shared, readonly );
+}
+
+TQWidget* KFileSharePropsPlugin::page() const
+{
+ return d->m_vBox;
+}
+
+#include "tdefilesharedlg.moc"
+
+//TODO: do we need to monitor /etc/security/fileshare.conf ?
+// if the user is added to the 'fileshare' group, we wouldn't be notified
+// Of course the config module can notify us.
+// TODO: listen to such notifications ;)