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