001
014
015 package com.liferay.portlet.login.action;
016
017 import com.liferay.portal.AddressCityException;
018 import com.liferay.portal.AddressStreetException;
019 import com.liferay.portal.AddressZipException;
020 import com.liferay.portal.CompanyMaxUsersException;
021 import com.liferay.portal.ContactFirstNameException;
022 import com.liferay.portal.ContactFullNameException;
023 import com.liferay.portal.ContactLastNameException;
024 import com.liferay.portal.DuplicateUserEmailAddressException;
025 import com.liferay.portal.DuplicateUserScreenNameException;
026 import com.liferay.portal.EmailAddressException;
027 import com.liferay.portal.NoSuchCountryException;
028 import com.liferay.portal.NoSuchLayoutException;
029 import com.liferay.portal.NoSuchListTypeException;
030 import com.liferay.portal.NoSuchOrganizationException;
031 import com.liferay.portal.NoSuchRegionException;
032 import com.liferay.portal.NoSuchUserException;
033 import com.liferay.portal.OrganizationParentException;
034 import com.liferay.portal.PhoneNumberException;
035 import com.liferay.portal.RequiredFieldException;
036 import com.liferay.portal.RequiredUserException;
037 import com.liferay.portal.ReservedUserEmailAddressException;
038 import com.liferay.portal.ReservedUserScreenNameException;
039 import com.liferay.portal.TermsOfUseException;
040 import com.liferay.portal.UserEmailAddressException;
041 import com.liferay.portal.UserIdException;
042 import com.liferay.portal.UserPasswordException;
043 import com.liferay.portal.UserScreenNameException;
044 import com.liferay.portal.UserSmsException;
045 import com.liferay.portal.WebsiteURLException;
046 import com.liferay.portal.kernel.captcha.CaptchaMaxChallengesException;
047 import com.liferay.portal.kernel.captcha.CaptchaTextException;
048 import com.liferay.portal.kernel.captcha.CaptchaUtil;
049 import com.liferay.portal.kernel.servlet.SessionErrors;
050 import com.liferay.portal.kernel.servlet.SessionMessages;
051 import com.liferay.portal.kernel.util.Constants;
052 import com.liferay.portal.kernel.util.ParamUtil;
053 import com.liferay.portal.kernel.util.Validator;
054 import com.liferay.portal.kernel.workflow.WorkflowConstants;
055 import com.liferay.portal.model.Company;
056 import com.liferay.portal.model.CompanyConstants;
057 import com.liferay.portal.model.Layout;
058 import com.liferay.portal.model.User;
059 import com.liferay.portal.security.auth.PrincipalException;
060 import com.liferay.portal.service.LayoutLocalServiceUtil;
061 import com.liferay.portal.service.ServiceContext;
062 import com.liferay.portal.service.ServiceContextFactory;
063 import com.liferay.portal.service.UserLocalServiceUtil;
064 import com.liferay.portal.service.UserServiceUtil;
065 import com.liferay.portal.struts.PortletAction;
066 import com.liferay.portal.theme.ThemeDisplay;
067 import com.liferay.portal.util.PortalUtil;
068 import com.liferay.portal.util.PropsValues;
069 import com.liferay.portal.util.WebKeys;
070 import com.liferay.portlet.login.util.LoginUtil;
071
072 import javax.portlet.ActionRequest;
073 import javax.portlet.ActionResponse;
074 import javax.portlet.PortletConfig;
075 import javax.portlet.PortletURL;
076 import javax.portlet.RenderRequest;
077 import javax.portlet.RenderResponse;
078
079 import javax.servlet.http.HttpServletRequest;
080 import javax.servlet.http.HttpServletResponse;
081 import javax.servlet.http.HttpSession;
082
083 import org.apache.struts.action.ActionForm;
084 import org.apache.struts.action.ActionForward;
085 import org.apache.struts.action.ActionMapping;
086
087
093 public class CreateAccountAction extends PortletAction {
094
095 @Override
096 public void processAction(
097 ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
098 ActionRequest actionRequest, ActionResponse actionResponse)
099 throws Exception {
100
101 ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
102 WebKeys.THEME_DISPLAY);
103
104 String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
105
106 try {
107 if (cmd.equals(Constants.ADD)) {
108 if (PropsValues.CAPTCHA_CHECK_PORTAL_CREATE_ACCOUNT) {
109 CaptchaUtil.check(actionRequest);
110 }
111
112 addUser(actionRequest, actionResponse);
113 }
114 else if (cmd.equals(Constants.RESET)) {
115 resetUser(actionRequest, actionResponse);
116 }
117 else if (cmd.equals(Constants.UPDATE)) {
118 updateIncompleteUser(actionRequest, actionResponse);
119 }
120 }
121 catch (Exception e) {
122 if (e instanceof DuplicateUserEmailAddressException ||
123 e instanceof DuplicateUserScreenNameException) {
124
125 String emailAddress = ParamUtil.getString(
126 actionRequest, "emailAddress");
127
128 try {
129 User user = UserLocalServiceUtil.getUserByEmailAddress(
130 themeDisplay.getCompanyId(), emailAddress);
131
132 if (user.getStatus() !=
133 WorkflowConstants.STATUS_INCOMPLETE) {
134
135 SessionErrors.add(
136 actionRequest, e.getClass().getName(), e);
137 }
138 else {
139 setForward(
140 actionRequest, "portlet.login.update_account");
141 }
142 }
143 catch (NoSuchUserException nsue) {
144 SessionErrors.add(actionRequest, e.getClass().getName(), e);
145 }
146 }
147 else if (e instanceof AddressCityException ||
148 e instanceof AddressStreetException ||
149 e instanceof AddressZipException ||
150 e instanceof CaptchaMaxChallengesException ||
151 e instanceof CaptchaTextException ||
152 e instanceof CompanyMaxUsersException ||
153 e instanceof ContactFirstNameException ||
154 e instanceof ContactFullNameException ||
155 e instanceof ContactLastNameException ||
156 e instanceof EmailAddressException ||
157 e instanceof NoSuchCountryException ||
158 e instanceof NoSuchListTypeException ||
159 e instanceof NoSuchOrganizationException ||
160 e instanceof NoSuchRegionException ||
161 e instanceof OrganizationParentException ||
162 e instanceof PhoneNumberException ||
163 e instanceof RequiredFieldException ||
164 e instanceof RequiredUserException ||
165 e instanceof ReservedUserEmailAddressException ||
166 e instanceof ReservedUserScreenNameException ||
167 e instanceof TermsOfUseException ||
168 e instanceof UserEmailAddressException ||
169 e instanceof UserIdException ||
170 e instanceof UserPasswordException ||
171 e instanceof UserScreenNameException ||
172 e instanceof UserSmsException ||
173 e instanceof WebsiteURLException) {
174
175 SessionErrors.add(actionRequest, e.getClass().getName(), e);
176 }
177 else {
178 throw e;
179 }
180 }
181
182 if (Validator.isNull(PropsValues.COMPANY_SECURITY_STRANGERS_URL)) {
183 return;
184 }
185
186 try {
187 Layout layout = LayoutLocalServiceUtil.getFriendlyURLLayout(
188 themeDisplay.getScopeGroupId(), false,
189 PropsValues.COMPANY_SECURITY_STRANGERS_URL);
190
191 String redirect = PortalUtil.getLayoutURL(layout, themeDisplay);
192
193 sendRedirect(actionRequest, actionResponse, redirect);
194 }
195 catch (NoSuchLayoutException nsle) {
196 }
197 }
198
199 @Override
200 public ActionForward render(
201 ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
202 RenderRequest renderRequest, RenderResponse renderResponse)
203 throws Exception {
204
205 Company company = PortalUtil.getCompany(renderRequest);
206
207 if (!company.isStrangers()) {
208 throw new PrincipalException();
209 }
210
211 ThemeDisplay themeDisplay = (ThemeDisplay)renderRequest.getAttribute(
212 WebKeys.THEME_DISPLAY);
213
214 renderResponse.setTitle(themeDisplay.translate("create-account"));
215
216 return mapping.findForward(
217 getForward(renderRequest, "portlet.login.create_account"));
218 }
219
220 protected void addUser(
221 ActionRequest actionRequest, ActionResponse actionResponse)
222 throws Exception {
223
224 HttpServletRequest request = PortalUtil.getHttpServletRequest(
225 actionRequest);
226 HttpSession session = request.getSession();
227
228 ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
229 WebKeys.THEME_DISPLAY);
230
231 Company company = themeDisplay.getCompany();
232
233 boolean autoPassword = true;
234 String password1 = null;
235 String password2 = null;
236 boolean autoScreenName = isAutoScreenName();
237 String screenName = ParamUtil.getString(actionRequest, "screenName");
238 String emailAddress = ParamUtil.getString(
239 actionRequest, "emailAddress");
240 long facebookId = ParamUtil.getLong(actionRequest, "facebookId");
241 String openId = ParamUtil.getString(actionRequest, "openId");
242 String firstName = ParamUtil.getString(actionRequest, "firstName");
243 String middleName = ParamUtil.getString(actionRequest, "middleName");
244 String lastName = ParamUtil.getString(actionRequest, "lastName");
245 int prefixId = ParamUtil.getInteger(actionRequest, "prefixId");
246 int suffixId = ParamUtil.getInteger(actionRequest, "suffixId");
247 boolean male = ParamUtil.getBoolean(actionRequest, "male", true);
248 int birthdayMonth = ParamUtil.getInteger(
249 actionRequest, "birthdayMonth");
250 int birthdayDay = ParamUtil.getInteger(actionRequest, "birthdayDay");
251 int birthdayYear = ParamUtil.getInteger(actionRequest, "birthdayYear");
252 String jobTitle = ParamUtil.getString(actionRequest, "jobTitle");
253 long[] groupIds = null;
254 long[] organizationIds = null;
255 long[] roleIds = null;
256 long[] userGroupIds = null;
257 boolean sendEmail = true;
258
259 ServiceContext serviceContext = ServiceContextFactory.getInstance(
260 User.class.getName(), actionRequest);
261
262 if (PropsValues.LOGIN_CREATE_ACCOUNT_ALLOW_CUSTOM_PASSWORD) {
263 autoPassword = false;
264
265 password1 = ParamUtil.getString(actionRequest, "password1");
266 password2 = ParamUtil.getString(actionRequest, "password2");
267 }
268
269 boolean openIdPending = false;
270
271 Boolean openIdLoginPending = (Boolean)session.getAttribute(
272 WebKeys.OPEN_ID_LOGIN_PENDING);
273
274 if ((openIdLoginPending != null) &&
275 (openIdLoginPending.booleanValue()) &&
276 (Validator.isNotNull(openId))) {
277
278 sendEmail = false;
279 openIdPending = true;
280 }
281
282 User user = UserServiceUtil.addUserWithWorkflow(
283 company.getCompanyId(), autoPassword, password1, password2,
284 autoScreenName, screenName, emailAddress, facebookId, openId,
285 themeDisplay.getLocale(), firstName, middleName, lastName, prefixId,
286 suffixId, male, birthdayMonth, birthdayDay, birthdayYear, jobTitle,
287 groupIds, organizationIds, roleIds, userGroupIds, sendEmail,
288 serviceContext);
289
290 if (openIdPending) {
291 session.setAttribute(
292 WebKeys.OPEN_ID_LOGIN, new Long(user.getUserId()));
293
294 session.removeAttribute(WebKeys.OPEN_ID_LOGIN_PENDING);
295 }
296 else {
297
298
299
300 if (user.getStatus() == WorkflowConstants.STATUS_APPROVED) {
301 SessionMessages.add(
302 request, "user_added", user.getEmailAddress());
303 SessionMessages.add(
304 request, "user_added_password",
305 user.getPasswordUnencrypted());
306 }
307 else {
308 SessionMessages.add(
309 request, "user_pending", user.getEmailAddress());
310 }
311 }
312
313
314
315 String login = null;
316
317 if (company.getAuthType().equals(CompanyConstants.AUTH_TYPE_ID)) {
318 login = String.valueOf(user.getUserId());
319 }
320 else if (company.getAuthType().equals(CompanyConstants.AUTH_TYPE_SN)) {
321 login = user.getScreenName();
322 }
323 else {
324 login = user.getEmailAddress();
325 }
326
327 sendRedirect(
328 actionRequest, actionResponse, themeDisplay, login,
329 user.getPasswordUnencrypted());
330 }
331
332 protected boolean isAutoScreenName() {
333 return _AUTO_SCREEN_NAME;
334 }
335
336 @Override
337 protected boolean isCheckMethodOnProcessAction() {
338 return _CHECK_METHOD_ON_PROCESS_ACTION;
339 }
340
341 protected void resetUser(
342 ActionRequest actionRequest, ActionResponse actionResponse)
343 throws Exception {
344
345 ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
346 WebKeys.THEME_DISPLAY);
347
348 String emailAddress = ParamUtil.getString(
349 actionRequest, "emailAddress");
350
351 User anonymousUser = UserLocalServiceUtil.getUserByEmailAddress(
352 themeDisplay.getCompanyId(), emailAddress);
353
354 UserLocalServiceUtil.deleteUser(anonymousUser.getUserId());
355
356 addUser(actionRequest, actionResponse);
357 }
358
359 protected void sendRedirect(
360 ActionRequest actionRequest, ActionResponse actionResponse,
361 ThemeDisplay themeDisplay, String login, String password)
362 throws Exception {
363
364 HttpServletRequest request = PortalUtil.getHttpServletRequest(
365 actionRequest);
366
367 String redirect = PortalUtil.escapeRedirect(
368 ParamUtil.getString(actionRequest, "redirect"));
369
370 if (Validator.isNotNull(redirect)) {
371 HttpServletResponse response = PortalUtil.getHttpServletResponse(
372 actionResponse);
373
374 LoginUtil.login(request, response, login, password, false, null);
375 }
376 else {
377 PortletURL loginURL = LoginUtil.getLoginURL(
378 request, themeDisplay.getPlid());
379
380 loginURL.setParameter("login", login);
381
382 redirect = loginURL.toString();
383 }
384
385 actionResponse.sendRedirect(redirect);
386 }
387
388 protected void updateIncompleteUser(
389 ActionRequest actionRequest, ActionResponse actionResponse)
390 throws Exception {
391
392 HttpServletRequest request = PortalUtil.getHttpServletRequest(
393 actionRequest);
394
395 ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
396 WebKeys.THEME_DISPLAY);
397
398 boolean autoPassword = true;
399 String password1 = null;
400 String password2 = null;
401 boolean autoScreenName = false;
402 String screenName = ParamUtil.getString(actionRequest, "screenName");
403 String emailAddress = ParamUtil.getString(
404 actionRequest, "emailAddress");
405 long facebookId = ParamUtil.getLong(actionRequest, "facebookId");
406 String openId = ParamUtil.getString(actionRequest, "openId");
407 String firstName = ParamUtil.getString(actionRequest, "firstName");
408 String middleName = ParamUtil.getString(actionRequest, "middleName");
409 String lastName = ParamUtil.getString(actionRequest, "lastName");
410 int prefixId = ParamUtil.getInteger(actionRequest, "prefixId");
411 int suffixId = ParamUtil.getInteger(actionRequest, "suffixId");
412 boolean male = ParamUtil.getBoolean(actionRequest, "male", true);
413 int birthdayMonth = ParamUtil.getInteger(
414 actionRequest, "birthdayMonth");
415 int birthdayDay = ParamUtil.getInteger(actionRequest, "birthdayDay");
416 int birthdayYear = ParamUtil.getInteger(actionRequest, "birthdayYear");
417 String jobTitle = ParamUtil.getString(actionRequest, "jobTitle");
418 boolean updateUserInformation = true;
419 boolean sendEmail = true;
420
421 ServiceContext serviceContext = ServiceContextFactory.getInstance(
422 User.class.getName(), actionRequest);
423
424 User user = UserServiceUtil.updateIncompleteUser(
425 themeDisplay.getCompanyId(), autoPassword, password1, password2,
426 autoScreenName, screenName, emailAddress, facebookId, openId,
427 themeDisplay.getLocale(), firstName, middleName, lastName, prefixId,
428 suffixId, male, birthdayMonth, birthdayDay, birthdayYear, jobTitle,
429 sendEmail, updateUserInformation, serviceContext);
430
431
432
433 if (user.getStatus() == WorkflowConstants.STATUS_APPROVED) {
434 SessionMessages.add(request, "user_added", user.getEmailAddress());
435 SessionMessages.add(
436 request, "user_added_password", user.getPasswordUnencrypted());
437 }
438 else {
439 SessionMessages.add(
440 request, "user_pending", user.getEmailAddress());
441 }
442
443
444
445 String login = null;
446
447 Company company = themeDisplay.getCompany();
448
449 if (company.getAuthType().equals(CompanyConstants.AUTH_TYPE_ID)) {
450 login = String.valueOf(user.getUserId());
451 }
452 else if (company.getAuthType().equals(CompanyConstants.AUTH_TYPE_SN)) {
453 login = user.getScreenName();
454 }
455 else {
456 login = user.getEmailAddress();
457 }
458
459 sendRedirect(
460 actionRequest, actionResponse, themeDisplay, login,
461 user.getPasswordUnencrypted());
462 }
463
464 private static final boolean _AUTO_SCREEN_NAME = false;
465
466 private static final boolean _CHECK_METHOD_ON_PROCESS_ACTION = false;
467
468 }