keycloak-uncached

KEYCLOAK-74 email verification fixes

10/1/2013 10:40:42 AM

Details

diff --git a/forms/src/main/resources/META-INF/resources/forms/theme/default/css/login-register.css b/forms/src/main/resources/META-INF/resources/forms/theme/default/css/login-register.css
index 8908e52..0fa24e8 100644
--- a/forms/src/main/resources/META-INF/resources/forms/theme/default/css/login-register.css
+++ b/forms/src/main/resources/META-INF/resources/forms/theme/default/css/login-register.css
@@ -330,6 +330,12 @@ a.zocial:before {
     text-align: right;
 }
 
+.rcue-login-register .background-area p.instruction {
+    font-size: 1.3em;
+    line-height: 1.3em;
+    margin-bottom: 1.53846em;
+}
+
 .rcue-login-register .background-area p.instruction.instruction.second {
     color: #999999;
 }
diff --git a/forms/src/main/resources/META-INF/resources/forms/theme/default/login-verify-email.ftl b/forms/src/main/resources/META-INF/resources/forms/theme/default/login-verify-email.ftl
index d6c62b0..12fb90b 100755
--- a/forms/src/main/resources/META-INF/resources/forms/theme/default/login-verify-email.ftl
+++ b/forms/src/main/resources/META-INF/resources/forms/theme/default/login-verify-email.ftl
@@ -1,24 +1,25 @@
 <#import "template-login-action.ftl" as layout>
-<@layout.registrationLayout bodyClass=""; section>
+<@layout.registrationLayout bodyClass="reset"; section>
     <#if section = "title">
 
-    Verify email
+    Email verification
 
     <#elseif section = "header">
 
-    Verify email
+    Email verification
 
     <#elseif section = "form">
 
-    <div id="form">
-    	An email with instructions to verify your email address has been sent to you. If you don't receive this email, 
-    	<a href="${url.emailVerificationUrl}">click here</a> to re-send the email.
+    <div class="app-form">
+        <p class="instruction">
+            Your account is not enabled. An email with instructions to verify your email address has been sent to you.
+        </p>
+        <p class="instruction">Haven't received a verification code in your email?
+            <a href="${url.emailVerificationUrl}">Click here</a> to re-send the email.
+        </p>
     </div>
 
     <#elseif section = "info" >
 
-    <div id="info">
-    </div>
-
     </#if>
 </@layout.registrationLayout>
\ No newline at end of file
diff --git a/services/src/main/java/org/keycloak/services/email/EmailSender.java b/services/src/main/java/org/keycloak/services/email/EmailSender.java
index 8bd181c..7fb20eb 100644
--- a/services/src/main/java/org/keycloak/services/email/EmailSender.java
+++ b/services/src/main/java/org/keycloak/services/email/EmailSender.java
@@ -85,9 +85,15 @@ public class EmailSender {
         URI uri = builder.build(realm.getId());
 
         StringBuilder sb = new StringBuilder();
+        sb.append("Hi ").append(user.getFirstName()).append(",\n\n");
+        sb.append("Someone has created a Keycloak account with this email address. ");
+        sb.append("If this was you, click the link below to verify your email address:\n");
         sb.append(uri.toString());
-        sb.append("\n");
-        sb.append("Expires in " + TimeUnit.SECONDS.toMinutes(realm.getAccessCodeLifespanUserAction()));
+        sb.append("\n\nThis link will expire within ").append(TimeUnit.SECONDS.toMinutes(realm.getAccessCodeLifespanUserAction()));
+        sb.append(" minutes.\n\n");
+        sb.append("If you didn't create this account, just ignore this message.\n\n");
+        sb.append("Thanks,\n");
+        sb.append("The Keycloak Team");
 
         try {
             send(user.getEmail(), "Verify email", sb.toString());
diff --git a/services/src/main/java/org/keycloak/services/resources/AccountService.java b/services/src/main/java/org/keycloak/services/resources/AccountService.java
index 94e4682..cfbdefa 100755
--- a/services/src/main/java/org/keycloak/services/resources/AccountService.java
+++ b/services/src/main/java/org/keycloak/services/resources/AccountService.java
@@ -281,8 +281,6 @@ public class AccountService {
                 return Response.status(Status.FORBIDDEN).build();
             }
 
-            new EmailSender().sendEmailVerification(user, realm, accessCode, uriInfo);
-
             return Flows.forms(realm, request, uriInfo).setAccessCode(accessCode).setUser(user)
                     .forwardToAction(RequiredAction.VERIFY_EMAIL);
         }
diff --git a/testsuite/src/test/java/org/keycloak/testsuite/actions/RequiredActionEmailVerificationTest.java b/testsuite/src/test/java/org/keycloak/testsuite/actions/RequiredActionEmailVerificationTest.java
index 26b9e55..7d38da7 100644
--- a/testsuite/src/test/java/org/keycloak/testsuite/actions/RequiredActionEmailVerificationTest.java
+++ b/testsuite/src/test/java/org/keycloak/testsuite/actions/RequiredActionEmailVerificationTest.java
@@ -40,6 +40,7 @@ import org.keycloak.testsuite.pages.AppPage;
 import org.keycloak.testsuite.pages.AppPage.RequestType;
 import org.keycloak.testsuite.pages.LoginPage;
 import org.keycloak.testsuite.pages.RegisterPage;
+import org.keycloak.testsuite.pages.VerifyEmailPage;
 import org.keycloak.testsuite.rule.GreenMailRule;
 import org.keycloak.testsuite.rule.KeycloakRule;
 import org.keycloak.testsuite.rule.KeycloakRule.KeycloakSetup;
@@ -81,6 +82,9 @@ public class RequiredActionEmailVerificationTest {
     protected LoginPage loginPage;
 
     @WebResource
+    protected VerifyEmailPage verifyEmailPage;
+
+    @WebResource
     protected RegisterPage registerPage;
 
     @Test
@@ -88,7 +92,9 @@ public class RequiredActionEmailVerificationTest {
         loginPage.open();
         loginPage.login("test-user@localhost", "password");
 
-        Assert.assertTrue(driver.getPageSource().contains("Verify email"));
+        Assert.assertTrue(verifyEmailPage.isCurrent());
+
+        Assert.assertEquals(1, greenMail.getReceivedMessages().length);
 
         MimeMessage message = greenMail.getReceivedMessages()[0];
 
@@ -111,7 +117,9 @@ public class RequiredActionEmailVerificationTest {
         loginPage.clickRegister();
         registerPage.register("firstName", "lastName", "email", "verifyEmail", "password", "password");
 
-        Assert.assertTrue(driver.getPageSource().contains("Verify email"));
+        Assert.assertTrue(verifyEmailPage.isCurrent());
+
+        Assert.assertEquals(1, greenMail.getReceivedMessages().length);
 
         MimeMessage message = greenMail.getReceivedMessages()[0];
 
@@ -128,4 +136,33 @@ public class RequiredActionEmailVerificationTest {
         Assert.assertEquals(RequestType.AUTH_RESPONSE, appPage.getRequestType());
     }
 
+    @Test
+    public void verifyEmailResend() throws IOException, MessagingException {
+        loginPage.open();
+        loginPage.clickRegister();
+        registerPage.register("firstName2", "lastName2", "email2", "verifyEmail2", "password2", "password2");
+
+        Assert.assertTrue(verifyEmailPage.isCurrent());
+
+        Assert.assertEquals(1, greenMail.getReceivedMessages().length);
+
+        verifyEmailPage.clickResendEmail();
+
+        Assert.assertEquals(2, greenMail.getReceivedMessages().length);
+
+        MimeMessage message = greenMail.getReceivedMessages()[1];
+
+        String body = (String) message.getContent();
+
+        Pattern p = Pattern.compile("(?s).*(http://[^\\s]*).*");
+        Matcher m = p.matcher(body);
+        m.matches();
+
+        String verificationUrl = m.group(1);
+
+        driver.navigate().to(verificationUrl.trim());
+
+        Assert.assertEquals(RequestType.AUTH_RESPONSE, appPage.getRequestType());
+    }
+
 }
diff --git a/testsuite/src/test/java/org/keycloak/testsuite/pages/VerifyEmailPage.java b/testsuite/src/test/java/org/keycloak/testsuite/pages/VerifyEmailPage.java
new file mode 100644
index 0000000..5e8c24c
--- /dev/null
+++ b/testsuite/src/test/java/org/keycloak/testsuite/pages/VerifyEmailPage.java
@@ -0,0 +1,53 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2012, Red Hat, Inc., and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.keycloak.testsuite.pages;
+
+import org.keycloak.testsuite.OAuthClient;
+import org.keycloak.testsuite.rule.WebResource;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.FindBy;
+
+/**
+ * @author <a href="mailto:vrockai@redhat.com">Viliam Rockai</a>
+ */
+public class VerifyEmailPage extends Page {
+
+    @WebResource
+    protected OAuthClient oauth;
+
+    @FindBy(linkText = "Click here")
+    private WebElement resendEmailLink;
+
+    @Override
+    public void open() {
+
+    }
+
+    public boolean isCurrent() {
+        return driver.getTitle().equals("Email verification");
+    }
+
+    public void clickResendEmail() {
+        resendEmailLink.click();
+    }
+
+}