use myrights for personal folders to fix interoperability problem with fastmail.fm, r=sspitzer, sr=scott, a=sspitzer 217431

This commit is contained in:
bienvenu%nventure.com 2003-08-28 23:16:52 +00:00
Родитель e65903b938
Коммит 3fdadcff7b
3 изменённых файлов: 75 добавлений и 14 удалений

Просмотреть файл

@ -227,6 +227,7 @@ nsImapMailFolder::nsImapMailFolder() :
m_pathName = nsnull;
m_folderACL = nsnull;
m_aclFlags = 0;
m_supportedUserFlags = 0;
m_namespace = nsnull;
m_numFilterClassifyRequests = 0;
}
@ -5050,6 +5051,51 @@ NS_IMETHODIMP nsImapMailFolder::GetAclFlags(PRUint32 *aclFlags)
return rv;
}
nsresult nsImapMailFolder::SetSupportedUserFlags(PRUint32 userFlags)
{
nsCOMPtr<nsIDBFolderInfo> dbFolderInfo;
nsresult rv = GetDatabase(nsnull);
m_supportedUserFlags = userFlags;
if (mDatabase)
{
rv = mDatabase->GetDBFolderInfo(getter_AddRefs(dbFolderInfo));
if (NS_SUCCEEDED(rv) && dbFolderInfo)
dbFolderInfo->SetUint32Property("imapFlags", userFlags);
}
return rv;
}
nsresult nsImapMailFolder::GetSupportedUserFlags(PRUint32 *userFlags)
{
NS_ENSURE_ARG_POINTER(userFlags);
nsresult rv = NS_OK;
ReadDBFolderInfo(PR_FALSE); // update cache first.
if (m_supportedUserFlags == 0) // 0 means invalid value, so get it from db.
{
nsCOMPtr<nsIDBFolderInfo> dbFolderInfo;
rv = GetDatabase(nsnull);
if (mDatabase)
{
rv = mDatabase->GetDBFolderInfo(getter_AddRefs(dbFolderInfo));
if (NS_SUCCEEDED(rv) && dbFolderInfo)
{
rv = dbFolderInfo->GetUint32Property("imapFlags", userFlags, 0);
m_supportedUserFlags = *userFlags;
}
}
}
else
*userFlags = m_supportedUserFlags;
return rv;
}
NS_IMETHODIMP nsImapMailFolder::GetCanIOpenThisFolder(PRBool *aBool)
{
NS_ENSURE_ARG_POINTER(aBool);
@ -5165,9 +5211,18 @@ void nsMsgIMAPFolderACL::UpdateACLCache()
PRBool nsMsgIMAPFolderACL::SetFolderRightsForUser(const char *userName, const char *rights)
{
PRBool rv = PR_FALSE;
PRBool ret = PR_FALSE;
nsXPIDLCString myUserName;
m_folder->GetUsername(getter_Copies(myUserName));
nsCOMPtr <nsIMsgIncomingServer> server;
nsresult rv = m_folder->GetServer(getter_AddRefs(server));
NS_ASSERTION(NS_SUCCEEDED(rv), "error getting server");
if (NS_FAILED(rv))
return PR_FALSE;
// we need the real user name to match with what the imap server returns
// in the acl response.
server->GetRealUsername(getter_Copies(myUserName));
char *ourUserName = nsnull;
if (!userName)
@ -5188,7 +5243,7 @@ PRBool nsMsgIMAPFolderACL::SetFolderRightsForUser(const char *userName, const ch
NS_ASSERTION(m_aclCount >= 0, "acl count can't go negative");
}
m_aclCount++;
rv = (m_rightsHash->Put(&hashKey, rightsWeOwn) == 0);
ret = (m_rightsHash->Put(&hashKey, rightsWeOwn) == 0);
}
if (ourUserName &&
@ -5198,7 +5253,7 @@ PRBool nsMsgIMAPFolderACL::SetFolderRightsForUser(const char *userName, const ch
UpdateACLCache();
}
return rv;
return ret;
}
const char *nsMsgIMAPFolderACL::GetRightsStringForUser(const char *inUserName)

Просмотреть файл

@ -341,6 +341,10 @@ public:
virtual nsresult SpamFilterClassifyMessages(const char **aURIArray, PRUint32 aURICount, nsIMsgWindow *aMsgWindow, nsIJunkMailPlugin *aJunkMailPlugin);
static nsresult AllocateUidStringFromKeys(nsMsgKey *keys, PRUint32 numKeys, nsCString &msgIds);
// these might end up as an nsIImapMailFolder attribute.
nsresult SetSupportedUserFlags(PRUint32 userFlags);
nsresult GetSupportedUserFlags(PRUint32 *userFlags);
protected:
// Helper methods
@ -474,6 +478,7 @@ protected:
nsMsgIMAPFolderACL *m_folderACL;
PRUint32 m_aclFlags;
PRUint32 m_supportedUserFlags;
nsCOMPtr<nsISupports> mSupportsToRelease;

Просмотреть файл

@ -474,7 +474,7 @@ nsresult nsImapProtocol::Initialize(nsIImapHostSessionList * aHostSessionList, n
m_flagState = new nsImapFlagAndUidState(kImapFlagAndUidStateSize, PR_FALSE);
if (!m_flagState)
return NS_ERROR_OUT_OF_MEMORY;
return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(m_flagState);
@ -4779,7 +4779,7 @@ void nsImapProtocol::HandleCurrentUrlError()
nsImapMailboxSpec *notSelectedSpec = new nsImapMailboxSpec;
if (notSelectedSpec)
{
NS_ADDREF(notSelectedSpec);
NS_ADDREF(notSelectedSpec);
notSelectedSpec->allocatedPathName = fCurrentUrl->CreateCanonicalSourceFolderPathString();
notSelectedSpec->hostName = fCurrentUrl->GetUrlHost();
notSelectedSpec->folderSelected = PR_FALSE;
@ -5353,16 +5353,16 @@ void nsImapProtocol::OnUnsubscribe(const char * sourceMailbox)
void nsImapProtocol::RefreshACLForFolderIfNecessary(const char *mailboxName)
{
if (GetServerStateParser().ServerHasACLCapability())
if (GetServerStateParser().ServerHasACLCapability())
{
if (!m_folderNeedsACLRefreshed && m_imapMailFolderSink)
m_imapMailFolderSink->GetFolderNeedsACLListed(&m_folderNeedsACLRefreshed);
if (m_folderNeedsACLRefreshed)
{
if (!m_folderNeedsACLRefreshed && m_imapMailFolderSink)
m_imapMailFolderSink->GetFolderNeedsACLListed(&m_folderNeedsACLRefreshed);
if (m_folderNeedsACLRefreshed)
{
RefreshACLForFolder(mailboxName);
m_folderNeedsACLRefreshed = PR_FALSE;
}
RefreshACLForFolder(mailboxName);
m_folderNeedsACLRefreshed = PR_FALSE;
}
}
}
void nsImapProtocol::RefreshACLForFolder(const char *mailboxName)
@ -5383,6 +5383,7 @@ void nsImapProtocol::RefreshACLForFolder(const char *mailboxName)
ClearAllFolderRights(mailboxName, ns);
// Now, get the new one.
GetACLForFolder(mailboxName);
GetMyRightsForFolder(mailboxName);
// We're all done, refresh the icon/flags for this folder
RefreshFolderACLView(mailboxName, ns);
break;