/**
* Copyright 2013 Tommi S.E. Laukkanen
*
* Licensed 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.bubblecloud.ilves.ui.anonymous.login;
import com.vaadin.data.Property;
import com.vaadin.data.util.BeanItem;
import com.vaadin.data.util.ObjectProperty;
import com.vaadin.data.util.PropertysetItem;
import com.vaadin.server.VaadinService;
import com.vaadin.server.VaadinServletRequest;
import com.vaadin.ui.*;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.themes.ValoTheme;
import org.apache.log4j.Logger;
import org.bubblecloud.ilves.component.flow.AbstractFlowlet;
import org.bubblecloud.ilves.component.grid.FieldDescriptor;
import org.bubblecloud.ilves.component.grid.ValidatingEditor;
import org.bubblecloud.ilves.component.grid.ValidatingEditorStateListener;
import org.bubblecloud.ilves.component.validator.PasswordValidator;
import org.bubblecloud.ilves.component.validator.PasswordVerificationValidator;
import org.bubblecloud.ilves.model.Company;
import org.bubblecloud.ilves.model.Customer;
import org.bubblecloud.ilves.model.PostalAddress;
import org.bubblecloud.ilves.model.User;
import org.bubblecloud.ilves.module.customer.CustomerModule;
import org.bubblecloud.ilves.security.SecurityService;
import org.bubblecloud.ilves.security.UserDao;
import org.bubblecloud.ilves.site.SiteFields;
import org.bubblecloud.ilves.site.SiteModuleManager;
import org.bubblecloud.ilves.util.EmailUtil;
import org.bubblecloud.ilves.util.PropertiesUtil;
import org.bubblecloud.ilves.util.StringUtil;
import org.vaadin.addons.lazyquerycontainer.CompositeItem;
import javax.persistence.EntityManager;
import javax.servlet.http.HttpServletRequest;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* Register Flowlet.
*
* @author Tommi S.E. Laukkanen
*/
public final class RegisterFlowlet extends AbstractFlowlet {
/** The logger. */
private static final Logger LOGGER = Logger.getLogger(RegisterFlowlet.class);
/** Default serial version UID. */
private static final long serialVersionUID = 1L;
/** Customer. */
private Customer customer;
/** Original password property. */
private Property originalPasswordProperty;
/** Verification password property. */
private Property verifiedPasswordProperty;
/** Validating editor. */
private ValidatingEditor editor;
@Override
public String getFlowletKey() {
return "register";
}
/**
* Reset data.
*/
public void reset() {
customer = new Customer();
final CompositeItem compositeItem = new CompositeItem();
final PropertysetItem defaultItem = (PropertysetItem) compositeItem.getItem(CompositeItem.DEFAULT_ITEM_KEY);
originalPasswordProperty.setValue("");
verifiedPasswordProperty.setValue("");
defaultItem.addItemProperty("password1", originalPasswordProperty);
defaultItem.addItemProperty("password2", verifiedPasswordProperty);
final BeanItem<Customer> customerItem = new BeanItem<Customer>(customer);
compositeItem.addItem("customer", customerItem);
originalPasswordProperty.setValue(null);
verifiedPasswordProperty.setValue(null);
editor.setItem(compositeItem, true);
}
@Override
public void initialize() {
originalPasswordProperty = new ObjectProperty<String>(null, String.class);
verifiedPasswordProperty = new ObjectProperty<String>(null, String.class);
final List<FieldDescriptor> fieldDescriptors = new ArrayList<FieldDescriptor>();
final PasswordValidator passwordValidator = new PasswordValidator(getSite(), originalPasswordProperty, "password2");
//fieldDescriptors.addAll(SiteFields.getFieldDescriptors(Customer.class));
for (final FieldDescriptor fieldDescriptor : SiteFields.getFieldDescriptors(Customer.class)) {
if (fieldDescriptor.getId().equals("adminGroup")) {
continue;
}
if (fieldDescriptor.getId().equals("memberGroup")) {
continue;
}
if (fieldDescriptor.getId().equals("created")) {
continue;
}
if (fieldDescriptor.getId().equals("modified")) {
continue;
}
fieldDescriptors.add(fieldDescriptor);
}
//fieldDescriptors.remove(fieldDescriptors.size() - 1);
//fieldDescriptors.remove(fieldDescriptors.size() - 1);
fieldDescriptors.add(new FieldDescriptor("password1", getSite().localize("input-password"),
PasswordField.class, null, 150, null, String.class, null,
false, true, true
).addValidator(passwordValidator));
fieldDescriptors.add(new FieldDescriptor("password2", getSite().localize("input-password-verification"),
PasswordField.class, null, 150, null,
String.class, null, false, true,
true).addValidator(new PasswordVerificationValidator(getSite(), originalPasswordProperty)));
editor = new ValidatingEditor(fieldDescriptors);
passwordValidator.setEditor(editor);
final Button registerButton = new Button(getSite().localize("button-register"));
registerButton.setStyleName(ValoTheme.BUTTON_PRIMARY);
registerButton.addClickListener(new ClickListener() {
/** The default serial version ID. */
private static final long serialVersionUID = 1L;
@Override
public void buttonClick(final ClickEvent event) {
editor.commit();
customer.setCreated(new Date());
customer.setModified(customer.getCreated());
final EntityManager entityManager = getSite().getSiteContext().getObject(EntityManager.class);
final Company company = getSite().getSiteContext().getObject(Company.class);
final PostalAddress invoicingAddress = new PostalAddress();
invoicingAddress.setAddressLineOne("?");
invoicingAddress.setAddressLineTwo("?");
invoicingAddress.setAddressLineThree("?");
invoicingAddress.setCity("?");
invoicingAddress.setPostalCode("?");
invoicingAddress.setCountry("?");
final PostalAddress deliveryAddress = new PostalAddress();
deliveryAddress.setAddressLineOne("?");
deliveryAddress.setAddressLineTwo("?");
deliveryAddress.setAddressLineThree("?");
deliveryAddress.setCity("?");
deliveryAddress.setPostalCode("?");
deliveryAddress.setCountry("?");
customer.setInvoicingAddress(invoicingAddress);
customer.setDeliveryAddress(deliveryAddress);
if (UserDao.getUser(entityManager, company, customer.getEmailAddress()) != null) {
Notification.show(getSite().localize("message-user-email-address-registered"),
Notification.Type.WARNING_MESSAGE);
return;
}
final HttpServletRequest request = ((VaadinServletRequest) VaadinService.getCurrentRequest())
.getHttpServletRequest();
try {
final byte[] passwordAndSaltBytes = (customer.getEmailAddress()
+ ":" + ((String) originalPasswordProperty.getValue()))
.getBytes("UTF-8");
final MessageDigest md = MessageDigest.getInstance("SHA-256");
final byte[] passwordAndSaltDigest = md.digest(passwordAndSaltBytes);
customer.setOwner(company);
final User user = new User(company, customer.getFirstName(), customer.getLastName(),
customer.getEmailAddress(), customer.getPhoneNumber(), StringUtil.toHexString(passwordAndSaltDigest));
SecurityService.addUser(getSite().getSiteContext(), user, UserDao.getGroup(entityManager, company, "user"));
if (SiteModuleManager.isModuleInitialized(CustomerModule.class)) {
SecurityService.addCustomer(getSite().getSiteContext(), customer, user);
}
final String url = company.getUrl() +
"#!validate/" + user.getUserId();
final Thread emailThread = new Thread(new Runnable() {
@Override
public void run() {
EmailUtil.send(
user.getEmailAddress(), company.getSupportEmailAddress(), "Email Validation",
"Please validate your email by browsing to this URL: " + url);
}
});
emailThread.start();
LOGGER.info("User registered " + user.getEmailAddress()
+ " (IP: " + request.getRemoteHost() + ":" + request.getRemotePort() + ")");
Notification.show(getSite().localize("message-registration-success"),
Notification.Type.HUMANIZED_MESSAGE);
getFlow().back();
} catch (final Exception e) {
LOGGER.error("Error adding user. (IP: " + request.getRemoteHost()
+ ":" + request.getRemotePort() + ")", e);
Notification.show(getSite().localize("message-registration-error"),
Notification.Type.WARNING_MESSAGE);
}
reset();
}
});
editor.addListener(new ValidatingEditorStateListener() {
@Override
public void editorStateChanged(final ValidatingEditor source) {
if (source.isValid()) {
registerButton.setEnabled(true);
} else {
registerButton.setEnabled(false);
}
}
});
reset();
final VerticalLayout panel = new VerticalLayout();
panel.addComponent(editor);
panel.addComponent(registerButton);
panel.setSpacing(true);
final HorizontalLayout mainLayout = new HorizontalLayout();
mainLayout.setMargin(true);
mainLayout.addComponent(panel);
final Panel mainPanel = new Panel();
mainPanel.setSizeUndefined();
mainPanel.setContent(mainLayout);
setViewContent(mainPanel);
}
@Override
public boolean isDirty() {
return false;
}
@Override
public boolean isValid() {
return false;
}
@Override
public void enter() {
}
}