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 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 KIO::SimpleJob* ACLJobs::setACL( KIO::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 KIO::SimpleJob* job = KIO::special( url, packedArgs, false ); 00132 KIO::Scheduler::assignJobToSlave( slave, job ); 00133 return job; 00134 } 00135 00136 ACLJobs::DeleteACLJob* ACLJobs::deleteACL( KIO::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 KIO::Scheduler::assignJobToSlave( slave, job ); 00144 return job; 00145 } 00146 00147 ACLJobs::GetACLJob* ACLJobs::getACL( KIO::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 KIO::Scheduler::assignJobToSlave( slave, job ); 00155 return job; 00156 } 00157 00158 ACLJobs::GetUserRightsJob* ACLJobs::getUserRights( KIO::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 KIO::Scheduler::assignJobToSlave( slave, job ); 00166 return job; 00167 } 00168 00169 ACLJobs::GetACLJob::GetACLJob( const KURL& url, const TQByteArray &packedArgs, 00170 bool showProgressInfo ) 00171 : KIO::SimpleJob( url, KIO::CMD_SPECIAL, packedArgs, showProgressInfo ) 00172 { 00173 connect( this, TQT_SIGNAL(infoMessage(KIO::Job*,const TQString&)), 00174 TQT_SLOT(slotInfoMessage(KIO::Job*,const TQString&)) ); 00175 } 00176 00177 void ACLJobs::GetACLJob::slotInfoMessage( KIO::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 : KIO::SimpleJob( url, KIO::CMD_SPECIAL, packedArgs, showProgressInfo ) 00193 { 00194 connect( this, TQT_SIGNAL(infoMessage(KIO::Job*,const TQString&)), 00195 TQT_SLOT(slotInfoMessage(KIO::Job*,const TQString&)) ); 00196 } 00197 00198 void ACLJobs::GetUserRightsJob::slotInfoMessage( KIO::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 : KIO::SimpleJob( url, KIO::CMD_SPECIAL, packedArgs, showProgressInfo ), 00208 mUserId( userId ) 00209 { 00210 } 00211 00213 00214 ACLJobs::MultiSetACLJob::MultiSetACLJob( KIO::Slave* slave, const KURL& url, const ACLList& acl, bool showProgressInfo ) 00215 : KIO::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 KIO::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( KIO::Job *job ) 00244 { 00245 if ( job->error() ) { 00246 KIO::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( KIO::Slave* slave, const KURL& url, const ACLList& acl ) 00259 { 00260 return new MultiSetACLJob( slave, url, acl, false /*showProgressInfo*/ ); 00261 } 00262 00263 #include "acljobs.moc"