001    /**
002     * Copyright (c) 2000-present 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.usersadmin.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.ContactBirthdayException;
022    import com.liferay.portal.ContactNameException;
023    import com.liferay.portal.EmailAddressException;
024    import com.liferay.portal.GroupFriendlyURLException;
025    import com.liferay.portal.NoSuchCountryException;
026    import com.liferay.portal.NoSuchListTypeException;
027    import com.liferay.portal.NoSuchRegionException;
028    import com.liferay.portal.NoSuchUserException;
029    import com.liferay.portal.PhoneNumberException;
030    import com.liferay.portal.RequiredUserException;
031    import com.liferay.portal.UserEmailAddressException;
032    import com.liferay.portal.UserFieldException;
033    import com.liferay.portal.UserIdException;
034    import com.liferay.portal.UserPasswordException;
035    import com.liferay.portal.UserReminderQueryException;
036    import com.liferay.portal.UserScreenNameException;
037    import com.liferay.portal.UserSmsException;
038    import com.liferay.portal.WebsiteURLException;
039    import com.liferay.portal.kernel.bean.BeanParamUtil;
040    import com.liferay.portal.kernel.language.LanguageUtil;
041    import com.liferay.portal.kernel.portlet.DynamicActionRequest;
042    import com.liferay.portal.kernel.repository.model.FileEntry;
043    import com.liferay.portal.kernel.servlet.SessionErrors;
044    import com.liferay.portal.kernel.servlet.SessionMessages;
045    import com.liferay.portal.kernel.util.CalendarFactoryUtil;
046    import com.liferay.portal.kernel.util.CharPool;
047    import com.liferay.portal.kernel.util.Constants;
048    import com.liferay.portal.kernel.util.FileUtil;
049    import com.liferay.portal.kernel.util.HttpUtil;
050    import com.liferay.portal.kernel.util.LocaleUtil;
051    import com.liferay.portal.kernel.util.ParamUtil;
052    import com.liferay.portal.kernel.util.StringPool;
053    import com.liferay.portal.kernel.util.StringUtil;
054    import com.liferay.portal.kernel.util.Validator;
055    import com.liferay.portal.kernel.workflow.WorkflowConstants;
056    import com.liferay.portal.model.Address;
057    import com.liferay.portal.model.Company;
058    import com.liferay.portal.model.Contact;
059    import com.liferay.portal.model.EmailAddress;
060    import com.liferay.portal.model.Group;
061    import com.liferay.portal.model.Layout;
062    import com.liferay.portal.model.ListType;
063    import com.liferay.portal.model.ListTypeConstants;
064    import com.liferay.portal.model.Phone;
065    import com.liferay.portal.model.User;
066    import com.liferay.portal.model.UserGroupRole;
067    import com.liferay.portal.model.Website;
068    import com.liferay.portal.security.auth.PrincipalException;
069    import com.liferay.portal.security.membershippolicy.MembershipPolicyException;
070    import com.liferay.portal.security.permission.ActionKeys;
071    import com.liferay.portal.service.ListTypeLocalServiceUtil;
072    import com.liferay.portal.service.ServiceContext;
073    import com.liferay.portal.service.ServiceContextFactory;
074    import com.liferay.portal.service.UserLocalServiceUtil;
075    import com.liferay.portal.service.UserServiceUtil;
076    import com.liferay.portal.service.permission.GroupPermissionUtil;
077    import com.liferay.portal.struts.PortletAction;
078    import com.liferay.portal.theme.ThemeDisplay;
079    import com.liferay.portal.util.PortalUtil;
080    import com.liferay.portal.util.PortletKeys;
081    import com.liferay.portal.util.PropsValues;
082    import com.liferay.portal.util.WebKeys;
083    import com.liferay.portlet.InvokerPortletImpl;
084    import com.liferay.portlet.admin.util.AdminUtil;
085    import com.liferay.portlet.announcements.model.AnnouncementsDelivery;
086    import com.liferay.portlet.announcements.model.AnnouncementsEntryConstants;
087    import com.liferay.portlet.announcements.model.impl.AnnouncementsDeliveryImpl;
088    import com.liferay.portlet.announcements.service.AnnouncementsDeliveryLocalServiceUtil;
089    import com.liferay.portlet.documentlibrary.service.DLAppLocalServiceUtil;
090    import com.liferay.portlet.sites.util.SitesUtil;
091    import com.liferay.portlet.usersadmin.util.UsersAdmin;
092    import com.liferay.portlet.usersadmin.util.UsersAdminUtil;
093    
094    import java.util.ArrayList;
095    import java.util.Calendar;
096    import java.util.List;
097    import java.util.Locale;
098    
099    import javax.portlet.ActionRequest;
100    import javax.portlet.ActionResponse;
101    import javax.portlet.PortletConfig;
102    import javax.portlet.PortletRequest;
103    import javax.portlet.PortletSession;
104    import javax.portlet.RenderRequest;
105    import javax.portlet.RenderResponse;
106    
107    import javax.servlet.http.HttpServletRequest;
108    import javax.servlet.http.HttpServletResponse;
109    import javax.servlet.http.HttpSession;
110    
111    import org.apache.struts.Globals;
112    import org.apache.struts.action.ActionForm;
113    import org.apache.struts.action.ActionForward;
114    import org.apache.struts.action.ActionMapping;
115    
116    /**
117     * @author Brian Wing Shun Chan
118     * @author Jorge Ferrer
119     * @author Julio Camarero
120     * @author Wesley Gong
121     */
122    public class EditUserAction extends PortletAction {
123    
124            @Override
125            public void processAction(
126                            ActionMapping actionMapping, ActionForm actionForm,
127                            PortletConfig portletConfig, ActionRequest actionRequest,
128                            ActionResponse actionResponse)
129                    throws Exception {
130    
131                    DynamicActionRequest dynamicActionRequest = new DynamicActionRequest(
132                            actionRequest);
133    
134                    long prefixId = getListTypeId(
135                            actionRequest, "prefixValue", ListTypeConstants.CONTACT_PREFIX);
136    
137                    dynamicActionRequest.setParameter("prefixId", String.valueOf(prefixId));
138    
139                    long suffixId = getListTypeId(
140                            actionRequest, "suffixValue", ListTypeConstants.CONTACT_SUFFIX);
141    
142                    dynamicActionRequest.setParameter("suffixId", String.valueOf(suffixId));
143    
144                    actionRequest = dynamicActionRequest;
145    
146                    String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
147    
148                    try {
149                            User user = null;
150                            String oldScreenName = StringPool.BLANK;
151                            boolean updateLanguageId = false;
152    
153                            if (cmd.equals(Constants.ADD)) {
154                                    user = addUser(actionRequest);
155                            }
156                            else if (cmd.equals(Constants.DEACTIVATE) ||
157                                             cmd.equals(Constants.DELETE) ||
158                                             cmd.equals(Constants.RESTORE)) {
159    
160                                    deleteUsers(actionRequest);
161                            }
162                            else if (cmd.equals("deleteRole")) {
163                                    deleteRole(actionRequest);
164                            }
165                            else if (cmd.equals(Constants.UPDATE)) {
166                                    Object[] returnValue = updateUser(
167                                            actionRequest, actionResponse);
168    
169                                    user = (User)returnValue[0];
170                                    oldScreenName = ((String)returnValue[1]);
171                                    updateLanguageId = ((Boolean)returnValue[2]);
172                            }
173                            else if (cmd.equals("unlock")) {
174                                    user = updateLockout(actionRequest);
175                            }
176    
177                            ThemeDisplay themeDisplay =
178                                    (ThemeDisplay)actionRequest.getAttribute(WebKeys.THEME_DISPLAY);
179    
180                            String redirect = ParamUtil.getString(actionRequest, "redirect");
181    
182                            if (user != null) {
183                                    if (Validator.isNotNull(oldScreenName)) {
184    
185                                            // This will fix the redirect if the user is on his personal
186                                            // my account page and changes his screen name. A redirect
187                                            // that references the old screen name no longer points to a
188                                            // valid screen name and therefore needs to be updated.
189    
190                                            Group group = user.getGroup();
191    
192                                            if (group.getGroupId() == themeDisplay.getScopeGroupId()) {
193                                                    Layout layout = themeDisplay.getLayout();
194    
195                                                    String friendlyURLPath = group.getPathFriendlyURL(
196                                                            layout.isPrivateLayout(), themeDisplay);
197    
198                                                    String oldPath =
199                                                            friendlyURLPath + StringPool.SLASH + oldScreenName;
200                                                    String newPath =
201                                                            friendlyURLPath + StringPool.SLASH +
202                                                                    user.getScreenName();
203    
204                                                    redirect = StringUtil.replace(
205                                                            redirect, oldPath, newPath);
206    
207                                                    redirect = StringUtil.replace(
208                                                            redirect, HttpUtil.encodeURL(oldPath),
209                                                            HttpUtil.encodeURL(newPath));
210                                            }
211                                    }
212    
213                                    if (updateLanguageId && themeDisplay.isI18n()) {
214                                            String i18nLanguageId = user.getLanguageId();
215                                            int pos = i18nLanguageId.indexOf(CharPool.UNDERLINE);
216    
217                                            if (pos != -1) {
218                                                    i18nLanguageId = i18nLanguageId.substring(0, pos);
219                                            }
220    
221                                            String i18nPath = StringPool.SLASH + i18nLanguageId;
222    
223                                            redirect = StringUtil.replace(
224                                                    redirect, themeDisplay.getI18nPath(), i18nPath);
225                                    }
226    
227                                    redirect = HttpUtil.setParameter(
228                                            redirect, actionResponse.getNamespace() + "p_u_i_d",
229                                            user.getUserId());
230                            }
231    
232                            Group scopeGroup = themeDisplay.getScopeGroup();
233    
234                            if (scopeGroup.isUser() &&
235                                    (UserLocalServiceUtil.fetchUserById(
236                                            scopeGroup.getClassPK()) == null)) {
237    
238                                    redirect = HttpUtil.setParameter(redirect, "doAsGroupId", 0);
239                                    redirect = HttpUtil.setParameter(redirect, "refererPlid", 0);
240                            }
241    
242                            sendRedirect(actionRequest, actionResponse, redirect);
243                    }
244                    catch (Exception e) {
245                            if (e instanceof NoSuchUserException ||
246                                    e instanceof PrincipalException) {
247    
248                                    SessionErrors.add(actionRequest, e.getClass());
249    
250                                    setForward(actionRequest, "portlet.users_admin.error");
251                            }
252                            else if (e instanceof AddressCityException ||
253                                             e instanceof AddressStreetException ||
254                                             e instanceof AddressZipException ||
255                                             e instanceof CompanyMaxUsersException ||
256                                             e instanceof ContactBirthdayException ||
257                                             e instanceof ContactNameException ||
258                                             e instanceof EmailAddressException ||
259                                             e instanceof GroupFriendlyURLException ||
260                                             e instanceof MembershipPolicyException ||
261                                             e instanceof NoSuchCountryException ||
262                                             e instanceof NoSuchListTypeException ||
263                                             e instanceof NoSuchRegionException ||
264                                             e instanceof PhoneNumberException ||
265                                             e instanceof RequiredUserException ||
266                                             e instanceof UserEmailAddressException ||
267                                             e instanceof UserFieldException ||
268                                             e instanceof UserIdException ||
269                                             e instanceof UserPasswordException ||
270                                             e instanceof UserReminderQueryException ||
271                                             e instanceof UserScreenNameException ||
272                                             e instanceof UserSmsException ||
273                                             e instanceof WebsiteURLException) {
274    
275                                    if (e instanceof NoSuchListTypeException) {
276                                            NoSuchListTypeException nslte = (NoSuchListTypeException)e;
277    
278                                            SessionErrors.add(
279                                                    actionRequest,
280                                                    e.getClass().getName() + nslte.getType());
281                                    }
282                                    else {
283                                            SessionErrors.add(actionRequest, e.getClass(), e);
284                                    }
285    
286                                    String password1 = actionRequest.getParameter("password1");
287                                    String password2 = actionRequest.getParameter("password2");
288    
289                                    boolean submittedPassword = false;
290    
291                                    if (!Validator.isBlank(password1) ||
292                                            !Validator.isBlank(password2)) {
293    
294                                            submittedPassword = true;
295                                    }
296    
297                                    if (e instanceof CompanyMaxUsersException ||
298                                            e instanceof RequiredUserException || submittedPassword) {
299    
300                                            String redirect = PortalUtil.escapeRedirect(
301                                                    ParamUtil.getString(actionRequest, "redirect"));
302    
303                                            if (submittedPassword) {
304                                                    User user = PortalUtil.getSelectedUser(actionRequest);
305    
306                                                    redirect = HttpUtil.setParameter(
307                                                            redirect, actionResponse.getNamespace() + "p_u_i_d",
308                                                            user.getUserId());
309                                            }
310    
311                                            if (Validator.isNotNull(redirect)) {
312                                                    actionResponse.sendRedirect(redirect);
313                                            }
314                                    }
315                            }
316                            else {
317                                    throw e;
318                            }
319                    }
320            }
321    
322            @Override
323            public ActionForward render(
324                            ActionMapping actionMapping, ActionForm actionForm,
325                            PortletConfig portletConfig, RenderRequest renderRequest,
326                            RenderResponse renderResponse)
327                    throws Exception {
328    
329                    try {
330                            PortalUtil.getSelectedUser(renderRequest);
331                    }
332                    catch (Exception e) {
333                            if (e instanceof PrincipalException) {
334                                    SessionErrors.add(renderRequest, e.getClass());
335    
336                                    return actionMapping.findForward("portlet.users_admin.error");
337                            }
338                            else {
339                                    throw e;
340                            }
341                    }
342    
343                    return actionMapping.findForward(
344                            getForward(renderRequest, "portlet.users_admin.edit_user"));
345            }
346    
347            protected User addUser(ActionRequest actionRequest) throws Exception {
348                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
349                            WebKeys.THEME_DISPLAY);
350    
351                    boolean autoPassword = ParamUtil.getBoolean(
352                            actionRequest, "autoPassword", true);
353                    String password1 = actionRequest.getParameter("password1");
354                    String password2 = actionRequest.getParameter("password2");
355    
356                    String reminderQueryQuestion = ParamUtil.getString(
357                            actionRequest, "reminderQueryQuestion");
358    
359                    if (reminderQueryQuestion.equals(UsersAdmin.CUSTOM_QUESTION)) {
360                            reminderQueryQuestion = ParamUtil.getString(
361                                    actionRequest, "reminderQueryCustomQuestion");
362                    }
363    
364                    String reminderQueryAnswer = ParamUtil.getString(
365                            actionRequest, "reminderQueryAnswer");
366                    boolean autoScreenName = ParamUtil.getBoolean(
367                            actionRequest, "autoScreenName");
368                    String screenName = ParamUtil.getString(actionRequest, "screenName");
369                    String emailAddress = ParamUtil.getString(
370                            actionRequest, "emailAddress");
371                    long facebookId = 0;
372                    String openId = ParamUtil.getString(actionRequest, "openId");
373                    String languageId = ParamUtil.getString(actionRequest, "languageId");
374                    String timeZoneId = ParamUtil.getString(actionRequest, "timeZoneId");
375                    String greeting = ParamUtil.getString(actionRequest, "greeting");
376                    String firstName = ParamUtil.getString(actionRequest, "firstName");
377                    String middleName = ParamUtil.getString(actionRequest, "middleName");
378                    String lastName = ParamUtil.getString(actionRequest, "lastName");
379                    long prefixId = ParamUtil.getInteger(actionRequest, "prefixId");
380                    long suffixId = ParamUtil.getInteger(actionRequest, "suffixId");
381                    boolean male = ParamUtil.getBoolean(actionRequest, "male", true);
382                    int birthdayMonth = ParamUtil.getInteger(
383                            actionRequest, "birthdayMonth");
384                    int birthdayDay = ParamUtil.getInteger(actionRequest, "birthdayDay");
385                    int birthdayYear = ParamUtil.getInteger(actionRequest, "birthdayYear");
386                    String comments = ParamUtil.getString(actionRequest, "comments");
387                    String smsSn = ParamUtil.getString(actionRequest, "smsSn");
388                    String aimSn = ParamUtil.getString(actionRequest, "aimSn");
389                    String facebookSn = ParamUtil.getString(actionRequest, "facebookSn");
390                    String icqSn = ParamUtil.getString(actionRequest, "icqSn");
391                    String jabberSn = ParamUtil.getString(actionRequest, "jabberSn");
392                    String msnSn = ParamUtil.getString(actionRequest, "msnSn");
393                    String mySpaceSn = ParamUtil.getString(actionRequest, "mySpaceSn");
394                    String skypeSn = ParamUtil.getString(actionRequest, "skypeSn");
395                    String twitterSn = ParamUtil.getString(actionRequest, "twitterSn");
396                    String ymSn = ParamUtil.getString(actionRequest, "ymSn");
397                    String jobTitle = ParamUtil.getString(actionRequest, "jobTitle");
398                    long[] groupIds = UsersAdminUtil.getGroupIds(actionRequest);
399                    long[] organizationIds = UsersAdminUtil.getOrganizationIds(
400                            actionRequest);
401                    long[] roleIds = UsersAdminUtil.getRoleIds(actionRequest);
402                    List<UserGroupRole> userGroupRoles = UsersAdminUtil.getUserGroupRoles(
403                            actionRequest);
404                    long[] userGroupIds = UsersAdminUtil.getUserGroupIds(actionRequest);
405                    List<Address> addresses = UsersAdminUtil.getAddresses(actionRequest);
406                    List<EmailAddress> emailAddresses = UsersAdminUtil.getEmailAddresses(
407                            actionRequest);
408                    List<Phone> phones = UsersAdminUtil.getPhones(actionRequest);
409                    List<Website> websites = UsersAdminUtil.getWebsites(actionRequest);
410                    List<AnnouncementsDelivery> announcementsDeliveries =
411                            getAnnouncementsDeliveries(actionRequest);
412                    boolean sendEmail = true;
413    
414                    ServiceContext serviceContext = ServiceContextFactory.getInstance(
415                            User.class.getName(), actionRequest);
416    
417                    User user = UserServiceUtil.addUser(
418                            themeDisplay.getCompanyId(), autoPassword, password1, password2,
419                            autoScreenName, screenName, emailAddress, facebookId, openId,
420                            LocaleUtil.fromLanguageId(languageId), firstName, middleName,
421                            lastName, prefixId, suffixId, male, birthdayMonth, birthdayDay,
422                            birthdayYear, jobTitle, groupIds, organizationIds, roleIds,
423                            userGroupIds, addresses, emailAddresses, phones, websites,
424                            announcementsDeliveries, sendEmail, serviceContext);
425    
426                    if (!userGroupRoles.isEmpty()) {
427                            for (UserGroupRole userGroupRole : userGroupRoles) {
428                                    userGroupRole.setUserId(user.getUserId());
429                            }
430    
431                            user = UserServiceUtil.updateUser(
432                                    user.getUserId(), StringPool.BLANK, StringPool.BLANK,
433                                    StringPool.BLANK, false, reminderQueryQuestion,
434                                    reminderQueryAnswer, user.getScreenName(),
435                                    user.getEmailAddress(), facebookId, openId, true, null,
436                                    languageId, timeZoneId, greeting, comments, firstName,
437                                    middleName, lastName, prefixId, suffixId, male, birthdayMonth,
438                                    birthdayDay, birthdayYear, smsSn, aimSn, facebookSn, icqSn,
439                                    jabberSn, msnSn, mySpaceSn, skypeSn, twitterSn, ymSn, jobTitle,
440                                    groupIds, organizationIds, roleIds, userGroupRoles,
441                                    userGroupIds, addresses, emailAddresses, phones, websites,
442                                    announcementsDeliveries, serviceContext);
443                    }
444    
445                    long publicLayoutSetPrototypeId = ParamUtil.getLong(
446                            actionRequest, "publicLayoutSetPrototypeId");
447                    long privateLayoutSetPrototypeId = ParamUtil.getLong(
448                            actionRequest, "privateLayoutSetPrototypeId");
449                    boolean publicLayoutSetPrototypeLinkEnabled = ParamUtil.getBoolean(
450                            actionRequest, "publicLayoutSetPrototypeLinkEnabled");
451                    boolean privateLayoutSetPrototypeLinkEnabled = ParamUtil.getBoolean(
452                            actionRequest, "privateLayoutSetPrototypeLinkEnabled");
453    
454                    SitesUtil.updateLayoutSetPrototypesLinks(
455                            user.getGroup(), publicLayoutSetPrototypeId,
456                            privateLayoutSetPrototypeId, publicLayoutSetPrototypeLinkEnabled,
457                            privateLayoutSetPrototypeLinkEnabled);
458    
459                    return user;
460            }
461    
462            protected void deleteRole(ActionRequest actionRequest) throws Exception {
463                    User user = PortalUtil.getSelectedUser(actionRequest);
464    
465                    long roleId = ParamUtil.getLong(actionRequest, "roleId");
466    
467                    UserServiceUtil.deleteRoleUser(roleId, user.getUserId());
468            }
469    
470            protected void deleteUsers(ActionRequest actionRequest) throws Exception {
471                    String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
472    
473                    long[] deleteUserIds = StringUtil.split(
474                            ParamUtil.getString(actionRequest, "deleteUserIds"), 0L);
475    
476                    for (long deleteUserId : deleteUserIds) {
477                            if (cmd.equals(Constants.DEACTIVATE) ||
478                                    cmd.equals(Constants.RESTORE)) {
479    
480                                    int status = WorkflowConstants.STATUS_APPROVED;
481    
482                                    if (cmd.equals(Constants.DEACTIVATE)) {
483                                            status = WorkflowConstants.STATUS_INACTIVE;
484                                    }
485    
486                                    UserServiceUtil.updateStatus(
487                                            deleteUserId, status, new ServiceContext());
488                            }
489                            else {
490                                    UserServiceUtil.deleteUser(deleteUserId);
491                            }
492                    }
493            }
494    
495            protected List<AnnouncementsDelivery> getAnnouncementsDeliveries(
496                    ActionRequest actionRequest) {
497    
498                    List<AnnouncementsDelivery> announcementsDeliveries = new ArrayList<>();
499    
500                    for (String type : AnnouncementsEntryConstants.TYPES) {
501                            boolean email = ParamUtil.getBoolean(
502                                    actionRequest, "announcementsType" + type + "Email");
503                            boolean sms = ParamUtil.getBoolean(
504                                    actionRequest, "announcementsType" + type + "Sms");
505                            boolean website = ParamUtil.getBoolean(
506                                    actionRequest, "announcementsType" + type + "Website");
507    
508                            AnnouncementsDelivery announcementsDelivery =
509                                    new AnnouncementsDeliveryImpl();
510    
511                            announcementsDelivery.setType(type);
512                            announcementsDelivery.setEmail(email);
513                            announcementsDelivery.setSms(sms);
514                            announcementsDelivery.setWebsite(website);
515    
516                            announcementsDeliveries.add(announcementsDelivery);
517                    }
518    
519                    return announcementsDeliveries;
520            }
521    
522            protected List<AnnouncementsDelivery> getAnnouncementsDeliveries(
523                            ActionRequest actionRequest, User user)
524                    throws Exception {
525    
526                    if (actionRequest.getParameter(
527                                    "announcementsType" + AnnouncementsEntryConstants.TYPES[0] +
528                                            "Email") == null) {
529    
530                            return AnnouncementsDeliveryLocalServiceUtil.getUserDeliveries(
531                                    user.getUserId());
532                    }
533    
534                    return getAnnouncementsDeliveries(actionRequest);
535            }
536    
537            protected long getListTypeId(
538                            PortletRequest portletRequest, String parameterName, String type)
539                    throws Exception {
540    
541                    String parameterValue = ParamUtil.getString(
542                            portletRequest, parameterName);
543    
544                    ListType listType = ListTypeLocalServiceUtil.addListType(
545                            parameterValue, type);
546    
547                    return listType.getListTypeId();
548            }
549    
550            protected User updateLockout(ActionRequest actionRequest) throws Exception {
551                    User user = PortalUtil.getSelectedUser(actionRequest);
552    
553                    UserServiceUtil.updateLockoutById(user.getUserId(), false);
554    
555                    return user;
556            }
557    
558            protected Object[] updateUser(
559                            ActionRequest actionRequest, ActionResponse actionResponse)
560                    throws Exception {
561    
562                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
563                            WebKeys.THEME_DISPLAY);
564    
565                    User user = PortalUtil.getSelectedUser(actionRequest);
566    
567                    Contact contact = user.getContact();
568    
569                    String oldPassword = AdminUtil.getUpdateUserPassword(
570                            actionRequest, user.getUserId());
571                    String newPassword1 = actionRequest.getParameter("password1");
572                    String newPassword2 = actionRequest.getParameter("password2");
573                    boolean passwordReset = ParamUtil.getBoolean(
574                            actionRequest, "passwordReset");
575    
576                    String reminderQueryQuestion = BeanParamUtil.getString(
577                            user, actionRequest, "reminderQueryQuestion");
578    
579                    if (reminderQueryQuestion.equals(UsersAdmin.CUSTOM_QUESTION)) {
580                            reminderQueryQuestion = BeanParamUtil.getStringSilent(
581                                    user, actionRequest, "reminderQueryCustomQuestion");
582                    }
583    
584                    String reminderQueryAnswer = BeanParamUtil.getString(
585                            user, actionRequest, "reminderQueryAnswer");
586                    String oldScreenName = user.getScreenName();
587                    String screenName = BeanParamUtil.getString(
588                            user, actionRequest, "screenName");
589                    String oldEmailAddress = user.getEmailAddress();
590                    String emailAddress = BeanParamUtil.getString(
591                            user, actionRequest, "emailAddress");
592                    long facebookId = user.getFacebookId();
593                    String openId = BeanParamUtil.getString(user, actionRequest, "openId");
594                    boolean deleteLogo = ParamUtil.getBoolean(actionRequest, "deleteLogo");
595    
596                    byte[] portraitBytes = null;
597    
598                    long fileEntryId = ParamUtil.getLong(actionRequest, "fileEntryId");
599    
600                    if (fileEntryId > 0) {
601                            FileEntry fileEntry = DLAppLocalServiceUtil.getFileEntry(
602                                    fileEntryId);
603    
604                            portraitBytes = FileUtil.getBytes(fileEntry.getContentStream());
605                    }
606    
607                    String languageId = BeanParamUtil.getString(
608                            user, actionRequest, "languageId");
609                    String timeZoneId = BeanParamUtil.getString(
610                            user, actionRequest, "timeZoneId");
611                    String greeting = BeanParamUtil.getString(
612                            user, actionRequest, "greeting");
613                    String firstName = BeanParamUtil.getString(
614                            user, actionRequest, "firstName");
615                    String middleName = BeanParamUtil.getString(
616                            user, actionRequest, "middleName");
617                    String lastName = BeanParamUtil.getString(
618                            user, actionRequest, "lastName");
619                    long prefixId = BeanParamUtil.getInteger(
620                            contact, actionRequest, "prefixId");
621                    long suffixId = BeanParamUtil.getInteger(
622                            contact, actionRequest, "suffixId");
623                    boolean male = BeanParamUtil.getBoolean(
624                            user, actionRequest, "male", true);
625    
626                    Calendar birthdayCal = CalendarFactoryUtil.getCalendar();
627    
628                    birthdayCal.setTime(contact.getBirthday());
629    
630                    int birthdayMonth = ParamUtil.getInteger(
631                            actionRequest, "birthdayMonth", birthdayCal.get(Calendar.MONTH));
632                    int birthdayDay = ParamUtil.getInteger(
633                            actionRequest, "birthdayDay", birthdayCal.get(Calendar.DATE));
634                    int birthdayYear = ParamUtil.getInteger(
635                            actionRequest, "birthdayYear", birthdayCal.get(Calendar.YEAR));
636                    String comments = BeanParamUtil.getString(
637                            user, actionRequest, "comments");
638                    String smsSn = BeanParamUtil.getString(contact, actionRequest, "smsSn");
639                    String aimSn = BeanParamUtil.getString(contact, actionRequest, "aimSn");
640                    String facebookSn = BeanParamUtil.getString(
641                            contact, actionRequest, "facebookSn");
642                    String icqSn = BeanParamUtil.getString(contact, actionRequest, "icqSn");
643                    String jabberSn = BeanParamUtil.getString(
644                            contact, actionRequest, "jabberSn");
645                    String msnSn = BeanParamUtil.getString(contact, actionRequest, "msnSn");
646                    String mySpaceSn = BeanParamUtil.getString(
647                            contact, actionRequest, "mySpaceSn");
648                    String skypeSn = BeanParamUtil.getString(
649                            contact, actionRequest, "skypeSn");
650                    String twitterSn = BeanParamUtil.getString(
651                            contact, actionRequest, "twitterSn");
652                    String ymSn = BeanParamUtil.getString(contact, actionRequest, "ymSn");
653                    String jobTitle = BeanParamUtil.getString(
654                            user, actionRequest, "jobTitle");
655                    long[] groupIds = UsersAdminUtil.getGroupIds(actionRequest);
656                    long[] organizationIds = UsersAdminUtil.getOrganizationIds(
657                            actionRequest);
658                    long[] roleIds = UsersAdminUtil.getRoleIds(actionRequest);
659    
660                    List<UserGroupRole> userGroupRoles = null;
661    
662                    if ((actionRequest.getParameter("addGroupRolesGroupIds") != null) ||
663                            (actionRequest.getParameter("addGroupRolesRoleIds") != null) ||
664                            (actionRequest.getParameter("deleteGroupRolesGroupIds") != null) ||
665                            (actionRequest.getParameter("deleteGroupRolesRoleIds") != null)) {
666    
667                            userGroupRoles = UsersAdminUtil.getUserGroupRoles(actionRequest);
668                    }
669    
670                    long[] userGroupIds = UsersAdminUtil.getUserGroupIds(actionRequest);
671                    List<Address> addresses = UsersAdminUtil.getAddresses(
672                            actionRequest, user.getAddresses());
673                    List<EmailAddress> emailAddresses = UsersAdminUtil.getEmailAddresses(
674                            actionRequest, user.getEmailAddresses());
675                    List<Phone> phones = UsersAdminUtil.getPhones(
676                            actionRequest, user.getPhones());
677                    List<Website> websites = UsersAdminUtil.getWebsites(
678                            actionRequest, user.getWebsites());
679                    List<AnnouncementsDelivery> announcementsDeliveries =
680                            getAnnouncementsDeliveries(actionRequest, user);
681    
682                    ServiceContext serviceContext = ServiceContextFactory.getInstance(
683                            User.class.getName(), actionRequest);
684    
685                    user = UserServiceUtil.updateUser(
686                            user.getUserId(), oldPassword, newPassword1, newPassword2,
687                            passwordReset, reminderQueryQuestion, reminderQueryAnswer,
688                            screenName, emailAddress, facebookId, openId, !deleteLogo,
689                            portraitBytes, languageId, timeZoneId, greeting, comments,
690                            firstName, middleName, lastName, prefixId, suffixId, male,
691                            birthdayMonth, birthdayDay, birthdayYear, smsSn, aimSn, facebookSn,
692                            icqSn, jabberSn, msnSn, mySpaceSn, skypeSn, twitterSn, ymSn,
693                            jobTitle, groupIds, organizationIds, roleIds, userGroupRoles,
694                            userGroupIds, addresses, emailAddresses, phones, websites,
695                            announcementsDeliveries, serviceContext);
696    
697                    if (oldScreenName.equals(user.getScreenName())) {
698                            oldScreenName = StringPool.BLANK;
699                    }
700    
701                    boolean updateLanguageId = false;
702    
703                    if (user.getUserId() == themeDisplay.getUserId()) {
704    
705                            // Reset the locale
706    
707                            HttpServletRequest request = PortalUtil.getHttpServletRequest(
708                                    actionRequest);
709                            HttpServletResponse response = PortalUtil.getHttpServletResponse(
710                                    actionResponse);
711                            HttpSession session = request.getSession();
712    
713                            session.removeAttribute(Globals.LOCALE_KEY);
714    
715                            Locale locale = LocaleUtil.fromLanguageId(languageId);
716    
717                            LanguageUtil.updateCookie(request, response, locale);
718    
719                            // Clear cached portlet responses
720    
721                            PortletSession portletSession = actionRequest.getPortletSession();
722    
723                            InvokerPortletImpl.clearResponses(portletSession);
724    
725                            // Password
726    
727                            if (PropsValues.SESSION_STORE_PASSWORD &&
728                                    Validator.isNotNull(newPassword1)) {
729    
730                                    portletSession.setAttribute(
731                                            WebKeys.USER_PASSWORD, newPassword1,
732                                            PortletSession.APPLICATION_SCOPE);
733                            }
734    
735                            updateLanguageId = true;
736                    }
737    
738                    String portletId = serviceContext.getPortletId();
739    
740                    if (!portletId.equals(PortletKeys.MY_ACCOUNT)) {
741                            Group group = user.getGroup();
742    
743                            boolean hasGroupUpdatePermission = GroupPermissionUtil.contains(
744                                    themeDisplay.getPermissionChecker(), group.getGroupId(),
745                                    ActionKeys.UPDATE);
746    
747                            long publicLayoutSetPrototypeId = ParamUtil.getLong(
748                                    actionRequest, "publicLayoutSetPrototypeId");
749                            long privateLayoutSetPrototypeId = ParamUtil.getLong(
750                                    actionRequest, "privateLayoutSetPrototypeId");
751                            boolean publicLayoutSetPrototypeLinkEnabled = ParamUtil.getBoolean(
752                                    actionRequest, "publicLayoutSetPrototypeLinkEnabled");
753                            boolean privateLayoutSetPrototypeLinkEnabled = ParamUtil.getBoolean(
754                                    actionRequest, "privateLayoutSetPrototypeLinkEnabled");
755    
756                            if (hasGroupUpdatePermission &&
757                                    ((publicLayoutSetPrototypeId > 0) ||
758                                     (privateLayoutSetPrototypeId > 0))) {
759    
760                                    SitesUtil.updateLayoutSetPrototypesLinks(
761                                            group, publicLayoutSetPrototypeId,
762                                            privateLayoutSetPrototypeId,
763                                            publicLayoutSetPrototypeLinkEnabled,
764                                            privateLayoutSetPrototypeLinkEnabled);
765                            }
766                    }
767    
768                    Company company = PortalUtil.getCompany(actionRequest);
769    
770                    if (company.isStrangersVerify() &&
771                            !StringUtil.equalsIgnoreCase(oldEmailAddress, emailAddress)) {
772    
773                            SessionMessages.add(actionRequest, "verificationEmailSent");
774                    }
775    
776                    return new Object[] {user, oldScreenName, updateLanguageId};
777            }
778    
779    }