diff options
author | Ola Aunronning <olaa@yahooinc.com> | 2022-10-28 09:55:27 +0200 |
---|---|---|
committer | Ola Aunronning <olaa@yahooinc.com> | 2022-10-28 09:55:27 +0200 |
commit | acbd60a0051f8534a70723f09ead1484a8098479 (patch) | |
tree | 7df83c50ce7e269cb97f5f470afb2ff1f3626cbb /controller-server | |
parent | d092241882ffbcee42d707ac364a39221bbe3990 (diff) |
Email verification controlled by feature flag
Diffstat (limited to 'controller-server')
2 files changed, 29 insertions, 11 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java index 23f945e02be..0abf1470d29 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java @@ -47,6 +47,7 @@ import com.yahoo.slime.Slime; import com.yahoo.slime.SlimeUtils; import com.yahoo.text.Text; import com.yahoo.vespa.athenz.api.OAuthCredentials; +import com.yahoo.vespa.flags.Flags; import com.yahoo.vespa.hosted.controller.Application; import com.yahoo.vespa.hosted.controller.Controller; import com.yahoo.vespa.hosted.controller.Instance; @@ -568,8 +569,11 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { var mergedEmail = optional("email", inspector.field("contact")) .filter(address -> !address.equals(info.contact().email().getEmailAddress())) .map(address -> { - controller.mailVerifier().sendMailVerification(cloudTenant.name(), address, PendingMailVerification.MailType.TENANT_CONTACT); - return new Email(address, false); + if (emailVerificationEnabled()) { + controller.mailVerifier().sendMailVerification(cloudTenant.name(), address, PendingMailVerification.MailType.TENANT_CONTACT); + return new Email(address, false); + } + return new Email(address, true); }) .orElse(info.contact().email()); @@ -754,8 +758,11 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { var mergedEmail = optional("contactEmail", insp) .filter(address -> !address.equals(oldInfo.contact().email().getEmailAddress())) .map(address -> { - controller.mailVerifier().sendMailVerification(tenant.name(), address, PendingMailVerification.MailType.TENANT_CONTACT); - return new Email(address, false); + if (emailVerificationEnabled()) { + controller.mailVerifier().sendMailVerification(tenant.name(), address, PendingMailVerification.MailType.TENANT_CONTACT); + return new Email(address, false); + } + return new Email(address, true); }) .orElse(oldInfo.contact().email()); @@ -810,7 +817,7 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { var mergedEmail = optional("email", insp) .filter(address -> !address.equals(oldContact.email().getEmailAddress())) .map(address -> { - if (isBillingContact) + if (isBillingContact || !emailVerificationEnabled()) return new Email(address, true); controller.mailVerifier().sendMailVerification(tenantName, address, PendingMailVerification.MailType.TENANT_CONTACT); return new Email(address, false); @@ -847,8 +854,11 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { .findAny() .map(emailContact -> new TenantContacts.EmailContact(audiences, emailContact.email())) .orElseGet(() -> { - controller.mailVerifier().sendMailVerification(tenantName, email, PendingMailVerification.MailType.NOTIFICATIONS); - return new TenantContacts.EmailContact(audiences, new Email(email, false)); + if (emailVerificationEnabled()) { + controller.mailVerifier().sendMailVerification(tenantName, email, PendingMailVerification.MailType.NOTIFICATIONS); + return new TenantContacts.EmailContact(audiences, new Email(email, false)); + } + return new TenantContacts.EmailContact(audiences, new Email(email, true)); }); }).toList(); @@ -3074,5 +3084,8 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { .collect(collectingAndThen(Collectors.toList(), Collections::unmodifiableList)); } + public boolean emailVerificationEnabled() { + return Flags.ENABLED_MAIL_VERIFICATION.bindTo(controller.flagSource()).value(); + } } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiCloudTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiCloudTest.java index 4a816ebeee9..3b5a09e4a74 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiCloudTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiCloudTest.java @@ -8,6 +8,7 @@ import com.yahoo.config.provision.ApplicationName; import com.yahoo.config.provision.InstanceName; import com.yahoo.config.provision.TenantName; import com.yahoo.restapi.RestApiException; +import com.yahoo.vespa.flags.Flags; import com.yahoo.vespa.flags.InMemoryFlagSource; import com.yahoo.vespa.flags.PermanentFlags; import com.yahoo.vespa.hosted.controller.ControllerTester; @@ -81,6 +82,7 @@ public class ApplicationApiCloudTest extends ControllerContainerCloudTest { @Test void tenant_info_profile() { + tester.flagSource().withBooleanFlag(Flags.ENABLED_MAIL_VERIFICATION.id(), true); var request = request("/application/v4/tenant/scoober/info/profile", GET) .roles(Set.of(Role.reader(tenantName))); tester.assertResponse(request, "{}", 200); @@ -112,6 +114,7 @@ public class ApplicationApiCloudTest extends ControllerContainerCloudTest { @Test void tenant_info_contacts() { + tester.flagSource().withBooleanFlag(Flags.ENABLED_MAIL_VERIFICATION.id(), true); var request = request("/application/v4/tenant/scoober/info/contacts", GET) .roles(Set.of(Role.reader(tenantName))); tester.assertResponse(request, "{\"contacts\":[]}", 200); @@ -147,11 +150,12 @@ public class ApplicationApiCloudTest extends ControllerContainerCloudTest { tester.assertResponse(postPartialContacts, "{\"message\":\"Tenant info updated\"}", 200); // Read back the updated info - tester.assertResponse(infoRequest, "{\"name\":\"\",\"email\":\"\",\"website\":\"\",\"contactName\":\"newName\",\"contactEmail\":\"foo@example.com\",\"contactEmailVerified\":false,\"billingContact\":{\"name\":\"billingName\",\"email\":\"\",\"phone\":\"\"},\"contacts\":[{\"audiences\":[\"tenant\"],\"email\":\"contact1@example.com\",\"emailVerified\":false}]}", 200); + tester.assertResponse(infoRequest, "{\"name\":\"\",\"email\":\"\",\"website\":\"\",\"contactName\":\"newName\",\"contactEmail\":\"foo@example.com\",\"contactEmailVerified\":true,\"billingContact\":{\"name\":\"billingName\",\"email\":\"\",\"phone\":\"\"},\"contacts\":[{\"audiences\":[\"tenant\"],\"email\":\"contact1@example.com\",\"emailVerified\":true}]}", 200); + tester.flagSource().withBooleanFlag(Flags.ENABLED_MAIL_VERIFICATION.id(), true); String fullAddress = "{\"addressLines\":\"addressLines\",\"postalCodeOrZip\":\"postalCodeOrZip\",\"city\":\"city\",\"stateRegionProvince\":\"stateRegionProvince\",\"country\":\"country\"}"; String fullBillingContact = "{\"name\":\"name\",\"email\":\"foo@example\",\"phone\":\"phone\",\"address\":" + fullAddress + "}"; - String fullContacts = "[{\"audiences\":[\"tenant\"],\"email\":\"contact1@example.com\",\"emailVerified\":false},{\"audiences\":[\"notifications\"],\"email\":\"contact2@example.com\",\"emailVerified\":false},{\"audiences\":[\"tenant\",\"notifications\"],\"email\":\"contact3@example.com\",\"emailVerified\":false}]"; + String fullContacts = "[{\"audiences\":[\"tenant\"],\"email\":\"contact1@example.com\",\"emailVerified\":true},{\"audiences\":[\"notifications\"],\"email\":\"contact2@example.com\",\"emailVerified\":false},{\"audiences\":[\"tenant\",\"notifications\"],\"email\":\"contact3@example.com\",\"emailVerified\":false}]"; String fullInfo = "{\"name\":\"name\",\"email\":\"foo@example\",\"website\":\"https://yahoo.com\",\"contactName\":\"contactName\",\"contactEmail\":\"contact@example.com\",\"contactEmailVerified\":false,\"address\":" + fullAddress + ",\"billingContact\":" + fullBillingContact + ",\"contacts\":" + fullContacts + "}"; // Now set all fields @@ -171,16 +175,17 @@ public class ApplicationApiCloudTest extends ControllerContainerCloudTest { .roles(Set.of(Role.administrator(tenantName))); tester.assertResponse(resendMailRequest, "{\"error-code\":\"BAD_REQUEST\",\"message\":\"Unknown mail type blurb\"}", 400); - var resendMailBody = "{\"mail\":\"contact1@example.com\", \"mailType\":\"notifications\"}"; + var resendMailBody = "{\"mail\":\"contact2@example.com\", \"mailType\":\"notifications\"}"; resendMailRequest = request("/application/v4/tenant/scoober/info/resend-mail-verification", PUT) .data(resendMailBody) .roles(Set.of(Role.administrator(tenantName))); - tester.assertResponse(resendMailRequest, "{\"message\":\"Re-sent verification mail to contact1@example.com\"}", 200); + tester.assertResponse(resendMailRequest, "{\"message\":\"Re-sent verification mail to contact2@example.com\"}", 200); } @Test void tenant_info_missing_fields() { + tester.flagSource().withBooleanFlag(Flags.ENABLED_MAIL_VERIFICATION.id(), true); // tenants can be created with empty tenant info - they're not part of the POST to v4/tenant var infoRequest = request("/application/v4/tenant/scoober/info", GET) |