KIO
kfileshare.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "kfileshare.h"
00021 #include "kfileshare_p.h"
00022 #include <QtCore/QDir>
00023 #include <QtCore/QFile>
00024 #include <QtCore/Q_PID>
00025 #include <klocale.h>
00026 #include <kstandarddirs.h>
00027 #include <kdebug.h>
00028 #include <kdirwatch.h>
00029 #include <stdio.h>
00030 #include <stdlib.h>
00031 #include <errno.h>
00032 #include <kconfig.h>
00033 #include <kconfiggroup.h>
00034 #include <kuser.h>
00035
00036 static KFileShare::Authorization s_authorization = KFileShare::NotInitialized;
00037 K_GLOBAL_STATIC(QStringList, s_shareList)
00038 static KFileShare::ShareMode s_shareMode;
00039 static bool s_sambaEnabled;
00040 static bool s_nfsEnabled;
00041 static bool s_restricted;
00042 static QString s_fileShareGroup;
00043 static bool s_sharingEnabled;
00044
00045 #define FILESHARECONF "/etc/security/fileshare.conf"
00046
00047 static QString findExe( const char* exeName )
00048 {
00049
00050
00051 QString path = QString::fromLocal8Bit(qgetenv("PATH"));
00052 #ifndef Q_WS_WIN
00053 path += QLatin1String(":/usr/sbin");
00054 #endif
00055 QString exe = KStandardDirs::findExe( exeName, path );
00056 if (exe.isEmpty())
00057 kError() << exeName << "not found in" << path;
00058 return exe;
00059 }
00060
00061 KFileSharePrivate::KFileSharePrivate()
00062 {
00063 KDirWatch::self()->addFile(FILESHARECONF);
00064 connect(KDirWatch::self(), SIGNAL(dirty (const QString&)),this,
00065 SLOT(slotFileChange(const QString &)));
00066 connect(KDirWatch::self(), SIGNAL(created(const QString&)),this,
00067 SLOT(slotFileChange(const QString &)));
00068 connect(KDirWatch::self(), SIGNAL(deleted(const QString&)),this,
00069 SLOT(slotFileChange(const QString &)));
00070 }
00071
00072 KFileSharePrivate::~KFileSharePrivate()
00073 {
00074 KDirWatch::self()->removeFile(FILESHARECONF);
00075 }
00076
00077 KFileSharePrivate* KFileSharePrivate::self()
00078 {
00079 K_GLOBAL_STATIC(KFileSharePrivate, _self)
00080 return _self;
00081 }
00082
00083 void KFileSharePrivate::slotFileChange(const QString &file)
00084 {
00085 if(file==FILESHARECONF) {
00086 KFileShare::readConfig();
00087 KFileShare::readShareList();
00088 }
00089 }
00090
00091 KFileShare::ShareMode readEntry(const KConfigGroup &cg, const char* key,
00092 const KFileShare::ShareMode& aDefault)
00093 {
00094 const QByteArray data=cg.readEntry(key, QByteArray());
00095
00096 if (!data.isEmpty()) {
00097 if (data.toLower() == "simple")
00098 return KFileShare::Simple;
00099 else if (data.toLower() == "advanced")
00100 return KFileShare::Advanced;
00101 }
00102
00103 return aDefault;
00104 }
00105
00106 void KFileShare::readConfig()
00107 {
00108
00109 KFileSharePrivate::self();
00110 KConfig config(QLatin1String(FILESHARECONF));
00111 KConfigGroup group( &config, QString() );
00112
00113 s_sharingEnabled = group.readEntry("FILESHARING", true);
00114 s_restricted = group.readEntry("RESTRICT", true);
00115 s_fileShareGroup = group.readEntry("FILESHAREGROUP", "fileshare");
00116
00117
00118 if (!s_sharingEnabled)
00119 s_authorization = UserNotAllowed;
00120 else
00121 if (!s_restricted )
00122 s_authorization = Authorized;
00123 else {
00124
00125 KUserGroup shareGroup(s_fileShareGroup);
00126 if (shareGroup.users().contains(KUser()) )
00127 s_authorization = Authorized;
00128 else
00129 s_authorization = UserNotAllowed;
00130 }
00131
00132 s_shareMode = readEntry(group, "SHARINGMODE", Simple);
00133
00134
00135 s_sambaEnabled = group.readEntry("SAMBA", true);
00136 s_nfsEnabled = group.readEntry("NFS", true);
00137 }
00138
00139 KFileShare::ShareMode KFileShare::shareMode() {
00140 if ( s_authorization == NotInitialized )
00141 readConfig();
00142
00143 return s_shareMode;
00144 }
00145
00146 bool KFileShare::sharingEnabled() {
00147 if ( s_authorization == NotInitialized )
00148 readConfig();
00149
00150 return s_sharingEnabled;
00151 }
00152
00153 bool KFileShare::isRestricted() {
00154 if ( s_authorization == NotInitialized )
00155 readConfig();
00156
00157 return s_restricted;
00158 }
00159
00160 QString KFileShare::fileShareGroup() {
00161 if ( s_authorization == NotInitialized )
00162 readConfig();
00163
00164 return s_fileShareGroup;
00165 }
00166
00167
00168 bool KFileShare::sambaEnabled() {
00169 if ( s_authorization == NotInitialized )
00170 readConfig();
00171
00172 return s_sambaEnabled;
00173 }
00174
00175 bool KFileShare::nfsEnabled() {
00176 if ( s_authorization == NotInitialized )
00177 readConfig();
00178
00179 return s_nfsEnabled;
00180 }
00181
00182
00183 void KFileShare::readShareList()
00184 {
00185 KFileSharePrivate::self();
00186 s_shareList->clear();
00187
00188 QString exe = ::findExe( "filesharelist" );
00189 if (exe.isEmpty()) {
00190 s_authorization = ErrorNotFound;
00191 return;
00192 }
00193 QProcess proc;
00194 proc.start( exe, QStringList() );
00195 if ( !proc.waitForFinished() ) {
00196 kError() << "Can't run" << exe;
00197 s_authorization = ErrorNotFound;
00198 return;
00199 }
00200
00201
00202 while (!proc.atEnd()) {
00203 QString line = proc.readLine().trimmed();
00204 int length = line.length();
00205 if ( length > 0 )
00206 {
00207 if ( line[length-1] != '/' )
00208 line += '/';
00209 s_shareList->append(line);
00210 kDebug(7000) << "Shared dir:" << line;
00211 }
00212 }
00213 }
00214
00215
00216 bool KFileShare::isDirectoryShared( const QString& _path )
00217 {
00218 if ( ! s_shareList )
00219 readShareList();
00220
00221 QString path( _path );
00222 if ( path[path.length()-1] != '/' )
00223 path += '/';
00224 return s_shareList->contains( path );
00225 }
00226
00227 KFileShare::Authorization KFileShare::authorization()
00228 {
00229
00230 if ( s_authorization == NotInitialized )
00231 readConfig();
00232 return s_authorization;
00233 }
00234
00235 bool KFileShare::setShared( const QString& path, bool shared )
00236 {
00237 if (! KFileShare::sharingEnabled() ||
00238 KFileShare::shareMode() == Advanced)
00239 return false;
00240
00241 kDebug(7000) << path << "," << shared;
00242 QString exe = ::findExe( "fileshareset" );
00243 if (exe.isEmpty())
00244 return false;
00245
00246 QStringList args;
00247 if ( shared )
00248 args << "--add";
00249 else
00250 args << "--remove";
00251 args << path ;
00252 int ec = QProcess::execute( exe, args );
00253 kDebug(7000) << "exitCode=" << ec;
00254 bool ok = !ec;
00255 switch (ec) {
00256 case 1:
00257
00258 break;
00259 case 3:
00260
00261
00262
00263 ok = true;
00264 break;
00265 case 4:
00266
00267 break;
00268 case 5:
00269
00270
00271
00272 ok = true;
00273 break;
00274 case 6:
00275
00276 break;
00277 case 7:
00278
00279 break;
00280 case 8:
00281
00282 break;
00283 case 255:
00284
00285 break;
00286 }
00287
00288 return ok;
00289 }
00290
00291
00292 #include "kfileshare_p.moc"
00293