kmail

acljobs.cpp

00001 
00031 #include "acljobs.h"
00032 #include <kio/scheduler.h>
00033 #include <kdebug.h>
00034 
00035 using namespace KMail;
00036 
00037 // Convert str to an ACLPermissions value.
00038 // url and user are there only for the error message
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     // Reading without 'seen' is, well, annoying. Unusable, even.
00060     // So we treat 'rs' as a single one.
00061     // But if the permissions were set out of kmail, better check that both are set
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     // Is the above correct enough to be turned into a KMessageBox?
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   // Parse the result
00177   QStringList lst = QStringList::split( " ", str );
00178   while ( lst.count() >= 2 ) // we take items 2 by 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   // Parse the result
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   // Skip over unchanged entries
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 { // done!
00236     emitResult();
00237   }
00238 }
00239 
00240 void ACLJobs::MultiSetACLJob::slotResult( KIO::Job *job )
00241 {
00242   if ( job->error() ) {
00243     KIO::Job::slotResult( job ); // will set the error and emit result(this)
00244     return;
00245   }
00246   subjobs.remove(job);
00247   const ACLListEntry& entry = *mACLListIterator;
00248   emit aclChanged( entry.userId, entry.permissions );
00249 
00250   // Move on to next one
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 /*showProgressInfo*/ );
00258 }
00259 
00260 #include "acljobs.moc"
KDE Home | KDE Accessibility Home | Description of Access Keys