1 package org.appfuse.webapp.pages;
2
3 import org.apache.commons.lang.StringUtils;
4 import org.apache.tapestry5.alerts.AlertManager;
5 import org.apache.tapestry5.alerts.Duration;
6 import org.apache.tapestry5.alerts.Severity;
7 import org.apache.tapestry5.annotations.Component;
8 import org.apache.tapestry5.annotations.Log;
9 import org.apache.tapestry5.annotations.PageActivationContext;
10 import org.apache.tapestry5.annotations.Property;
11 import org.apache.tapestry5.ioc.Messages;
12 import org.apache.tapestry5.ioc.annotations.Inject;
13 import org.apache.tapestry5.services.HttpError;
14 import org.apache.tapestry5.services.Response;
15 import org.appfuse.Constants;
16 import org.appfuse.model.User;
17 import org.appfuse.service.RoleManager;
18 import org.appfuse.service.UserExistsException;
19 import org.appfuse.service.UserManager;
20 import org.appfuse.webapp.components.UserForm;
21 import org.appfuse.webapp.services.EmailService;
22 import org.appfuse.webapp.services.SecurityContext;
23 import org.appfuse.webapp.util.RequestUtil;
24 import org.slf4j.Logger;
25 import org.springframework.mail.MailException;
26 import org.springframework.security.access.AccessDeniedException;
27
28 import javax.servlet.http.HttpServletRequest;
29 import javax.servlet.http.HttpServletResponse;
30 import java.io.IOException;
31
32
33
34
35
36
37
38 public class Signup {
39 @Inject
40 private Logger logger;
41
42 @Inject
43 private UserManager userManager;
44
45 @Inject
46 private RoleManager roleManager;
47
48 @Inject
49 private AlertManager alertManager;
50
51 @Inject
52 private EmailService emailService;
53
54 @Property
55 @PageActivationContext
56 private User user;
57
58 @Inject
59 private HttpServletRequest request;
60
61 @Inject
62 private SecurityContext securityContext;
63
64 @Inject
65 private Response response;
66
67 @Inject
68 private Messages messages;
69
70 @Component(id = "signup")
71 private UserForm form;
72
73 @Property
74 private Boolean cookieLogin;
75
76 void onPrepare() {
77 if (user == null) {
78 user = new User();
79 }
80
81 user.setEnabled(true);
82
83
84 user.addRole(roleManager.getRole(Constants.USER_ROLE));
85 }
86
87 void setupRender() {
88 form.setInfoMessage(messages.get("signup.message"));
89 }
90
91
92
93 @Log
94 Object onCanceledFromSignup() {
95 return Login.class;
96 }
97
98 @Log
99 void onValidatePasswordFromSignup() {
100
101 if (form.isValid()) {
102 if (!StringUtils.equals(user.getPassword(), user.getConfirmPassword())) {
103
104 String errorMessage = messages.format("errors.twofields",
105 messages.get("user.confirmPassword"),
106 messages.get("user.password"));
107
108 form.recordError(errorMessage);
109
110 alertManager.alert(
111 Duration.TRANSIENT,
112 Severity.ERROR,
113 errorMessage);
114 }
115 }
116 }
117
118 @Log
119 Object onSuccess() throws IOException {
120 try {
121 user = userManager.saveUser(user);
122 } catch (AccessDeniedException ade) {
123
124 logger.warn(ade.getMessage());
125 return new HttpError(HttpServletResponse.SC_FORBIDDEN, "Resource not available");
126 } catch (UserExistsException e) {
127
128
129 alertManager.error(
130 messages.format("errors.existing.user", user.getUsername(), user.getEmail())
131 );
132
133 user.setPassword(user.getConfirmPassword());
134
135
136
137 response.sendRedirect("signup");
138 }
139
140
141 securityContext.login(user);
142
143
144 logger.debug(String.format("Sending user '%s' an account information e-mail", user.getUsername()));
145 try {
146 String msg = messages.get("signup.email.message");
147 String subject = messages.get("signup.email.subject");
148 emailService.send(user, subject, msg, RequestUtil.getAppURL(request), false);
149 } catch (MailException me) {
150 request.getSession(true).setAttribute("error",
151 me.getMostSpecificCause().getMessage());
152 }
153
154 alertManager.alert(Duration.TRANSIENT, Severity.INFO, messages.get("user.registered"));
155 if (request != null) {
156 response.sendRedirect(request.getContextPath());
157 }
158 return null;
159 }
160
161 @Log
162 void onFailure() throws IOException {
163 response.sendRedirect("signup");
164 }
165 }