Hi Duc, Thanks for the response.
I don't have an implementation yet. I want to be sure I do the 'right'
implementation first... Here's the fundamental problem:
I don't believe there is any enforcing of case on usernames. Hence I
theoretically could have a JAMES user name of je...@malcolms.com. I do
know for certain that there is downstream code in the mailbox writing
area that IS case sensitive on the username (i.e. mailbox name) and
throws exceptions if the case passed in on the target acct name does not
match the username case. Granted we could go find all downstream code
and ensure all code is not case-sensitive. But I'm not a big proponent
of 'finding all situations where...' because there's always going to be
one place I missed, especially where there is one single point that
could alternatively fix the problem for all cases.
ToSenderFolder calls AbstractUsersRepository.getUser(...)
AbstractUserRepository.getName(...) calls asString() which returns
localPart + "@" + domain.asString()
Domain.asString() returns normalizedDomainName which is:
removeBrackets(domainName.toLowerCase(Locale.US));
So right now, ToSendeFolder is using the original case of localPart plus
lowercased domainname, which still will possibly not match the case of
the user account name and will throw the exception.
One fix is to simply localPart.toLowerCase(). But that is only good if
ALL usernames are forced to be all lowercase, which I'm not sure is a
change we want to force (unless it's already being forced).
The other fix (which I'm proposing) is for AbstractUserRepository to
convert the derived username to the correct case found in the list of
account names (JAMES_USER). Simply do a case-insensitive lookup using
"je...@malcolms.com" which will return the correct case of
je...@malcolms.com found in JAMES_USER to be returned to the caller (e.g
ToSenderFolder mailet).
My question is what is the correct way to do a 'case-insensitive lookup
of <username>' that spans all of the various implementations of user
name storage (not just JPA/JDBC, etc).
Thanks
Jerry
On 10/29/2019 3:15 AM, Duc Tran wrote:
Hello Jerrry, can you provide me a block of code of the
implementation, I didn't found the place where it lowercases the sender.
I had looked in `UserRepository.getUser(MailAddress)` implementations
(`AbstractUsersRepository`, `ReadOnlyUsersLDAPRepository`)
Or if better, you can open a pull request with a new test to prove you
argument, so we can get what you want to describe quickly
Duc Tran
On 28/10/2019 04:40, Jerry Malcolm wrote:
My previous post explains a problem when there are capitalization
inconsistencies between the target acct name and the user name. I've
traced through the code and see how this is happening:
The "To" and "Sender" fields can be any case: je...@xyz.com.
usersRepository.getUser(sender) lowercases the domain portion of the
address, but does not lowercase the name portion of the address. It
will return je...@xyz.com, which has no correlation to the actual
account name. This results in the mailbox "ReadOnly" exception which
actually means mailbox not found.
I believe the usersRepository.getUser(sender) should do a lookup in
the usersRepository and return the actual user name and case from the
repository. And if the derived 'user name' doesn't match an account,
I think an error should be returned.
I can make the changes. But again, I want to make sure I'm not
violating what was intended with this function. I just need
confirmation that what I'm proposing is correct.
Jerry
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org
For additional commands, e-mail: server-dev-h...@james.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org
For additional commands, e-mail: server-dev-h...@james.apache.org