This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 059e0e5f53a5b99ee3b7b624f1937918cb995bab Author: Benoit Tellier <[email protected]> AuthorDate: Fri Oct 29 10:07:54 2021 +0700 JAMES-3539 PushListener should set urgency --- .../james/jmap/pushsubscription/PushListener.scala | 14 +++++++- .../jmap/pushsubscription/PushListenerTest.scala | 42 +++++++++++++++++++--- 2 files changed, 51 insertions(+), 5 deletions(-) diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/pushsubscription/PushListener.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/pushsubscription/PushListener.scala index 857cc64..6154d0f 100644 --- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/pushsubscription/PushListener.scala +++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/pushsubscription/PushListener.scala @@ -26,7 +26,7 @@ import org.apache.james.events.EventListener.ReactiveGroupEventListener import org.apache.james.events.{Event, Group} import org.apache.james.jmap.api.model.PushSubscription import org.apache.james.jmap.api.pushsubscription.PushSubscriptionRepository -import org.apache.james.jmap.change.StateChangeEvent +import org.apache.james.jmap.change.{EmailDeliveryTypeName, StateChangeEvent} import org.apache.james.jmap.core.StateChange import org.apache.james.jmap.json.PushSerializer import org.apache.james.util.ReactorUtils @@ -62,6 +62,7 @@ class PushListener @Inject()(pushRepository: PushSubscriptionRepository, private def asPushRequest(stateChange: StateChange, pushSubscription: PushSubscription): PushRequest = PushRequest(ttl = PushTTL.MAX, + urgency = Some(urgency(stateChange)), contentCoding = pushSubscription.keys.map(_ => Aes128gcm), payload = asBytes(stateChange, pushSubscription)) @@ -71,4 +72,15 @@ class PushListener @Inject()(pushRepository: PushSubscriptionRepository, .map(keys => keys.encrypt(clearTextPayload)) .getOrElse(clearTextPayload) } + + private def urgency(stateChange: StateChange): PushUrgency = + if (stateChange.changes + .values + .flatMap(ts => ts.changes.keys) + .toList + .contains(EmailDeliveryTypeName)) { + High + } else { + Low + } } diff --git a/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/pushsubscription/PushListenerTest.scala b/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/pushsubscription/PushListenerTest.scala index b7880eb..738de4d 100644 --- a/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/pushsubscription/PushListenerTest.scala +++ b/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/pushsubscription/PushListenerTest.scala @@ -37,6 +37,7 @@ import org.apache.james.jmap.change.{EmailDeliveryTypeName, EmailTypeName, Mailb import org.apache.james.jmap.core.UuidState import org.apache.james.jmap.json.PushSerializer import org.apache.james.jmap.memory.pushsubscription.MemoryPushSubscriptionRepository +import org.assertj.core.api.Assertions.assertThat import org.assertj.core.api.SoftAssertions import org.junit.jupiter.api.{BeforeEach, Test} import org.mockito.ArgumentMatchers.any @@ -118,8 +119,6 @@ class PushListenerTest { SoftAssertions.assertSoftly(softly => { softly.assertThat(argumentCaptor.getValue.ttl).isEqualTo(PushTTL.MAX) - softly.assertThat(argumentCaptor.getValue.topic.toJava).isEmpty - softly.assertThat(argumentCaptor.getValue.urgency.toJava).isEmpty softly.assertThat(new String(argumentCaptor.getValue.payload, StandardCharsets.UTF_8)) .isEqualTo(s"""{"@type":"StateChange","changed":{"$bobAccountId":{"Email":"${state1.value.toString}"}}}""") }) @@ -144,14 +143,49 @@ class PushListenerTest { SoftAssertions.assertSoftly(softly => { softly.assertThat(argumentCaptor.getValue.ttl).isEqualTo(PushTTL.MAX) - softly.assertThat(argumentCaptor.getValue.topic.toJava).isEmpty - softly.assertThat(argumentCaptor.getValue.urgency.toJava).isEmpty softly.assertThat(new String(argumentCaptor.getValue.payload, StandardCharsets.UTF_8)) .isEqualTo(s"""{"@type":"StateChange","changed":{"$bobAccountId":{"Email":"${state1.value.toString}","Mailbox":"${state2.value.toString}"}}}""") }) } @Test + def emailDeliveryUrgencyShouldBeHigh(): Unit = { + val id = SMono(pushSubscriptionRepository.save(bob, PushSubscriptionCreationRequest( + deviceClientId = DeviceClientId("junit"), + url = url, + types = Seq(EmailDeliveryTypeName, EmailTypeName)))).block().id + SMono(pushSubscriptionRepository.validateVerificationCode(bob, id)).block() + + val state1 = UuidState(UUID.randomUUID()) + val state2 = UuidState(UUID.randomUUID()) + val state3 = UuidState(UUID.randomUUID()) + SMono(testee.reactiveEvent(StateChangeEvent(EventId.random(), bob, + Map(EmailTypeName -> state1, MailboxTypeName -> state2, EmailDeliveryTypeName -> state3)))).block() + + val argumentCaptor: ArgumentCaptor[PushRequest] = ArgumentCaptor.forClass(classOf[PushRequest]) + verify(webPushClient).push(ArgumentMatchers.eq(url), argumentCaptor.capture()) + assertThat(argumentCaptor.getValue.urgency.toJava).contains(High) + } + + @Test + def nonEmailDeliveryUrgencyShouldBeLow(): Unit = { + val id = SMono(pushSubscriptionRepository.save(bob, PushSubscriptionCreationRequest( + deviceClientId = DeviceClientId("junit"), + url = url, + types = Seq(EmailDeliveryTypeName, EmailTypeName)))).block().id + SMono(pushSubscriptionRepository.validateVerificationCode(bob, id)).block() + + val state1 = UuidState(UUID.randomUUID()) + val state2 = UuidState(UUID.randomUUID()) + SMono(testee.reactiveEvent(StateChangeEvent(EventId.random(), bob, + Map(EmailTypeName -> state1, MailboxTypeName -> state2)))).block() + + val argumentCaptor: ArgumentCaptor[PushRequest] = ArgumentCaptor.forClass(classOf[PushRequest]) + verify(webPushClient).push(ArgumentMatchers.eq(url), argumentCaptor.capture()) + assertThat(argumentCaptor.getValue.urgency.toJava).contains(Low) + } + + @Test def pushShouldEncryptMessages(): Unit = { val uaKeyPair = EllipticCurves.generateKeyPair(CurveType.NIST_P256) val uaPrivateKey: ECPrivateKey = uaKeyPair.getPrivate.asInstanceOf[ECPrivateKey] --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
