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