You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2015/01/07 00:25:46 UTC

[08/47] isis git commit: ISIS-987 Provide some sort of mechanism to allow users to self-register for an Isis application.

ISIS-987 Provide some sort of mechanism to allow users to self-register for an Isis application.

Password reset UI improvements.


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/790470c8
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/790470c8
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/790470c8

Branch: refs/heads/ISIS-985
Commit: 790470c80a7baa02816d0cd76e5ddb772cd50958
Parents: 065bc10
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Tue Dec 30 09:21:40 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Tue Dec 30 09:21:40 2014 +0200

----------------------------------------------------------------------
 .../signup/PasswordResetEmailPanel.html         |  34 ++++++
 .../signup/PasswordResetEmailPanel.java         | 118 +++++++++++++++++++
 .../signup/PasswordResetPage.java               |  26 ++--
 .../signup/PasswordResetPage.properties         |   9 +-
 .../signup/PasswordResetPanel.html              |  13 +-
 .../signup/PasswordResetPanel.java              |  23 ++--
 .../pages/signup/EmailAvailableValidator.java   |  17 +--
 .../ui/pages/signup/RegistrationFormPanel.java  |   2 +-
 .../userreg/UserRegistrationService.java        |   3 +
 9 files changed, 210 insertions(+), 35 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/790470c8/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/password_reset/signup/PasswordResetEmailPanel.html
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/password_reset/signup/PasswordResetEmailPanel.html b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/password_reset/signup/PasswordResetEmailPanel.html
new file mode 100644
index 0000000..b536773
--- /dev/null
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/password_reset/signup/PasswordResetEmailPanel.html
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<html xmlns:wicket="http://wicket.apache.org">
+    <body>
+        <wicket:panel>
+            <span wicket:id="feedback"></span>
+
+            <form wicket:id="signUpForm" role="form">
+                <div class="form-group" wicket:id="formGroup">
+                    <label wicket:for="email" class="control-label"><wicket:message key="emailLabel"/></label>
+                    <input type="text" class="form-control" wicket:id="email" wicket:message="placeholder:emailPlaceholder"/>
+                </div>
+
+                <button type="submit" wicket:id="passwordResetSubmit" class="btn btn-primary"><wicket:message key="passwordResetSubmitLabel"/></button>
+            </form>
+
+        </wicket:panel>
+    </body>
+</html>

http://git-wip-us.apache.org/repos/asf/isis/blob/790470c8/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/password_reset/signup/PasswordResetEmailPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/password_reset/signup/PasswordResetEmailPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/password_reset/signup/PasswordResetEmailPanel.java
new file mode 100644
index 0000000..bec5ed7
--- /dev/null
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/password_reset/signup/PasswordResetEmailPanel.java
@@ -0,0 +1,118 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.viewer.wicket.ui.pages.password_reset.signup;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+import javax.inject.Inject;
+import org.apache.wicket.markup.html.form.Button;
+import org.apache.wicket.markup.html.form.RequiredTextField;
+import org.apache.wicket.markup.html.form.StatelessForm;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.model.ResourceModel;
+import org.apache.wicket.request.Url;
+import org.apache.wicket.request.UrlRenderer;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.validation.validator.EmailAddressValidator;
+import org.apache.isis.applib.services.email.EmailNotificationService;
+import org.apache.isis.applib.services.email.events.EmailRegistrationEvent;
+import org.apache.isis.applib.services.userreg.UserRegistrationService;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.core.runtime.system.internal.InitialisationSession;
+import org.apache.isis.viewer.wicket.ui.components.widgets.bootstrap.FormGroup;
+import org.apache.isis.viewer.wicket.ui.pages.signup.EmailAvailableValidator;
+
+/**
+ * A panel with a form for creation of new users
+ */
+public class PasswordResetEmailPanel extends Panel {
+
+    /**
+     * Constructor
+     *
+     * @param id
+     *            the component id
+     */
+    public PasswordResetEmailPanel(final String id) {
+        super(id);
+
+        addOrReplace(new NotificationPanel("feedback"));
+
+        StatelessForm<Void> form = new StatelessForm<>("signUpForm");
+        addOrReplace(form);
+
+        final RequiredTextField<String> emailField = new RequiredTextField<>("email", Model.of(""));
+        emailField.setLabel(new ResourceModel("emailLabel"));
+        emailField.add(EmailAddressValidator.getInstance());
+        emailField.add(EmailAvailableValidator.DOESNT_EXIST);
+
+        FormGroup formGroup = new FormGroup("formGroup", emailField);
+        form.add(formGroup);
+
+        formGroup.add(emailField);
+
+        Button signUpButton = new Button("passwordResetSubmit") {
+            @Override
+            public void onSubmit() {
+                super.onSubmit();
+
+                String email = emailField.getModelObject();
+
+                String confirmationUrl = createUrl(email);
+
+                boolean emailSent = emailService.send(new EmailRegistrationEvent(email, confirmationUrl));
+                if (emailSent) {
+                    Map<String, String> map = new HashMap<>();
+                    map.put("email", email);
+                    IModel<Map<String, String>> model = Model.ofMap(map);
+                    String emailSentMessage = getString("emailSentMessage", model);
+                    success(emailSentMessage);
+                }
+            }
+        };
+
+        form.add(signUpButton);
+    }
+
+    private String createUrl(String email) {
+        String uuid = UUID.randomUUID().toString();
+        uuid = uuid.replace("-", "");
+
+        // TODO mgrigorov: either improve the API or use a DB table for this
+        AccountConfirmationMap accountConfirmationMap = getApplication().getMetaData(AccountConfirmationMap.KEY);
+        accountConfirmationMap.put(uuid, email);
+
+        PageParameters parameters = new PageParameters();
+        parameters.set(0, uuid);
+        CharSequence relativeUrl = urlFor(PasswordResetPage.class, parameters);
+        UrlRenderer urlRenderer = getRequestCycle().getUrlRenderer();
+        String fullUrl = urlRenderer.renderFullUrl(Url.parse(relativeUrl));
+
+        return fullUrl;
+    }
+
+    @Inject
+    private EmailNotificationService emailService;
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/790470c8/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/password_reset/signup/PasswordResetPage.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/password_reset/signup/PasswordResetPage.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/password_reset/signup/PasswordResetPage.java
index de0096e..d13779b 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/password_reset/signup/PasswordResetPage.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/password_reset/signup/PasswordResetPage.java
@@ -34,6 +34,8 @@ public class PasswordResetPage extends AccountManagementPageAbstract {
     
     private static final long serialVersionUID = 1L;
 
+    private static final String ID_CONTENT_PANEL = "passwordResetPanel";
+
     public PasswordResetPage(final PageParameters parameters) {
         this(parameters, getAndClearExceptionModelIfAny());
     }
@@ -48,23 +50,27 @@ public class PasswordResetPage extends AccountManagementPageAbstract {
 
         StringValue uuidValue = getPageParameters().get(0);
         if (uuidValue.isEmpty()) {
-            addPasswordResetPanel("passwordResetPanel");
+            addPasswordResetEmailPanel(ID_CONTENT_PANEL);
         } else {
             String uuid = uuidValue.toString();
-            AccountConfirmationMap accountConfirmationMap = getApplication().getMetaData(AccountConfirmationMap.KEY);
-            String email = accountConfirmationMap.get(uuid);
 
-            // TODO ISIS-987 Show a Panel with password/confirmPassword fields and update the passwd of the user with the given email
-//            IsisContext.openSession(new InitialisationSession());
-//            final UserRegistrationService userRegistrationService = IsisContext.getPersistenceSession().getServicesInjector().lookupService(UserRegistrationService.class);
-//            userRegistrationService.updatePasswordByEmail(email, password);
-//            IsisContext.closeSession();
+            // TODO ISIS-987 Check that there is a record in AccountConfirmationMap and an ApplicationUser
+            // Show error feedback.
+            // Otherwise show password reset panel
+
+            addPasswordResetPanel(ID_CONTENT_PANEL, uuid);
         }
     }
 
-    protected PasswordResetPanel addPasswordResetPanel(String id) {
-        final PasswordResetPanel passwordResetPanel = new PasswordResetPanel(id);
+    protected PasswordResetPanel addPasswordResetPanel(String id, String uuid) {
+        final PasswordResetPanel passwordResetPanel = new PasswordResetPanel(id, uuid);
         addOrReplace(passwordResetPanel);
         return passwordResetPanel;
     }
+
+    protected PasswordResetEmailPanel addPasswordResetEmailPanel(String id) {
+        final PasswordResetEmailPanel passwordResetEmailPanel = new PasswordResetEmailPanel(id);
+        addOrReplace(passwordResetEmailPanel);
+        return passwordResetEmailPanel;
+    }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/790470c8/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/password_reset/signup/PasswordResetPage.properties
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/password_reset/signup/PasswordResetPage.properties b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/password_reset/signup/PasswordResetPage.properties
index 9891fcd..c43b8cc 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/password_reset/signup/PasswordResetPage.properties
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/password_reset/signup/PasswordResetPage.properties
@@ -19,8 +19,11 @@
 
 passwordResetHeader=Forgot password
 emailLabel=Email
-emailPlaceholder=Enter your email address
-signUpPasswordLabel=Password
-passwordPlaceholder=Enter password
+emailPlaceholder=Enter your email
+passwordLabel=Password
+passwordPlaceholder=Enter your new password
+confirmPasswordLabel=Confirm password
+confirmPasswordPlaceholder=Type the same password again
 passwordResetSubmitLabel=Submit
 emailSentMessage=An automatic email has been sent to '${email}' for verification.
+noSuchUserByEmail=There is no account with this email

http://git-wip-us.apache.org/repos/asf/isis/blob/790470c8/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/password_reset/signup/PasswordResetPanel.html
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/password_reset/signup/PasswordResetPanel.html b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/password_reset/signup/PasswordResetPanel.html
index b536773..adfd44b 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/password_reset/signup/PasswordResetPanel.html
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/password_reset/signup/PasswordResetPanel.html
@@ -20,10 +20,15 @@
         <wicket:panel>
             <span wicket:id="feedback"></span>
 
-            <form wicket:id="signUpForm" role="form">
-                <div class="form-group" wicket:id="formGroup">
-                    <label wicket:for="email" class="control-label"><wicket:message key="emailLabel"/></label>
-                    <input type="text" class="form-control" wicket:id="email" wicket:message="placeholder:emailPlaceholder"/>
+            <form wicket:id="passwordResetForm" role="form">
+                <div class="form-group">
+                    <label wicket:for="password" class="control-label"><wicket:message key="passwordLabel"/></label>
+                    <input type="password" class="form-control" wicket:id="password" wicket:message="placeholder:passwordPlaceholder"/>
+                </div>
+
+                <div class="form-group">
+                    <label wicket:for="confirmPassword" class="control-label"><wicket:message key="confirmPasswordLabel"/></label>
+                    <input type="password" class="form-control" wicket:id="confirmPassword" wicket:message="placeholder:confirmPasswordPlaceholder"/>
                 </div>
 
                 <button type="submit" wicket:id="passwordResetSubmit" class="btn btn-primary"><wicket:message key="passwordResetSubmitLabel"/></button>

http://git-wip-us.apache.org/repos/asf/isis/blob/790470c8/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/password_reset/signup/PasswordResetPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/password_reset/signup/PasswordResetPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/password_reset/signup/PasswordResetPanel.java
index f588066..c668e86 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/password_reset/signup/PasswordResetPanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/password_reset/signup/PasswordResetPanel.java
@@ -26,8 +26,10 @@ import java.util.Map;
 import java.util.UUID;
 import javax.inject.Inject;
 import org.apache.wicket.markup.html.form.Button;
+import org.apache.wicket.markup.html.form.PasswordTextField;
 import org.apache.wicket.markup.html.form.RequiredTextField;
 import org.apache.wicket.markup.html.form.StatelessForm;
+import org.apache.wicket.markup.html.form.validation.EqualPasswordInputValidator;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
@@ -39,7 +41,6 @@ import org.apache.wicket.validation.validator.EmailAddressValidator;
 import org.apache.isis.applib.services.email.EmailNotificationService;
 import org.apache.isis.applib.services.email.events.EmailRegistrationEvent;
 import org.apache.isis.viewer.wicket.ui.components.widgets.bootstrap.FormGroup;
-import org.apache.isis.viewer.wicket.ui.pages.register.RegisterPage;
 
 /**
  * A panel with a form for creation of new users
@@ -51,30 +52,32 @@ public class PasswordResetPanel extends Panel {
      *
      * @param id
      *            the component id
+     * @param uuid
      */
-    public PasswordResetPanel(final String id) {
+    public PasswordResetPanel(final String id, String uuid) {
         super(id);
 
         addOrReplace(new NotificationPanel("feedback"));
 
-        StatelessForm<Void> form = new StatelessForm<>("signUpForm");
+        StatelessForm<Void> form = new StatelessForm<>("passwordResetForm");
         addOrReplace(form);
 
-        final RequiredTextField<String> emailField = new RequiredTextField<>("email", Model.of(""));
-        emailField.setLabel(new ResourceModel("emailLabel"));
-        emailField.add(EmailAddressValidator.getInstance());
+        final PasswordTextField passwordField = new PasswordTextField("password", Model.of(""));
+        passwordField.setLabel(new ResourceModel("passwordLabel"));
+        form.add(passwordField);
 
-        FormGroup formGroup = new FormGroup("formGroup", emailField);
-        form.add(formGroup);
+        final PasswordTextField confirmPasswordField = new PasswordTextField("confirmPassword", Model.of(""));
+        confirmPasswordField.setLabel(new ResourceModel("confirmPasswordLabel"));
+        form.add(confirmPasswordField);
 
-        formGroup.add(emailField);
+        form.add(new EqualPasswordInputValidator(passwordField, confirmPasswordField));
 
         Button signUpButton = new Button("passwordResetSubmit") {
             @Override
             public void onSubmit() {
                 super.onSubmit();
 
-                String email = emailField.getModelObject();
+                String email = confirmPasswordField.getModelObject();
                 String confirmationUrl = createUrl(email);
 
                 boolean emailSent = emailService.send(new EmailRegistrationEvent(email, confirmationUrl));

http://git-wip-us.apache.org/repos/asf/isis/blob/790470c8/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/signup/EmailAvailableValidator.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/signup/EmailAvailableValidator.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/signup/EmailAvailableValidator.java
index c44eda7..12deb66 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/signup/EmailAvailableValidator.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/signup/EmailAvailableValidator.java
@@ -12,21 +12,24 @@ import org.apache.isis.core.runtime.system.internal.InitialisationSession;
  */
 public class EmailAvailableValidator implements IValidator<String> {
 
-    private static final EmailAvailableValidator INSTANCE = new EmailAvailableValidator();
+    public static final EmailAvailableValidator EXISTS = new EmailAvailableValidator(true, "emailIsNotAvailable");
+    public static final EmailAvailableValidator DOESNT_EXIST = new EmailAvailableValidator(false, "noSuchUserByEmail");
 
-    public static EmailAvailableValidator getInstance() {
-        return INSTANCE;
-    }
+    private final boolean emailExists;
+    private final String resourceKey;
 
-    private EmailAvailableValidator() {}
+    private EmailAvailableValidator(boolean emailExists, String resourceKey) {
+        this.emailExists = emailExists;
+        this.resourceKey = resourceKey;
+    }
 
     @Override
     public void validate(IValidatable<String> validatable) {
         IsisContext.openSession(new InitialisationSession());
         final UserRegistrationService userRegistrationService = IsisContext.getPersistenceSession().getServicesInjector().lookupService(UserRegistrationService.class);
         String email = validatable.getValue();
-        if (userRegistrationService.emailExists(email)) {
-            validatable.error(new ValidationError().addKey("emailIsNotAvailable"));
+        if (userRegistrationService.emailExists(email) == emailExists) {
+            validatable.error(new ValidationError().addKey(resourceKey));
         }
         IsisContext.closeSession();
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/790470c8/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/signup/RegistrationFormPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/signup/RegistrationFormPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/signup/RegistrationFormPanel.java
index ff268f2..fd14c8e 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/signup/RegistrationFormPanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/signup/RegistrationFormPanel.java
@@ -62,7 +62,7 @@ public class RegistrationFormPanel extends Panel {
         final RequiredTextField<String> emailField = new RequiredTextField<>("email", Model.of(""));
         emailField.setLabel(new ResourceModel("emailLabel"));
         emailField.add(EmailAddressValidator.getInstance());
-        emailField.add(EmailAvailableValidator.getInstance());
+        emailField.add(EmailAvailableValidator.EXISTS);
 
         FormGroup formGroup = new FormGroup("formGroup", emailField);
         form.add(formGroup);

http://git-wip-us.apache.org/repos/asf/isis/blob/790470c8/core/applib/src/main/java/org/apache/isis/applib/services/userreg/UserRegistrationService.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/userreg/UserRegistrationService.java b/core/applib/src/main/java/org/apache/isis/applib/services/userreg/UserRegistrationService.java
index a37e7db..5639d4f 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/userreg/UserRegistrationService.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/userreg/UserRegistrationService.java
@@ -27,4 +27,7 @@ public interface UserRegistrationService {
 
     @Programmatic
     boolean emailExists(String emailAddress);
+
+    @Programmatic
+    void updatePasswordByEmail(String emailAddress, String password);
 }