kmail

acljobs.cpp
00001 
00031 #include "acljobs.h"
00032 #include <tdeio/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 TQString& str, const KURL& url, const TQString& user ) {
00040   unsigned int perm = 0;
00041   uint len = str.length();
00042   for (uint i = 0; i < len; ++i) {
00043     TQChar ch = str[i];
00044     switch ( ch.latin1() ) {
00045     case 'l': perm |= ACLJobs::List; break;
00046     case 'r': perm |= ACLJobs::Read; break;
00047     case 's': perm |= ACLJobs::WriteSeenFlag; break;
00048     case 'w': perm |= ACLJobs::WriteFlags; break;
00049     case 'i': perm |= ACLJobs::Insert; break;
00050     case 'p': perm |= ACLJobs::Post; break;
00051     case 'k': // fall through
00052     case 'c': perm |= ACLJobs::Create; break;
00053     case 'x': // fall through
00054     case 'd': perm |= ACLJobs::Delete; break;
00055     case 'a': perm |= ACLJobs::Administer; break;
00056     default: break;
00057     }
00058   }
00059   if ( ( perm & ACLJobs::Read ) && !( perm & ACLJobs::WriteSeenFlag )  ) {
00060     // Reading without 'seen' is, well, annoying. Unusable, even.
00061     // So we treat 'rs' as a single one.
00062     // But if the permissions were set out of kmail, better check that both are set
00063     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;
00064     if ( perm & ACLJobs::Administer )
00065       kdWarning(5006) << "You can change this yourself in the ACL dialog" << endl;
00066     else
00067       kdWarning(5006) << "Ask your admin for 's' permissions." << endl;
00068     // Is the above correct enough to be turned into a KMessageBox?
00069   }
00070 
00071   return perm;
00072 }
00073 
00074 static TQCString permissionsToIMAPRights( unsigned int permissions ) {
00075   TQCString str = "";
00076   if ( permissions & ACLJobs::List )
00077     str += 'l';
00078   if ( permissions & ACLJobs::Read )
00079     str += 'r';
00080   if ( permissions & ACLJobs::WriteSeenFlag )
00081     str += 's';
00082   if ( permissions & ACLJobs::WriteFlags )
00083     str += 'w';
00084   if ( permissions & ACLJobs::Insert )
00085     str += 'i';
00086   if ( permissions & ACLJobs::Post )
00087     str += 'p';
00088   if ( permissions & ACLJobs::Create )
00089     str += 'c';
00090   if ( permissions & ACLJobs::Delete )
00091     str += 'd';
00092   if ( permissions & ACLJobs::Administer )
00093     str += 'a';
00094   return str;
00095 }
00096 
00097 #ifndef NDEBUG
00098 TQString ACLJobs::permissionsToString( unsigned int permissions )
00099 {
00100   TQString str;
00101   if ( permissions & ACLJobs::List )
00102     str += "List ";
00103   if ( permissions & ACLJobs::Read )
00104     str += "Read ";
00105   if ( permissions & ACLJobs::WriteFlags )
00106     str += "Write ";
00107   if ( permissions & ACLJobs::Insert )
00108     str += "Insert ";
00109   if ( permissions & ACLJobs::Post )
00110     str += "Post ";
00111   if ( permissions & ACLJobs::Create )
00112     str += "Create ";
00113   if ( permissions & ACLJobs::Delete )
00114     str += "Delete ";
00115   if ( permissions & ACLJobs::Administer )
00116     str += "Administer ";
00117   if ( !str.isEmpty() )
00118     str.truncate( str.length() - 1 );
00119   return str;
00120 }
00121 #endif
00122 
00123 TDEIO::SimpleJob* ACLJobs::setACL( TDEIO::Slave* slave, const KURL& url, const TQString& user, unsigned int permissions )
00124 {
00125   TQString perm = TQString::fromLatin1( permissionsToIMAPRights( permissions ) );
00126 
00127   TQByteArray packedArgs;
00128   TQDataStream stream( packedArgs, IO_WriteOnly );
00129   stream << (int)'A' << (int)'S' << url << user << perm;
00130 
00131   TDEIO::SimpleJob* job = TDEIO::special( url, packedArgs, false );
00132   TDEIO::Scheduler::assignJobToSlave( slave, job );
00133   return job;
00134 }
00135 
00136 ACLJobs::DeleteACLJob* ACLJobs::deleteACL( TDEIO::Slave* slave, const KURL& url, const TQString& user )
00137 {
00138   TQByteArray packedArgs;
00139   TQDataStream stream( packedArgs, IO_WriteOnly );
00140   stream << (int)'A' << (int)'D' << url << user;
00141 
00142   ACLJobs::DeleteACLJob* job = new ACLJobs::DeleteACLJob( url, user, packedArgs, false );
00143   TDEIO::Scheduler::assignJobToSlave( slave, job );
00144   return job;
00145 }
00146 
00147 ACLJobs::GetACLJob* ACLJobs::getACL( TDEIO::Slave* slave, const KURL& url )
00148 {
00149   TQByteArray packedArgs;
00150   TQDataStream stream( packedArgs, IO_WriteOnly );
00151   stream << (int)'A' << (int)'G' << url;
00152 
00153   ACLJobs::GetACLJob* job = new ACLJobs::GetACLJob( url, packedArgs, false );
00154   TDEIO::Scheduler::assignJobToSlave( slave, job );
00155   return job;
00156 }
00157 
00158 ACLJobs::GetUserRightsJob* ACLJobs::getUserRights( TDEIO::Slave* slave, const KURL& url )
00159 {
00160   TQByteArray packedArgs;
00161   TQDataStream stream( packedArgs, IO_WriteOnly );
00162   stream << (int)'A' << (int)'M' << url;
00163 
00164   ACLJobs::GetUserRightsJob* job = new ACLJobs::GetUserRightsJob( url, packedArgs, false );
00165   TDEIO::Scheduler::assignJobToSlave( slave, job );
00166   return job;
00167 }
00168 
00169 ACLJobs::GetACLJob::GetACLJob( const KURL& url, const TQByteArray &packedArgs,
00170                                  bool showProgressInfo )
00171   : TDEIO::SimpleJob( url, TDEIO::CMD_SPECIAL, packedArgs, showProgressInfo )
00172 {
00173   connect( this, TQT_SIGNAL(infoMessage(TDEIO::Job*,const TQString&)),
00174            TQT_SLOT(slotInfoMessage(TDEIO::Job*,const TQString&)) );
00175 }
00176 
00177 void ACLJobs::GetACLJob::slotInfoMessage( TDEIO::Job*, const TQString& str )
00178 {
00179   // Parse the result
00180   TQStringList lst = TQStringList::split( "\"", str, true );
00181   while ( lst.count() >= 2 ) // we take items 2 by 2
00182   {
00183     TQString user = lst.front(); lst.pop_front();
00184     TQString imapRights = lst.front(); lst.pop_front();
00185     unsigned int perm = IMAPRightsToPermission( imapRights, url(), user );
00186     m_entries.append( ACLListEntry( user, imapRights, perm ) );
00187   }
00188 }
00189 
00190 ACLJobs::GetUserRightsJob::GetUserRightsJob( const KURL& url, const TQByteArray &packedArgs,
00191                                                bool showProgressInfo )
00192   : TDEIO::SimpleJob( url, TDEIO::CMD_SPECIAL, packedArgs, showProgressInfo )
00193 {
00194   connect( this, TQT_SIGNAL(infoMessage(TDEIO::Job*,const TQString&)),
00195            TQT_SLOT(slotInfoMessage(TDEIO::Job*,const TQString&)) );
00196 }
00197 
00198 void ACLJobs::GetUserRightsJob::slotInfoMessage( TDEIO::Job*, const TQString& str )
00199 {
00200   // Parse the result
00201   m_permissions = IMAPRightsToPermission( str, url(), TQString() );
00202 }
00203 
00204 ACLJobs::DeleteACLJob::DeleteACLJob( const KURL& url, const TQString& userId,
00205                                      const TQByteArray &packedArgs,
00206                                      bool showProgressInfo )
00207   : TDEIO::SimpleJob( url, TDEIO::CMD_SPECIAL, packedArgs, showProgressInfo ),
00208     mUserId( userId )
00209 {
00210 }
00211 
00213 
00214 ACLJobs::MultiSetACLJob::MultiSetACLJob( TDEIO::Slave* slave, const KURL& url, const ACLList& acl, bool showProgressInfo )
00215   : TDEIO::Job( showProgressInfo ),
00216     mSlave( slave ),
00217     mUrl( url ), mACLList( acl ), mACLListIterator( mACLList.begin() )
00218 {
00219   TQTimer::singleShot(0, this, TQT_SLOT(slotStart()));
00220 }
00221 
00222 void ACLJobs::MultiSetACLJob::slotStart()
00223 {
00224   // Skip over unchanged entries
00225   while ( mACLListIterator != mACLList.end() && !(*mACLListIterator).changed )
00226     ++mACLListIterator;
00227 
00228   if ( mACLListIterator != mACLList.end() )
00229   {
00230     const ACLListEntry& entry = *mACLListIterator;
00231     TDEIO::Job* job = 0;
00232     if ( entry.permissions > -1 )
00233       job = setACL( mSlave, mUrl, entry.userId, entry.permissions );
00234     else
00235       job = deleteACL( mSlave, mUrl, entry.userId );
00236 
00237     addSubjob( job );
00238   } else { // done!
00239     emitResult();
00240   }
00241 }
00242 
00243 void ACLJobs::MultiSetACLJob::slotResult( TDEIO::Job *job )
00244 {
00245   if ( job->error() ) {
00246     TDEIO::Job::slotResult( job ); // will set the error and emit result(this)
00247     return;
00248   }
00249   subjobs.remove(job);
00250   const ACLListEntry& entry = *mACLListIterator;
00251   emit aclChanged( entry.userId, entry.permissions );
00252 
00253   // Move on to next one
00254   ++mACLListIterator;
00255   slotStart();
00256 }
00257 
00258 ACLJobs::MultiSetACLJob* ACLJobs::multiSetACL( TDEIO::Slave* slave, const KURL& url, const ACLList& acl )
00259 {
00260   return new MultiSetACLJob( slave, url, acl, false /*showProgressInfo*/ );
00261 }
00262 
00263 #include "acljobs.moc"