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.
297 lines
9.5 KiB
297 lines
9.5 KiB
14 years ago
|
--- kio/kfile/kfilesharedlg.cpp
|
||
|
+++ kio/kfile/kfilesharedlg.cpp 2004/08/06 08:38:31
|
||
|
@@ -24,6 +24,7 @@
|
||
|
#include <qradiobutton.h>
|
||
|
#include <qbuttongroup.h>
|
||
|
#include <qlayout.h>
|
||
|
+#include <qlineedit.h>
|
||
|
#include <kprocess.h>
|
||
|
#include <kprocio.h>
|
||
|
#include <klocale.h>
|
||
|
@@ -93,8 +94,10 @@
|
||
|
delete m_widget;
|
||
|
m_rbShare = 0L;
|
||
|
m_rbUnShare = 0L;
|
||
|
+ m_rbSharerw = 0L;
|
||
|
m_widget = new QWidget( d->m_vBox );
|
||
|
QVBoxLayout * vbox = new QVBoxLayout( m_widget );
|
||
|
+ //QHBoxLayout * hbox = new QHBoxLayout( vbox );
|
||
|
|
||
|
switch ( KFileShare::authorization() ) {
|
||
|
case KFileShare::Authorized:
|
||
|
@@ -105,18 +108,31 @@
|
||
|
home += '/';
|
||
|
bool ok = true;
|
||
|
KFileItemList items = properties->items();
|
||
|
- // We have 3 possibilities: all shared, all unshared, or mixed.
|
||
|
+ // We have some possibilities: all shared, all unshared (ro,rw), or mixed.
|
||
|
bool allShared = true;
|
||
|
bool allUnshared = true;
|
||
|
+ bool allreadonly = true;
|
||
|
KFileItemListIterator it( items );
|
||
|
for ( ; it.current() && ok; ++it ) {
|
||
|
QString 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 ( KFileShare::isDirectoryShared( path ) )
|
||
|
+ if ( dirStatus == 1 ) {
|
||
|
allUnshared = false;
|
||
|
- else
|
||
|
+ }
|
||
|
+ else if ( dirStatus == 3 ) {
|
||
|
+ allUnshared = false;
|
||
|
+ allreadonly = false;
|
||
|
+ }
|
||
|
+ else {
|
||
|
allShared = false;
|
||
|
+ allreadonly = false;
|
||
|
+ }
|
||
|
}
|
||
|
if ( !ok )
|
||
|
{
|
||
|
@@ -136,16 +152,31 @@
|
||
|
vbox->addWidget( m_rbUnShare, 0 );
|
||
|
rbGroup->insert( m_rbUnShare );
|
||
|
|
||
|
- m_rbShare = new QRadioButton( i18n("Shared"), m_widget );
|
||
|
+ m_rbShare = new QRadioButton( i18n("Shared - read only for others"), m_widget );
|
||
|
connect( m_rbShare, SIGNAL( toggled(bool) ), SIGNAL( changed() ) );
|
||
|
vbox->addWidget( m_rbShare, 0 );
|
||
|
rbGroup->insert( m_rbShare );
|
||
|
|
||
|
+ m_rbSharerw = new QRadioButton( i18n("Shared - writeable for others"), m_widget );
|
||
|
+ connect( m_rbSharerw, SIGNAL( toggled(bool) ), SIGNAL( changed() ) );
|
||
|
+ vbox->addWidget( m_rbSharerw, 0 );
|
||
|
+ rbGroup->insert( m_rbSharerw );
|
||
|
+
|
||
|
+ //QLabel *testlabel1 = new QLabel(i18n("Enter Samba Share Name here"),m_widget);
|
||
|
+ //m_leSmbShareName = new QLineEdit(m_widget);
|
||
|
+ //m_leSmbShareName->setMaxLength(12);
|
||
|
+
|
||
|
+ //hbox->addWidget( testlabel1, 0 );
|
||
|
+ //hbox->addWidget( m_leSmbShareName );
|
||
|
+ //vbox->addLayout( hbox );
|
||
|
+
|
||
|
// Activate depending on status
|
||
|
if ( allShared )
|
||
|
- m_rbShare->setChecked(true);
|
||
|
+ m_rbSharerw->setChecked(true);
|
||
|
if ( allUnshared )
|
||
|
m_rbUnShare->setChecked(true);
|
||
|
+ if ( allreadonly )
|
||
|
+ m_rbShare->setChecked(true);
|
||
|
|
||
|
// Some help text
|
||
|
QLabel *label = new QLabel( i18n("Sharing this folder makes it available under Linux/UNIX (NFS) and Windows (Samba).") , m_widget );
|
||
|
@@ -204,7 +235,7 @@
|
||
|
void KFileSharePropsPlugin::applyChanges()
|
||
|
{
|
||
|
kdDebug() << "KFileSharePropsPlugin::applyChanges" << endl;
|
||
|
- if ( m_rbShare && m_rbUnShare )
|
||
|
+ if ( m_rbShare && m_rbUnShare && m_rbSharerw )
|
||
|
{
|
||
|
bool share = m_rbShare->isChecked();
|
||
|
KFileItemList items = properties->items();
|
||
|
@@ -212,7 +243,7 @@
|
||
|
bool ok = true;
|
||
|
for ( ; it.current() && ok; ++it ) {
|
||
|
QString path = (*it)->url().path();
|
||
|
- ok = setShared( path, share );
|
||
|
+ ok = SuSEsetShared( path, share, m_rbSharerw->isChecked() );
|
||
|
if (!ok) {
|
||
|
if (share)
|
||
|
KMessageBox::detailedError(properties,
|
||
|
@@ -239,8 +270,14 @@
|
||
|
|
||
|
bool KFileSharePropsPlugin::setShared( const QString& path, bool shared )
|
||
|
{
|
||
|
- kdDebug() << "KFileSharePropsPlugin::setShared " << path << "," << shared << endl;
|
||
|
- return KFileShare::setShared( path, shared );
|
||
|
+ return SuSEsetShared( path, shared, true );
|
||
|
+}
|
||
|
+
|
||
|
+bool KFileSharePropsPlugin::SuSEsetShared( const QString& path, bool shared, bool readonly )
|
||
|
+{
|
||
|
+ kdDebug() << "KFileSharePropsPlugin::setShared " << path << ","
|
||
|
+ << shared << readonly << endl;
|
||
|
+ return KFileShare::SuSEsetShared( path, shared, readonly );
|
||
|
}
|
||
|
|
||
|
QWidget* KFileSharePropsPlugin::page() const
|
||
|
--- kio/kfile/kfilesharedlg.h
|
||
|
+++ kio/kfile/kfilesharedlg.h 2004/08/06 08:38:31
|
||
|
@@ -54,10 +54,13 @@
|
||
|
private:
|
||
|
void init();
|
||
|
bool setShared( const QString&path, bool shared );
|
||
|
+ bool SuSEsetShared( const QString&path, bool shared, bool readonly );
|
||
|
|
||
|
QWidget *m_widget;
|
||
|
QRadioButton *m_rbShare;
|
||
|
+ QRadioButton *m_rbSharerw;
|
||
|
QRadioButton *m_rbUnShare;
|
||
|
+ //QLineEdit *m_leSmbShareName;
|
||
|
QPushButton *m_pbConfig;
|
||
|
class Private;
|
||
|
Private *d;
|
||
|
--- kio/kio/kfileshare.cpp
|
||
|
+++ kio/kio/kfileshare.cpp 2004/08/06 08:38:51
|
||
|
@@ -20,6 +20,7 @@
|
||
|
#include "kfileshare.h"
|
||
|
#include <qdir.h>
|
||
|
#include <qfile.h>
|
||
|
+#include <qregexp.h>
|
||
|
#include <kprocess.h>
|
||
|
#include <kprocio.h>
|
||
|
#include <klocale.h>
|
||
|
@@ -35,8 +36,10 @@
|
||
|
#include <kuser.h>
|
||
|
|
||
|
KFileShare::Authorization KFileShare::s_authorization = NotInitialized;
|
||
|
-QStringList* KFileShare::s_shareList = 0L;
|
||
|
-static KStaticDeleter<QStringList> sdShareList;
|
||
|
+//QStringList* KFileShare::s_shareList = 0L;
|
||
|
+//static KStaticDeleter<QStringList> sdShareList;
|
||
|
+QMap<QString,QString>* KFileShare::s_shareMap = 0L;
|
||
|
+static KStaticDeleter<QMap<QString,QString> > sdShareMap;
|
||
|
|
||
|
KFileShare::ShareMode KFileShare::s_shareMode;
|
||
|
bool KFileShare::s_sambaEnabled;
|
||
|
@@ -164,10 +167,10 @@
|
||
|
void KFileShare::readShareList()
|
||
|
{
|
||
|
KFileSharePrivate::self();
|
||
|
- if ( !s_shareList )
|
||
|
- sdShareList.setObject( s_shareList, new QStringList );
|
||
|
+ if ( !s_shareMap )
|
||
|
+ sdShareMap.setObject( s_shareMap, new QMap<QString,QString> );
|
||
|
else
|
||
|
- s_shareList->clear();
|
||
|
+ s_shareMap->clear();
|
||
|
|
||
|
// /usr/sbin on Mandrake, $PATH allows flexibility for other distributions
|
||
|
QString exe = findExe( "filesharelist" );
|
||
|
@@ -185,29 +188,45 @@
|
||
|
|
||
|
// Reading code shamelessly stolen from khostname.cpp ;)
|
||
|
QString line;
|
||
|
+ QString options;
|
||
|
+ QString path;
|
||
|
int length;
|
||
|
+ QRegExp rx_line("([^\\s]+)\\s+(.*)");
|
||
|
do {
|
||
|
length = proc.readln(line, true);
|
||
|
if ( length > 0 )
|
||
|
{
|
||
|
if ( line[length-1] != '/' )
|
||
|
line += '/';
|
||
|
- s_shareList->append(line);
|
||
|
+ if( rx_line.search( line ) != -1 ) {
|
||
|
+ options = rx_line.cap(1);
|
||
|
+ path = rx_line.cap(2);
|
||
|
+ (*s_shareMap)[path] = options;
|
||
|
+ }
|
||
|
kdDebug(7000) << "Shared dir:" << line << endl;
|
||
|
}
|
||
|
} while (length > -1);
|
||
|
}
|
||
|
|
||
|
|
||
|
-bool KFileShare::isDirectoryShared( const QString& _path )
|
||
|
+int KFileShare::isDirectoryShared( const QString& _path )
|
||
|
{
|
||
|
- if ( ! s_shareList )
|
||
|
+ int ret(0);
|
||
|
+
|
||
|
+ if ( ! s_shareMap )
|
||
|
readShareList();
|
||
|
|
||
|
QString path( _path );
|
||
|
if ( path[path.length()-1] != '/' )
|
||
|
path += '/';
|
||
|
- return s_shareList && s_shareList->contains( path );
|
||
|
+ //return s_shareList && s_shareList->contains( path );
|
||
|
+ if( (*s_shareMap).contains(path) && !((*s_shareMap)[path].isEmpty()) ) {
|
||
|
+ ret+=1;
|
||
|
+ if( (*s_shareMap)[path].find("readwrite") != -1 )
|
||
|
+ ret+=2;
|
||
|
+ }
|
||
|
+
|
||
|
+ return ret;
|
||
|
}
|
||
|
|
||
|
KFileShare::Authorization KFileShare::authorization()
|
||
|
@@ -230,17 +249,30 @@
|
||
|
|
||
|
bool KFileShare::setShared( const QString& path, bool shared )
|
||
|
{
|
||
|
+ return SuSEsetShared( path, shared, false );
|
||
|
+}
|
||
|
+
|
||
|
+bool KFileShare::SuSEsetShared( const QString& path, bool shared, bool rw )
|
||
|
+{
|
||
|
if (! KFileShare::sharingEnabled() ||
|
||
|
KFileShare::shareMode() == Advanced)
|
||
|
return false;
|
||
|
|
||
|
- kdDebug(7000) << "KFileShare::setShared " << path << "," << shared << endl;
|
||
|
QString exe = KFileShare::findExe( "fileshareset" );
|
||
|
if (exe.isEmpty())
|
||
|
return false;
|
||
|
-
|
||
|
+
|
||
|
+ // we want to share, so we kick it first - just to be sure
|
||
|
KProcess proc;
|
||
|
proc << exe;
|
||
|
+ proc << "--remove";
|
||
|
+ proc << path;
|
||
|
+ proc.start( KProcess::Block );
|
||
|
+ proc.clearArguments();
|
||
|
+
|
||
|
+ proc << exe;
|
||
|
+ if( rw )
|
||
|
+ proc << "--rw";
|
||
|
if ( shared )
|
||
|
proc << "--add";
|
||
|
else
|
||
|
--- kio/kio/kfileshare.h
|
||
|
+++ kio/kio/kfileshare.h 2004/08/06 08:38:31
|
||
|
@@ -65,7 +65,7 @@
|
||
|
/**
|
||
|
* Call this to know if a directory is currently shared
|
||
|
*/
|
||
|
- static bool isDirectoryShared( const QString& path );
|
||
|
+ static int isDirectoryShared( const QString& path );
|
||
|
|
||
|
enum Authorization { NotInitialized, ErrorNotFound, Authorized, UserNotAllowed };
|
||
|
/**
|
||
|
@@ -83,7 +83,12 @@
|
||
|
* @returns wether the perl script was successful
|
||
|
*/
|
||
|
static bool setShared( const QString& path, bool shared );
|
||
|
-
|
||
|
+
|
||
|
+ /*
|
||
|
+ * SuSE only enhancement for now
|
||
|
+ */
|
||
|
+ static bool SuSEsetShared( const QString& path, bool shared, bool ro );
|
||
|
+
|
||
|
/**
|
||
|
* The used share mode.
|
||
|
* Simple means that the simple sharing dialog is used and
|
||
|
@@ -132,7 +137,8 @@
|
||
|
|
||
|
private:
|
||
|
static Authorization s_authorization;
|
||
|
- static QStringList* s_shareList;
|
||
|
+// static QStringList* s_shareList;
|
||
|
+ static QMap<QString,QString>* s_shareMap;
|
||
|
static ShareMode s_shareMode;
|
||
|
static bool s_sambaEnabled;
|
||
|
static bool s_nfsEnabled;
|