public AccessToken authenticate(String username) { return tokenByUser.computeIfAbsent(username, (user) -> { String password = passwordByUser.get(user); Preconditions.checkState(password != null, "unknown user " + user); return authenticateJamesUser(baseUri(mainStepdefs.jmapServer), user, password); }); }
public static AccessToken authenticateJamesUser(URIBuilder uriBuilder, String username, String password) { return calmlyAwait.until( () -> doAuthenticate(uriBuilder, username, password), IsAnything.anything()); }
public static AccessToken doAuthenticate(URIBuilder uriBuilder, String username, String password) throws ClientProtocolException, IOException, URISyntaxException { String continuationToken = getContinuationToken(uriBuilder, username); Response response = postAuthenticate(uriBuilder, password, continuationToken); return AccessToken.fromString( JsonPath.parse(response.returnContent().asString()) .read("accessToken")); }
default AccessToken accessTokenFor(GuiceJamesServer james, String user, String password) { return authenticateJamesUser(baseUri(james), user, password); }
@Test public void provisionMailboxesShouldSubscribeToThem() throws Exception { String token = authenticateJamesUser(baseUri(jmapServer), USER, PASSWORD).serialize(); with() .header("Authorization", token) .body("[[\"getMailboxes\", {}, \"#0\"]]") .post("/jmap"); assertThat(jmapServer.getProbe(MailboxProbeImpl.class) .listSubscriptions(USER)) .containsAll(DefaultMailboxes.DEFAULT_MAILBOXES); } }
@Test public void jmapVacationShouldHaveSupportForHtmlMail() throws Exception { // Given AccessToken user1AccessToken = authenticateJamesUser(baseUri(guiceJamesServer), USER_1, PASSWORD); AccessToken user2AccessToken = authenticateJamesUser(baseUri(guiceJamesServer), USER_2, PASSWORD); setHtmlVacationResponse(user1AccessToken); // When String user2OutboxId = getOutboxId(user2AccessToken); sendMail(user2AccessToken, user2OutboxId, "user|inbox|1"); // Then calmlyAwait.atMost(10, TimeUnit.SECONDS) .until(() -> isTextMessageReceived(user1AccessToken, getInboxId(user1AccessToken), ORIGINAL_MESSAGE_TEXT_BODY, USER_2, USER_1)); calmlyAwait.atMost(10, TimeUnit.SECONDS) .until(() -> assertOneMessageWithHtmlBodyReceived(user2AccessToken, getInboxId(user2AccessToken), HTML_REASON, USER_1, USER_2)); }
@Test public void jmapVacationShouldNotSendNotificationTwice() throws Exception { /* Test scenario : - User 1 benw@mydomain.tld sets a Vacation on its account - User 2 matthieu@mydomain.tld sends User 1 a mail - User 2 matthieu@mydomain.tld sends User 1 a second mail - User 1 should well receive this mail - User 2 should well receive only one notification about user 1 vacation */ // Given AccessToken user1AccessToken = authenticateJamesUser(baseUri(guiceJamesServer), USER_1, PASSWORD); AccessToken user2AccessToken = authenticateJamesUser(baseUri(guiceJamesServer), USER_2, PASSWORD); // User 1 benw@mydomain.tld sets a Vacation on its account setVacationResponse(user1AccessToken); // When // User 2 matthieu@mydomain.tld sends User 1 a mail String user2OutboxId = getOutboxId(user2AccessToken); sendMail(user2AccessToken, user2OutboxId, "user|inbox|1"); sendMail(user2AccessToken, user2OutboxId, "user|inbox|2"); // Then // User 2 should well receive a notification about user 1 vacation calmlyAwait.atMost(30, TimeUnit.SECONDS) .until(() -> isTextMessageReceived(user2AccessToken, getInboxId(user2AccessToken), REASON, USER_1, USER_2)); // User 2 should not receive another notification Thread.sleep(1000L); assertOneMessageReceived(user2AccessToken, getInboxId(user2AccessToken), REASON, USER_1, USER_2); }
@Before public void setup() throws Throwable { jmapServer = createJmapServer(); jmapServer.start(); mailboxProbe = jmapServer.getProbe(MailboxProbeImpl.class); dataProbe = jmapServer.getProbe(DataProbeImpl.class); aclProbe = jmapServer.getProbe(ACLProbeImpl.class); RestAssured.requestSpecification = jmapRequestSpecBuilder .setPort(jmapServer.getProbe(JmapGuiceProbe.class).getJmapPort()) .build(); dataProbe.addDomain(DOMAIN); dataProbe.addUser(ALICE, ALICE_PASSWORD); this.aliceAccessToken = authenticateJamesUser(baseUri(jmapServer), ALICE, ALICE_PASSWORD); dataProbe.addUser(BOB, BOB_PASSWORD); this.bobAccessToken = authenticateJamesUser(baseUri(jmapServer), BOB, BOB_PASSWORD); }
@Before public void setup() throws Throwable { jmapServer = createJmapServer(); jmapServer.start(); MailboxProbe mailboxProbe = jmapServer.getProbe(MailboxProbeImpl.class); DataProbe dataProbe = jmapServer.getProbe(DataProbeImpl.class); RestAssured.requestSpecification = jmapRequestSpecBuilder .setPort(jmapServer.getProbe(JmapGuiceProbe.class).getJmapPort()) .build(); RestAssured.defaultParser = Parser.JSON; dataProbe.addDomain(DOMAIN); dataProbe.addUser(HOMER, PASSWORD); dataProbe.addUser(BART, BOB_PASSWORD); mailboxProbe.createMailbox("#private", HOMER, DefaultMailboxes.INBOX); homerAccessToken = authenticateJamesUser(baseUri(jmapServer), HOMER, PASSWORD); bartAccessToken = authenticateJamesUser(baseUri(jmapServer), BART, BOB_PASSWORD); }
@Before public void setup() throws Throwable { jmapServer = createJmapServer(); jmapServer.start(); MailboxProbe mailboxProbe = jmapServer.getProbe(MailboxProbeImpl.class); DataProbe dataProbe = jmapServer.getProbe(DataProbeImpl.class); RestAssured.requestSpecification = jmapRequestSpecBuilder .setPort(jmapServer.getProbe(JmapGuiceProbe.class).getJmapPort()) .build(); RestAssured.defaultParser = Parser.JSON; dataProbe.addDomain(DOMAIN); dataProbe.addUser(HOMER, PASSWORD); dataProbe.addUser(BART, BOB_PASSWORD); mailboxProbe.createMailbox("#private", HOMER, DefaultMailboxes.INBOX); homerAccessToken = authenticateJamesUser(baseUri(jmapServer), HOMER, PASSWORD); bartAccessToken = authenticateJamesUser(baseUri(jmapServer), BART, BOB_PASSWORD); }
dataProbe.addUser(recipientAddress, recipientPassword); mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, recipientAddress, DefaultMailboxes.INBOX); AccessToken recipientToken = HttpJmapAuthentication.authenticateJamesUser(baseUri(jmapServer), recipientAddress, recipientPassword); await();
AccessToken user1AccessToken = authenticateJamesUser(baseUri(guiceJamesServer), USER_1, PASSWORD); AccessToken user2AccessToken = authenticateJamesUser(baseUri(guiceJamesServer), USER_2, PASSWORD);
@Test public void jmapVacationShouldGenerateAReplyWhenActive() throws Exception { /* Test scenario : - User 1 benw@mydomain.tld sets a Vacation on its account - User 2 matthieu@mydomain.tld sends User 1 a mail - User 1 should well receive this mail - User 2 should well receive a notification about user 1 vacation */ // Given AccessToken user1AccessToken = authenticateJamesUser(baseUri(guiceJamesServer), USER_1, PASSWORD); AccessToken user2AccessToken = authenticateJamesUser(baseUri(guiceJamesServer), USER_2, PASSWORD); // User 1 benw@mydomain.tld sets a Vacation on its account setVacationResponse(user1AccessToken); // When // User 2 matthieu@mydomain.tld sends User 1 a mail String user2OutboxId = getOutboxId(user2AccessToken); sendMail(user2AccessToken, user2OutboxId, "user|inbox|1"); // Then // User 1 should well receive this mail calmlyAwait.atMost(30, TimeUnit.SECONDS) .until(() -> isTextMessageReceived(user1AccessToken, getInboxId(user1AccessToken), ORIGINAL_MESSAGE_TEXT_BODY, USER_2, USER_1)); // User 2 should well receive a notification about user 1 vacation calmlyAwait.atMost(30, TimeUnit.SECONDS) .until(() -> isTextMessageReceived(user2AccessToken, getInboxId(user2AccessToken), REASON, USER_1, USER_2)); }
@Test public void provisionMailboxesShouldNotDuplicateMailboxByName() throws Exception { String token = authenticateJamesUser(baseUri(jmapServer), USER, PASSWORD).serialize(); ConcurrentTestRunner.builder() .operation((a, b) -> with() .header("Authorization", token) .body("[[\"getMailboxes\", {}, \"#0\"]]") .post("/jmap")) .threadCount(10) .runSuccessfullyWithin(Duration.ofMinutes(1)); given() .header("Authorization", token) .body("[[\"getMailboxes\", {}, \"#0\"]]") .when() .post("/jmap") .then() .statusCode(200) .body(NAME, equalTo("mailboxes")) .body(ARGUMENTS + ".list", hasSize(6)) .body(ARGUMENTS + ".list.name", hasItems(DefaultMailboxes.DEFAULT_MAILBOXES.toArray())); }
@Before public void setup() throws Throwable { jmapServer = createJmapServer(); jmapServer.start(); RestAssured.requestSpecification = jmapRequestSpecBuilder .setPort(jmapServer.getProbe(JmapGuiceProbe.class).getJmapPort()) .build(); DataProbe dataProbe = jmapServer.getProbe(DataProbeImpl.class); dataProbe.addDomain(DOMAIN); dataProbe.addUser(ALICE, ALICE_PASSWORD); dataProbe.addUser(BOB, BOB_PASSWORD); accessToken = authenticateJamesUser(baseUri(jmapServer), ALICE, ALICE_PASSWORD); bobAccessToken = authenticateJamesUser(baseUri(jmapServer), BOB, BOB_PASSWORD); MailboxProbeImpl mailboxProbe = jmapServer.getProbe(MailboxProbeImpl.class); matchedMailbox = mailboxProbe.createMailbox(MailboxPath.forUser(ALICE, "matched")); inbox = mailboxProbe.createMailbox(MailboxPath.forUser(ALICE, INBOX)); }
webAdminApi.put(String.format("/address/forwards/%s/targets/%s", ALICE, BOB)); AccessToken cedricAccessToken = authenticateJamesUser(baseUri(jmapServer), CEDRIC, CEDRIC_PASSWORD); AccessToken aliceAccessToken = authenticateJamesUser(baseUri(jmapServer), ALICE, ALICE_PASSWORD); String messageCreationId = "creationId1337"; String requestBody = "[" + .post("/jmap"); AccessToken bobAccessToken = authenticateJamesUser(baseUri(jmapServer), BOB, BOB_PASSWORD); calmlyAwait .pollDelay(Duration.FIVE_HUNDRED_MILLISECONDS)
@Test public void jmapVacationShouldGenerateAReplyEvenWhenNoText() throws Exception { // Given AccessToken user1AccessToken = authenticateJamesUser(baseUri(guiceJamesServer), USER_1, PASSWORD); AccessToken user2AccessToken = authenticateJamesUser(baseUri(guiceJamesServer), USER_2, PASSWORD); jmapGuiceProbe.modifyVacation( AccountId.fromString(USER_1), VacationPatch.builder() .isEnabled(true) .build()); // When String user2OutboxId = getOutboxId(user2AccessToken); sendMail(user2AccessToken, user2OutboxId, "user|inbox|1"); // Then // User 1 should well receive this mail calmlyAwait.atMost(30, TimeUnit.SECONDS) .until(() -> isTextMessageReceived(user1AccessToken, getInboxId(user1AccessToken), ORIGINAL_MESSAGE_TEXT_BODY, USER_2, USER_1)); // User 2 should well receive a notification about user 1 vacation calmlyAwait.atMost(30, TimeUnit.SECONDS) .until(() -> isTextMessageReceived(user2AccessToken, getInboxId(user2AccessToken), "", USER_1, USER_2)); }
webAdminApi.put(String.format("/address/forwards/%s/targets/%s", BOB, CEDRIC)); AccessToken cedricAccessToken = authenticateJamesUser(baseUri(jmapServer), CEDRIC, CEDRIC_PASSWORD); AccessToken aliceAccessToken = authenticateJamesUser(baseUri(jmapServer), ALICE, ALICE_PASSWORD); String messageCreationId = "creationId1337"; String requestBody = "[" +
@Test public void jmapVacationShouldSendNotificationTwiceWhenVacationReset() throws Exception { /* Test scenario : - User 1 benw@mydomain.tld sets a Vacation on its account - User 2 matthieu@mydomain.tld sends User 1 a mail - User 2 matthieu@mydomain.tld sends User 1 a second mail - User 1 should well receive this mail - User 2 should well receive only one notification about user 1 vacation */ // Given AccessToken user1AccessToken = authenticateJamesUser(baseUri(guiceJamesServer), USER_1, PASSWORD); AccessToken user2AccessToken = authenticateJamesUser(baseUri(guiceJamesServer), USER_2, PASSWORD); // User 1 benw@mydomain.tld sets a Vacation on its account setVacationResponse(user1AccessToken); // User 2 matthieu@mydomain.tld sends User 1 a mail String user2OutboxId = getOutboxId(user2AccessToken); sendMail(user2AccessToken, user2OutboxId, "user|inbox|1"); // Wait user 1 to receive the eMail before reset of vacation calmlyAwait.atMost(30, TimeUnit.SECONDS) .until(() -> isTextMessageReceived(user1AccessToken, getInboxId(user1AccessToken), ORIGINAL_MESSAGE_TEXT_BODY, USER_2, USER_1)); // When // User 1 benw@mydomain.tld resets a Vacation on its account setVacationResponse(user1AccessToken); // User 2 matthieu@mydomain.tld sends User 1 a mail sendMail(user2AccessToken, user2OutboxId, "user|inbox|2"); // Then // User 2 should well receive two notification about user 1 vacation calmlyAwait.atMost(30, TimeUnit.SECONDS) .until(() -> areTwoTextMessageReceived(user2AccessToken, getInboxId(user2AccessToken))); }
webAdminApi.put(String.format("/address/forwards/%s/targets/%s", CEDRIC, BOB)); AccessToken cedricAccessToken = authenticateJamesUser(baseUri(jmapServer), CEDRIC, CEDRIC_PASSWORD); String messageCreationId = "creationId1337"; String requestBody = "[" + .post("/jmap"); AccessToken bobAccessToken = authenticateJamesUser(baseUri(jmapServer), BOB, BOB_PASSWORD); calmlyAwait .pollDelay(Duration.FIVE_HUNDRED_MILLISECONDS)