00001
00031 #include "acljobs.h"
00032 #include <tdeio/scheduler.h>
00033 #include <kdebug.h>
00034
00035 using namespace KMail;
00036
00037
00038
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':
00052 case 'c': perm |= ACLJobs::Create; break;
00053 case 'x':
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
00061
00062
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
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
00180 TQStringList lst = TQStringList::split( "\"", str, true );
00181 while ( lst.count() >= 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
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
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 {
00239 emitResult();
00240 }
00241 }
00242
00243 void ACLJobs::MultiSetACLJob::slotResult( TDEIO::Job *job )
00244 {
00245 if ( job->error() ) {
00246 TDEIO::Job::slotResult( job );
00247 return;
00248 }
00249 subjobs.remove(job);
00250 const ACLListEntry& entry = *mACLListIterator;
00251 emit aclChanged( entry.userId, entry.permissions );
00252
00253
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 );
00261 }
00262
00263 #include "acljobs.moc"