001    /**
002     * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
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    /**
091     * @author Brian Wing Shun Chan
092     * @author Amos Fong
093     * @author Daniel Sanz
094     * @author Sergio Gonz??lez
095     */
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                            // Session messages
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                    // Send redirect
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                            // Send redirect
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                    // Session messages
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                    // Send redirect
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    }