Open Bug 166603 Opened 22 years ago Updated 2 years ago

IMAP: Drafts/Sent/etc not recognized as special folders, when using namespaces.

Categories

(MailNews Core :: Networking: IMAP, defect)

x86
All
defect

Tracking

(Not tracked)

People

(Reporter: mozilla-bugs, Unassigned)

References

(Blocks 1 open bug)

Details

(Keywords: helpwanted, Whiteboard: [patchlove] workaround: comment 22)

Attachments

(8 obsolete files)

I have in my prefs.js:

user_pref("mail.server.server3.namespace.other_users", "");
user_pref("mail.server.server3.namespace.personal",
"\"INBOX.Sys.\",\"INBOX.Work\",\"INBOX.Folders.\"");
user_pref("mail.server.server3.namespace.public", "");
user_pref("mail.server.server3.override_namespaces", false);

and

user_pref("mail.identity.id2.draft_folder",
"imap://nogin@cuttlefish.cs.caltech.edu/Drafts");
user_pref("mail.identity.id2.drafts_folder_picker_mode", "0");

With this setup Mozilla (1.1 on Red Hat Linux 7.3) correctly saves messages to
INBOX.Sys.Drafts when I do "save as draft". However when I go to the Drafts
folder, the message is displayed same as if it was an ordinary folder and there
is no way to continue editing the draft (other then "Edit as new")!
Which build are you using? Can you provide the build info here?
What kind of the IMAP Server are you connecting with? 
I am using 1.1 release (using RPMs from ftp.mozilla.org) on Red Hat Linux 7.3.
The server is Courier IMAP.
Blocks: 160644
Same with Sent - the sent messages will be filed there normally, but when
viewing the folder, it would show the sender instead of showing the recipient
(as it supposed to do in Sent).

P.S. Not sure if this is an IMAP issue, an FE issue, or both...
Summary: IMAP: Drafts is not recognized as a special folder, when using namespaces. → IMAP: Drafts/Sent/etc not recognized as special folders, when using namespaces.
I reproduced this bug in my fastmail account (Cyrus server) too.  And also I
can't save massage in mydraft when IMAP server directory is set INBOX.
Yeah, still there in BuildID 2002103002 (trunk).
This may have something to do with the server.Need server prepare a pair of
Drafts and Sent and Templates folders for every personal namespace? If server
don't support default Drafts and Sent ... folders initially, mozilla can be
changed into create those folders when it first discoverfolders. Just like
1.CreateDefaultMailboxes,2.SetFlagsOnDefaultMailboxes.( And the key of the
solution will be flags' setting and using.) But it is expensive.
Re: comment #6

> This may have something to do with the server

Regardless of server, Mozilla is clearly confused - it knows to _save_ messages
into those folders, but for some reason faile to realize they are special when
_displaying_ them.
This is the client issue.
Does someone have tracked if the flags is set correctly for Drafts folder?Do
Aleksey Nogin mean even if the flags is set correctly, we still can't see the
'edit draft...' button or other errors?Thnks:)
How do I check the flags? My guess is they are *not* set correctly - at least in
the folders pane the "normal folder" icons are used instead of the special ones.
If the MSG_FOLDER_FLAG_DRAFTS or such other flags(which means that this is a
special folder) is set correctly, I find the "Edit draft..." button and other
special functions works well. I'm finding if there is something wrong with the
setting of flags or recognize these special folder. Thks Aleksey.
The reason should be the flags are *NOT* set correctly because of the namespace.
If drafts (or other special ones) is parrelled with 'INBOX' or subfolder of
'INBOX',flags is set. If they are in more deeper levels, for
example,'INBOX.Sys.Drafts',flags is not set. A question is ,need mozilla keep a
pair of Drafts and Templates and Sent folders for each personal namespace?
> A question is ,need mozilla keep a
> pair of Drafts and Templates and Sent folders for each personal namespace?

Why "each"??? Right now Mozilla (IMHO correctly) keeps Drafts, Trash and Sent in
the *first* personal namespace, but does not set any flags. 

In any case, if all available namespaces are subspaces of INBOX. (as in my
case), then Mozilla does not have amny other choice but to be able to use one of
those (and set the correct flags), which is what this bug is about.
Attached patch add a patch. (obsolete) — Splinter Review
Comment on attachment 105540 [details] [diff] [review]
add a patch.

>+    if(name->Equals(NS_LITERAL_STRING(onlineNameWithoutNamespace)))

This fails to compile:

nsImapMailFolder.cpp:390: `LonlineNameWithoutNamespace' undeclared
Attachment #105540 - Flags: review-
Comment on attachment 105540 [details] [diff] [review]
add a patch.

Hi, philip,

Thx for the patch anyway. But there are something needed to be payed attention
to.

1. try to build and test the code before you give out the patch

2. pay attention to the code style, refer to
http://www.mozilla.org/hacking/mozilla-style-guide.html, also please refer to
the existing code

3. As for the bug, Drafts/Sent/etc should not be recongnized by comparing the
literals, they can be any names. Also, nsMsgFolder::SetPrefFlag
(nsMsgAccountManager::SetSpecialFoldersForIdentities) should be better place
for the patch.

Henry
Thanks Aleksey and henry. I will be careful later.:-)

I also find that nsMsgFolder::SetPrefFlag where mozilla set flags when it
initially find out Draft and other special ones will be the best place to add patch.

But nsIMAPNamespace *nsImapMailFolder::GetNamespaceForFolder() is a protect
method of nsImapMailFolder and we can't use it in
mailnews/base/util/nsMsgFolder.cpp.

How can we get the folder's namespace in nsMsgFolder.cpp then? 

Because nsMsgFolder mainly deal with those actions which needn't know what kind
of a folder it is, if we add a protect method GetNamespaceForFolder here(using
it only to get namespace of this folder when server supports namespace), it will
seems a not small change to mozilla's whole code structure. Should we do that?
Thank you.
try nsIImapIncomingServer::getUriWithNamespacePrefixIfNecessary
Attached patch a patch for test (obsolete) — Splinter Review
1.Reason of this bug is SENTMAIL,DRAFTS,TEMPLATES flags are not set correctly
because of namespace.

2.In nsMsgFolder::SetPrefFlag(),mozilla find out special folders using 
  2.1 accountMgr->GetFirstIdentityForServer(server, getter_AddRefs(identity))
  2.2 identity->GetFccFolder(getter_Copies(folderUri));
  2.3 rdf->GetResource(folderUri, getter_AddRefs(res))
  If these three steps all succeed, flag will be set using folder->SetFlag.

3.I guess 2.1 will not fail, for no identity no all. And 2.2 will not fail
either because the fail of GetFccFolder will only demonstrate there are no
special folders initially supported by server(Is it correct?). So only 2.3 may
fail.

4.Thus I wrote this patch,which means if folderUri (a uri without namespace
prefix) is not enough to let mozilla find the folder's resource, we will give
it a complete uri folderUriWithNamespace, it may find the folder and set flags
then.

5.Pls test it when you have time,I have no this bug's environment.:-)
Comment on attachment 106183 [details] [diff] [review]
a patch for test

This patch does not fix the problem for me.

However:

1) I agree with the reasoning behind the patch: It is likely that the
"rdf->GetResource" is the one that fails. But note - this is *not* what your
patch is currently doing - you seem to have attached "else" to the *wrong
branch*:

>@@ -1540,6 +1543,22 @@
>       folder = do_QueryInterface(res, &rv);
>       if (NS_SUCCEEDED(rv))
>         rv = folder->SetFlag(MSG_FOLDER_FLAG_SENTMAIL);
>+      else
>+      {

e.g. your "else" would only become active if do_QueryInterface(res) fails,
*not* if "rdf->GetResource" fails!
Attachment #106183 - Flags: review-
BTW, your reasoning have suggested a workaround! If I choose the folder to use
by selecting 

Place a copy in -> "Sent" Folder on: -> Work

then I see this bug. But if instead I choose

Place a copy in -> Other: -> Sent on Work

(e.g. I manually point to the folder I want), then it works fine!

P.S. Would it be better to try to fix the GetFccFolder function itself, rather
than trying to fix the place(s) that use it?
>2.In nsMsgFolder::SetPrefFlag(),mozilla find out special folders using 
>  2.1 accountMgr->GetFirstIdentityForServer(server, getter_AddRefs(identity))
>  2.2 identity->GetFccFolder(getter_Copies(folderUri));
>  2.3 rdf->GetResource(folderUri, getter_AddRefs(res))
>  If these three steps all succeed, flag will be set using folder->SetFlag.
>
>3.I guess 2.1 will not fail, for no identity no all. And 2.2 will not fail
>either because the fail of GetFccFolder will only demonstrate there are no
>special folders initially supported by server(Is it correct?). So only 2.3 may
>fail.
It's not correct that 2.3 will fail. 2.3 always succeed. You need just add the
namespace if needed.

Fixing GetFccFolder is a good suggestion.

Pay attention to the fcc_folder, etc may locate on another server with different
namespace.

You need to setup an enviroment for the work. You may refer to our internal web
site for some test enviroment.
Attached patch a new patch (obsolete) — Splinter Review
Pls try this. Added namespace before folder name of Draft etc.
Comment on attachment 106317 [details] [diff] [review]
a new patch

See comment 23

Have you tried to test the patch?
Attachment #106317 - Flags: review-
Yes.Henry.I have tested it.
The differentce of the new patch with the second patch is simple, only let the
code of else to run.(I only add a '!' before NS_SUCCEEDED(rv) of line a111)

a111>if (!NS_SUCCEEDED(rv))
a222>        rv = folder->SetFlag(MSG_FOLDER_FLAG_SENTMAIL);
a333>      else
a444>      {//code here will run

In my test account of courier server matchpoint,username mailer1 ,password
mailer1, whatever override_namespace is true or false, or if we have configured
personal namespace by hand, the code all work well. I can see these special
folders with special icons now.And when I save a massage as draft, the 'Edit
Draft...' button shows .It works well.

In the original code,the code of line a222 do set flag.But flag is not set on
correct folder.
Originally,set flag on "imap://mailer1@matchpoint/Sent"(no this folder acturlly)
Now,set flag on "imap://mailer1@matchpoint/INBOX/Sent".(though we may not see
Sent folder at the beginning,but once we ever use it,we will see it from that
time on.The same is with Drafts and Templates.)
So I think it is correct.

Of course,the code should have a clean. But that will be easy. So we may test it
first.
The logic of your code is not right. 

You should check if the uri includes namespace first before trying to get the
related folder object.
Acturlly, in nsIImapIncomingServer::getUriWithNamespacePrefixIfNecessary,
mozilla has checked if the uri(we give to this method as a parameter) have
namespace. That means, if uri is "imap://mailer1@matchpoint/INBOX/Sent", doesn't
change, if uri is "imap://mailer1@matchpoint/Sent", insert 'INBOX/' into the uri.
While,I think whatever the uri is "imap://mailer1@matchpoint/Sent" or
"imap://mailer1@matchpoint/INBOX/Sent" ,we should both setflag to the folder
object. Because in some other conditions the folder is just
"imap://mailer1@matchpoint/Sent". The code should be changed to this. This is
what I wanted in patch 2.
> if uri is "imap://mailer1@matchpoint/Sent",
> insert 'INBOX/' into the uri.

Ah, I think you've nailed it - that sound exactly where the bug is coming from!
It should insert the first namespace here, not the "INBOX/".
You are right.I think it did just as you say.I mean that too.
Comment on attachment 106317 [details] [diff] [review]
a new patch

I am starting to think - is the "old" branch necessary at all? Would not it
work better if the code just *always* use GetUriWithNamespacePrefixIfNecessary
and never even tries running GetResource(folderUri)? This way the brunch before
the "else" would be totally unnecessary.

Sure, the code will be slightly less efficient in the simple (no namespaces)
case, but I am sure the difference will be negligible and it's more important
that the code will be simpler.
Comment on attachment 106317 [details] [diff] [review]
a new patch

Sorry, ignore what I just said - of course, we can not always use
GetUriWithNamespacePrefixIfNecessary since it only exists for IMAP.
Attached patch better than the 3rd one (obsolete) — Splinter Review
This patch add a logic to check if the server is a imap server.

Henry,I'm not sure what you mean to "check if the uri includes namespace first
before trying to get the related folder object". Amazing...:-) I'd like to talk
with you about it.
Comment on attachment 106491 [details] [diff] [review]
better than the 3rd one

Hi, Philip,

Thx for the hard work. This patch looks good. Just a few small tips.

1. you may just use
nsCOMPtr<nsIImapIncomingServer> imapServer = do_QueryInterface(server);
instead of
rv = server->GetType(&serverType);
to check if the mail server is imap. This can make the code a little more
efficient. And, try not to use the hardcode, such as "imap".

2. pay attention to the code style, such as the indent character number.

3. try to make the line is less or equal to 80 characters.

4. get rid of 
    //fccfolder treatment end
since you just have only one such comment.

5. get rid of 
       // && NS_SUCCEEDED(rdf->GetResource(folderUri, getter_AddRefs(res))))

As for "check if the uri includes namespace first
before trying to get the related folder object", I mean you should check if the
server is imap server and check if the uri includes namespace before you
"folder = do_QueryInterface(res, &rv);". You have done so in your new patch.
:-)

Keep on going.

Henry
Attachment #106491 - Flags: review-
Attached patch a new patch (obsolete) — Splinter Review
I changed the lines as your comment,henry. 

1.Using nsCOMPtr<nsIImapIncomingServer> imapServer = do_QueryInterface(server)
and if(imapServer) to check if the server is a imap server.

2.Bring some lines out for efficiency.

3.Other is corrected as your comment.
Add check of fcc_folder_picker_mode (and also with Drafts,Templates folder's
picker_mode) in this patch.
Philip, when you update patches, can you mark the old ones as obsolete
(provided, of course, they are indeed obsolete)? Thanks!
I get it.
Thx! Nogin!
Comment on attachment 106627 [details] [diff] [review]
patch with  folder_picker_mode checks

1. use 'nsXPIDLCString folderPickerMode;' instead of 'char *
folderPickerMode;', thus you don't need to take care of the memory release.

2. still the code style :-)
Attachment #106627 - Flags: review-
Attached patch updated new patch (obsolete) — Splinter Review
Having changed it as your comment, henry. 3x!:-)
Attachment #105540 - Attachment is obsolete: true
Attachment #106183 - Attachment is obsolete: true
Attachment #106317 - Attachment is obsolete: true
Attachment #106491 - Attachment is obsolete: true
Attachment #106555 - Attachment is obsolete: true
Attachment #106627 - Attachment is obsolete: true
Comment on attachment 106637 [details] [diff] [review]
updated new patch

1. use
folderPickerMode.Equals("0")
instead of
PL_strcmp(folderPickerMode.get(), "0")

2. still code style. pay attention to the intend char number. Thx.
Attachment #106637 - Flags: review-
Attached patch updated new patch (obsolete) — Splinter Review
henry,pls see this one. 

1.using folderPickerMode.Equals("0")
2.when the parameter is more than 2, using a new line for each parameter in a
method.

:-)
Attachment #106637 - Attachment is obsolete: true
Comment on attachment 106747 [details] [diff] [review]
updated new patch

It's OK. Thx, Philip.

r=henry
Attachment #106747 - Flags: superreview?(bienvenu)
Attachment #106747 - Flags: review+
Comment on attachment 106747 [details] [diff] [review]
updated new patch

This patch works for me, thanks!
Comment on attachment 106747 [details] [diff] [review]
updated new patch

first of all, there's no way the imap code should be in nsMsgFolder.cpp. For
imap, this could be in nsImapIncomingServer::PossibleImapMailbox. Also, this
patch duplicates a lot of code that could be in a helper routine.
Attachment #106747 - Flags: superreview?(bienvenu) → superreview-
What's the meaning and useness of redirector_type(always three values found: ""
and "aol" and "netscape") in nsImapIncomingServer ?
If we still based on currently used namespace architechture, 2 advanced bugs are
sure to be found when we have fixed bug #166603 and bug #154778.

Bug #166603 means that special folders like Drafts Templates Sent are not set
flags correctly.

Bug #154778 means that we can't access folders on Courier server when we set
IMAP server directory to "INBOX".
       
Now supposed we have conquered this two bugs.
1. Special flags are set because in our patch we can find the folder correctly.
2. We can access the folders when we set IMAP server directory on Courier server.

This bug will be found soon:
When the folderPickerMode is '1' which means we use "others" in "Copies &
Folders" and we manully selected a folder to let it act as a special folder, and
if we set IMAP server setting into "INBOX", the flags is not there any more.

Acturely, they are not set correctly again.
We have set flags into folder "INBOX.aaa.bbb", but in the folder pane the folder
is "aaa.bbb". It has no flags set.
Hi, David, Can you see attachment 106747 [details] [diff] [review] for a more time? I still resist it. :-)
QA Contact: huang → gchan
I just put a long description in a very related bug 123707.  The problem with
that old bug is that it is listed as enhancement instead of normal.  I would
hope that either this bug gets updated to include the whole Windows trunk, or
that old one gets a new lease on life with a normal bug status.

Bug 114533 seems to be similar.  Bug 174670 is another one.

I am reporting this problem on Windows 2000 and Windows 98.  Probably all
Windows clients are affected.  I'm also seeing the bug on Mozilla 1.2.1 and
1.3a.  I have Courier IMAP server.  Please see my fuller description in bug 123707.
also on windows
OS: Linux → All
bug 168060 may be blocked/a result by/of this bug.
Product: MailNews → Core
Does this still fail for you?

I have "" in namespace and special folders works, but perhaps "" is just ignored?
I am using the workaround from comment #22 and a fairly old version of TBird, so I would not know if this works in a recent version without the workaround...
last patch author, philip zhao, is gone - email address is dead.
no one has picked up the patch.
Assignee: mscott → bienvenu
QA Contact: grylchan → networking.imap
Assignee: bienvenu → nobody
Keywords: helpwanted
Whiteboard: [patchlove] workaround: comment 22
Product: Core → MailNews Core
Comment on attachment 106747 [details] [diff] [review]
updated new patch

Patch has bitrotted.

nsMsgFolder.cpp is no longer present at mailnews/base/util/

See:

http://hg.mozilla.org/comm-central/file/25a5e9e27cc4/mailnews/base/util/
Attachment #106747 - Attachment is obsolete: true
Severity: normal → S3
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: