001    /**
002     * Copyright (c) 2000-2011 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
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.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    /**
088     * @author Brian Wing Shun Chan
089     * @author Amos Fong
090     * @author Daniel Sanz
091     * @author Sergio González
092     */
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                            // Session messages
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                    // Send redirect
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                    // Session messages
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                    // Send redirect
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    }