00001
00031
#include "acljobs.h"
00032
#include <kio/scheduler.h>
00033
#include <kdebug.h>
00034
00035
using namespace KMail;
00036
00037
static unsigned int IMAPRightsToPermission(
const QString& str ) {
00038
unsigned int perm = 0;
00039
bool foundSeenPerm =
false;
00040 uint len = str.length();
00041
for (uint i = 0; i < len; ++i) {
00042
QChar ch = str[i];
00043
switch ( ch.latin1() ) {
00044
case 'l': perm |= ACLJobs::List;
break;
00045
case 'r': perm |= ACLJobs::Read;
break;
00046
case 's': foundSeenPerm =
true;
break;
00047
case 'w': perm |= ACLJobs::WriteFlags;
break;
00048
case 'i': perm |= ACLJobs::Insert;
break;
00049
case 'p': perm |= ACLJobs::Post;
break;
00050
case 'c': perm |= ACLJobs::Create;
break;
00051
case 'd': perm |= ACLJobs::Delete;
break;
00052
case 'a': perm |= ACLJobs::Administer;
break;
00053
default:
break;
00054 }
00055 }
00056
if ( ( perm & ACLJobs::Read ) && str.find(
's' ) == -1 ) {
00057
00058
00059
00060 kdWarning(5006) <<
"IMAPRightsToPermission: found read (r) but not seen (s). Things will not work well." << endl;
00061
if ( perm & ACLJobs::Administer )
00062 kdWarning(5006) <<
"You can change this yourself in the ACL dialog" << endl;
00063
else
00064 kdWarning(5006) <<
"Ask your admin for 's' permissions." << endl;
00065
00066 }
00067
00068
return perm;
00069 }
00070
00071
static QCString permissionsToIMAPRights(
unsigned int permissions ) {
00072
QCString str =
"";
00073
if ( permissions & ACLJobs::List )
00074 str +=
'l';
00075
if ( permissions & ACLJobs::Read )
00076 str +=
"rs";
00077
if ( permissions & ACLJobs::WriteFlags )
00078 str +=
'w';
00079
if ( permissions & ACLJobs::Insert )
00080 str +=
'i';
00081
if ( permissions & ACLJobs::Post )
00082 str +=
'p';
00083
if ( permissions & ACLJobs::Create )
00084 str +=
'c';
00085
if ( permissions & ACLJobs::Delete )
00086 str +=
'd';
00087
if ( permissions & ACLJobs::Administer )
00088 str +=
'a';
00089
return str;
00090 }
00091
00092
#ifndef NDEBUG
00093
QString ACLJobs::permissionsToString(
unsigned int permissions )
00094 {
00095
QString str;
00096
if ( permissions & ACLJobs::List )
00097 str +=
"List ";
00098
if ( permissions & ACLJobs::Read )
00099 str +=
"Read ";
00100
if ( permissions & ACLJobs::WriteFlags )
00101 str +=
"Write ";
00102
if ( permissions & ACLJobs::Insert )
00103 str +=
"Insert ";
00104
if ( permissions & ACLJobs::Post )
00105 str +=
"Post ";
00106
if ( permissions & ACLJobs::Create )
00107 str +=
"Create ";
00108
if ( permissions & ACLJobs::Delete )
00109 str +=
"Delete ";
00110
if ( permissions & ACLJobs::Administer )
00111 str +=
"Administer ";
00112
if ( !str.isEmpty() )
00113 str.truncate( str.length() - 1 );
00114
return str;
00115 }
00116
#endif
00117
00118 KIO::SimpleJob* ACLJobs::setACL( KIO::Slave* slave,
const KURL& url,
const QString& user,
unsigned int permissions )
00119 {
00120
QString perm = QString::fromLatin1( permissionsToIMAPRights( permissions ) );
00121
00122
QByteArray packedArgs;
00123
QDataStream stream( packedArgs, IO_WriteOnly );
00124 stream << (
int)
'A' << (
int)
'S' << url << user << perm;
00125
00126 KIO::SimpleJob* job = KIO::special( url, packedArgs,
false );
00127 KIO::Scheduler::assignJobToSlave( slave, job );
00128
return job;
00129 }
00130
00131
ACLJobs::DeleteACLJob* ACLJobs::deleteACL( KIO::Slave* slave,
const KURL& url,
const QString& user )
00132 {
00133
QByteArray packedArgs;
00134
QDataStream stream( packedArgs, IO_WriteOnly );
00135 stream << (
int)
'A' << (
int)
'D' << url << user;
00136
00137
ACLJobs::DeleteACLJob* job =
new ACLJobs::DeleteACLJob( url, user, packedArgs,
false );
00138 KIO::Scheduler::assignJobToSlave( slave, job );
00139
return job;
00140 }
00141
00142
ACLJobs::GetACLJob* ACLJobs::getACL( KIO::Slave* slave,
const KURL& url )
00143 {
00144
QByteArray packedArgs;
00145
QDataStream stream( packedArgs, IO_WriteOnly );
00146 stream << (
int)
'A' << (
int)
'G' << url;
00147
00148
ACLJobs::GetACLJob* job =
new ACLJobs::GetACLJob( url, packedArgs,
false );
00149 KIO::Scheduler::assignJobToSlave( slave, job );
00150
return job;
00151 }
00152
00153
ACLJobs::GetUserRightsJob* ACLJobs::getUserRights( KIO::Slave* slave,
const KURL& url )
00154 {
00155
QByteArray packedArgs;
00156
QDataStream stream( packedArgs, IO_WriteOnly );
00157 stream << (
int)
'A' << (
int)
'M' << url;
00158
00159
ACLJobs::GetUserRightsJob* job =
new ACLJobs::GetUserRightsJob( url, packedArgs,
false );
00160 KIO::Scheduler::assignJobToSlave( slave, job );
00161
return job;
00162 }
00163
00164 ACLJobs::GetACLJob::GetACLJob(
const KURL& url,
const QByteArray &packedArgs,
00165
bool showProgressInfo )
00166 : KIO::SimpleJob( url, KIO::CMD_SPECIAL, packedArgs, showProgressInfo )
00167 {
00168 connect(
this, SIGNAL(infoMessage(KIO::Job*,
const QString&)),
00169 SLOT(slotInfoMessage(KIO::Job*,
const QString&)) );
00170 }
00171
00172
void ACLJobs::GetACLJob::slotInfoMessage( KIO::Job*,
const QString& str )
00173 {
00174
00175
QStringList lst = QStringList::split(
" ", str );
00176
while ( lst.count() >= 2 )
00177 {
00178
QString user = lst.front(); lst.pop_front();
00179
QString imapRights = lst.front(); lst.pop_front();
00180
unsigned int perm = IMAPRightsToPermission( imapRights );
00181 m_entries.append(
ACLListEntry( user, imapRights, perm ) );
00182 }
00183 }
00184
00185 ACLJobs::GetUserRightsJob::GetUserRightsJob(
const KURL& url,
const QByteArray &packedArgs,
00186
bool showProgressInfo )
00187 : KIO::SimpleJob( url, KIO::CMD_SPECIAL, packedArgs, showProgressInfo )
00188 {
00189 connect(
this, SIGNAL(infoMessage(KIO::Job*,
const QString&)),
00190 SLOT(slotInfoMessage(KIO::Job*,
const QString&)) );
00191 }
00192
00193
void ACLJobs::GetUserRightsJob::slotInfoMessage( KIO::Job*,
const QString& str )
00194 {
00195
00196 m_permissions = IMAPRightsToPermission( str );
00197 }
00198
00199 ACLJobs::DeleteACLJob::DeleteACLJob(
const KURL& url,
const QString& userId,
00200
const QByteArray &packedArgs,
00201
bool showProgressInfo )
00202 : KIO::SimpleJob( url, KIO::CMD_SPECIAL, packedArgs, showProgressInfo ),
00203 mUserId( userId )
00204 {
00205 }
00206
00208
00209 ACLJobs::MultiSetACLJob::MultiSetACLJob( KIO::Slave* slave,
const KURL& url,
const ACLList& acl,
bool showProgressInfo )
00210 : KIO::Job( showProgressInfo ),
00211 mSlave( slave ),
00212 mUrl( url ), mACLList( acl ), mACLListIterator( acl.begin() )
00213 {
00214 QTimer::singleShot(0,
this, SLOT(slotStart()));
00215 }
00216
00217
void ACLJobs::MultiSetACLJob::slotStart()
00218 {
00219
00220
while ( mACLListIterator != mACLList.
end() && !(*mACLListIterator).changed )
00221 ++mACLListIterator;
00222
00223
if ( mACLListIterator != mACLList.
end() )
00224 {
00225
const ACLListEntry& entry = *mACLListIterator;
00226 KIO::Job* job = 0;
00227
if ( entry.
permissions > -1 )
00228 job =
setACL( mSlave, mUrl, entry.
userId, entry.
permissions );
00229
else
00230 job =
deleteACL( mSlave, mUrl, entry.
userId );
00231
00232 addSubjob( job );
00233 }
else {
00234 emitResult();
00235 }
00236 }
00237
00238
void ACLJobs::MultiSetACLJob::slotResult( KIO::Job *job )
00239 {
00240
if ( job->error() ) {
00241 KIO::Job::slotResult( job );
00242
return;
00243 }
00244 subjobs.remove(job);
00245
const ACLListEntry& entry = *mACLListIterator;
00246 emit aclChanged( entry.
userId, entry.
permissions );
00247
00248
00249 ++mACLListIterator;
00250 slotStart();
00251 }
00252
00253
ACLJobs::MultiSetACLJob* ACLJobs::multiSetACL( KIO::Slave* slave,
const KURL& url,
const ACLList& acl )
00254 {
00255
return new MultiSetACLJob( slave, url, acl,
false );
00256 }
00257
00258
#include "acljobs.moc"