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"