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

Reply via email to