linagora / james-project

Mirror of Apache James Project
Apache License 2.0
70 stars 63 forks source link

javax.mail.internet.AddressException: Domain contains illegal character #5167

Closed chibenwa closed 1 week ago

chibenwa commented 3 months ago
javax.mail.internet.AddressException: Domain contains illegal character
    at javax.mail.internet.InternetAddress.checkAddress(InternetAddress.java:1432)
    at javax.mail.internet.InternetAddress.parse(InternetAddress.java:1215)
    at javax.mail.internet.InternetAddress.parse(InternetAddress.java:752)
    at javax.mail.internet.InternetAddress.parse(InternetAddress.java:729)
    at javax.mail.internet.MimeMessage.setRecipients(MimeMessage.java:666)
    at org.apache.james.jmap.method.MDNSendMethod.buildMailAndMimeMessage(MDNSendMethod.scala:197)
    at org.apache.james.jmap.method.MDNSendMethod.$anonfun$buildMailAndResponse$2(MDNSendMethod.scala:189)
    at scala.util.Either.map(Either.scala:382)
    at org.apache.james.jmap.method.MDNSendMethod.$anonfun$buildMailAndResponse$1(MDNSendMethod.scala:185)
    at scala.util.Either.flatMap(Either.scala:352)
    at org.apache.james.jmap.method.MDNSendMethod.buildMailAndResponse(MDNSendMethod.scala:184)
    at org.apache.james.jmap.method.MDNSendMethod.$anonfun$sendMDN$3(MDNSendMethod.scala:152)
    at scala.util.Either.flatMap(Either.scala:352)
    at org.apache.james.jmap.method.MDNSendMethod.$anonfun$sendMDN$1(MDNSendMethod.scala:150)
    at scala.util.Either.flatMap(Either.scala:352)
    at org.apache.james.jmap.method.MDNSendMethod.sendMDN(MDNSendMethod.scala:149)
    at org.apache.james.jmap.method.MDNSendMethod.$anonfun$createMDNSend$1(MDNSendMethod.scala:133)
    at scala.util.Either.flatMap(Either.scala:352)
    at org.apache.james.jmap.method.MDNSendMethod.createMDNSend(MDNSendMethod.scala:133)
    at org.apache.james.jmap.method.MDNSendMethod.$anonfun$create$1(MDNSendMethod.scala:121)
    at reactor.core.scala.publisher.package$.$anonfun$scalaBiFunction2JavaBiFunction$1(package.scala:69)
    at reactor.core.publisher.MonoReduceSeed$ReduceSeedSubscriber.onNext(MonoReduceSeed.java:116)
    at reactor.core.publisher.FluxIterable$IterableSubscription.fastPath(FluxIterable.java:402)
    at reactor.core.publisher.FluxIterable$IterableSubscription.request(FluxIterable.java:291)
    at reactor.core.publisher.Operators$BaseFluxToMonoOperator.request(Operators.java:2067)
    at reactor.core.publisher.MonoSubscribeOn$SubscribeOnSubscriber.trySchedule(MonoSubscribeOn.java:189)
    at reactor.core.publisher.MonoSubscribeOn$SubscribeOnSubscriber.onSubscribe(MonoSubscribeOn.java:134)
    at reactor.core.publisher.Operators$BaseFluxToMonoOperator.onSubscribe(Operators.java:2051)
    at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:201)
    at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:83)
    at reactor.core.publisher.Mono.subscribe(Mono.java:4512)
    at reactor.core.publisher.MonoSubscribeOn$SubscribeOnSubscriber.run(MonoSubscribeOn.java:126)
    at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:84)
    at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:37)
    at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
    at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.base/java.lang.Thread.run(Unknown Source)

DOD manage the error

chibenwa commented 3 months ago

(and find which valid EmailAddress is failing according to javax.mail)

chibenwa commented 2 months ago
package org.apache.james;

import org.apache.james.core.MailAddress;

import com.code_intelligence.jazzer.junit.FuzzTest;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;

public class Jazz {
    @FuzzTest(maxDuration = "1m")
    void test(String str) {
        if (str == null) {
            return;
        }
        MailAddress m;
        try {
            m = new MailAddress(str);
        } catch (AddressException e) {
            return;
        }

        try {
            new InternetAddress(str);
        } catch (Exception e) {
            if (e.getMessage().contains("Domain contains illegal character")) {
                System.out.println("====");
                System.out.println(str);
                System.out.println("====");
                throw new RuntimeException(e);
            }
        }
    }
}

To find parser differencials.

vttranlina commented 1 week ago

Cann't install code_intelligence fuzztest on my local The download page requests auth code, and have no way to register a new one.

I tried to another one: https://github.com/rohanpadhye/JQF/wiki/JQF-Maven-Plugin

~32 minutes later, just 0.26% coverage and no unique failure, I tend to execute it on charge server

image
vttranlina commented 1 week ago

I'm currently running a process on the charge1 server, but the execution speed is quite slow at around 1000/sec. It may take a few days or more. I will return after the fuzz test is completed.

vttranlina commented 1 week ago

pr : https://github.com/apache/james-project/pull/2348

// Jazzer very quick,

chibenwa commented 1 week ago

Yes code coverage fuzzers rocks!